1 /* B.SEQuencer
2  * MIDI Step Sequencer LV2 Plugin
3  *
4  * Copyright (C) 2018, 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 #ifndef BSEQUENCER_GUI_HPP_
22 #define BSEQUENCER_GUI_HPP_
23 
24 #include <lv2/lv2plug.in/ns/lv2core/lv2.h>
25 #include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
26 #include <lv2/lv2plug.in/ns/ext/atom/atom.h>
27 #include <lv2/lv2plug.in/ns/ext/atom/forge.h>
28 #include <lv2/lv2plug.in/ns/ext/time/time.h>
29 #include <lv2/lv2plug.in/ns/ext/midi/midi.h>
30 #include <iostream>
31 #include <algorithm>
32 
33 #include "BWidgets/BItems.hpp"
34 #include "BWidgets/Widget.hpp"
35 #include "BWidgets/Window.hpp"
36 #include "BWidgets/Label.hpp"
37 #include "BWidgets/DrawingSurface.hpp"
38 #include "BWidgets/HSliderValue.hpp"
39 #include "BWidgets/VSliderValue.hpp"
40 #include "BWidgets/DialValue.hpp"
41 #include "BWidgets/HSwitch.hpp"
42 #include "BWidgets/TextToggleButton.hpp"
43 #include "BWidgets/Text.hpp"
44 #include "BWidgets/PopupListBox.hpp"
45 #include "BWidgets/ImageIcon.hpp"
46 #include "screen.h"
47 
48 #ifdef LOCALEFILE
49 #include LOCALEFILE
50 #else
51 #include "Locale_EN.hpp"
52 #endif
53 
54 #include "BScale.hpp"
55 #include "ScaleMap.hpp"
56 #include "drawbutton.hpp"
57 #include "PlayStopButton.hpp"
58 #include "ButtonBox.hpp"
59 #include "HaloButton.hpp"
60 #include "ResetButton.hpp"
61 #include "UndoButton.hpp"
62 #include "RedoButton.hpp"
63 #include "PadSurface.hpp"
64 #include "DialRangeValue.hpp"
65 #include "definitions.h"
66 #include "ports.h"
67 #include "urids.h"
68 #include "Pad.hpp"
69 #include "PadMessage.hpp"
70 #include "ScaleEditor.hpp"
71 #include "Journal.hpp"
72 #include "Pattern.hpp"
73 
74 #define BG_FILE "surface.png"
75 #define EDIT_SYMBOL "EditSymbol.png"
76 #define HELP_URL "https://github.com/sjaehn/BSEQuencer/wiki/B.SEQuencer"
77 #define YT_URL "https://www.youtube.com/watch?v=J6bU4GdUVYc"
78 #define WWW_BROWSER_CMD "x-www-browser"
79 
80 #define RESIZE(widget, x, y, w, h, sz) widget.moveTo ((x) * (sz), (y) * (sz)); widget.resize ((w) * (sz), (h) * (sz));
81 class BSEQuencer_GUI : public BWidgets::Window
82 {
83 public:
84 	BSEQuencer_GUI (const char *bundle_path, const LV2_Feature *const *features, PuglNativeView parentWindow);
85 	~BSEQuencer_GUI ();
86 	void port_event (uint32_t port_index, uint32_t buffer_size, uint32_t format, const void *buffer);
87 	void send_ui_on ();
88 	void send_ui_off ();
89 	void send_pad (int row, int step);
90 	void send_scaleMaps (int scaleNr);
91 	virtual void onConfigureRequest (BEvents::ExposeEvent* event) override;
92 	virtual void onCloseRequest (BEvents::WidgetEvent* event) override;
93 	virtual void onKeyPressed (BEvents::KeyEvent* event) override;
94 	virtual void onKeyReleased (BEvents::KeyEvent* event) override;
95 	void applyTheme (BStyles::Theme& theme) override;
96 
97 	LV2UI_Controller controller;
98 	LV2UI_Write_Function write_function;
99 
100 private:
101 	static void valueChangedCallback(BEvents::Event* event);
102 	static void helpPressedCallback (BEvents::Event* event);
103 	static void ytPressedCallback (BEvents::Event* event);
104 	static void editPressedCallback (BEvents::Event* event);
105 	static void resetClickedCallback (BEvents::Event* event);
106 	static void undoClickedCallback (BEvents::Event* event);
107 	static void padsPressedCallback (BEvents::Event* event);
108 	static void padsScrolledCallback (BEvents::Event* event);
109 	static void padsFocusedCallback (BEvents::Event* event);
110 	void scale ();
111 	void scaleFocus ();
112 	void drawCaption ();
113 	void drawPad ();
114 	void drawPad (const int row, const int step);
115 	void drawPad (cairo_t* cr, const int row, const int step);
116 	bool padIsSelected (const int row, const int step);
117 	int padGetChannel (const int row, const int step);
118 	int padGetControl (const int row, const int step);
119 	void padClip (const int row, const int step);
120 
121 
122 	std::string pluginPath;
123 	double sz;
124 	cairo_surface_t* bgImageSurface;
125 
126 	BSEQuencerURIs uris;
127 	LV2_Atom_Forge forge;
128 
129 	// Controllers
130 	std::array<BWidgets::ValueWidget*, KNOBS_SIZE> controllerWidgets;
131 	std::array<float, KNOBS_SIZE> controllers;
132 
133 	//Pads
134 	Pattern pattern;
135 
136 	struct ClipBoard
137 	{
138 		std::vector<std::vector<Pad>> data;
139 		std::pair<int, int> origin;
140 		std::pair<int, int> extends;
141 		bool ready = true;
142 		std::chrono::steady_clock::time_point time;
143 	};
144 
145 	ClipBoard clipBoard;
146 
147 
148 	// Cursors
149 	uint32_t cursorBits [MAXSTEPS];
150 	uint32_t noteBits;
151 	uint32_t chBits;
152 
153 	// Temporary tools
154 	bool tempTool;
155 	double tempToolCh;
156 	bool wheelScrolled;
157 
158 	enum ModifierIndex
159 	{
160 		MODIFIER_VELOCITY = 0,
161 		MODIFIER_DURATION = 1,
162 		MODIFIER_OCTAVE = 2
163 	};
164 	ModifierIndex modifier;
165 
166 	ScaleMap scaleMaps[NR_SYSTEM_SCALES + NR_USER_SCALES];
167 
168 	//Widgets
169 	BWidgets::Widget mContainer;
170 	PadSurface padSurface;
171 	BWidgets::DrawingSurface captionSurface;
172 
173 	BWidgets::Widget modeBox;
174 	BWidgets::Label modeBoxLabel;
175 	BWidgets::Label modeLabel;
176 	BWidgets::PopupListBox modeListBox;
177 	BWidgets::Label modeAutoplayBpmLabel;
178 	BWidgets::HSliderValue modeAutoplayBpmSlider;
179 	BWidgets::Label modeAutoplayBpbLabel;
180 	BWidgets::HSliderValue modeAutoplayBpbSlider;
181 	BWidgets::Label modeMidiInChannelLabel;
182 	BWidgets::PopupListBox modeMidiInChannelListBox;
183 	BWidgets::Label modeOnKeyLabel;
184 	BWidgets::PopupListBox modeOnKeyListBox;
185 	BWidgets::Label modePlayLabel;
186 	PlayStopButton modePlayButton;
187 
188 	BWidgets::Widget toolBox;
189 	BWidgets::Label toolBoxLabel;
190 	ButtonBox toolButtonBox;
191 	BWidgets::TextToggleButton toolWholeStepButton;
192 	ResetButton toolResetButton;
193 	UndoButton toolUndoButton;
194 	RedoButton toolRedoButton;
195 	BWidgets::Label toolButtonBoxCtrlLabel;
196 	BWidgets::Label toolButtonBoxChLabel;
197 	BWidgets::Label toolButtonBoxEditLabel;
198 	BWidgets::Label toolGateLabel;
199 	BWidgets::VSliderValue toolGateSlider;
200 	BWidgets::Label toolNoteLabel;
201 	DialRangeValue toolNoteDial;
202 	BWidgets::Label toolOctaveLabel;
203 	DialRangeValue toolOctaveDial;
204 	BWidgets::Label toolVelocityLabel;
205 	DialRangeValue toolVelocityDial;
206 	BWidgets::Label toolDurationLabel;
207 	DialRangeValue toolDurationDial;
208 
209 
210 	BWidgets::Widget propertiesBox;
211 	BWidgets::Label propertiesBoxLabel;
212 	BWidgets::Label propertiesNrStepsLabel;
213 	BWidgets::PopupListBox propertiesNrStepsListBox;
214 	BWidgets::Label propertiesStepsPerLabel;
215 	BWidgets::HSliderValue propertiesStepsPerSlider;
216 	BWidgets::PopupListBox propertiesBaseListBox;
217 	BWidgets::Label propertiesRootLabel;
218 	BWidgets::PopupListBox propertiesRootListBox;
219 	BWidgets::PopupListBox propertiesSignatureListBox;
220 	BWidgets::Label propertiesOctaveLabel;
221 	BWidgets::PopupListBox propertiesOctaveListBox;
222 	BWidgets::Label propertiesScaleLabel;
223 	BWidgets::ImageIcon propertiesScaleEditIcon;
224 	BWidgets::PopupListBox propertiesScaleListBox;
225 
226 	struct ChBox
227 	{
228 		BWidgets::Widget box;
229 		BWidgets::Label chLabel;
230 		BWidgets::DrawingSurface chSymbol;
231 		BWidgets::Label pitchLabel;
232 		BWidgets::HSwitch pitchSwitch;
233 		BWidgets::Widget pitchScreen;
234 		BWidgets::Label channelLabel;
235 		BWidgets::PopupListBox channelListBox;
236 		BWidgets::Label velocityLabel;
237 		BWidgets::DialValue velocityDial;
238 		BWidgets::Label noteOffsetLabel;
239 		BWidgets::DialValue noteOffsetDial;
240 	};
241 
242 	std::array<ChBox, NR_SEQUENCER_CHS> chBoxes;
243 
244 	HaloButton helpButton;
245 	HaloButton ytButton;
246 	ScaleEditor* scaleEditor;
247 
248 	// Definition of styles
249 	BColors::ColorSet fgColors = {{{0.0, 0.25, 0.75, 1.0}, {0.25, 0.75, 0.75, 1.0}, {0.0, 0.0, 0.1, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
250 	BColors::ColorSet fgColors_ch1 = {{{0.0, 0.25, 0.75, 1.0}, {0.25, 0.75, 0.75, 1.0}, {0.0, 0.0, 0.1, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
251 	BColors::ColorSet fgColors_ch2 = {{{0.75, 0.0, 0.75, 1.0}, {0.75, 0.25, 0.75, 1.0}, {0.1, 0.0, 0.1, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
252 	BColors::ColorSet fgColors_ch3 = {{{0.875, 0.4235, 0.0, 1.0}, {0.875, 0.75, 0.25, 1.0}, {0.1, 0.05, 0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
253 	BColors::ColorSet fgColors_ch4 = {{{0.75, 0.75, 0.0, 1.0}, {0.75, 0.75, 0.75, 1.0}, {0.1, 0.1, 0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
254 	BColors::ColorSet txColors = {{{0.167, 0.37, 0.80, 1.0}, {0.33, 0.5, 0.85, 1.0}, {0.0, 0.0, 0.25, 1.0}, {0.0, 0.0, 0.0, 0.0}}};
255 	BColors::ColorSet tgColors = {{BColors::grey, BColors::white, BColors::grey, BColors::darkgrey}};
256 	BColors::ColorSet bgColors = {{{0.15, 0.15, 0.15, 1.0}, {0.3, 0.3, 0.3, 1.0}, {0.05, 0.05, 0.05, 1.0}, {0.0, 0.0, 0.0, 1.0}}};
257 	BColors::ColorSet tgBgColors = {{{0.0, 0.03, 0.06, 1.0}, {0.3, 0.3, 0.3, 1.0}, {0.0, 0.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0}}};
258 	BColors::ColorSet ltColors = {{{1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {0.25, 0.25, 0.25, 1.0}, {0.0, 0.0, 0.0, 1.0}}};
259 	BColors::Color ink = {0.0, 0.25, 0.5, 1.0};
260 	BColors::Color light = {1.0, 1.0, 1.0, 1.0};
261 	BColors::Color evenPadBgColor = {0.0, 0.03, 0.06, 1.0};
262 	BColors::Color oddPadBgColor = {0.0, 0.0, 0.0, 1.0};
263 
264 	std::array<ButtonStyle, NR_SEQUENCER_CHS + 1> chButtonStyles =
265 	{{
266 		{{0.0, 0.0, 0.0, 0.5}, NO_CTRL, BSEQUENCER_LABEL_NO_CHANNEL},
267 		{{0.0, 0.0, 1.0, 1.0}, NO_CTRL, BSEQUENCER_LABEL_CHANNEL " 1"},
268 		{{1.0, 0.0, 1.0, 1.0}, NO_CTRL, BSEQUENCER_LABEL_CHANNEL " 2"},
269 		{{1.0, 0.5, 0.0, 1.0}, NO_CTRL, BSEQUENCER_LABEL_CHANNEL " 3"},
270 		{{1.0, 1.0, 0.0, 1.0}, NO_CTRL, BSEQUENCER_LABEL_CHANNEL " 4"}
271 	}};
272 
273 	std::array<ButtonStyle, NR_CTRL_BUTTONS> ctrlButtonStyles =
274 	{{
275 		{{0.0, 0.0, 0.0, 0.5}, NO_CTRL, BSEQUENCER_LABEL_NO_CONTROL},
276 		{{0.0, 0.03, 0.06, 1.0}, CTRL_PLAY_FWD, BSEQUENCER_LABEL_PLAY_FWD},
277 		{{0.0, 0.03, 0.06, 1.0}, CTRL_PLAY_REW, BSEQUENCER_LABEL_PLAY_REW},
278 	  	{{0.0, 0.03, 0.06, 1.0}, CTRL_ALL_MARK, BSEQUENCER_LABEL_ALL_MARK},
279 		{{0.0, 0.03, 0.06, 1.0}, CTRL_MARK, BSEQUENCER_LABEL_ALL_MARK},
280 		{{0.0, 0.03, 0.06, 1.0}, CTRL_JUMP_FWD, BSEQUENCER_LABEL_JUMP_FWD},
281 		{{0.0, 0.03, 0.06, 1.0}, CTRL_JUMP_BACK, BSEQUENCER_LABEL_JUMP_BACK},
282 	  	{{0.0, 0.03, 0.06, 1.0}, CTRL_SKIP, BSEQUENCER_LABEL_SKIP},
283 		{{0.0, 0.03, 0.06, 1.0}, CTRL_STOP, BSEQUENCER_LABEL_STOP}
284 	}};
285 
286 	std::array<ButtonStyle, NR_EDIT_BUTTONS> editButtonStyles =
287 	{{
288 		{{0.0, 0.03, 0.06, 1.0}, EDIT_PICK, BSEQUENCER_LABEL_PICK},
289 		{{0.0, 0.03, 0.06, 1.0}, EDIT_MERGE, BSEQUENCER_LABEL_MERGE},
290 		{{0.0, 0.03, 0.06, 1.0}, EDIT_CUT, BSEQUENCER_LABEL_CUT},
291 	  	{{0.0, 0.03, 0.06, 1.0}, EDIT_COPY, BSEQUENCER_LABEL_COPY},
292 		{{0.0, 0.03, 0.06, 1.0}, EDIT_FLIPX, BSEQUENCER_LABEL_FLIPX},
293 		{{0.0, 0.03, 0.06, 1.0}, EDIT_FLIPY, BSEQUENCER_LABEL_FLIPY},
294 		{{0.0, 0.03, 0.06, 1.0}, EDIT_PASTE, BSEQUENCER_LABEL_PASTE}
295 	}};
296 
297 	BStyles::Border border = {{ink, 1.0}, 0.0, 2.0, 0.0};
298 	BStyles::Border menuBorder = {{BColors::darkgrey, 1.0}, 0.0, 0.0, 0.0};
299 	BStyles::Border labelborder = {BStyles::noLine, 4.0, 0.0, 0.0};
300 	BStyles::Border focusborder = BStyles::Border (BStyles::Line (BColors::Color (0.0, 0.0, 0.0, 0.5), 2.0));
301 	BStyles::Fill widgetBg = BStyles::noFill;
302 	BStyles::Fill menuBg = BStyles::Fill (BColors::Color (0.0, 0.0, 0.05, 1.0));
303 	BStyles::Fill screenBg = BStyles::Fill (BColors::Color (0.0, 0.0, 0.0, 0.8));
304 	BStyles::Fill boxBg = BStyles::Fill (BColors::Color (0.0, 0.0, 0.0, 0.9));
305 	BStyles::Font ctLabelFont = BStyles::Font ("Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL, 12.0,
306 						   BStyles::TEXT_ALIGN_CENTER, BStyles::TEXT_VALIGN_MIDDLE);
307 	BStyles::Font tgLabelFont = BStyles::Font ("Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL, 12.0,
308 						   BStyles::TEXT_ALIGN_CENTER, BStyles::TEXT_VALIGN_MIDDLE);
309 	BStyles::Font iLabelFont = BStyles::Font ("Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD, 18.0,
310 						  BStyles::TEXT_ALIGN_CENTER, BStyles::TEXT_VALIGN_MIDDLE);
311 	BStyles::Font lfLabelFont = BStyles::Font ("Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL, 12.0,
312 						   BStyles::TEXT_ALIGN_LEFT, BStyles::TEXT_VALIGN_MIDDLE);
313 	BStyles::StyleSet defaultStyles = {"default", {{"background", STYLEPTR (&BStyles::noFill)},
314 					  {"border", STYLEPTR (&BStyles::noBorder)}}};
315 	BStyles::StyleSet labelStyles = {"labels", {{"background", STYLEPTR (&BStyles::noFill)},
316 					{"border", STYLEPTR (&labelborder)},
317 					{"textcolors", STYLEPTR (&txColors)},
318 					{"font", STYLEPTR (&ctLabelFont)}}};
319 	BStyles::StyleSet focusStyles = {"labels", {{"background", STYLEPTR (&screenBg)},
320 					{"border", STYLEPTR (&focusborder)},
321 					{"textcolors", STYLEPTR (&ltColors)},
322 					{"font", STYLEPTR (&lfLabelFont)}}};
323 
324 	BStyles::Theme theme = BStyles::Theme
325 	({
326 		defaultStyles,
327 		{"B.SEQuencer", 	{{"background", STYLEPTR (&BStyles::blackFill)},
328 					 {"border", STYLEPTR (&BStyles::noBorder)}}},
329 		{"main", 		{{"background", STYLEPTR (&widgetBg)},
330 					 {"border", STYLEPTR (&BStyles::noBorder)}}},
331 		{"widget", 		{{"uses", STYLEPTR (&defaultStyles)}}},
332 		{"screen", 		{{"background", STYLEPTR (&screenBg)}}},
333 		{"box", 		{{"background", STYLEPTR (&boxBg)},
334 					{"border", STYLEPTR (&border)}}},
335 		{"box/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
336 		{"button", 		{{"background", STYLEPTR (&BStyles::blackFill)},
337 					 {"border", STYLEPTR (&border)}}},
338 		{"tgbutton", 		{{"border", STYLEPTR (&BStyles::noBorder)},
339 					 {"textcolors", STYLEPTR (&tgColors)},
340 					 {"bgcolors", STYLEPTR (&tgBgColors)},
341 					 {"font", STYLEPTR (&tgLabelFont)}}},
342 		{"tgbutton/focus",	{{"uses", STYLEPTR (&focusStyles)}}},
343 		{"halobutton", 		{{"uses", STYLEPTR (&defaultStyles)},
344 					 {"fgcolors", STYLEPTR (&bgColors)}}},
345 		{"halobutton/focus", {{"uses", STYLEPTR (&focusStyles)}}},
346 		{"dial", 		{{"uses", STYLEPTR (&defaultStyles)},
347 					 {"fgcolors", STYLEPTR (&fgColors)},
348 					 {"bgcolors", STYLEPTR (&bgColors)},
349 					 {"textcolors", STYLEPTR (&fgColors)},
350 					 {"font", STYLEPTR (&ctLabelFont)}}},
351 		{"dial/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
352 		{"ch1", 		{{"uses", STYLEPTR (&defaultStyles)},
353 					 {"fgcolors", STYLEPTR (&fgColors_ch1)},
354 					 {"bgcolors", STYLEPTR (&bgColors)},
355 					 {"textcolors", STYLEPTR (&fgColors)},
356 					 {"font", STYLEPTR (&ctLabelFont)}}},
357 		{"ch1/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
358 		{"ch2", 		{{"uses", STYLEPTR (&defaultStyles)},
359 					 {"fgcolors", STYLEPTR (&fgColors_ch2)},
360 					 {"bgcolors", STYLEPTR (&bgColors)},
361 					 {"textcolors", STYLEPTR (&fgColors)},
362 					 {"font", STYLEPTR (&ctLabelFont)}}},
363 		{"ch2/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
364 		{"ch3", 		{{"uses", STYLEPTR (&defaultStyles)},
365 					 {"fgcolors", STYLEPTR (&fgColors_ch3)},
366 					 {"bgcolors", STYLEPTR (&bgColors)},
367 					 {"textcolors", STYLEPTR (&fgColors)},
368 					 {"font", STYLEPTR (&ctLabelFont)}}},
369 		{"ch3/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
370 		{"ch4", 		{{"uses", STYLEPTR (&defaultStyles)},
371 					 {"fgcolors", STYLEPTR (&fgColors_ch4)},
372 					 {"bgcolors", STYLEPTR (&bgColors)},
373 					 {"textcolors", STYLEPTR (&fgColors)},
374 					 {"font", STYLEPTR (&ctLabelFont)}}},
375 		{"ch4/focus",		{{"uses", STYLEPTR (&focusStyles)}}},
376 		{"slider",		{{"uses", STYLEPTR (&defaultStyles)},
377 					 {"fgcolors", STYLEPTR (&fgColors)},
378 					 {"bgcolors", STYLEPTR (&bgColors)},
379 					 {"textcolors", STYLEPTR (&fgColors)},
380 					 {"font", STYLEPTR (&ctLabelFont)}}},
381 		{"slider/focus",	{{"uses", STYLEPTR (&focusStyles)}}},
382 		{"ctlabel",	 	{{"uses", STYLEPTR (&labelStyles)}}},
383 		{"lflabel",	 	{{"uses", STYLEPTR (&labelStyles)},
384 					 {"font", STYLEPTR (&lfLabelFont)}}},
385 		{"txtbox",	 	{{"background", STYLEPTR (&BStyles::noFill)},
386 					 {"border", STYLEPTR (&labelborder)},
387 					 //{"textcolors", STYLEPTR (&txColors)},
388 					 {"font", STYLEPTR (&lfLabelFont)}}},
389 		{"ilabel",	 	{{"uses", STYLEPTR (&labelStyles)},
390 					 {"font", STYLEPTR (&iLabelFont)},
391 					 {"textcolors", STYLEPTR (&BColors::whites)}}},
392 		{"editlabel",	 	{{"uses", STYLEPTR (&labelStyles)},
393 		 	 	 	 {"font", STYLEPTR (&iLabelFont)},
394 					 {"textcolors", STYLEPTR (&BColors::whites)}}},
395 		{"widget/focus",	{{"uses", STYLEPTR (&focusStyles)}}},
396 		{"menu",	 	{{"border", STYLEPTR (&menuBorder)},
397 					 {"background", STYLEPTR (&menuBg)}}},
398 		{"menu/item",	 	{{"uses", STYLEPTR (&defaultStyles)},
399 					 {"border", STYLEPTR (&labelborder)},
400 					 {"textcolors", STYLEPTR (&BColors::whites)},
401 					 {"font", STYLEPTR (&lfLabelFont)}}},
402 		{"menu/button",	 	{{"border", STYLEPTR (&menuBorder)},
403 					 {"background", STYLEPTR (&menuBg)},
404 					 {"bgcolors", STYLEPTR (&bgColors)}}},
405 		{"menu/listbox",	{{"border", STYLEPTR (&menuBorder)},
406 					 {"background", STYLEPTR (&menuBg)}}},
407 		{"menu/listbox/item",	{{"uses", STYLEPTR (&defaultStyles)},
408 					 {"border", STYLEPTR (&labelborder)},
409 					 {"textcolors", STYLEPTR (&BColors::whites)},
410 					 {"font", STYLEPTR (&lfLabelFont)}}},
411 		{"menu/listbox//button",{{"border", STYLEPTR (&menuBorder)},
412 					 {"background", STYLEPTR (&menuBg)},
413 					 {"bgcolors", STYLEPTR (&bgColors)}}}
414 	});
415 };
416 
417 #endif /* BSEQUENCER_GUI_HPP_ */
418