summaryrefslogtreecommitdiff
path: root/plugingui/frame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugingui/frame.cc')
-rw-r--r--plugingui/frame.cc119
1 files changed, 119 insertions, 0 deletions
diff --git a/plugingui/frame.cc b/plugingui/frame.cc
new file mode 100644
index 0000000..f34eecf
--- /dev/null
+++ b/plugingui/frame.cc
@@ -0,0 +1,119 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * frame.cc
+ *
+ * Tue Feb 7 21:07:56 CET 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 "frame.h"
+
+#include "painter.h"
+
+// TODO: fix all the segfaults
+// TODO: change look to what it is in the fake GUI
+// TODO: replace CheckBox by some other name
+// TODO: maybe refactor the Toggle thingy
+// TODO: make it possible to use layouts recursively
+// TODO: make it possible to add layouts to tabs
+
+namespace GUI
+{
+
+FrameWidget::FrameWidget(Widget *parent, bool has_switch)
+ : Widget(parent)
+ , has_switch(has_switch)
+ , is_switched_on(!has_switch)
+ , bar_height(24)
+{
+ if (has_switch) {
+ // We only have to set this once as nothing happens on a resize
+ power_button.move(4, 4);
+ power_button.resize(16, 16);
+
+ CONNECT(&power_button, stateChangedNotifier, this, &FrameWidget::powerButtonClicked);
+ }
+ power_button.setVisible(has_switch);
+
+ CONNECT(this, sizeChangeNotifier, this, &FrameWidget::sizeChanged);
+}
+
+void FrameWidget::repaintEvent(RepaintEvent* repaintEvent)
+{
+ Painter p(*this);
+ p.clear();
+
+ int center_x = width() / 2;
+ auto title_buf = title.c_str();
+
+ // draw the dark grey box
+ p.setColour(grey_box_colour);
+ p.drawFilledRectangle(1, 1, width() - 2, bar_height);
+
+ // frame
+ p.setColour(frame_colour);
+ p.drawRectangle(0, 0, width() - 1, height() - 1);
+
+ // background
+ p.setColour(background_colour);
+ p.drawFilledRectangle(1, bar_height, width() - 2, height() - 2);
+
+ // draw the label
+ p.setColour(label_colour);
+ p.drawText(center_x - label_width, bar_height - 4, font, title_buf);
+}
+
+void FrameWidget::powerButtonClicked(bool clicked)
+{
+ is_switched_on = !is_switched_on;
+
+ if (content) {
+ content->setVisible(true);
+ }
+}
+
+void FrameWidget::setTitle(std::string const& title)
+{
+ this->title = title;
+ label_width = font.textWidth(title.c_str()) / 2 + 1;
+}
+
+void FrameWidget::setContent(Widget* content)
+{
+ this->content = content;
+ content->reparent(this);
+ content->setVisible(true);
+}
+
+void FrameWidget::sizeChanged(int width, int height)
+{
+ if (content) {
+ content_start_x = content_margin;
+ content_start_y = bar_height + content_margin;
+ content_width = width - 2*content_margin;
+ content_height = height - (bar_height + 2*content_margin);
+
+ content->move(content_start_x, content_start_y);
+ content->resize(content_width, content_height);
+ }
+}
+
+} // GUI::