diff --git a/plugins/editor/layout/about.fl b/plugins/editor/layout/about.fl index 838f9117..29c72055 100644 --- a/plugins/editor/layout/about.fl +++ b/plugins/editor/layout/about.fl @@ -3,48 +3,66 @@ version 1.0305 header_name {.h} code_name {.cxx} widget_class aboutView { - label {About sfizz} open selected + label {About sfizz} open xywh {527 165 800 475} type Double visible } { - Fl_Box lblHover_ { - xywh {200 80 400 25} labelsize 10 - class HoverBox - } - Fl_Button {} { - comment {tag=kTagButtonSfztools} - xywh {235 45 35 35} labelsize 30 - class ButtonSfztools - } - Fl_Button {} { - comment {tag=kTagButtonGithub} - xywh {305 45 35 35} labelsize 30 - class ButtonGithub - } - Fl_Button {} { - comment {tag=kTagButtonDiscord} - xywh {375 45 35 35} labelsize 30 - class ButtonDiscord - } - Fl_Button {} { - comment {tag=kTagButtonOpencollective} - xywh {445 45 35 35} labelsize 30 - class ButtonOpencollective - } - Fl_Button {} { - comment {tag=kTagButtonSfzformat} - xywh {515 45 35 35} labelsize 30 - class ButtonSfzformat - } Fl_Box {} { - image {../resources/logo_orange.png} xywh {200 90 400 180} + image {../resources/logo_orange.png} xywh {200 0 400 180} class Logo } Fl_Box {} { - xywh {260 270 280 80} + xywh {260 180 280 80} class InfoBox } Fl_Box {} { - xywh {200 350 400 100} + xywh {200 260 400 100} class DescriptionBox } + Fl_Box lblHover_ {selected + xywh {465 435 315 25} labelsize 12 hide + class HoverBox + } + Fl_Button {} { + comment {tag=kTagButtonSfztools} selected + xywh {465 405 40 40} labelsize 30 + class ButtonSfztools + } + Fl_Button {} { + comment {tag=kTagButtonGithub} selected + xywh {535 405 40 40} labelsize 30 + class ButtonGithub + } + Fl_Button {} { + comment {tag=kTagButtonDiscord} selected + xywh {605 405 40 40} labelsize 30 + class ButtonDiscord + } + Fl_Button {} { + comment {tag=kTagButtonOpencollective} selected + xywh {675 405 40 40} labelsize 30 + class ButtonOpencollective + } + Fl_Button {} { + comment {tag=kTagButtonSfzformat} selected + xywh {745 405 40 40} labelsize 30 + class ButtonSfzformat + } + Fl_Box {} { + label {Format +Host +Processor +Address +System} + xywh {15 375 90 90} align 20 + class SysInfoKeyBox + } + Fl_Box lblSysInfoValue_ { + label {%PluginFormat% +%HostProgram% +%HostCPU% +%HostBits% bits +%HostOS%} + xywh {105 375 345 90} align 20 + class SysInfoValueBox + } } diff --git a/plugins/editor/src/editor/DlgAbout.cpp b/plugins/editor/src/editor/DlgAbout.cpp index 3d417dae..fba4e275 100644 --- a/plugins/editor/src/editor/DlgAbout.cpp +++ b/plugins/editor/src/editor/DlgAbout.cpp @@ -77,7 +77,7 @@ SAboutDialog::SAboutDialog(const CRect& bounds) auto createHoverBox = [](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) { CTextLabel* lbl = new CTextLabel(bounds, label); auto font = makeOwned("Roboto", fontsize); - lbl->setFontColor(CColor(0xff, 0xff, 0xff, 0xff)); + lbl->setFontColor(CColor(0xfd, 0x98, 0x00, 0xff)); lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); lbl->setHoriAlign(align); @@ -85,6 +85,30 @@ SAboutDialog::SAboutDialog(const CRect& bounds) return lbl; }; + auto createSysInfoKeyBox = [](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) { + CMultiLineTextLabel* lbl = new CMultiLineTextLabel(bounds); + auto font = makeOwned("Roboto", fontsize, kBoldFace); + lbl->setFont(font); + lbl->setFontColor(CColor(0xfd, 0x98, 0x00, 0xff)); + lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setHoriAlign(align); + lbl->setText(label); + return lbl; + }; + + auto createSysInfoValueBox = [](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) { + CMultiLineTextLabel* lbl = new CMultiLineTextLabel(bounds); + auto font = makeOwned("Roboto", fontsize); + lbl->setFont(font); + lbl->setFontColor(CColor(0xff, 0xff, 0xff, 0xff)); + lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setHoriAlign(align); + lbl->setText(label); + return lbl; + }; + auto createGlyphButton = [this](UTF8StringPtr glyph, const CRect& bounds, int tag, int fontsize) { STextButton* btn = new STextButton(bounds, this, tag, glyph); btn->setFont(makeOwned("Sfizz Misc Icons", fontsize)); @@ -98,32 +122,32 @@ SAboutDialog::SAboutDialog(const CRect& bounds) }; auto createButtonSfztools = [this, &createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { STextButton* btn = createGlyphButton(u8"\ue000", bounds, tag, fontsize); - btn->OnHoverEnter = [this]() { lblHover_->setText("SFZTools Website"); }; - btn->OnHoverLeave = [this]() { lblHover_->setText(""); }; + btn->OnHoverEnter = [this, btn]() { buttonHoverEnter(btn, "SFZ Tools"); }; + btn->OnHoverLeave = [this, btn]() { buttonHoverLeave(btn); }; return btn; }; auto createButtonGithub = [this, &createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { STextButton* btn = createGlyphButton(u8"\ue001", bounds, tag, fontsize); - btn->OnHoverEnter = [this]() { lblHover_->setText("GitHub Repository"); }; - btn->OnHoverLeave = [this]() { lblHover_->setText(""); }; + btn->OnHoverEnter = [this, btn]() { buttonHoverEnter(btn, "Source code"); }; + btn->OnHoverLeave = [this, btn]() { buttonHoverLeave(btn); }; return btn; }; auto createButtonDiscord = [this, &createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { STextButton* btn = createGlyphButton(u8"\ue002", bounds, tag, fontsize); - btn->OnHoverEnter = [this]() { lblHover_->setText("Discord Chat"); }; - btn->OnHoverLeave = [this]() { lblHover_->setText(""); }; + btn->OnHoverEnter = [this, btn]() { buttonHoverEnter(btn, "Community chat"); }; + btn->OnHoverLeave = [this, btn]() { buttonHoverLeave(btn); }; return btn; }; auto createButtonOpencollective = [this, &createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { STextButton* btn = createGlyphButton(u8"\ue003", bounds, tag, fontsize); - btn->OnHoverEnter = [this]() { lblHover_->setText("Support Us"); }; - btn->OnHoverLeave = [this]() { lblHover_->setText(""); }; + btn->OnHoverEnter = [this, btn]() { buttonHoverEnter(btn, "Support us"); }; + btn->OnHoverLeave = [this, btn]() { buttonHoverLeave(btn); }; return btn; }; auto createButtonSfzformat = [this, &createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { STextButton* btn = createGlyphButton(u8"\ue004", bounds, tag, fontsize); - btn->OnHoverEnter = [this]() { lblHover_->setText("SFZFormat Documentation"); }; - btn->OnHoverLeave = [this]() { lblHover_->setText(""); }; + btn->OnHoverEnter = [this, btn]() { buttonHoverEnter(btn, "SFZ Format"); }; + btn->OnHoverLeave = [this, btn]() { buttonHoverLeave(btn); }; return btn; }; @@ -134,16 +158,54 @@ SAboutDialog::SAboutDialog(const CRect& bounds) CRect aboutBounds = aboutView->getViewSize(); aboutBounds.centerInside(CRect(bounds).originize()); aboutView->setViewSize(aboutBounds); + + /// + sysInfoTemplate_ = lblSysInfoValue_->getText(); + sysInfoVariables_["%HostOS%"] = getOperatingSystemName(); + sysInfoVariables_["%HostCPU%"] = getProcessorName(); + sysInfoVariables_["%HostBits%"] = std::to_string(8 * sizeof(void*)); } void SAboutDialog::setPluginFormat(const std::string& pluginFormat) { - // TODO + sysInfoVariables_["%PluginFormat%"] = pluginFormat; + updateSysInfo(); } void SAboutDialog::setPluginHost(const std::string& pluginHost) { - // TODO + sysInfoVariables_["%HostProgram%"] = pluginHost; + updateSysInfo(); +} + +void SAboutDialog::updateSysInfo() +{ + std::string text = sysInfoTemplate_; + for (const auto& infoKeyValue : sysInfoVariables_) { + size_t pos = text.find(infoKeyValue.first); + if (pos != text.npos) + text.replace(pos, infoKeyValue.first.size(), infoKeyValue.second); + } + lblSysInfoValue_->setText(UTF8String(text)); +} + +void SAboutDialog::buttonHoverEnter(CControl* btn, const char* text) +{ + CRect rect = lblHover_->getViewSize(); + CRect btnRect = btn->getViewSize(); + rect.left = btnRect.left - 100; + rect.right = btnRect.right + 100; + lblHover_->setViewSize(rect); + + lblHover_->setText(text); + lblHover_->setVisible(true); + lblHover_->invalid(); +} + +void SAboutDialog::buttonHoverLeave(CControl* btn) +{ + (void)btn; + lblHover_->setVisible(false); } CMouseEventResult SAboutDialog::onMouseDown(CPoint& where, const CButtonState& buttons) diff --git a/plugins/editor/src/editor/DlgAbout.h b/plugins/editor/src/editor/DlgAbout.h index e7ac0119..23c0a6e0 100644 --- a/plugins/editor/src/editor/DlgAbout.h +++ b/plugins/editor/src/editor/DlgAbout.h @@ -35,5 +35,14 @@ protected: // IControlListener void valueChanged(CControl* ctl) override; +private: + void updateSysInfo(); + + void buttonHoverEnter(CControl* btn, const char* text); + void buttonHoverLeave(CControl* btn); + CTextLabel* lblHover_ = {}; + CTextLabel* lblSysInfoValue_ = {}; + std::string sysInfoTemplate_; + std::map sysInfoVariables_; }; diff --git a/plugins/editor/src/editor/layout/about.hpp b/plugins/editor/src/editor/layout/about.hpp index 594f175e..1628dc1e 100644 --- a/plugins/editor/src/editor/layout/about.hpp +++ b/plugins/editor/src/editor/layout/about.hpp @@ -1,22 +1,28 @@ /* This file is generated by the layout maker tool. */ auto* const view__0 = createaboutView(CRect(0, 0, 800, 475), -1, "About sfizz", kCenterText, 14); aboutView = view__0; -auto* const view__1 = createHoverBox(CRect(200, 80, 600, 105), -1, "", kCenterText, 10); -lblHover_ = view__1; +auto* const view__1 = createLogo(CRect(200, 0, 600, 180), -1, "", kCenterText, 14); view__0->addView(view__1); -auto* const view__2 = createButtonSfztools(CRect(235, 45, 270, 80), kTagButtonSfztools, "", kCenterText, 30); +auto* const view__2 = createInfoBox(CRect(260, 180, 540, 260), -1, "", kCenterText, 14); view__0->addView(view__2); -auto* const view__3 = createButtonGithub(CRect(305, 45, 340, 80), kTagButtonGithub, "", kCenterText, 30); +auto* const view__3 = createDescriptionBox(CRect(200, 260, 600, 360), -1, "", kCenterText, 14); view__0->addView(view__3); -auto* const view__4 = createButtonDiscord(CRect(375, 45, 410, 80), kTagButtonDiscord, "", kCenterText, 30); +auto* const view__4 = createHoverBox(CRect(465, 435, 780, 460), -1, "", kCenterText, 12); +lblHover_ = view__4; view__0->addView(view__4); -auto* const view__5 = createButtonOpencollective(CRect(445, 45, 480, 80), kTagButtonOpencollective, "", kCenterText, 30); +view__4->setVisible(false); +auto* const view__5 = createButtonSfztools(CRect(465, 405, 505, 445), kTagButtonSfztools, "", kCenterText, 30); view__0->addView(view__5); -auto* const view__6 = createButtonSfzformat(CRect(515, 45, 550, 80), kTagButtonSfzformat, "", kCenterText, 30); +auto* const view__6 = createButtonGithub(CRect(535, 405, 575, 445), kTagButtonGithub, "", kCenterText, 30); view__0->addView(view__6); -auto* const view__7 = createLogo(CRect(200, 90, 600, 270), -1, "", kCenterText, 14); +auto* const view__7 = createButtonDiscord(CRect(605, 405, 645, 445), kTagButtonDiscord, "", kCenterText, 30); view__0->addView(view__7); -auto* const view__8 = createInfoBox(CRect(260, 270, 540, 350), -1, "", kCenterText, 14); +auto* const view__8 = createButtonOpencollective(CRect(675, 405, 715, 445), kTagButtonOpencollective, "", kCenterText, 30); view__0->addView(view__8); -auto* const view__9 = createDescriptionBox(CRect(200, 350, 600, 450), -1, "", kCenterText, 14); +auto* const view__9 = createButtonSfzformat(CRect(745, 405, 785, 445), kTagButtonSfzformat, "", kCenterText, 30); view__0->addView(view__9); +auto* const view__10 = createSysInfoKeyBox(CRect(15, 375, 105, 465), -1, "Format\nHost\nProcessor\nAddress\nSystem", kLeftText, 14); +view__0->addView(view__10); +auto* const view__11 = createSysInfoValueBox(CRect(105, 375, 450, 465), -1, "%PluginFormat%\n%HostProgram%\n%HostCPU%\n%HostBits% bits\n%HostOS%", kLeftText, 14); +lblSysInfoValue_ = view__11; +view__0->addView(view__11);