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 (<Colors)}, 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