summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndré Nusser <andre.nusser@googlemail.com>2017-04-16 12:54:16 +0200
committerAndré Nusser <andre.nusser@googlemail.com>2017-04-16 12:54:16 +0200
commit19b9cddf7d5ef3daac5cda481db492f28574d28d (patch)
treea3ca1d8ab84df69bd01c9bbab6d455c996cc462c
parentf4114b68d903eb5828c93910853ea9fdea004952 (diff)
Move button functionality to BaseButton. Create TabButton.
-rw-r--r--plugingui/Makefile.am1
-rw-r--r--plugingui/button.cc84
-rw-r--r--plugingui/button.h37
-rw-r--r--plugingui/button_base.cc97
-rw-r--r--plugingui/button_base.h74
-rw-r--r--plugingui/tabbutton.cc84
-rw-r--r--plugingui/tabbutton.h34
7 files changed, 297 insertions, 114 deletions
diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am
index 1dcff20..133c71f 100644
--- a/plugingui/Makefile.am
+++ b/plugingui/Makefile.am
@@ -29,6 +29,7 @@ nodist_libdggui_la_SOURCES = \
widget.cc \
colour.cc \
painter.cc \
+ button_base.cc \
button.cc \
pixelbuffer.cc \
lineedit.cc \
diff --git a/plugingui/button.cc b/plugingui/button.cc
index fb25390..0da79a0 100644
--- a/plugingui/button.cc
+++ b/plugingui/button.cc
@@ -28,49 +28,19 @@
#include "painter.h"
-#include <stdio.h>
#include <hugin.hpp>
+#include <stdio.h>
-namespace GUI {
-
-Button::Button(Widget *parent)
- : Widget(parent)
- , draw_state(up)
- , button_state(up)
+namespace GUI
{
-}
-Button::~Button()
+Button::Button(Widget* parent)
+ : ButtonBase(parent)
{
}
-void Button::buttonEvent(ButtonEvent* buttonEvent)
+Button::~Button()
{
- // Ignore everything except left clicks.
- if(buttonEvent->button != MouseButton::left)
- {
- return;
- }
-
- if(buttonEvent->direction == Direction::down)
- {
- draw_state = down;
- button_state = down;
- in_button = true;
- redraw();
- }
-
- if(buttonEvent->direction == Direction::up)
- {
- draw_state = up;
- button_state = up;
- redraw();
- if(in_button)
- {
- clicked();
- clickNotifier();
- }
- }
}
void Button::repaintEvent(RepaintEvent* repaintEvent)
@@ -89,48 +59,24 @@ void Button::repaintEvent(RepaintEvent* repaintEvent)
return;
}
- switch(draw_state) {
- case up:
+ switch(draw_state)
+ {
+ case State::Up:
box_up.setSize(w - padLeft, h - padTop);
p.drawImage(padLeft, padTop, box_up);
-
break;
- case down:
+
+ case State::Down:
box_down.setSize(w - padLeft, h - padTop);
p.drawImage(padLeft, padTop, box_down);
break;
}
p.setColour(Colour(0.1));
- p.drawText(width()/2-(text.length()*3)+(draw_state==up?0:1) + (padLeft / 2),
- height()/2+5+1+(draw_state==up?0:1) + (padTop / 2), font, text,
- true);
-}
-
-void Button::setText(const std::string& text)
-{
- this->text = text;
- redraw();
-}
-
-void Button::mouseLeaveEvent()
-{
- in_button = false;
- if(button_state == down)
- {
- draw_state = up;
- redraw();
- }
-}
-
-void Button::mouseEnterEvent()
-{
- in_button = true;
- if(button_state == down)
- {
- draw_state = down;
- redraw();
- }
+ auto x = (w / 2) - (3 * text.length()) + (draw_state == State::Up ? 0 : 1) +
+ (padLeft / 2);
+ auto y = (h / 2) + 5 + 1 + (draw_state == State::Up ? 0 : 1) + (padTop / 2);
+ p.drawText(x, y, font, text, true);
}
-} //GUI::
+} // GUI::
diff --git a/plugingui/button.h b/plugingui/button.h
index 04656ba..fde0459 100644
--- a/plugingui/button.h
+++ b/plugingui/button.h
@@ -26,42 +26,23 @@
*/
#pragma once
-#include <string>
-
-#include <notifier.h>
-
-#include "widget.h"
-#include "painter.h"
+#include "button_base.h"
#include "font.h"
#include "texturedbox.h"
namespace GUI {
-class Button : public Widget {
+class Button
+ : public ButtonBase {
public:
- Button(Widget *parent);
+ Button(Widget* parent);
virtual ~Button();
- // From Widget:
- bool isFocusable() override { return true; }
- bool catchMouse() override { return true; }
-
- void setText(const std::string& text);
-
- Notifier<> clickNotifier;
-
protected:
- virtual void clicked() {}
-
// From Widget:
virtual void repaintEvent(RepaintEvent* e) override;
- virtual void buttonEvent(ButtonEvent* e) override;
- virtual void mouseLeaveEvent() override;
- virtual void mouseEnterEvent() override;
private:
- bool in_button{false};
-
TexturedBox box_up{getImageCache(), ":pushbutton.png",
0, 0, // atlas offset (x, y)
11, 1, 11, // dx1, dx2, dx3
@@ -72,17 +53,7 @@ private:
11, 1, 11, // dx1, dx2, dx3
10, 72, 12}; // dy1, dy2, dy3
- typedef enum {
- up,
- down
- } state_t;
-
- std::string text;
-
Font font{":fontemboss.png"};
-
- state_t draw_state{up};
- state_t button_state{up};
};
} // GUI::
diff --git a/plugingui/button_base.cc b/plugingui/button_base.cc
new file mode 100644
index 0000000..1030bbc
--- /dev/null
+++ b/plugingui/button_base.cc
@@ -0,0 +1,97 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * button_base.cc
+ *
+ * Sat Apr 15 21:45:30 CEST 2017
+ * Copyright 2017 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "button_base.h"
+
+namespace GUI {
+
+ButtonBase::ButtonBase(Widget *parent)
+ : Widget(parent)
+ , draw_state(State::Up)
+ , button_state(State::Up)
+{
+}
+
+ButtonBase::~ButtonBase()
+{
+}
+
+void ButtonBase::buttonEvent(ButtonEvent* buttonEvent)
+{
+ // Ignore everything except left clicks.
+ if(buttonEvent->button != MouseButton::left)
+ {
+ return;
+ }
+
+ if(buttonEvent->direction == Direction::down)
+ {
+ draw_state = State::Down;
+ button_state = State::Down;
+ in_button = true;
+ redraw();
+ }
+
+ if(buttonEvent->direction == Direction::up)
+ {
+ draw_state = State::Up;
+ button_state = State::Up;
+ redraw();
+ if(in_button)
+ {
+ clicked();
+ clickNotifier();
+ }
+ }
+}
+
+void ButtonBase::setText(const std::string& text)
+{
+ this->text = text;
+ redraw();
+}
+
+void ButtonBase::mouseLeaveEvent()
+{
+ in_button = false;
+ if(button_state == State::Down)
+ {
+ draw_state = State::Up;
+ redraw();
+ }
+}
+
+void ButtonBase::mouseEnterEvent()
+{
+ in_button = true;
+ if(button_state == State::Down)
+ {
+ draw_state = State::Down;
+ redraw();
+ }
+}
+
+} // GUI::
diff --git a/plugingui/button_base.h b/plugingui/button_base.h
new file mode 100644
index 0000000..a21a084
--- /dev/null
+++ b/plugingui/button_base.h
@@ -0,0 +1,74 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ * button_base.h
+ *
+ * Sat Apr 15 21:45:30 CEST 2017
+ * Copyright 2017 André Nusser
+ * andre.nusser@googlemail.com
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * DrumGizmo is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#pragma once
+
+#include <string>
+
+#include <notifier.h>
+
+#include "widget.h"
+
+namespace GUI {
+
+class ButtonBase
+ : public Widget
+{
+public:
+ ButtonBase(Widget* parent);
+ virtual ~ButtonBase();
+
+ // From Widget:
+ bool isFocusable() override { return true; }
+ bool catchMouse() override { return true; }
+
+ void setText(const std::string& text);
+
+ Notifier<> clickNotifier;
+
+protected:
+ virtual void clicked() {}
+
+ // From Widget:
+ virtual void repaintEvent(RepaintEvent* e) override {};
+ virtual void buttonEvent(ButtonEvent* e) override;
+ virtual void mouseLeaveEvent() override;
+ virtual void mouseEnterEvent() override;
+
+ bool in_button{false};
+
+ enum class State {
+ Up,
+ Down
+ };
+
+ std::string text;
+
+ State draw_state{State::Up};
+ State button_state{State::Up};
+};
+
+} // GUI::
diff --git a/plugingui/tabbutton.cc b/plugingui/tabbutton.cc
index 2a55572..1fc4619 100644
--- a/plugingui/tabbutton.cc
+++ b/plugingui/tabbutton.cc
@@ -26,24 +26,96 @@
*/
#include "tabbutton.h"
+#include "painter.h"
+
namespace GUI
{
-TabButton::TabButton(Widget* parent, Widget* tabWidget)
- : Button(parent)
- , tabWidget(tabWidget)
+TabButton::TabButton(Widget* parent, Widget* tab_widget)
+ : ButtonBase(parent)
+ , tab_widget(tab_widget)
{
CONNECT(this, clickNotifier, this, &TabButton::clickHandler);
}
-Widget *TabButton::getTabWidget()
+TabButton::~TabButton()
+{
+}
+
+Widget* TabButton::getTabWidget()
+{
+ return tab_widget;
+}
+
+std::size_t TabButton::getMinimalWidth() const
{
- return tabWidget;
+ std::size_t padding = 15;
+ auto font_width = font.textWidth(text);
+
+ return font_width + padding;
+}
+
+std::size_t TabButton::getMinimalHeight() const
+{
+ std::size_t padding = 10;
+ auto font_height= font.textHeight(text);
+
+ return font_height + padding;
+}
+
+void TabButton::setActive(bool active)
+{
+ if (active) {
+ draw_state = State::Down;
+ }
+ else {
+ draw_state = State::Up;
+ }
+
+ redraw();
+}
+
+void TabButton::repaintEvent(RepaintEvent* e)
+{
+ Painter p(*this);
+
+ p.clear();
+
+ int padTop = 3;
+ int padLeft = 0;
+
+ int w = width();
+ int h = height();
+ if(w == 0 || h == 0)
+ {
+ return;
+ }
+
+ switch(draw_state)
+ {
+ case State::Up:
+ tab_passive.setSize(w - padLeft, h - padTop);
+ p.drawImage(padLeft, padTop, tab_passive);
+ break;
+
+ case State::Down:
+ tab_active.setSize(w - padLeft, h - padTop);
+ p.drawImage(padLeft, padTop, tab_active);
+ break;
+ }
+
+ p.setColour(Colour(0.1));
+ // FIXME: fix all the magic values here
+ auto x = (width() / 2) - (3 * text.length()) +
+ (draw_state == State::Up ? 0 : 1) + (padLeft / 2);
+ auto y = (height() / 2) + 5 + 1 + (draw_state == State::Up ? 0 : 1) +
+ (padTop / 2);
+ p.drawText(x, y + 4, font, text, true);
}
void TabButton::clickHandler()
{
- switchTabNotifier(tabWidget);
+ switchTabNotifier(tab_widget);
}
} // GUI::
diff --git a/plugingui/tabbutton.h b/plugingui/tabbutton.h
index 2f5e287..2f0dc10 100644
--- a/plugingui/tabbutton.h
+++ b/plugingui/tabbutton.h
@@ -28,26 +28,48 @@
#include <notifier.h>
-#include "widget.h"
-#include "button.h"
+#include "button_base.h"
+#include "font.h"
+#include "texturedbox.h"
namespace GUI
{
class TabButton
- : public Button
+ : public ButtonBase
{
public:
- TabButton(Widget* parent, Widget* tabWidget);
+ TabButton(Widget* parent, Widget* tab_widget);
+ virtual ~TabButton();
- Widget *getTabWidget();
+ Widget* getTabWidget();
+ std::size_t getMinimalWidth() const;
+ std::size_t getMinimalHeight() const;
+ void setActive(bool active);
Notifier<Widget*> switchTabNotifier;
+protected:
+ // From Widget:
+ virtual void repaintEvent(RepaintEvent* e) override;
+
private:
void clickHandler();
- Widget* tabWidget;
+ Widget* tab_widget;
+ bool active;
+
+ TexturedBox tab_active{getImageCache(), ":tab.png",
+ 0, 0, // atlas offset (x, y)
+ 5, 1, 5, // dx1, dx2, dx3
+ 5, 13, 1}; // dy1, dy2, dy3
+
+ TexturedBox tab_passive{getImageCache(), ":tab.png",
+ 11, 0, // atlas offset (x, y)
+ 5, 1, 5, // dx1, dx2, dx3
+ 5, 13, 1}; // dy1, dy2, dy3
+
+ Font font{":fontemboss.png"};
};
} // GUI::