1 /* B.Oops
2  * Glitch effect sequencer LV2 plugin
3  *
4  * Copyright (C) 2019 by Sven Jähnichen
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20 
21 #include "ValueSelect.hpp"
22 #include "BUtilities/to_string.hpp"
23 #include "BUtilities/stof.hpp"
24 
ValueSelect()25 ValueSelect::ValueSelect () : ValueSelect (0, 0, 0, 0, "select", 0, 0, 1, 0) {}
26 
ValueSelect(const double x,const double y,const double width,const double height,const std::string & name,const double value,const double min,const double max,const double step)27 ValueSelect::ValueSelect (const double  x, const double y, const double width, const double height, const std::string& name,
28 		 	 	 	 	  const double value, const double min, const double max, const double step) :
29 	RangeWidget (x, y, width, height, name, value, min, max, step),
30 	upClick (0, 0, height, height, name + "/click"),
31 	downClick (width - height, 0, height, height, name + "/click"),
32 	display (height, 0, width - 2 * height, height, name + "/label", "0")
33 {
34 	setDraggable (true);
35 	setScrollable (true);
36 	display.setEditable (true);
37 
38 	upClick.setCallbackFunction(BEvents::EventType::BUTTON_PRESS_EVENT, ValueSelect::buttonPressedCallback);
39 	downClick.setCallbackFunction(BEvents::EventType::BUTTON_PRESS_EVENT, ValueSelect::buttonPressedCallback);
40 	display.setCallbackFunction(BEvents::EventType::POINTER_DRAG_EVENT, ValueSelect::displayDraggedCallback);
41 	display.setCallbackFunction(BEvents::EventType::MESSAGE_EVENT, displayMessageCallback);
42 
43 	add (upClick);
44 	add (display);
45 	add (downClick);
46 
47 	upClick.setScrollable (false);
48 	downClick.setScrollable (false);
49 	display.setScrollable (false);
50 }
51 
applyTheme(BStyles::Theme & theme)52 void ValueSelect::applyTheme (BStyles::Theme& theme) {applyTheme (theme, name_);}
53 
applyTheme(BStyles::Theme & theme,const std::string & name)54 void ValueSelect::applyTheme (BStyles::Theme& theme, const std::string& name)
55 {
56 	//Widget::applyTheme (theme, name);
57 	upClick.applyTheme (theme, name + "/click");
58 	display.applyTheme (theme, name + "/label");
59 	downClick.applyTheme (theme, name + "/click");
60 }
61 
update()62 void ValueSelect::update ()
63 {
64 	upClick.resize (getHeight(), getHeight());
65 
66 	display.moveTo (getHeight(), 0);
67 	display.resize (getWidth() - 2 * getHeight(), getHeight());
68 	display.setText (BUtilities::to_string (value, "%2.2f"));
69 
70 	downClick.moveTo (getWidth() - getHeight(), 0);
71 	downClick.resize (getHeight(), getHeight());
72 }
73 
onPointerDragged(BEvents::PointerEvent * event)74 void ValueSelect::onPointerDragged (BEvents::PointerEvent* event)
75 {
76 	if (event->getButton () == BDevices::LEFT_BUTTON) setValue (getValue () - event->getDelta().y * getStep ());
77 }
78 
onWheelScrolled(BEvents::WheelEvent * event)79 void ValueSelect::onWheelScrolled (BEvents::WheelEvent* event)
80 {
81 	setValue (getValue () + event->getDelta().y * getStep ());
82 }
83 
buttonPressedCallback(BEvents::Event * event)84 void ValueSelect::buttonPressedCallback (BEvents::Event* event)
85 {
86 	if ((event) && (((BEvents::PointerEvent*)event)->getButton () == BDevices::LEFT_BUTTON))
87 	{
88 		Widget* w = event->getWidget();
89 
90 		if (w)
91 		{
92 			ValueSelect* p = (ValueSelect*) w->getParent();
93 
94 			if (p)
95 			{
96 				if (w == (Widget*) &p->upClick) p->setValue (p->getValue () + p->getStep());
97 				else if (w == (Widget*) &p->downClick) p->setValue (p->getValue () - p->getStep());
98 			}
99 		}
100 	}
101 }
102 
displayDraggedCallback(BEvents::Event * event)103 void ValueSelect::displayDraggedCallback (BEvents::Event* event)
104 {
105 	if (event && event->getWidget())
106 	{
107 		BWidgets::Label* l = (BWidgets::Label*)event->getWidget();
108 		ValueSelect* v = (ValueSelect*)l->getParent();
109 		if (v && (!l->getEditMode())) v->onPointerDragged ((BEvents::PointerEvent*)event);
110 	}
111 }
112 
displayMessageCallback(BEvents::Event * event)113 void ValueSelect::displayMessageCallback (BEvents::Event* event)
114 {
115 	if (event && event->getWidget())
116 	{
117 		BWidgets::Label* l = (BWidgets::Label*)event->getWidget();
118 		ValueSelect* v = (ValueSelect*)l->getParent();
119 		if (v)
120 		{
121 			double val;
122 			try {val = BUtilities::stof (l->getText());}
123 			catch (std::invalid_argument &ia)
124 			{
125 				fprintf (stderr, "%s\n", ia.what());
126 				v->update();
127 				return;
128 			}
129 
130 			v->setValue (val);
131 		}
132 	}
133 }
134