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