summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2016-11-24 20:29:29 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2017-01-21 14:51:30 +0100
commit586fac8e8daa7665302b075f900d8d2df90716f9 (patch)
treebfb02ad2e88d6e6b3e6bd013853a0792de951849
parent8976d1106ac40e74b7bdc4d0401003126cee53d8 (diff)
Added TabWidget.
-rw-r--r--plugingui/Makefile.am3
-rw-r--r--plugingui/Makefile.am.plugingui2
-rw-r--r--plugingui/stackedwidget.cc12
-rw-r--r--plugingui/stackedwidget.h4
-rw-r--r--plugingui/tabbutton.cc49
-rw-r--r--plugingui/tabbutton.h53
-rw-r--r--plugingui/tabwidget.cc69
-rw-r--r--plugingui/tabwidget.h55
-rw-r--r--plugingui/widget.cc20
-rw-r--r--plugingui/widget.h1
10 files changed, 268 insertions, 0 deletions
diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am
index 21a78f8..49025c7 100644
--- a/plugingui/Makefile.am
+++ b/plugingui/Makefile.am
@@ -56,6 +56,9 @@ EXTRA_DIST = \
resource_data.h \
scrollbar.h \
slider.h \
+ stackedwidget.h \
+ tabbutton.h \
+ tabwidget.h \
textedit.h \
texture.h \
texturedbox.h \
diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui
index 0e48f29..42824cc 100644
--- a/plugingui/Makefile.am.plugingui
+++ b/plugingui/Makefile.am.plugingui
@@ -19,6 +19,8 @@ PLUGIN_GUI_SOURCES = \
$(top_srcdir)/plugingui/slider.cc \
$(top_srcdir)/plugingui/scrollbar.cc \
$(top_srcdir)/plugingui/stackedwidget.cc \
+ $(top_srcdir)/plugingui/tabbutton.cc \
+ $(top_srcdir)/plugingui/tabwidget.cc \
$(top_srcdir)/plugingui/textedit.cc \
$(top_srcdir)/plugingui/texture.cc \
$(top_srcdir)/plugingui/texturedbox.cc \
diff --git a/plugingui/stackedwidget.cc b/plugingui/stackedwidget.cc
index 77f0f58..069e80b 100644
--- a/plugingui/stackedwidget.cc
+++ b/plugingui/stackedwidget.cc
@@ -32,6 +32,7 @@ namespace GUI
StackedWidget::StackedWidget(Widget *parent)
: Widget(parent)
{
+ CONNECT(this, sizeChangeNotifier, this, &StackedWidget::sizeChanged);
}
StackedWidget::~StackedWidget()
@@ -41,6 +42,7 @@ StackedWidget::~StackedWidget()
void StackedWidget::addWidget(Widget *widget)
{
widgets.push_back(widget);
+ widget->reparent(this);
if(currentWidget == nullptr)
{
@@ -91,4 +93,14 @@ void StackedWidget::setCurrentWidget(Widget *widget)
currentChanged(currentWidget);
}
+void StackedWidget::sizeChanged(int width, int height)
+{
+ // Propagate size change to child:
+ if(currentWidget)
+ {
+ currentWidget->move(0, 0);
+ currentWidget->resize(width, height);
+ }
+}
+
} // GUI::
diff --git a/plugingui/stackedwidget.h b/plugingui/stackedwidget.h
index 903aa17..13d764b 100644
--- a/plugingui/stackedwidget.h
+++ b/plugingui/stackedwidget.h
@@ -62,6 +62,10 @@ public:
Notifier<Widget*> currentChanged;
private:
+ //! Callback for Widget::sizeChangeNotifier
+ void sizeChanged(int width, int height);
+
+private:
Widget* currentWidget{nullptr};
std::list<Widget*> widgets;
};
diff --git a/plugingui/tabbutton.cc b/plugingui/tabbutton.cc
new file mode 100644
index 0000000..2a55572
--- /dev/null
+++ b/plugingui/tabbutton.cc
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * tabbutton.cc
+ *
+ * Thu Nov 24 18:52:26 CET 2016
+ * Copyright 2016 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * 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 "tabbutton.h"
+
+namespace GUI
+{
+
+TabButton::TabButton(Widget* parent, Widget* tabWidget)
+ : Button(parent)
+ , tabWidget(tabWidget)
+{
+ CONNECT(this, clickNotifier, this, &TabButton::clickHandler);
+}
+
+Widget *TabButton::getTabWidget()
+{
+ return tabWidget;
+}
+
+void TabButton::clickHandler()
+{
+ switchTabNotifier(tabWidget);
+}
+
+} // GUI::
diff --git a/plugingui/tabbutton.h b/plugingui/tabbutton.h
new file mode 100644
index 0000000..2f5e287
--- /dev/null
+++ b/plugingui/tabbutton.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * tabbutton.h
+ *
+ * Thu Nov 24 18:52:26 CET 2016
+ * Copyright 2016 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * 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 <notifier.h>
+
+#include "widget.h"
+#include "button.h"
+
+namespace GUI
+{
+
+class TabButton
+ : public Button
+{
+public:
+ TabButton(Widget* parent, Widget* tabWidget);
+
+ Widget *getTabWidget();
+
+ Notifier<Widget*> switchTabNotifier;
+
+private:
+ void clickHandler();
+
+ Widget* tabWidget;
+};
+
+} // GUI::
diff --git a/plugingui/tabwidget.cc b/plugingui/tabwidget.cc
new file mode 100644
index 0000000..6988d39
--- /dev/null
+++ b/plugingui/tabwidget.cc
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * tabwidget.cc
+ *
+ * Thu Nov 24 17:46:22 CET 2016
+ * Copyright 2016 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * 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 "tabwidget.h"
+
+namespace GUI
+{
+
+TabWidget::TabWidget(Widget *parent)
+ : Widget(parent)
+ , stack(this)
+{
+ CONNECT(this, sizeChangeNotifier, this, &TabWidget::sizeChanged);
+}
+
+void TabWidget::addTab(const std::string& title, Widget* widget)
+{
+ buttons.emplace_back(this, widget);
+ auto& button = buttons.back();
+ button.setText(title);
+ stack.addWidget(widget);
+ CONNECT(&button, switchTabNotifier, this, &TabWidget::switchTab);
+ sizeChanged(width(), height());
+}
+
+void TabWidget::switchTab(Widget* tabWidget)
+{
+ stack.setCurrentWidget(tabWidget);
+}
+
+void TabWidget::sizeChanged(int width, int height)
+{
+ std::size_t pos = 0;
+ std::size_t buttonWidth = width / buttons.size();
+ for(auto& button : buttons)
+ {
+ button.resize(buttonWidth, 40);
+ button.move(pos, 0);
+ pos += buttonWidth;
+ }
+
+ stack.move(0, 40);
+ stack.resize(width, height - 40);
+}
+
+} // GUI::
diff --git a/plugingui/tabwidget.h b/plugingui/tabwidget.h
new file mode 100644
index 0000000..4a9cba2
--- /dev/null
+++ b/plugingui/tabwidget.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * tabwidget.h
+ *
+ * Thu Nov 24 17:46:22 CET 2016
+ * Copyright 2016 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * 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 "widget.h"
+#include "tabbutton.h"
+#include "stackedwidget.h"
+
+namespace GUI
+{
+
+class TabWidget
+ : public Widget
+{
+public:
+ TabWidget(Widget *parent);
+
+ void addTab(const std::string& title, Widget* widget);
+
+private:
+ //! Callback for Widget::sizeChangeNotifier
+ void sizeChanged(int width, int height);
+
+private:
+ void switchTab(Widget* tabWidget);
+
+ std::list<TabButton> buttons;
+ StackedWidget stack;
+};
+
+} // GUI::
diff --git a/plugingui/widget.cc b/plugingui/widget.cc
index 3d9d47c..4b1d1f7 100644
--- a/plugingui/widget.cc
+++ b/plugingui/widget.cc
@@ -92,6 +92,26 @@ void Widget::removeChild(Widget* widget)
}
}
+void Widget::reparent(Widget* parent)
+{
+ if(parent == this->parent)
+ {
+ return; // Already at the right parent.
+ }
+
+ if(this->parent)
+ {
+ this->parent->removeChild(this);
+ }
+
+ if(parent)
+ {
+ parent->addChild(this);
+ }
+
+ this->parent = parent;
+}
+
void Widget::resize(int width, int height)
{
if((width < 1) || (height < 1) ||
diff --git a/plugingui/widget.h b/plugingui/widget.h
index 26070c5..03e8ab0 100644
--- a/plugingui/widget.h
+++ b/plugingui/widget.h
@@ -74,6 +74,7 @@ public:
void addChild(Widget* widget);
void removeChild(Widget* widget);
+ void reparent(Widget* parent);
virtual void repaintEvent(RepaintEvent* repaintEvent) {}
virtual void mouseMoveEvent(MouseMoveEvent* mouseMoveEvent) {}