| @@ -220,6 +220,52 @@ struct DisconnectCablesItem : ui::MenuItem { | |||
| } | |||
| }; | |||
| struct AllowCursorLockItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::allowCursorLock ^= true; | |||
| } | |||
| }; | |||
| struct KnobModeValueItem : ui::MenuItem { | |||
| settings::KnobMode knobMode; | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::knobMode = knobMode; | |||
| } | |||
| }; | |||
| struct KnobModeItem : ui::MenuItem { | |||
| ui::Menu* createChildMenu() override { | |||
| ui::Menu* menu = new ui::Menu; | |||
| static const std::vector<std::pair<settings::KnobMode, std::string>> knobModes = { | |||
| {settings::KNOB_MODE_LINEAR, "Linear"}, | |||
| {settings::KNOB_MODE_SCALED_LINEAR, "Scaled linear"}, | |||
| {settings::KNOB_MODE_ROTARY_ABSOLUTE, "Absolute rotary"}, | |||
| {settings::KNOB_MODE_ROTARY_RELATIVE, "Relative rotary"}, | |||
| }; | |||
| for (const auto& pair : knobModes) { | |||
| KnobModeValueItem* item = new KnobModeValueItem; | |||
| item->knobMode = pair.first; | |||
| item->text = pair.second; | |||
| item->rightText = CHECKMARK(settings::knobMode == pair.first); | |||
| menu->addChild(item); | |||
| } | |||
| return menu; | |||
| } | |||
| }; | |||
| struct KnobScrollItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::knobScroll ^= true; | |||
| } | |||
| }; | |||
| struct LockModulesItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::lockModules ^= true; | |||
| } | |||
| }; | |||
| struct EditButton : MenuButton { | |||
| void onAction(const ActionEvent& e) override { | |||
| ui::Menu* menu = createMenu(); | |||
| @@ -241,6 +287,28 @@ struct EditButton : MenuButton { | |||
| DisconnectCablesItem* disconnectCablesItem = new DisconnectCablesItem; | |||
| disconnectCablesItem->text = "Clear cables"; | |||
| menu->addChild(disconnectCablesItem); | |||
| menu->addChild(new ui::MenuSeparator); | |||
| AllowCursorLockItem* allowCursorLockItem = new AllowCursorLockItem; | |||
| allowCursorLockItem->text = "Lock cursor when dragging parameters"; | |||
| allowCursorLockItem->rightText = CHECKMARK(settings::allowCursorLock); | |||
| menu->addChild(allowCursorLockItem); | |||
| KnobModeItem* knobModeItem = new KnobModeItem; | |||
| knobModeItem->text = "Knob mode"; | |||
| knobModeItem->rightText = RIGHT_ARROW; | |||
| menu->addChild(knobModeItem); | |||
| KnobScrollItem* knobScrollItem = new KnobScrollItem; | |||
| knobScrollItem->text = "Scroll wheel knob control"; | |||
| knobScrollItem->rightText = CHECKMARK(settings::knobScroll); | |||
| menu->addChild(knobScrollItem); | |||
| LockModulesItem* lockModulesItem = new LockModulesItem; | |||
| lockModulesItem->text = "Lock module positions"; | |||
| lockModulesItem->rightText = CHECKMARK(settings::lockModules); | |||
| menu->addChild(lockModulesItem); | |||
| } | |||
| }; | |||
| @@ -420,52 +488,6 @@ struct TooltipsItem : ui::MenuItem { | |||
| } | |||
| }; | |||
| struct AllowCursorLockItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::allowCursorLock ^= true; | |||
| } | |||
| }; | |||
| struct KnobModeValueItem : ui::MenuItem { | |||
| settings::KnobMode knobMode; | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::knobMode = knobMode; | |||
| } | |||
| }; | |||
| struct KnobModeItem : ui::MenuItem { | |||
| ui::Menu* createChildMenu() override { | |||
| ui::Menu* menu = new ui::Menu; | |||
| static const std::vector<std::pair<settings::KnobMode, std::string>> knobModes = { | |||
| {settings::KNOB_MODE_LINEAR, "Linear"}, | |||
| {settings::KNOB_MODE_SCALED_LINEAR, "Scaled linear"}, | |||
| {settings::KNOB_MODE_ROTARY_ABSOLUTE, "Absolute rotary"}, | |||
| {settings::KNOB_MODE_ROTARY_RELATIVE, "Relative rotary"}, | |||
| }; | |||
| for (const auto& pair : knobModes) { | |||
| KnobModeValueItem* item = new KnobModeValueItem; | |||
| item->knobMode = pair.first; | |||
| item->text = pair.second; | |||
| item->rightText = CHECKMARK(settings::knobMode == pair.first); | |||
| menu->addChild(item); | |||
| } | |||
| return menu; | |||
| } | |||
| }; | |||
| struct KnobScrollItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::knobScroll ^= true; | |||
| } | |||
| }; | |||
| struct LockModulesItem : ui::MenuItem { | |||
| void onAction(const ActionEvent& e) override { | |||
| settings::lockModules ^= true; | |||
| } | |||
| }; | |||
| struct FrameRateValueItem : ui::MenuItem { | |||
| int frameSwapInterval; | |||
| void onAction(const ActionEvent& e) override { | |||
| @@ -507,57 +529,37 @@ struct ViewButton : MenuButton { | |||
| tooltipsItem->rightText = CHECKMARK(settings::tooltips); | |||
| menu->addChild(tooltipsItem); | |||
| AllowCursorLockItem* allowCursorLockItem = new AllowCursorLockItem; | |||
| allowCursorLockItem->text = "Lock cursor when dragging parameters"; | |||
| allowCursorLockItem->rightText = CHECKMARK(settings::allowCursorLock); | |||
| menu->addChild(allowCursorLockItem); | |||
| KnobModeItem* knobModeItem = new KnobModeItem; | |||
| knobModeItem->text = "Knob mode"; | |||
| knobModeItem->rightText = RIGHT_ARROW; | |||
| menu->addChild(knobModeItem); | |||
| KnobScrollItem* knobScrollItem = new KnobScrollItem; | |||
| knobScrollItem->text = "Scroll wheel knob control"; | |||
| knobScrollItem->rightText = CHECKMARK(settings::knobScroll); | |||
| menu->addChild(knobScrollItem); | |||
| FrameRateItem* frameRateItem = new FrameRateItem; | |||
| frameRateItem->text = "Frame rate"; | |||
| frameRateItem->rightText = RIGHT_ARROW; | |||
| menu->addChild(frameRateItem); | |||
| LockModulesItem* lockModulesItem = new LockModulesItem; | |||
| lockModulesItem->text = "Lock module positions"; | |||
| lockModulesItem->rightText = CHECKMARK(settings::lockModules); | |||
| menu->addChild(lockModulesItem); | |||
| FullscreenItem* fullscreenItem = new FullscreenItem; | |||
| fullscreenItem->text = "Fullscreen"; | |||
| fullscreenItem->rightText = "F11"; | |||
| if (APP->window->isFullScreen()) | |||
| fullscreenItem->rightText = CHECKMARK_STRING " " + fullscreenItem->rightText; | |||
| menu->addChild(fullscreenItem); | |||
| ZoomSlider* zoomSlider = new ZoomSlider; | |||
| zoomSlider->box.size.x = 200.0; | |||
| zoomSlider->box.size.x = 250.0; | |||
| menu->addChild(zoomSlider); | |||
| CableOpacitySlider* cableOpacitySlider = new CableOpacitySlider; | |||
| cableOpacitySlider->box.size.x = 200.0; | |||
| cableOpacitySlider->box.size.x = 250.0; | |||
| menu->addChild(cableOpacitySlider); | |||
| CableTensionSlider* cableTensionSlider = new CableTensionSlider; | |||
| cableTensionSlider->box.size.x = 200.0; | |||
| cableTensionSlider->box.size.x = 250.0; | |||
| menu->addChild(cableTensionSlider); | |||
| RackBrightnessSlider* rackBrightnessSlider = new RackBrightnessSlider; | |||
| rackBrightnessSlider->box.size.x = 200.0; | |||
| rackBrightnessSlider->box.size.x = 250.0; | |||
| menu->addChild(rackBrightnessSlider); | |||
| HaloBrightnessSlider* haloBrightnessSlider = new HaloBrightnessSlider; | |||
| haloBrightnessSlider->box.size.x = 200.0; | |||
| haloBrightnessSlider->box.size.x = 250.0; | |||
| menu->addChild(haloBrightnessSlider); | |||
| FrameRateItem* frameRateItem = new FrameRateItem; | |||
| frameRateItem->text = "Frame rate"; | |||
| frameRateItem->rightText = RIGHT_ARROW; | |||
| menu->addChild(frameRateItem); | |||
| FullscreenItem* fullscreenItem = new FullscreenItem; | |||
| fullscreenItem->text = "Fullscreen"; | |||
| fullscreenItem->rightText = "F11"; | |||
| if (APP->window->isFullScreen()) | |||
| fullscreenItem->rightText = CHECKMARK_STRING " " + fullscreenItem->rightText; | |||
| menu->addChild(fullscreenItem); | |||
| } | |||
| }; | |||
| @@ -1009,18 +1011,6 @@ struct HelpButton : MenuButton { | |||
| menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); | |||
| menu->box.size.x = box.size.x; | |||
| if (library::isAppUpdateAvailable()) { | |||
| AppUpdateItem* appUpdateItem = new AppUpdateItem; | |||
| appUpdateItem->text = "Update " + APP_NAME; | |||
| appUpdateItem->rightText = APP_VERSION + " → " + library::appVersion; | |||
| menu->addChild(appUpdateItem); | |||
| } | |||
| else if (!settings::autoCheckUpdates && !settings::devMode) { | |||
| CheckAppUpdateItem* checkAppUpdateItem = new CheckAppUpdateItem; | |||
| checkAppUpdateItem->text = "Check for " + APP_NAME + " update"; | |||
| menu->addChild(checkAppUpdateItem); | |||
| } | |||
| TipItem* tipItem = new TipItem; | |||
| tipItem->text = "Tips"; | |||
| menu->addChild(tipItem); | |||
| @@ -1036,6 +1026,20 @@ struct HelpButton : MenuButton { | |||
| websiteItem->url = "https://vcvrack.com/"; | |||
| menu->addChild(websiteItem); | |||
| menu->addChild(new ui::MenuSeparator); | |||
| if (library::isAppUpdateAvailable()) { | |||
| AppUpdateItem* appUpdateItem = new AppUpdateItem; | |||
| appUpdateItem->text = "Update " + APP_NAME; | |||
| appUpdateItem->rightText = APP_VERSION + " → " + library::appVersion; | |||
| menu->addChild(appUpdateItem); | |||
| } | |||
| else if (!settings::autoCheckUpdates && !settings::devMode) { | |||
| CheckAppUpdateItem* checkAppUpdateItem = new CheckAppUpdateItem; | |||
| checkAppUpdateItem->text = "Check for " + APP_NAME + " update"; | |||
| menu->addChild(checkAppUpdateItem); | |||
| } | |||
| FolderItem* folderItem = new FolderItem; | |||
| folderItem->text = "Open user folder"; | |||
| folderItem->path = asset::user(""); | |||