summaryrefslogtreecommitdiff
path: root/dggui/frame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dggui/frame.cc')
-rw-r--r--dggui/frame.cc146
1 files changed, 146 insertions, 0 deletions
diff --git a/dggui/frame.cc b/dggui/frame.cc
new file mode 100644
index 0000000..d375b6d
--- /dev/null
+++ b/dggui/frame.cc
@@ -0,0 +1,146 @@
+/* -*- 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"
+
+namespace GUI
+{
+
+FrameWidget::FrameWidget(Widget* parent, bool has_switch, bool has_help_text)
+ : Widget(parent)
+ , 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);
+
+ power_button.setChecked(is_switched_on);
+ CONNECT(&power_button, stateChangedNotifier, this,
+ &FrameWidget::powerButtonStateChanged);
+ }
+ power_button.setVisible(has_switch);
+
+ if(has_help_text)
+ {
+ // We only have to set this once as nothing happens on a resize
+ help_button.resize(16, 16);
+ help_button.move(width() - 4 - 16, 4);
+ help_button.setText("?");
+ }
+ help_button.setVisible(has_help_text);
+
+ CONNECT(this, sizeChangeNotifier, this, &FrameWidget::sizeChanged);
+}
+
+void FrameWidget::repaintEvent(RepaintEvent* repaintEvent)
+{
+ Painter p(*this);
+
+ int center_x = width() / 2;
+ auto title_buf = title.c_str();
+
+ // draw the dark grey box
+ p.setColour(enabled ? grey_box_colour : grey_box_colour_disabled);
+ p.drawFilledRectangle(1, 1, width() - 2, bar_height);
+
+ // frame
+ p.setColour(frame_colour_top);
+ p.drawLine(0, 0, width() - 1, 0);
+ p.setColour(frame_colour_bottom);
+ p.drawLine(0, height() - 1, width() - 1, height() - 1);
+ p.setColour(frame_colour_side);
+ p.drawLine(0, 0, 0, height() - 1);
+ p.drawLine(width() - 1, 0, width() - 1, height() - 1);
+
+ // background
+ p.setColour(background_colour);
+ p.drawFilledRectangle(1, bar_height, width() - 2, height() - 2);
+
+ // draw the label
+ p.setColour(enabled ? label_colour : label_colour_disabled);
+ p.drawText(center_x - label_width, bar_height - 4, font, title_buf);
+ power_button.setEnabled(enabled);
+}
+
+void FrameWidget::powerButtonStateChanged(bool new_state)
+{
+ is_switched_on = new_state;
+ onSwitchChangeNotifier(is_switched_on);
+}
+
+void FrameWidget::setTitle(std::string const& title)
+{
+ this->title = title;
+ label_width = font.textWidth(title.c_str()) / 2 + 1;
+}
+
+void FrameWidget::setHelpText(const std::string& help_text)
+{
+ help_button.setHelpText(help_text);
+}
+
+void FrameWidget::setContent(Widget* content)
+{
+ this->content = content;
+ content->reparent(this);
+}
+
+void FrameWidget::setOnSwitch(bool on)
+{
+ is_switched_on = on;
+ power_button.setChecked(is_switched_on);
+}
+
+void FrameWidget::setEnabled(bool enabled)
+{
+ this->enabled = enabled;
+ onEnabledChanged(enabled);
+
+ redraw();
+}
+
+void FrameWidget::sizeChanged(int width, int height)
+{
+ if(content)
+ {
+ content_start_x = content_margin;
+ content_start_y = bar_height + content_margin;
+ content_width = std::max((int)width - 2 * content_margin, 0);
+ content_height = std::max((int)height - (bar_height + 2 * content_margin), 0);
+
+ content->move(content_start_x, content_start_y);
+ content->resize(content_width, content_height);
+ }
+
+ help_button.move(width - 4 - 16, help_button.y());
+}
+
+} // GUI::