diff options
| -rw-r--r-- | plugingui/Makefile.am | 1 | ||||
| -rw-r--r-- | plugingui/checkbox.cc | 96 | ||||
| -rw-r--r-- | plugingui/checkbox.h | 30 | ||||
| -rw-r--r-- | plugingui/toggle.cc | 129 | ||||
| -rw-r--r-- | plugingui/toggle.h | 69 | 
5 files changed, 203 insertions, 122 deletions
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 <notifier.h> - -#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<bool> 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 <notifier.h> + +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<bool> 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::  | 
