From 2142bc7ccee6e08f4902bfbd0151c9fd112c332b Mon Sep 17 00:00:00 2001 From: David Given Date: Thu, 23 Oct 2025 01:12:40 +0200 Subject: [PATCH] Add a Disk menu. --- src/gui2/datastore.cc | 2 +- src/gui2/fluxengine.cc | 101 +++++++++++++++++++++++++++++++++- src/gui2/rsrc/lang/en_US.json | 9 ++- 3 files changed, 106 insertions(+), 6 deletions(-) diff --git a/src/gui2/datastore.cc b/src/gui2/datastore.cc index 591938f0..2f926482 100644 --- a/src/gui2/datastore.cc +++ b/src/gui2/datastore.cc @@ -35,7 +35,7 @@ using hex::operator""_lang; -static std::shared_ptr disk; +static std::shared_ptr disk = std::make_shared(); static std::shared_ptr wtImage; static std::deque> pendingTasks; diff --git a/src/gui2/fluxengine.cc b/src/gui2/fluxengine.cc index 9064b5cc..eec0ca2b 100644 --- a/src/gui2/fluxengine.cc +++ b/src/gui2/fluxengine.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -66,10 +67,106 @@ IMHEX_PLUGIN_SETUP("FluxEngine", "David Given", "FluxEngine integration") hex::WorkspaceManager::switchWorkspace(currentWorkspaceName); }); + hex::ContentRegistry::UserInterface::registerMainMenuItem( + "fluxengine.menu.name", 4999); + + auto isReady = [] + { + return !Datastore::isBusy(); + }; + + auto isReadyAndHasImage = [] + { + return !Datastore::isBusy() && Datastore::getDisk()->image; + }; + hex::ContentRegistry::UserInterface::addMenuItem( - {"hex.builtin.menu.extras", "fluxengine.menu.tools.exerciser"}, + {"fluxengine.menu.name", "fluxengine.view.controlpanel.readDevice"}, + ICON_TA_DEVICE_FLOPPY, + 1000, + hex::Shortcut::None, + [] + { + Datastore::beginRead(false); + }, + isReady); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.rereadBad"}, + ICON_TA_REPEAT, + 1100, + hex::Shortcut::None, + [] + { + Datastore::beginRead(true); + }, + isReadyAndHasImage); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.readImage"}, + ICON_VS_FOLDER_OPENED, + 1200, + hex::Shortcut::None, + [] + { + hex::fs::openFileBrowser( + hex::fs::DialogMode::Open, {}, Datastore::readImage); + }, + isReady); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.createBlank"}, + ICON_VS_FOLDER_OPENED, + 1250, + hex::Shortcut::None, + Datastore::createBlankImage, + [] + { + return !Datastore::isBusy() && Datastore::canFormat(); + }); + + hex::ContentRegistry::UserInterface::addMenuItemSeparator( + {"fluxengine.menu.name"}, 1300); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.writeDevice"}, + ICON_TA_DEVICE_FLOPPY, + 1400, + hex::Shortcut::None, + Datastore::beginWrite, + isReadyAndHasImage); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.writeFlux"}, + ICON_TA_DOWNLOAD, + 1500, + hex::Shortcut::None, + [] + { + hex::fs::openFileBrowser( + hex::fs::DialogMode::Save, {}, Datastore::writeFluxFile); + }, + isReady); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.view.controlpanel.writeImage"}, + ICON_VS_SAVE_ALL, + 1600, + hex::Shortcut::None, + [] + { + hex::fs::openFileBrowser( + hex::fs::DialogMode::Save, {}, Datastore::writeImage); + }, + isReadyAndHasImage); + + hex::ContentRegistry::UserInterface::addMenuItemSeparator( + {"fluxengine.menu.name"}, 9999); + + hex::ContentRegistry::UserInterface::addMenuItem( + {"fluxengine.menu.name", "fluxengine.menu.disk.exerciser"}, ICON_TA_TOOLS, - 2500, + 10000, hex::Shortcut::None, [] { diff --git a/src/gui2/rsrc/lang/en_US.json b/src/gui2/rsrc/lang/en_US.json index 9742a3e9..1e338ecc 100644 --- a/src/gui2/rsrc/lang/en_US.json +++ b/src/gui2/rsrc/lang/en_US.json @@ -33,13 +33,13 @@ "fluxengine.view.physical.name": "FluxEngine physical sector map", "fluxengine.view.controlpanel.name": "FluxEngine controls", - "fluxengine.view.controlpanel.readDevice": "Read", - "fluxengine.view.controlpanel.writeDevice": "Write", + "fluxengine.view.controlpanel.readDevice": "Read from device", + "fluxengine.view.controlpanel.writeDevice": "Write to device", "fluxengine.view.controlpanel.writeFlux": "Write flux file", "fluxengine.view.controlpanel.readImage": "Load disk image", "fluxengine.view.controlpanel.writeImage": "Save disk image", "fluxengine.view.controlpanel.rereadBad": "Re-read bad tracks", - "fluxengine.view.controlpanel.createBlank": "Empty filesystem", + "fluxengine.view.controlpanel.createBlank": "Make empty image", "fluxengine.view.controlpanel.stop": "Stop", "fluxengine.view.log.name": "FluxEngine log viewer", @@ -58,5 +58,8 @@ "fluxengine.view.status.blankFilesystem": "Creating blank filesystem", "fluxengine.messages.writingFluxToFile": "The current configuration is to write to a flux file rather than to hardware. Is this what you intended?", + + "fluxengine.menu.name": "Disk", + "fluxengine.menu.disk.exerciser": "Disk exerciser", "fluxengine.menu.workspace.reset": "Reset workspace" }