From 43c2a51331d3e91d86ef50c5262920bdaa260925 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Mon, 11 Feb 2019 10:52:30 +0100 Subject: Show/hide drumkit tab depending on if the current kit has a valid image attached or not. --- plugingui/drumkittab.cc | 6 +++--- plugingui/drumkittab.h | 5 +++-- plugingui/image.cc | 10 +++++++++- plugingui/image.h | 3 +++ plugingui/mainwindow.cc | 16 +++++++++++++++- plugingui/mainwindow.h | 3 +++ plugingui/tabbutton.cc | 13 +++++++++++++ plugingui/tabbutton.h | 6 ++++++ plugingui/tabwidget.cc | 32 ++++++++++++++++++++++++++++++-- plugingui/tabwidget.h | 6 +++++- 10 files changed, 90 insertions(+), 10 deletions(-) (limited to 'plugingui') diff --git a/plugingui/drumkittab.cc b/plugingui/drumkittab.cc index d6475fa..c3ee62e 100644 --- a/plugingui/drumkittab.cc +++ b/plugingui/drumkittab.cc @@ -42,12 +42,10 @@ namespace GUI DrumkitTab::DrumkitTab(Widget* parent, Settings& settings, - SettingsNotifier& settings_notifier/*, - Config& config*/) + SettingsNotifier& settings_notifier) : Widget(parent) , settings(settings) , settings_notifier(settings_notifier) - /*, config(config)*/ { velocity_label.move(10, height()-velocity_label.height()-5); updateVelocityLabel(); @@ -293,6 +291,8 @@ void DrumkitTab::init(std::string const& image_file, } } } + + imageChangeNotifier(drumkit_image->isValid()); } void DrumkitTab::drumkitFileChanged(const std::string& drumkit_file) diff --git a/plugingui/drumkittab.h b/plugingui/drumkittab.h index b1ccb73..a14a9c5 100644 --- a/plugingui/drumkittab.h +++ b/plugingui/drumkittab.h @@ -50,8 +50,7 @@ class DrumkitTab public: DrumkitTab(Widget* parent, Settings& settings, - SettingsNotifier& settings_notifier/*, - Config& config*/); + SettingsNotifier& settings_notifier); // From Widget: void resize(std::size_t width, std::size_t height) override; @@ -62,6 +61,8 @@ public: void init(std::string const& image_file, std::string const& map_file); + Notifier imageChangeNotifier; // bool has_valid_image + private: float current_velocity{.5}; std::string current_instrument{""}; diff --git a/plugingui/image.cc b/plugingui/image.cc index 4b5622e..70ee08e 100644 --- a/plugingui/image.cc +++ b/plugingui/image.cc @@ -76,15 +76,17 @@ Image& Image::operator=(Image&& other) image_data = std::move(other.image_data); _width = other._width; _height = other._height; + valid = other.valid; other._width = 0; other._height = 0; - + other.valid = false; return *this; } void Image::setError() { + valid = false; Resource rc(":resources/png_error"); const unsigned char* ptr = (const unsigned char*)rc.data(); @@ -155,6 +157,7 @@ void Image::load(const char* data, size_t size) assert(image_data.size() == (_width * _height)); std::free(char_image_data); + valid = true; } size_t Image::width() const @@ -177,4 +180,9 @@ const Colour& Image::getPixel(size_t x, size_t y) const return image_data[x + y * _width]; } +bool Image::isValid() const +{ + return valid; +} + } // GUI:: diff --git a/plugingui/image.h b/plugingui/image.h index e70215e..dd7f347 100644 --- a/plugingui/image.h +++ b/plugingui/image.h @@ -51,8 +51,11 @@ public: const Colour& getPixel(size_t x, size_t y) const override; + bool isValid() const; + private: void setError(); + bool valid{false}; void load(const char* data, size_t size); diff --git a/plugingui/mainwindow.cc b/plugingui/mainwindow.cc index a0364fa..a625bc3 100644 --- a/plugingui/mainwindow.cc +++ b/plugingui/mainwindow.cc @@ -51,8 +51,12 @@ MainWindow::MainWindow(Settings& settings, void* native_window) tabs.setTabWidth(100); tabs.move(16, 0); // x-offset to make room for the left side bar. tabs.addTab("Main", &main_tab); - tabs.addTab("Drumkit", &drumkit_tab); + drumkit_tab_id = tabs.addTab("Drumkit", &drumkit_tab); + changeDrumkitTabVisibility(false); // Hide while no kit is loaded tabs.addTab("About", &about_tab); + + CONNECT(&drumkit_tab, imageChangeNotifier, + this, &MainWindow::changeDrumkitTabVisibility); } MainWindow::~MainWindow() @@ -105,6 +109,16 @@ void MainWindow::sizeChanged(std::size_t width, std::size_t height) tabs.resize(std::max((int)width - 2 * 16, 0), height); } +void MainWindow::changeDrumkitTabVisibility(bool visible) +{ + // TODO: Check if the currently active tab is the drumkit tab and switch to + // the main tab if it is. + + // TODO: Add disabled state to the TabButtons and make it disabled instead of + // hidden here. + tabs.setVisible(drumkit_tab_id, visible); +} + void MainWindow::closeEventHandler() { closing = true; diff --git a/plugingui/mainwindow.h b/plugingui/mainwindow.h index ea05ad6..ffd0566 100644 --- a/plugingui/mainwindow.h +++ b/plugingui/mainwindow.h @@ -57,6 +57,7 @@ public: private: void sizeChanged(std::size_t width, std::size_t height); + void changeDrumkitTabVisibility(bool visible); // From Widget void repaintEvent(RepaintEvent* repaintEvent) override final; @@ -82,6 +83,8 @@ private: 17, 1, 1}; // dy1, dy2, dy3 bool closing{false}; + + TabID drumkit_tab_id; }; } // GUI:: diff --git a/plugingui/tabbutton.cc b/plugingui/tabbutton.cc index 845dedb..6a27f61 100644 --- a/plugingui/tabbutton.cc +++ b/plugingui/tabbutton.cc @@ -31,10 +31,18 @@ namespace GUI { +static TabID getNextTabID() +{ + static TabID next{0}; + next++; + return next; +} + TabButton::TabButton(Widget* parent, Widget* tab_widget) : ButtonBase(parent) , tab_widget(tab_widget) { + tab_id = getNextTabID(); CONNECT(this, clickNotifier, this, &TabButton::clickHandler); } @@ -77,6 +85,11 @@ void TabButton::setActive(bool active) redraw(); } +TabID TabButton::getID() const +{ + return tab_id; +} + void TabButton::repaintEvent(RepaintEvent* e) { Painter p(*this); diff --git a/plugingui/tabbutton.h b/plugingui/tabbutton.h index 29e6e05..1e9371a 100644 --- a/plugingui/tabbutton.h +++ b/plugingui/tabbutton.h @@ -37,6 +37,8 @@ namespace GUI class ScrollEvent; +using TabID = int; + class TabButton : public ButtonBase { @@ -49,6 +51,8 @@ public: std::size_t getMinimalHeight() const; void setActive(bool active); + TabID getID() const; + Notifier switchTabNotifier; Notifier scrollNotifier; // float delta @@ -58,6 +62,8 @@ protected: virtual void scrollEvent(ScrollEvent* scroll_event) override; private: + TabID tab_id; + void clickHandler(); Widget* tab_widget; diff --git a/plugingui/tabwidget.cc b/plugingui/tabwidget.cc index 7ba39c9..17a540e 100644 --- a/plugingui/tabwidget.cc +++ b/plugingui/tabwidget.cc @@ -39,7 +39,7 @@ TabWidget::TabWidget(Widget *parent) CONNECT(&stack, currentChanged, this, &TabWidget::setActiveButtons); } -void TabWidget::addTab(const std::string& title, Widget* widget) +TabID TabWidget::addTab(const std::string& title, Widget* widget) { buttons.emplace_back(this, widget); auto& button = buttons.back(); @@ -48,11 +48,13 @@ void TabWidget::addTab(const std::string& title, Widget* widget) CONNECT(&button, switchTabNotifier, this, &TabWidget::switchTab); CONNECT(&button, scrollNotifier, this, &TabWidget::rotateTab); sizeChanged(width(), height()); + return button.getID(); } void TabWidget::setTabWidth(std::size_t width) { tab_width = width; + relayout(); } std::size_t TabWidget::getTabWidth() const @@ -60,6 +62,19 @@ std::size_t TabWidget::getTabWidth() const return tab_width; } +void TabWidget::setVisible(TabID tab_id, bool visible) +{ + for (auto& button : buttons) + { + if(button.getID() == tab_id) + { + button.setVisible(visible); + relayout(); + return; + } + } +} + std::size_t TabWidget::getBarHeight() const { return topbar.height(); @@ -116,8 +131,12 @@ void TabWidget::sizeChanged(int width, int height) if(buttons.size() > 0) { - for (auto& button : buttons) + for(auto& button : buttons) { + if(!button.visible()) + { + continue; + } int min_width = button.getMinimalWidth(); button_width = std::max(button_width, min_width + button_border_width); } @@ -136,6 +155,10 @@ void TabWidget::sizeChanged(int width, int height) pos = button_padding_left; for(auto& button : buttons) { + if(!button.visible()) + { + continue; + } button.resize(button_width, bar_height); button.move(pos, 0); pos += button_width + button_padding_inner; @@ -145,4 +168,9 @@ void TabWidget::sizeChanged(int width, int height) stack.resize(width, std::max((int)height - bar_height, 0)); } +void TabWidget::relayout() +{ + sizeChanged(TabWidget::width(), TabWidget::height()); // Force re-layout +} + } // GUI:: diff --git a/plugingui/tabwidget.h b/plugingui/tabwidget.h index ff239a8..dc69776 100644 --- a/plugingui/tabwidget.h +++ b/plugingui/tabwidget.h @@ -43,18 +43,22 @@ public: //! Add new tab to the tab widget. //! \param title The title to display on the tab button. //! \param widget The widget to show in the tab. - void addTab(const std::string& title, Widget* widget); + //! \returns The TabID of the newly added tab. + TabID addTab(const std::string& title, Widget* widget); std::size_t getBarHeight() const; void setTabWidth(std::size_t width); std::size_t getTabWidth() const; + void setVisible(TabID tab_id, bool visible); + private: //! Callback for Widget::sizeChangeNotifier void sizeChanged(int width, int height); private: + void relayout(); //! Switch to the next tab if delta is > 0 or previous tab if delta is <= 0. void rotateTab(float delta); void switchTab(Widget* tabWidget); -- cgit v1.2.3