From 59c64bcb91017fd9965ddf4865f4630b9b18c7e2 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Fri, 11 Sep 2020 03:23:39 +0200 Subject: [PATCH] Tweaking the GUI The instrument information can be on the main tab Put the button behind the logo Embed the ABeeZee font and use it everywhere Add hover colors to glyph buttons Replace the "file open" glyph by a folder --- editor/CMakeLists.txt | 3 + editor/layout/main.fl | 174 +++++-------- editor/resources/Fonts/ABeeZee-Italic.ttf | Bin 0 -> 45780 bytes editor/resources/Fonts/ABeeZee-Regular.ttf | Bin 0 -> 44184 bytes editor/resources/logo_full_white.png | Bin 0 -> 4516 bytes editor/src/editor/Editor.cpp | 80 ++++-- editor/src/editor/GUIComponents.cpp | 3 + editor/src/editor/layout/main.hpp | 288 ++++++++++----------- 8 files changed, 269 insertions(+), 279 deletions(-) create mode 100644 editor/resources/Fonts/ABeeZee-Italic.ttf create mode 100644 editor/resources/Fonts/ABeeZee-Regular.ttf create mode 100644 editor/resources/logo_full_white.png diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index cce49479..935f5c79 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -5,11 +5,14 @@ set(EDITOR_RESOURCES logo.png logo_text.png logo_text@2x.png + logo_full_white.png icon_white.png icon_white@2x.png knob48.png knob48@2x.png Fonts/fluentui-system-regular-20.ttf + Fonts/ABeeZee-Regular.ttf + Fonts/ABeeZee-Regular.ttf PARENT_SCOPE) function(copy_editor_resources SOURCE_DIR DESTINATION_DIR) diff --git a/editor/layout/main.fl b/editor/layout/main.fl index 1d27e987..477d2d40 100644 --- a/editor/layout/main.fl +++ b/editor/layout/main.fl @@ -1,9 +1,9 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0305 +version 1.0304 header_name {.h} code_name {.cxx} widget_class mainView {open - xywh {410 523 800 475} type Double + xywh {572 266 800 475} type Double class LogicalGroup visible } { Fl_Group {} { @@ -12,112 +12,104 @@ widget_class mainView {open class LogicalGroup } { Fl_Group {} {open - xywh {5 4 100 101} box ROUNDED_BOX align 0 + xywh {5 4 175 101} box ROUNDED_BOX align 0 class RoundedGroup } { Fl_Box {} { comment {tag=kTagFirstChangePanel+kPanelGeneral} - image {../resources/icon_white.png} xywh {7 6 96 96} + image {../resources/logo_full_white.png} xywh {10 11 165 63} class SfizzMainButton } + Fl_Button {} { + comment {tag=kTagFirstChangePanel+kPanelGeneral} + xywh {55 75 25 25} labelsize 24 + class HomeButton + } + Fl_Button {} { + comment {tag=kTagFirstChangePanel+kPanelControls} + xywh {80 75 25 25} labelsize 24 + class CCButton + } + Fl_Button {} { + comment {tag=kTagFirstChangePanel+kPanelSettings} + xywh {105 75 25 25} labelsize 24 + class SettingsButton + } } Fl_Group {} {open - xywh {110 5 380 100} box ROUNDED_BOX + xywh {185 5 380 100} box ROUNDED_BOX class RoundedGroup } { Fl_Box {} { label {File:} - xywh {125 15 40 25} labelsize 16 + xywh {200 13 40 30} labelsize 16 class Label } Fl_Box {} { label {KS:} - xywh {125 45 40 25} labelsize 16 + xywh {200 45 40 30} labelsize 16 class Label } Fl_Box {} { label {Separator 1} - xywh {120 40 355 5} box BORDER_BOX labeltype NO_LABEL + xywh {195 41 360 5} box BORDER_BOX labeltype NO_LABEL class HLine } Fl_Box {} { label {Separator 2} - xywh {120 70 355 5} box BORDER_BOX labeltype NO_LABEL + xywh {195 73 360 5} box BORDER_BOX labeltype NO_LABEL class HLine } Fl_Box sfzFileLabel_ { label {DefaultInstrument.sfz} - xywh {190 15 230 25} labelsize 20 + xywh {265 12 230 30} labelsize 20 class Label } Fl_Box {} { label {Key switch} - xywh {190 45 230 25} labelsize 20 + xywh {265 44 230 30} labelsize 20 class Label } Fl_Box {} { label {Voices:} - xywh {120 75 60 25} labelsize 12 align 24 + xywh {195 76 60 25} labelsize 12 align 24 class Label } Fl_Button {} { comment {tag=kTagLoadSfzFile} - xywh {425 15 25 25} labelsize 24 + xywh {500 14 25 25} labelsize 24 class LoadFileButton } Fl_Button {} { comment {tag=kTagEditSfzFile} - xywh {450 15 25 25} labelsize 24 + xywh {525 14 25 25} labelsize 24 class EditFileButton } Fl_Box infoVoicesLabel_ { - xywh {185 75 50 25} labelsize 12 align 16 + xywh {260 76 50 25} labelsize 12 align 16 class Label } Fl_Box {} { label {Max:} - xywh {240 75 60 25} labelsize 12 align 24 + xywh {315 76 60 25} labelsize 12 align 24 class Label } Fl_Box numVoicesLabel_ { - xywh {305 75 50 25} labelsize 12 align 16 + xywh {380 76 50 25} labelsize 12 align 16 class Label } Fl_Box {} { label {Memory:} - xywh {360 75 60 25} labelsize 12 align 24 + xywh {435 76 60 25} labelsize 12 align 24 class Label } Fl_Box memoryLabel_ { - xywh {425 75 50 25} labelsize 12 align 16 + xywh {500 76 50 25} labelsize 12 align 16 class Label } } Fl_Group {} {open - xywh {495 5 100 100} box ROUNDED_BOX - class RoundedGroup - } { - Fl_Light_Button {} { - label SETUP - comment {tag=kTagFirstChangePanel+kPanelSettings} - xywh {510 42 70 25} - class LightButton - } - Fl_Light_Button {} { - label CC - comment {tag=kTagFirstChangePanel+kPanelControls} - xywh {510 15 70 25} - class LightButton - } - Fl_Light_Button {} { - label INFO - comment {tag=kTagFirstChangePanel+kPanelInfo} - xywh {510 69 70 25} - class LightButton - } - } - Fl_Group {} {open - xywh {600 5 195 100} box ROUNDED_BOX + xywh {570 5 225 100} box ROUNDED_BOX class RoundedGroup } { Fl_Dial {} { @@ -126,7 +118,7 @@ widget_class mainView {open } Fl_Box {} { label Center - xywh {610 70 60 25} labelsize 12 hide + xywh {610 70 60 5} labelsize 12 hide class ValueLabel } Fl_Dial volumeSlider_ { @@ -136,83 +128,74 @@ widget_class mainView {open } Fl_Box volumeLabel_ { label {0.0 dB} - xywh {675 70 60 25} labelsize 12 + xywh {675 70 60 22} labelsize 12 class ValueLabel } Fl_Box {} { - xywh {745 20 35 70} box BORDER_BOX + xywh {745 20 35 55} box BORDER_BOX class VMeter } } } - Fl_Group {subPanels_[kPanelGeneral]} { - xywh {5 110 790 285} hide + Fl_Group {subPanels_[kPanelGeneral]} {open selected + xywh {5 110 791 285} class LogicalGroup } { Fl_Group {} {open - xywh {5 110 120 285} box ROUNDED_BOX + xywh {5 110 175 280} box ROUNDED_BOX class RoundedGroup } { Fl_Box {} { label {Curves:} - xywh {15 120 60 25} labelsize 12 align 20 + xywh {20 120 60 25} align 20 class Label } Fl_Box {} { label {Masters:} - xywh {15 145 60 25} labelsize 12 align 20 + xywh {20 145 60 25} align 20 class Label } Fl_Box {} { label {Groups:} - xywh {15 170 60 25} labelsize 12 align 20 + xywh {20 170 60 25} align 20 class Label } Fl_Box {} { label {Regions:} - xywh {15 195 60 25} labelsize 12 align 20 + xywh {20 195 60 25} align 20 class Label } Fl_Box {} { label {Samples:} - xywh {15 220 60 25} labelsize 12 align 20 + xywh {20 220 60 25} align 20 class Label } Fl_Box infoCurvesLabel_ { label 0 - xywh {75 120 40 25} labelsize 12 align 16 + xywh {120 120 40 25} align 16 class Label } Fl_Box infoMastersLabel_ { label 0 - xywh {75 145 40 25} labelsize 12 align 16 + xywh {120 145 40 25} align 16 class Label } Fl_Box infoGroupsLabel_ { label 0 - xywh {75 170 40 25} labelsize 12 align 16 + xywh {120 170 40 25} align 16 class Label } Fl_Box infoRegionsLabel_ { label 0 - xywh {75 195 40 25} labelsize 12 align 16 + xywh {120 195 40 25} align 16 class Label } Fl_Box infoSamplesLabel_ { label 0 - xywh {75 220 40 25} labelsize 12 align 16 + xywh {120 220 40 25} align 16 class Label } } - Fl_Group {} {open - xywh {130 110 665 280} - class LogicalGroup - } { - Fl_Box {} { - image {../resources/logo_text.png} xywh {260 125 400 250} - class SfizzLargePicture - } - } } Fl_Group {subPanels_[kPanelControls]} { xywh {5 110 790 285} hide @@ -229,114 +212,99 @@ widget_class mainView {open } } } - Fl_Group {subPanels_[kPanelSettings]} {open - xywh {5 110 790 285} + Fl_Group {subPanels_[kPanelSettings]} { + xywh {5 109 790 286} hide class LogicalGroup } { Fl_Group {} { - label Engine open selected - xywh {260 125 280 110} box ROUNDED_BOX labelsize 12 align 17 + label Engine open + xywh {260 110 280 110} box ROUNDED_BOX labelsize 12 align 17 class TitleGroup } { Fl_Spinner numVoicesSlider_ { comment {tag=kTagSetNumVoices} - xywh {285 185 60 25} labelsize 12 textsize 12 + xywh {285 170 60 25} labelsize 12 textsize 12 class ValueMenu } Fl_Box {} { label Polyphony - xywh {275 145 80 25} labelsize 12 + xywh {275 130 80 25} labelsize 12 class ValueLabel } Fl_Spinner oversamplingSlider_ { comment {tag=kTagSetOversampling} - xywh {370 185 60 25} labelsize 12 textsize 12 + xywh {370 170 60 25} labelsize 12 textsize 12 class ValueMenu } Fl_Box {} { label Oversampling - xywh {360 145 80 25} labelsize 12 + xywh {360 130 80 25} labelsize 12 class ValueLabel } Fl_Box {} { label {Preload size} - xywh {445 145 80 25} labelsize 12 + xywh {445 130 80 25} labelsize 12 class ValueLabel } Fl_Spinner preloadSizeSlider_ { comment {tag=kTagSetPreloadSize} - xywh {455 185 60 25} labelsize 12 textsize 12 + xywh {455 170 60 25} labelsize 12 textsize 12 class ValueMenu } } Fl_Group {} { label Tuning open - xywh {205 260 390 120} box ROUNDED_BOX labelsize 12 align 17 + xywh {205 268 390 120} box ROUNDED_BOX labelsize 12 align 17 class TitleGroup } { Fl_Box {} { label {Root key} - xywh {330 280 80 25} labelsize 12 + xywh {330 288 80 25} labelsize 12 class ValueLabel } Fl_Spinner tuningFrequencySlider_ { comment {tag=kTagSetTuningFrequency} - xywh {425 320 60 25} labelsize 12 textsize 12 + xywh {425 328 60 25} labelsize 12 textsize 12 class ValueMenu } Fl_Box {} { label Frequency - xywh {415 280 80 25} labelsize 12 + xywh {415 288 80 25} labelsize 12 class ValueLabel } Fl_Dial stretchedTuningSlider_ { comment {tag=kTagSetStretchedTuning} - xywh {515 305 48 48} value 0.5 + xywh {515 313 48 48} value 0.5 class Knob48 } Fl_Box {} { label Stretch - xywh {500 280 80 25} labelsize 12 + xywh {500 288 80 25} labelsize 12 class ValueLabel } Fl_Box {} { label {Scala file} - xywh {225 280 100 25} labelsize 12 + xywh {225 288 100 25} labelsize 12 class ValueLabel } Fl_Button scalaFileButton_ { label DefaultScale comment {tag=kTagLoadScalaFile} - xywh {225 320 100 25} labelsize 12 + xywh {225 328 100 25} labelsize 12 class ValueButton } Fl_Spinner scalaRootKeySlider_ { comment {tag=kTagSetScalaRootKey} - xywh {340 320 35 25} labelsize 12 textsize 12 + xywh {340 328 35 25} labelsize 12 textsize 12 class ValueMenu } Fl_Spinner scalaRootOctaveSlider_ { comment {tag=kTagSetScalaRootKey} - xywh {375 320 30 25} labelsize 12 textsize 12 + xywh {375 328 30 25} labelsize 12 textsize 12 class ValueMenu } } } - Fl_Group {subPanels_[kPanelInfo]} { - xywh {5 110 790 285} hide - class LogicalGroup - } { - Fl_Group {} {open - xywh {5 110 790 285} box ROUNDED_BOX - class RoundedGroup - } { - Fl_Box {} { - label {Informative text goes here} - xywh {5 110 790 285} labelsize 40 - class Label - } - } - } Fl_Box {} { xywh {5 400 790 70} class Piano diff --git a/editor/resources/Fonts/ABeeZee-Italic.ttf b/editor/resources/Fonts/ABeeZee-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d98743aff8bc049de88675e3c7efbfd89264d8f5 GIT binary patch literal 45780 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 literal 0 HcmV?d00001 diff --git a/editor/resources/Fonts/ABeeZee-Regular.ttf b/editor/resources/Fonts/ABeeZee-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..71e6d16245f37eb1e7aecd847f4c4ae54c9e836d GIT binary patch literal 44184 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 @+H{4m&%{0J+I_`J9Vk_k+ss_AGuWe z=vwLR$Ja{5_O&nmj=LLQ7AYD^JOn$i6=S_|;D%vG_D8Xcy6H3@G_sF^qez%UaKYAq z8>PvaGdZyblNL%Ji{$dLKs5;IzvVJq39^S*8hdgiCE)jJCWX*^zL{Cv&F-it0LwxCLwR1sh_6sh+Vu{tHr+ zG5<%SrDIdMTZ%5Og&g;Hwhei5UD0%Z!L3z~Z8ICH?{%bm(pq(ECe_5>DaRle;31%> z_9^EPh+3?YRYds$e-?;W zAnh2hfN~{XsViUN?paq(yh6`|S2`{|O~q+ z*hZF)Jm*P*TlS=y zrvqYJVUv1bN)wpK`&yDNN4!ahYeMONj4o}kp2B3f~*vKNw_?UQj&XbXE@tfzQo_ z&jXhOmujK9rPAN;x>QP-kVW?N<4cxp@$jv zBw0`}iq1YzIFGfX;3F@%3+X~fVXQD)SSXw3$4`h23xo}_WLg;yU0K8Q9Soxz%a^!Q>&gk!^gJ*< zc&Qe`sZ@IVekzsXlZcA0VRbJ7%fxllurd;`hA0;FZIULd8{^i+Y%x1SHagbiD-!o! zIv)k$pe(}*;d%(3c&Q94hgHgpK%|aiLwxLuXIRxDWBE{hSnN;4<^NirU`27U{Qs^C zid};bL5<*}6HxNKmXv>CCOS z)@Mp=+cqb>Vep;L%a#})+zZUF{u~`ivr(2bA{AH9kUhQn7|O#;+DKCP_n)91Lk4jl z$K1x+`WVblD)XXjXiA9{NTv|ffE}&yN}hCiY}?1%7=8A@U-lK`R3y0rt0cJ&(mXAm zr`0qbXJh0(d`$&Qew>Ywk%Pf+0<@FdZ$Cmfz?#x{dU`cXc@MzMA$pp-$lZk}C?Dc4 zSd+^H9My7XS>xoE)|q2<@$<|!gE@vY36>?GW(OMkIxsA9sjvp(^xP92-~LSxdM2p< z^H&|;_({*jXQ-b55LUxLO9og=p5%T}eHi87PyQ9G-G^CuoO?T)!BBvDRDg>C@{JKl zU0SgW%N2oRYh0+=f%0eAS{fLYVS)uMLVl>KdT7Ld`N2p0zvBmZoqs6BUtazC?x90J zA&e0;$;a)X(F}(DWM#5|C+Z_-bd$_{86k#t_9PqDs%m~nc^RxW)|Ruc3f)(i(y=Lo zB%RN8Z65ply3~$$`!;9!J%l$v3!{7THATbtWq$CpP� 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 iconWhite = owned(new CBitmap("icon_white.png")); + SharedPointer iconWhite = owned(new CBitmap("logo_full_white.png")); SharedPointer knob48 = owned(new CBitmap("knob48.png")); SharedPointer logoText = owned(new CBitmap("logo_text.png")); @@ -332,6 +357,7 @@ void Editor::Impl::createFrameContents() CColor titleBoxText; CColor titleBoxBackground; CColor icon; + CColor iconHighlight; CColor valueText; CColor valueBackground; }; @@ -342,6 +368,7 @@ void Editor::Impl::createFrameContents() lightTheme.titleBoxText = { 0xff, 0xff, 0xff }; lightTheme.titleBoxBackground = { 0x2e, 0x34, 0x36 }; lightTheme.icon = lightTheme.text; + lightTheme.iconHighlight = { 0xa8, 0x62, 0x34 }; lightTheme.valueText = { 0xff, 0xff, 0xff }; lightTheme.valueBackground = { 0x2e, 0x34, 0x36 }; Theme darkTheme; @@ -350,6 +377,7 @@ void Editor::Impl::createFrameContents() darkTheme.titleBoxText = { 0x00, 0x00, 0x00 }; darkTheme.titleBoxBackground = { 0xba, 0xbd, 0xb6 }; darkTheme.icon = darkTheme.text; + darkTheme.iconHighlight = { 0xa8, 0x62, 0x34 }; darkTheme.valueText = { 0x2e, 0x34, 0x36 }; darkTheme.valueBackground = { 0xff, 0xff, 0xff }; Theme& defaultTheme = lightTheme; @@ -363,18 +391,19 @@ void Editor::Impl::createFrameContents() typedef CKickButton SfizzMainButton; typedef CTextLabel Label; typedef CViewContainer HLine; - typedef CTextButton LightButton; typedef CAnimKnob Knob48; typedef CTextLabel ValueLabel; typedef CViewContainer VMeter; - typedef CView SfizzLargePicture; typedef SValueMenu ValueMenu; #if 0 typedef CTextButton Button; #endif typedef CTextButton ValueButton; - typedef CTextButton LoadFileButton; - typedef CTextButton EditFileButton; + typedef CHoverButton LoadFileButton; + typedef CHoverButton CCButton; + typedef CHoverButton HomeButton; + typedef CHoverButton SettingsButton; + typedef CHoverButton EditFileButton; typedef SPiano Piano; auto createLogicalGroup = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { @@ -394,7 +423,7 @@ void Editor::Impl::createFrameContents() box->setBackgroundColor(theme->boxBackground); box->setTitleFontColor(theme->titleBoxText); box->setTitleBackgroundColor(theme->titleBoxBackground); - auto font = owned(new CFontDesc(*box->getTitleFont())); + auto font = owned(new CFontDesc("ABeeZee", fontsize)); font->setSize(fontsize); box->setTitleFont(font); return box; @@ -408,7 +437,7 @@ void Editor::Impl::createFrameContents() lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); lbl->setFontColor(theme->text); lbl->setHoriAlign(align); - auto font = owned(new CFontDesc(*lbl->getFont())); + auto font = owned(new CFontDesc("ABeeZee", fontsize)); font->setSize(fontsize); lbl->setFont(font); return lbl; @@ -420,11 +449,6 @@ void Editor::Impl::createFrameContents() hline->setBackgroundColor(CColor(0xff, 0xff, 0xff, 0xff)); return hline; }; - auto createLightButton = [this](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int) { - CTextButton* button = new CTextButton(bounds, this, tag, label); - button->setTextAlignment(align); - return button; - }; auto createKnob48 = [this, &knob48](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) { return new CAnimKnob(bounds, this, tag, 31, 48, knob48); }; @@ -434,7 +458,7 @@ void Editor::Impl::createFrameContents() lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); lbl->setFontColor(theme->text); lbl->setHoriAlign(align); - auto font = owned(new CFontDesc(*lbl->getFont())); + auto font = owned(new CFontDesc("ABeeZee", fontsize)); font->setSize(fontsize); lbl->setFont(font); return lbl; @@ -445,11 +469,6 @@ void Editor::Impl::createFrameContents() container->setBackgroundColor(CColor(0x00, 0x00, 0x00, 0x00)); return container; }; - auto createSfizzLargePicture = [&logoText](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { - CView* picture = new CView(bounds); - picture->setBackground(logoText); - return picture; - }; #if 0 auto createButton = [this](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int fontsize) { CTextButton* button = new CTextButton(bounds, this, tag, label); @@ -462,7 +481,7 @@ void Editor::Impl::createFrameContents() #endif auto createValueButton = [this, &theme](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int fontsize) { CTextButton* button = new CTextButton(bounds, this, tag, label); - auto font = owned(new CFontDesc(*button->getFont())); + auto font = owned(new CFontDesc("ABeeZee", fontsize)); font->setSize(fontsize); button->setFont(font); button->setTextAlignment(align); @@ -476,7 +495,7 @@ void Editor::Impl::createFrameContents() auto createValueMenu = [this, &theme](const CRect& bounds, int tag, const char*, CHoriTxtAlign align, int fontsize) { SValueMenu* vm = new SValueMenu(bounds, this, tag); vm->setHoriAlign(align); - auto font = owned(new CFontDesc(*vm->getFont())); + auto font = owned(new CFontDesc("ABeeZee", fontsize)); font->setSize(fontsize); vm->setFont(font); vm->setFontColor(theme->valueText); @@ -487,19 +506,30 @@ void Editor::Impl::createFrameContents() return vm; }; auto createGlyphButton = [this, &theme](UTF8StringPtr glyph, const CRect& bounds, int tag, int fontsize) { - CTextButton* btn = new CTextButton(bounds, this, tag, glyph); + CHoverButton* btn = new CHoverButton(bounds, this, tag, glyph); btn->setFont(new CFontDesc("Fluent System Regular W20", fontsize)); btn->setTextColor(theme->icon); + btn->setHoverColor(theme->iconHighlight); btn->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); btn->setGradient(nullptr); btn->setGradientHighlighted(nullptr); return btn; }; - auto createLoadFileButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { - return createGlyphButton(u8"\ue142", bounds, tag, fontsize); + auto createHomeButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + return createGlyphButton(u8"\ue1d6", bounds, tag, fontsize); + }; + auto createCCButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + // return createGlyphButton(u8"\ue240", bounds, tag, fontsize); + return createGlyphButton(u8"\ue140", bounds, tag, fontsize); + }; + auto createSettingsButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + return createGlyphButton(u8"\ue2e4", bounds, tag, fontsize); }; auto createEditFileButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { - return createGlyphButton(u8"\ue148", bounds, tag, fontsize); + return createGlyphButton(u8"\ue142", bounds, tag, fontsize); + }; + auto createLoadFileButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + return createGlyphButton(u8"\ue1a3", bounds, tag, fontsize); }; auto createPiano = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { SPiano* piano = new SPiano(bounds); diff --git a/editor/src/editor/GUIComponents.cpp b/editor/src/editor/GUIComponents.cpp index c4e6f958..d604d76e 100644 --- a/editor/src/editor/GUIComponents.cpp +++ b/editor/src/editor/GUIComponents.cpp @@ -408,6 +408,9 @@ CMouseEventResult SValueMenu::onMouseDown(CPoint& where, const CButtonState& but menu->addEntry(item); item->remember(); // above call does not increment refcount } + menu->setFont(self->getFont()); + menu->setFontColor(self->getFontColor()); + menu->setBackColor(self->getBackColor()); menu->popup(frame, frameWhere + CPoint(0.0, 1.0)); } }); diff --git a/editor/src/editor/layout/main.hpp b/editor/src/editor/layout/main.hpp index 808e5a10..c8e93a39 100644 --- a/editor/src/editor/layout/main.hpp +++ b/editor/src/editor/layout/main.hpp @@ -4,164 +4,150 @@ mainView = view__0; enterTheme(darkTheme); LogicalGroup* const view__1 = createLogicalGroup(CRect(0, 0, 800, 110), -1, "", kCenterText, 14); view__0->addView(view__1); -RoundedGroup* const view__2 = createRoundedGroup(CRect(5, 4, 105, 105), -1, "", kCenterText, 14); +RoundedGroup* const view__2 = createRoundedGroup(CRect(5, 4, 180, 105), -1, "", kCenterText, 14); view__1->addView(view__2); -SfizzMainButton* const view__3 = createSfizzMainButton(CRect(2, 2, 98, 98), kTagFirstChangePanel+kPanelGeneral, "", kCenterText, 14); +SfizzMainButton* const view__3 = createSfizzMainButton(CRect(5, 7, 170, 70), kTagFirstChangePanel+kPanelGeneral, "", kCenterText, 14); view__2->addView(view__3); -RoundedGroup* const view__4 = createRoundedGroup(CRect(110, 5, 490, 105), -1, "", kCenterText, 14); -view__1->addView(view__4); -Label* const view__5 = createLabel(CRect(15, 10, 55, 35), -1, "File:", kCenterText, 16); -view__4->addView(view__5); -Label* const view__6 = createLabel(CRect(15, 40, 55, 65), -1, "KS:", kCenterText, 16); -view__4->addView(view__6); -HLine* const view__7 = createHLine(CRect(10, 35, 365, 40), -1, "", kCenterText, 14); -view__4->addView(view__7); -HLine* const view__8 = createHLine(CRect(10, 65, 365, 70), -1, "", kCenterText, 14); -view__4->addView(view__8); -Label* const view__9 = createLabel(CRect(80, 10, 310, 35), -1, "DefaultInstrument.sfz", kCenterText, 20); -sfzFileLabel_ = view__9; -view__4->addView(view__9); -Label* const view__10 = createLabel(CRect(80, 40, 310, 65), -1, "Key switch", kCenterText, 20); -view__4->addView(view__10); -Label* const view__11 = createLabel(CRect(10, 70, 70, 95), -1, "Voices:", kRightText, 12); -view__4->addView(view__11); -LoadFileButton* const view__12 = createLoadFileButton(CRect(315, 10, 340, 35), kTagLoadSfzFile, "", kCenterText, 24); -view__4->addView(view__12); -EditFileButton* const view__13 = createEditFileButton(CRect(340, 10, 365, 35), kTagEditSfzFile, "", kCenterText, 24); -view__4->addView(view__13); -Label* const view__14 = createLabel(CRect(75, 70, 125, 95), -1, "", kCenterText, 12); -infoVoicesLabel_ = view__14; -view__4->addView(view__14); -Label* const view__15 = createLabel(CRect(130, 70, 190, 95), -1, "Max:", kRightText, 12); -view__4->addView(view__15); -Label* const view__16 = createLabel(CRect(195, 70, 245, 95), -1, "", kCenterText, 12); -numVoicesLabel_ = view__16; -view__4->addView(view__16); -Label* const view__17 = createLabel(CRect(250, 70, 310, 95), -1, "Memory:", kRightText, 12); -view__4->addView(view__17); -Label* const view__18 = createLabel(CRect(315, 70, 365, 95), -1, "", kCenterText, 12); -memoryLabel_ = view__18; -view__4->addView(view__18); -RoundedGroup* const view__19 = createRoundedGroup(CRect(495, 5, 595, 105), -1, "", kCenterText, 14); -view__1->addView(view__19); -LightButton* const view__20 = createLightButton(CRect(15, 37, 85, 62), kTagFirstChangePanel+kPanelSettings, "SETUP", kCenterText, 14); -view__19->addView(view__20); -LightButton* const view__21 = createLightButton(CRect(15, 10, 85, 35), kTagFirstChangePanel+kPanelControls, "CC", kCenterText, 14); -view__19->addView(view__21); -LightButton* const view__22 = createLightButton(CRect(15, 64, 85, 89), kTagFirstChangePanel+kPanelInfo, "INFO", kCenterText, 14); -view__19->addView(view__22); -RoundedGroup* const view__23 = createRoundedGroup(CRect(600, 5, 795, 105), -1, "", kCenterText, 14); -view__1->addView(view__23); -Knob48* const view__24 = createKnob48(CRect(15, 15, 63, 63), -1, "", kCenterText, 14); -view__23->addView(view__24); +HomeButton* const view__4 = createHomeButton(CRect(50, 71, 75, 96), kTagFirstChangePanel+kPanelGeneral, "", kCenterText, 24); +view__2->addView(view__4); +CCButton* const view__5 = createCCButton(CRect(75, 71, 100, 96), kTagFirstChangePanel+kPanelControls, "", kCenterText, 24); +view__2->addView(view__5); +SettingsButton* const view__6 = createSettingsButton(CRect(100, 71, 125, 96), kTagFirstChangePanel+kPanelSettings, "", kCenterText, 24); +view__2->addView(view__6); +RoundedGroup* const view__7 = createRoundedGroup(CRect(185, 5, 565, 105), -1, "", kCenterText, 14); +view__1->addView(view__7); +Label* const view__8 = createLabel(CRect(15, 8, 55, 38), -1, "File:", kCenterText, 16); +view__7->addView(view__8); +Label* const view__9 = createLabel(CRect(15, 40, 55, 70), -1, "KS:", kCenterText, 16); +view__7->addView(view__9); +HLine* const view__10 = createHLine(CRect(10, 36, 370, 41), -1, "", kCenterText, 14); +view__7->addView(view__10); +HLine* const view__11 = createHLine(CRect(10, 68, 370, 73), -1, "", kCenterText, 14); +view__7->addView(view__11); +Label* const view__12 = createLabel(CRect(80, 7, 310, 37), -1, "DefaultInstrument.sfz", kCenterText, 20); +sfzFileLabel_ = view__12; +view__7->addView(view__12); +Label* const view__13 = createLabel(CRect(80, 39, 310, 69), -1, "Key switch", kCenterText, 20); +view__7->addView(view__13); +Label* const view__14 = createLabel(CRect(10, 71, 70, 96), -1, "Voices:", kRightText, 12); +view__7->addView(view__14); +LoadFileButton* const view__15 = createLoadFileButton(CRect(315, 9, 340, 34), kTagLoadSfzFile, "", kCenterText, 24); +view__7->addView(view__15); +EditFileButton* const view__16 = createEditFileButton(CRect(340, 9, 365, 34), kTagEditSfzFile, "", kCenterText, 24); +view__7->addView(view__16); +Label* const view__17 = createLabel(CRect(75, 71, 125, 96), -1, "", kCenterText, 12); +infoVoicesLabel_ = view__17; +view__7->addView(view__17); +Label* const view__18 = createLabel(CRect(130, 71, 190, 96), -1, "Max:", kRightText, 12); +view__7->addView(view__18); +Label* const view__19 = createLabel(CRect(195, 71, 245, 96), -1, "", kCenterText, 12); +numVoicesLabel_ = view__19; +view__7->addView(view__19); +Label* const view__20 = createLabel(CRect(250, 71, 310, 96), -1, "Memory:", kRightText, 12); +view__7->addView(view__20); +Label* const view__21 = createLabel(CRect(315, 71, 365, 96), -1, "", kCenterText, 12); +memoryLabel_ = view__21; +view__7->addView(view__21); +RoundedGroup* const view__22 = createRoundedGroup(CRect(570, 5, 795, 105), -1, "", kCenterText, 14); +view__1->addView(view__22); +Knob48* const view__23 = createKnob48(CRect(45, 15, 93, 63), -1, "", kCenterText, 14); +view__22->addView(view__23); +view__23->setVisible(false); +ValueLabel* const view__24 = createValueLabel(CRect(40, 65, 100, 70), -1, "Center", kCenterText, 12); +view__22->addView(view__24); view__24->setVisible(false); -ValueLabel* const view__25 = createValueLabel(CRect(10, 65, 70, 90), -1, "Center", kCenterText, 12); -view__23->addView(view__25); -view__25->setVisible(false); -Knob48* const view__26 = createKnob48(CRect(80, 15, 128, 63), kTagSetVolume, "", kCenterText, 14); -volumeSlider_ = view__26; -view__23->addView(view__26); -ValueLabel* const view__27 = createValueLabel(CRect(75, 65, 135, 90), -1, "0.0 dB", kCenterText, 12); -volumeLabel_ = view__27; -view__23->addView(view__27); -VMeter* const view__28 = createVMeter(CRect(145, 15, 180, 85), -1, "", kCenterText, 14); -view__23->addView(view__28); +Knob48* const view__25 = createKnob48(CRect(110, 15, 158, 63), kTagSetVolume, "", kCenterText, 14); +volumeSlider_ = view__25; +view__22->addView(view__25); +ValueLabel* const view__26 = createValueLabel(CRect(105, 65, 165, 87), -1, "0.0 dB", kCenterText, 12); +volumeLabel_ = view__26; +view__22->addView(view__26); +VMeter* const view__27 = createVMeter(CRect(175, 15, 210, 70), -1, "", kCenterText, 14); +view__22->addView(view__27); enterTheme(defaultTheme); -LogicalGroup* const view__29 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); -subPanels_[kPanelGeneral] = view__29; -view__0->addView(view__29); -view__29->setVisible(false); -RoundedGroup* const view__30 = createRoundedGroup(CRect(0, 0, 120, 285), -1, "", kCenterText, 14); +LogicalGroup* const view__28 = createLogicalGroup(CRect(5, 110, 796, 395), -1, "", kCenterText, 14); +subPanels_[kPanelGeneral] = view__28; +view__0->addView(view__28); +RoundedGroup* const view__29 = createRoundedGroup(CRect(0, 0, 175, 280), -1, "", kCenterText, 14); +view__28->addView(view__29); +Label* const view__30 = createLabel(CRect(15, 10, 75, 35), -1, "Curves:", kLeftText, 14); view__29->addView(view__30); -Label* const view__31 = createLabel(CRect(10, 10, 70, 35), -1, "Curves:", kLeftText, 12); -view__30->addView(view__31); -Label* const view__32 = createLabel(CRect(10, 35, 70, 60), -1, "Masters:", kLeftText, 12); -view__30->addView(view__32); -Label* const view__33 = createLabel(CRect(10, 60, 70, 85), -1, "Groups:", kLeftText, 12); -view__30->addView(view__33); -Label* const view__34 = createLabel(CRect(10, 85, 70, 110), -1, "Regions:", kLeftText, 12); -view__30->addView(view__34); -Label* const view__35 = createLabel(CRect(10, 110, 70, 135), -1, "Samples:", kLeftText, 12); -view__30->addView(view__35); -Label* const view__36 = createLabel(CRect(70, 10, 110, 35), -1, "0", kCenterText, 12); -infoCurvesLabel_ = view__36; -view__30->addView(view__36); -Label* const view__37 = createLabel(CRect(70, 35, 110, 60), -1, "0", kCenterText, 12); -infoMastersLabel_ = view__37; -view__30->addView(view__37); -Label* const view__38 = createLabel(CRect(70, 60, 110, 85), -1, "0", kCenterText, 12); -infoGroupsLabel_ = view__38; -view__30->addView(view__38); -Label* const view__39 = createLabel(CRect(70, 85, 110, 110), -1, "0", kCenterText, 12); -infoRegionsLabel_ = view__39; -view__30->addView(view__39); -Label* const view__40 = createLabel(CRect(70, 110, 110, 135), -1, "0", kCenterText, 12); -infoSamplesLabel_ = view__40; -view__30->addView(view__40); -LogicalGroup* const view__41 = createLogicalGroup(CRect(125, 0, 790, 280), -1, "", kCenterText, 14); -view__29->addView(view__41); -SfizzLargePicture* const view__42 = createSfizzLargePicture(CRect(130, 15, 530, 265), -1, "", kCenterText, 14); +Label* const view__31 = createLabel(CRect(15, 35, 75, 60), -1, "Masters:", kLeftText, 14); +view__29->addView(view__31); +Label* const view__32 = createLabel(CRect(15, 60, 75, 85), -1, "Groups:", kLeftText, 14); +view__29->addView(view__32); +Label* const view__33 = createLabel(CRect(15, 85, 75, 110), -1, "Regions:", kLeftText, 14); +view__29->addView(view__33); +Label* const view__34 = createLabel(CRect(15, 110, 75, 135), -1, "Samples:", kLeftText, 14); +view__29->addView(view__34); +Label* const view__35 = createLabel(CRect(115, 10, 155, 35), -1, "0", kCenterText, 14); +infoCurvesLabel_ = view__35; +view__29->addView(view__35); +Label* const view__36 = createLabel(CRect(115, 35, 155, 60), -1, "0", kCenterText, 14); +infoMastersLabel_ = view__36; +view__29->addView(view__36); +Label* const view__37 = createLabel(CRect(115, 60, 155, 85), -1, "0", kCenterText, 14); +infoGroupsLabel_ = view__37; +view__29->addView(view__37); +Label* const view__38 = createLabel(CRect(115, 85, 155, 110), -1, "0", kCenterText, 14); +infoRegionsLabel_ = view__38; +view__29->addView(view__38); +Label* const view__39 = createLabel(CRect(115, 110, 155, 135), -1, "0", kCenterText, 14); +infoSamplesLabel_ = view__39; +view__29->addView(view__39); +LogicalGroup* const view__40 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelControls] = view__40; +view__0->addView(view__40); +view__40->setVisible(false); +RoundedGroup* const view__41 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +view__40->addView(view__41); +Label* const view__42 = createLabel(CRect(0, 0, 790, 285), -1, "Controls not available", kCenterText, 40); view__41->addView(view__42); -LogicalGroup* const view__43 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); -subPanels_[kPanelControls] = view__43; +LogicalGroup* const view__43 = createLogicalGroup(CRect(5, 109, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelSettings] = view__43; view__0->addView(view__43); view__43->setVisible(false); -RoundedGroup* const view__44 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +TitleGroup* const view__44 = createTitleGroup(CRect(255, 1, 535, 111), -1, "Engine", kCenterText, 12); view__43->addView(view__44); -Label* const view__45 = createLabel(CRect(0, 0, 790, 285), -1, "Controls not available", kCenterText, 40); +ValueMenu* const view__45 = createValueMenu(CRect(25, 60, 85, 85), kTagSetNumVoices, "", kCenterText, 12); +numVoicesSlider_ = view__45; view__44->addView(view__45); -LogicalGroup* const view__46 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); -subPanels_[kPanelSettings] = view__46; -view__0->addView(view__46); -TitleGroup* const view__47 = createTitleGroup(CRect(255, 15, 535, 125), -1, "Engine", kCenterText, 12); -view__46->addView(view__47); -ValueMenu* const view__48 = createValueMenu(CRect(25, 60, 85, 85), kTagSetNumVoices, "", kCenterText, 12); -numVoicesSlider_ = view__48; -view__47->addView(view__48); -ValueLabel* const view__49 = createValueLabel(CRect(15, 20, 95, 45), -1, "Polyphony", kCenterText, 12); -view__47->addView(view__49); -ValueMenu* const view__50 = createValueMenu(CRect(110, 60, 170, 85), kTagSetOversampling, "", kCenterText, 12); -oversamplingSlider_ = view__50; -view__47->addView(view__50); -ValueLabel* const view__51 = createValueLabel(CRect(100, 20, 180, 45), -1, "Oversampling", kCenterText, 12); -view__47->addView(view__51); -ValueLabel* const view__52 = createValueLabel(CRect(185, 20, 265, 45), -1, "Preload size", kCenterText, 12); -view__47->addView(view__52); -ValueMenu* const view__53 = createValueMenu(CRect(195, 60, 255, 85), kTagSetPreloadSize, "", kCenterText, 12); -preloadSizeSlider_ = view__53; -view__47->addView(view__53); -TitleGroup* const view__54 = createTitleGroup(CRect(200, 150, 590, 270), -1, "Tuning", kCenterText, 12); -view__46->addView(view__54); -ValueLabel* const view__55 = createValueLabel(CRect(125, 20, 205, 45), -1, "Root key", kCenterText, 12); -view__54->addView(view__55); -ValueMenu* const view__56 = createValueMenu(CRect(220, 60, 280, 85), kTagSetTuningFrequency, "", kCenterText, 12); -tuningFrequencySlider_ = view__56; -view__54->addView(view__56); -ValueLabel* const view__57 = createValueLabel(CRect(210, 20, 290, 45), -1, "Frequency", kCenterText, 12); -view__54->addView(view__57); -Knob48* const view__58 = createKnob48(CRect(310, 45, 358, 93), kTagSetStretchedTuning, "", kCenterText, 14); -stretchedTuningSlider_ = view__58; -view__54->addView(view__58); -ValueLabel* const view__59 = createValueLabel(CRect(295, 20, 375, 45), -1, "Stretch", kCenterText, 12); -view__54->addView(view__59); -ValueLabel* const view__60 = createValueLabel(CRect(20, 20, 120, 45), -1, "Scala file", kCenterText, 12); -view__54->addView(view__60); -ValueButton* const view__61 = createValueButton(CRect(20, 60, 120, 85), kTagLoadScalaFile, "DefaultScale", kCenterText, 12); -scalaFileButton_ = view__61; -view__54->addView(view__61); -ValueMenu* const view__62 = createValueMenu(CRect(135, 60, 170, 85), kTagSetScalaRootKey, "", kCenterText, 12); -scalaRootKeySlider_ = view__62; -view__54->addView(view__62); -ValueMenu* const view__63 = createValueMenu(CRect(170, 60, 200, 85), kTagSetScalaRootKey, "", kCenterText, 12); -scalaRootOctaveSlider_ = view__63; -view__54->addView(view__63); -LogicalGroup* const view__64 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); -subPanels_[kPanelInfo] = view__64; -view__0->addView(view__64); -view__64->setVisible(false); -RoundedGroup* const view__65 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); -view__64->addView(view__65); -Label* const view__66 = createLabel(CRect(0, 0, 790, 285), -1, "Informative text goes here", kCenterText, 40); -view__65->addView(view__66); -Piano* const view__67 = createPiano(CRect(5, 400, 795, 470), -1, "", kCenterText, 14); -view__0->addView(view__67); +ValueLabel* const view__46 = createValueLabel(CRect(15, 20, 95, 45), -1, "Polyphony", kCenterText, 12); +view__44->addView(view__46); +ValueMenu* const view__47 = createValueMenu(CRect(110, 60, 170, 85), kTagSetOversampling, "", kCenterText, 12); +oversamplingSlider_ = view__47; +view__44->addView(view__47); +ValueLabel* const view__48 = createValueLabel(CRect(100, 20, 180, 45), -1, "Oversampling", kCenterText, 12); +view__44->addView(view__48); +ValueLabel* const view__49 = createValueLabel(CRect(185, 20, 265, 45), -1, "Preload size", kCenterText, 12); +view__44->addView(view__49); +ValueMenu* const view__50 = createValueMenu(CRect(195, 60, 255, 85), kTagSetPreloadSize, "", kCenterText, 12); +preloadSizeSlider_ = view__50; +view__44->addView(view__50); +TitleGroup* const view__51 = createTitleGroup(CRect(200, 159, 590, 279), -1, "Tuning", kCenterText, 12); +view__43->addView(view__51); +ValueLabel* const view__52 = createValueLabel(CRect(125, 20, 205, 45), -1, "Root key", kCenterText, 12); +view__51->addView(view__52); +ValueMenu* const view__53 = createValueMenu(CRect(220, 60, 280, 85), kTagSetTuningFrequency, "", kCenterText, 12); +tuningFrequencySlider_ = view__53; +view__51->addView(view__53); +ValueLabel* const view__54 = createValueLabel(CRect(210, 20, 290, 45), -1, "Frequency", kCenterText, 12); +view__51->addView(view__54); +Knob48* const view__55 = createKnob48(CRect(310, 45, 358, 93), kTagSetStretchedTuning, "", kCenterText, 14); +stretchedTuningSlider_ = view__55; +view__51->addView(view__55); +ValueLabel* const view__56 = createValueLabel(CRect(295, 20, 375, 45), -1, "Stretch", kCenterText, 12); +view__51->addView(view__56); +ValueLabel* const view__57 = createValueLabel(CRect(20, 20, 120, 45), -1, "Scala file", kCenterText, 12); +view__51->addView(view__57); +ValueButton* const view__58 = createValueButton(CRect(20, 60, 120, 85), kTagLoadScalaFile, "DefaultScale", kCenterText, 12); +scalaFileButton_ = view__58; +view__51->addView(view__58); +ValueMenu* const view__59 = createValueMenu(CRect(135, 60, 170, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootKeySlider_ = view__59; +view__51->addView(view__59); +ValueMenu* const view__60 = createValueMenu(CRect(170, 60, 200, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootOctaveSlider_ = view__60; +view__51->addView(view__60); +Piano* const view__61 = createPiano(CRect(5, 400, 795, 470), -1, "", kCenterText, 14); +view__0->addView(view__61);