From 0e969842ccb1badc7689959c82208bd325cd01c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Thu, 23 Mar 2017 12:22:00 +0100 Subject: New Toggle class which includes the basic functionality of CheckBox --- plugingui/Makefile.am | 1 + plugingui/checkbox.cc | 96 +------------------------------------ plugingui/checkbox.h | 30 +----------- plugingui/toggle.cc | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ plugingui/toggle.h | 69 +++++++++++++++++++++++++++ 5 files changed, 203 insertions(+), 122 deletions(-) create mode 100644 plugingui/toggle.cc create mode 100644 plugingui/toggle.h diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am index 8180788..88e4cc8 100644 --- a/plugingui/Makefile.am +++ b/plugingui/Makefile.am @@ -34,6 +34,7 @@ nodist_libdggui_la_SOURCES = \ lineedit.cc \ led.cc \ checkbox.cc \ + toggle.cc \ mainwindow.cc \ slider.cc \ scrollbar.cc \ diff --git a/plugingui/checkbox.cc b/plugingui/checkbox.cc index 2a17635..499b2c1 100644 --- a/plugingui/checkbox.cc +++ b/plugingui/checkbox.cc @@ -32,63 +32,13 @@ namespace GUI { CheckBox::CheckBox(Widget* parent) - : Widget(parent) + : Toggle(parent) , bg_on(getImageCache(), ":switch_back_on.png") , bg_off(getImageCache(), ":switch_back_off.png") , knob(getImageCache(), ":switch_front.png") { } -void CheckBox::buttonEvent(ButtonEvent* buttonEvent) -{ - // Ignore everything except left clicks. - if(buttonEvent->button != MouseButton::left) - { - return; - } - - if((buttonEvent->direction == Direction::up) || buttonEvent->doubleClick) - { - buttonDown = false; - middle = false; - if(inCheckbox) - { - internalSetChecked(!state); - } - } - else - { - buttonDown = true; - middle = true; - } - - redraw(); -} - -void CheckBox::setText(std::string text) -{ - _text = text; - redraw(); -} - -void CheckBox::keyEvent(KeyEvent* keyEvent) -{ - if(keyEvent->keycode == Key::character && keyEvent->text == " ") - { - if(keyEvent->direction == Direction::up) - { - middle = false; - internalSetChecked(!state); - } - else - { - middle = true; - } - - redraw(); - } -} - void CheckBox::repaintEvent(RepaintEvent* repaintEvent) { Painter p(*this); @@ -97,7 +47,7 @@ void CheckBox::repaintEvent(RepaintEvent* repaintEvent) p.drawImage(0, (knob.height() - bg_on.height()) / 2, state ? bg_on : bg_off); - if(middle) + if(clicked) { p.drawImage((bg_on.width() - knob.width()) / 2 + 1, 0, knob); return; @@ -113,46 +63,4 @@ void CheckBox::repaintEvent(RepaintEvent* repaintEvent) } } -bool CheckBox::checked() -{ - return state; -} - -void CheckBox::setChecked(bool c) -{ - internalSetChecked(c); -} - -void CheckBox::mouseLeaveEvent() -{ - inCheckbox = false; - if(buttonDown) - { - middle = false; - redraw(); - } -} - -void CheckBox::mouseEnterEvent() -{ - inCheckbox = true; - if(buttonDown) - { - middle = true; - redraw(); - } -} - -void CheckBox::internalSetChecked(bool checked) -{ - if(checked == state) - { - return; - } - - state = checked; - stateChangedNotifier(state); - redraw(); -} - } // GUI:: diff --git a/plugingui/checkbox.h b/plugingui/checkbox.h index f85c1d9..6627304 100644 --- a/plugingui/checkbox.h +++ b/plugingui/checkbox.h @@ -26,50 +26,24 @@ */ #pragma once -#include - -#include "widget.h" +#include "toggle.h" #include "texture.h" namespace GUI { -class CheckBox : public Widget { +class CheckBox : public Toggle { public: CheckBox(Widget *parent); virtual ~CheckBox() = default; - void setText(std::string text); - - // From Widget: - bool isFocusable() override { return true; } - bool catchMouse() override { return true; } - - bool checked(); - void setChecked(bool checked); - - Notifier stateChangedNotifier; - protected: // From Widget: virtual void repaintEvent(RepaintEvent* repaintEvent) override; - virtual void buttonEvent(ButtonEvent* buttonEvent) override; - virtual void keyEvent(KeyEvent* keyEvent) override; - virtual void mouseLeaveEvent() override; - virtual void mouseEnterEvent() override; private: - void internalSetChecked(bool checked); - Texture bg_on; Texture bg_off; Texture knob; - - bool state{false}; - bool middle{false}; - bool buttonDown{false}; - bool inCheckbox{false}; - - std::string _text; }; } // GUI:: diff --git a/plugingui/toggle.cc b/plugingui/toggle.cc new file mode 100644 index 0000000..8168534 --- /dev/null +++ b/plugingui/toggle.cc @@ -0,0 +1,129 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * toggle.cc + * + * Wed Mar 22 22:58:57 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 "toggle.h" + +namespace GUI +{ + +Toggle::Toggle(Widget* parent) + : Widget(parent) +{ +} + +void Toggle::buttonEvent(ButtonEvent* buttonEvent) +{ + // Ignore everything except left clicks. + if(buttonEvent->button != MouseButton::left) + { + return; + } + + if((buttonEvent->direction == Direction::up) || buttonEvent->doubleClick) + { + buttonDown = false; + clicked = false; + if(inCheckbox) + { + internalSetChecked(!state); + } + } + else + { + buttonDown = true; + clicked = true; + } + + redraw(); +} + +void Toggle::setText(std::string text) +{ + _text = text; + redraw(); +} + +void Toggle::keyEvent(KeyEvent* keyEvent) +{ + if(keyEvent->keycode == Key::character && keyEvent->text == " ") + { + if(keyEvent->direction == Direction::up) + { + clicked = false; + internalSetChecked(!state); + } + else + { + clicked = true; + } + + redraw(); + } +} + +bool Toggle::checked() +{ + return state; +} + +void Toggle::setChecked(bool c) +{ + internalSetChecked(c); +} + +void Toggle::mouseLeaveEvent() +{ + inCheckbox = false; + if(buttonDown) + { + clicked = false; + redraw(); + } +} + +void Toggle::mouseEnterEvent() +{ + inCheckbox = true; + if(buttonDown) + { + clicked = true; + redraw(); + } +} + +void Toggle::internalSetChecked(bool checked) +{ + if(state == checked) + { + return; + } + + state = checked; + stateChangedNotifier(state); + redraw(); +} + +} // GUI:: diff --git a/plugingui/toggle.h b/plugingui/toggle.h new file mode 100644 index 0000000..b11db33 --- /dev/null +++ b/plugingui/toggle.h @@ -0,0 +1,69 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * toggle.h + * + * Wed Mar 22 22:58:57 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. + */ +#pragma once + +#include "widget.h" + +#include + +namespace GUI { + +class Toggle : public Widget { +public: + Toggle(Widget *parent); + virtual ~Toggle() = default; + + void setText(std::string text); + + // From Widget: + bool isFocusable() override { return true; } + bool catchMouse() override { return true; } + + bool checked(); + void setChecked(bool checked); + + Notifier stateChangedNotifier; + +protected: + // From Widget: + virtual void buttonEvent(ButtonEvent* buttonEvent) override; + virtual void keyEvent(KeyEvent* keyEvent) override; + virtual void mouseLeaveEvent() override; + virtual void mouseEnterEvent() override; + + bool state{false}; + bool clicked{false}; + bool buttonDown{false}; + bool inCheckbox{false}; + + std::string _text; + +private: + void internalSetChecked(bool checked); +}; + +} // GUI:: -- cgit v1.2.3