From df63257d117066797d727c2b27343e90dacdcaa9 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Tue, 5 Dec 2023 15:58:45 +0400 Subject: [PATCH 01/30] dummy export window, keybind and related settings --- CMakeLists.txt | 1 + src/gui/doAction.cpp | 3 + src/gui/exportWin.cpp | 24 +++ src/gui/gui.cpp | 358 ++++++++++++++++++++++-------------------- src/gui/gui.h | 6 +- src/gui/guiConst.cpp | 1 + src/gui/settings.cpp | 10 ++ 7 files changed, 233 insertions(+), 170 deletions(-) create mode 100644 src/gui/exportWin.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f1941a02b..5336f3131 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -779,6 +779,7 @@ src/gui/doAction.cpp src/gui/editing.cpp src/gui/editControls.cpp src/gui/effectList.cpp +src/gui/exportWin.cpp src/gui/findReplace.cpp src/gui/fmPreview.cpp src/gui/gradient.cpp diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 0d1bcf623..7a30760cf 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -65,6 +65,9 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_SAVE_AS: openFileDialog(GUI_FILE_SAVE); break; + case GUI_ACTION_EXPORT: + displayExport=true; + break; case GUI_ACTION_UNDO: if (curWindow==GUI_WINDOW_SAMPLE_EDIT) { doUndoSample(); diff --git a/src/gui/exportWin.cpp b/src/gui/exportWin.cpp new file mode 100644 index 000000000..6e2c8b559 --- /dev/null +++ b/src/gui/exportWin.cpp @@ -0,0 +1,24 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "gui.h" + +void FurnaceGUI::drawExport() { + if (ImGui::Button("dummy")) ImGui::CloseCurrentPopup(); +} diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 86cf09a86..99c7297ab 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4081,197 +4081,203 @@ bool FurnaceGUI::loop() { openFileDialog(GUI_FILE_SAVE_DMF_LEGACY); } ImGui::Separator(); - if (ImGui::BeginMenu("export audio...")) { - exitDisabledTimer=1; - if (ImGui::MenuItem("one file")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + if (settings.classicExportOptions) { + if (ImGui::BeginMenu("export audio...")) { + exitDisabledTimer=1; + if (ImGui::MenuItem("one file")) { + openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + } + if (ImGui::MenuItem("multiple files (one per chip)")) { + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); + } + if (ImGui::MenuItem("multiple files (one per channel)")) { + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); + } + if (ImGui::InputInt("Loops",&exportLoops,1,2)) { + if (exportLoops<0) exportLoops=0; + } + if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { + if (exportFadeOut<0.0) exportFadeOut=0.0; + } + ImGui::EndMenu(); } - if (ImGui::MenuItem("multiple files (one per chip)")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); - } - if (ImGui::MenuItem("multiple files (one per channel)")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); - } - if (ImGui::InputInt("Loops",&exportLoops,1,2)) { - if (exportLoops<0) exportLoops=0; - } - if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { - if (exportFadeOut<0.0) exportFadeOut=0.0; - } - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("export VGM...")) { - exitDisabledTimer=1; - ImGui::Text("settings:"); - if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { - for (int i=0; i<7; i++) { - if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { - vgmExportVersion=vgmVersions[i]; + if (ImGui::BeginMenu("export VGM...")) { + exitDisabledTimer=1; + ImGui::Text("settings:"); + if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { + for (int i=0; i<7; i++) { + if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { + vgmExportVersion=vgmVersions[i]; + } } + ImGui::EndCombo(); } - ImGui::EndCombo(); - } - ImGui::Checkbox("loop",&vgmExportLoop); - if (vgmExportLoop && e->song.loopModality==2) { - ImGui::Text("loop trail:"); - ImGui::Indent(); - if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { - vgmExportTrailingTicks=-1; - } - if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { - vgmExportTrailingTicks=-2; - } - if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { - vgmExportTrailingTicks=0; - } - if (vgmExportTrailingTicks>=0) { - ImGui::SameLine(); - if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { - if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + ImGui::Checkbox("loop",&vgmExportLoop); + if (vgmExportLoop && e->song.loopModality==2) { + ImGui::Text("loop trail:"); + ImGui::Indent(); + if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { + vgmExportTrailingTicks=-1; } + if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { + vgmExportTrailingTicks=-2; + } + if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { + vgmExportTrailingTicks=0; + } + if (vgmExportTrailingTicks>=0) { + ImGui::SameLine(); + if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { + if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + } + } + ImGui::Unindent(); } - ImGui::Unindent(); - } - ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "inserts data blocks on pattern changes.\n" - "useful if you are writing a playback routine.\n\n" + ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "inserts data blocks on pattern changes.\n" + "useful if you are writing a playback routine.\n\n" - "the format of a pattern change data block is:\n" - "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" - "- ll: length, a 32-bit little-endian number\n" - "- oo: order\n" - "- rr: initial row (a 0Dxx effect is able to select a different row)\n" - "- pp: pattern index (one per channel)\n\n" + "the format of a pattern change data block is:\n" + "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" + "- ll: length, a 32-bit little-endian number\n" + "- oo: order\n" + "- rr: initial row (a 0Dxx effect is able to select a different row)\n" + "- pp: pattern index (one per channel)\n\n" - "pattern indexes are ordered as they appear in the song." - ); - } - ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "required for DualPCM and MSM6258 export.\n\n" - "allows for volume/direction changes when playing samples,\n" - "at the cost of a massive increase in file size." - ); - } - ImGui::Text("chips to export:"); - bool hasOneAtLeast=false; - for (int i=0; isong.systemLen; i++) { - int minVersion=e->minVGMVersion(e->song.system[i]); - ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (minVersion>vgmExportVersion) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + "pattern indexes are ordered as they appear in the song." + ); + } + ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "required for DualPCM and MSM6258 export.\n\n" + "allows for volume/direction changes when playing samples,\n" + "at the cost of a massive increase in file size." + ); + } + ImGui::Text("chips to export:"); + bool hasOneAtLeast=false; + for (int i=0; isong.systemLen; i++) { + int minVersion=e->minVGMVersion(e->song.system[i]); + ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); + ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); + ImGui::EndDisabled(); + if (minVersion>vgmExportVersion) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + } + } else if (minVersion==0) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + } else { + if (willExport[i]) hasOneAtLeast=true; } - } else if (minVersion==0) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + ImGui::Text("select the chip you wish to export,"); + ImGui::Text("but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); + if (hasOneAtLeast) { + if (ImGui::MenuItem("click to export")) { + openFileDialog(GUI_FILE_EXPORT_VGM); } } else { - if (willExport[i]) hasOneAtLeast=true; - } - } - ImGui::Text("select the chip you wish to export,"); - ImGui::Text("but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); - if (hasOneAtLeast) { - if (ImGui::MenuItem("click to export")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - } - } else { - ImGui::Text("nothing to export"); - } - ImGui::EndMenu(); - } - int numZSMCompat=0; - for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; - } - if (numZSMCompat > 0) { - if (ImGui::BeginMenu("export ZSM...")) { - exitDisabledTimer=1; - ImGui::Text("Commander X16 Zsound Music File"); - if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { - if (zsmExportTickRate<1) zsmExportTickRate=1; - if (zsmExportTickRate>44100) zsmExportTickRate=44100; - } - ImGui::Checkbox("loop",&zsmExportLoop); - ImGui::SameLine(); - ImGui::Checkbox("optimize size",&zsmExportOptimize); - ImGui::SameLine(); - if (ImGui::Button("Begin Export")) { - openFileDialog(GUI_FILE_EXPORT_ZSM); - ImGui::CloseCurrentPopup(); + ImGui::Text("nothing to export"); } ImGui::EndMenu(); } - } - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - if (numAmiga && settings.iCannotWait) { - if (ImGui::BeginMenu("export Amiga validation data...")) { + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat > 0) { + if (ImGui::BeginMenu("export ZSM...")) { + exitDisabledTimer=1; + ImGui::Text("Commander X16 Zsound Music File"); + if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { + if (zsmExportTickRate<1) zsmExportTickRate=1; + if (zsmExportTickRate>44100) zsmExportTickRate=44100; + } + ImGui::Checkbox("loop",&zsmExportLoop); + ImGui::SameLine(); + ImGui::Checkbox("optimize size",&zsmExportOptimize); + ImGui::SameLine(); + if (ImGui::Button("Begin Export")) { + openFileDialog(GUI_FILE_EXPORT_ZSM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndMenu(); + } + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginMenu("export Amiga validation data...")) { + exitDisabledTimer=1; + ImGui::Text( + "this is NOT ROM export! only use for making sure the\n" + "Furnace Amiga emulator is working properly by\n" + "comparing it with real Amiga output." + ); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Directory"); + ImGui::SameLine(); + ImGui::InputText("##AVDPath",&workingDirROMExport); + if (ImGui::Button("Bake Data")) { + std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: out) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + ImGui::CloseCurrentPopup(); + } + ImGui::EndMenu(); + } + } + if (ImGui::BeginMenu("export text...")) { exitDisabledTimer=1; ImGui::Text( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." + "this option exports the song to a text file.\n" ); - ImGui::AlignTextToFramePadding(); - ImGui::Text("Directory"); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; - } - showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); - ImGui::CloseCurrentPopup(); + if (ImGui::Button("export")) { + openFileDialog(GUI_FILE_EXPORT_TEXT); } ImGui::EndMenu(); } - } - if (ImGui::BeginMenu("export text...")) { - exitDisabledTimer=1; - ImGui::Text( - "this option exports the song to a text file.\n" - ); - if (ImGui::Button("export")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); - } - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("export command stream...")) { - exitDisabledTimer=1; - ImGui::Text( - "this option exports a text or binary file which\n" - "contains a dump of the internal command stream\n" - "produced when playing the song.\n\n" + if (ImGui::BeginMenu("export command stream...")) { + exitDisabledTimer=1; + ImGui::Text( + "this option exports a text or binary file which\n" + "contains a dump of the internal command stream\n" + "produced when playing the song.\n\n" - "technical/development use only!" - ); - if (ImGui::Button("export (binary)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + "technical/development use only!" + ); + if (ImGui::Button("export (binary)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + } + if (ImGui::Button("export (text)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + } + ImGui::EndMenu(); } - if (ImGui::Button("export (text)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + } else { + if (ImGui::MenuItem("export...",BIND_FOR(GUI_ACTION_EXPORT))) { + displayExport=true; } - ImGui::EndMenu(); } ImGui::Separator(); if (!settings.classicChipOptions) { @@ -5453,6 +5459,11 @@ bool FurnaceGUI::loop() { } } + if (displayExport) { + displayExport=false; + ImGui::OpenPopup("Export"); + } + if (displayEditString) { ImGui::OpenPopup("EditString"); } @@ -5494,6 +5505,15 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + if (ImGui::BeginPopupModal("Export",NULL,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + ImGui::SetWindowPos(ImVec2(((canvasW)-ImGui::GetWindowSize().x)*0.5,((canvasH)-ImGui::GetWindowSize().y)*0.5)); + if (ImGui::GetWindowSize().xgetConfInt("centerPopup",1); settings.insIconsStyle=e->getConfInt("insIconsStyle",1); settings.classicChipOptions=e->getConfInt("classicChipOptions",0); + settings.classicExportOptions=e->getConfInt("classicExportOptions",0); settings.wasapiEx=e->getConfInt("wasapiEx",0); settings.chanOscThreads=e->getConfInt("chanOscThreads",0); settings.renderPoolThreads=e->getConfInt("renderPoolThreads",0); @@ -3953,6 +3961,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.centerPopup,0,1); clampSetting(settings.insIconsStyle,0,2); clampSetting(settings.classicChipOptions,0,1); + clampSetting(settings.classicExportOptions,0,1); clampSetting(settings.wasapiEx,0,1); clampSetting(settings.chanOscThreads,0,256); clampSetting(settings.renderPoolThreads,0,DIV_MAX_CHIPS); @@ -4232,6 +4241,7 @@ void FurnaceGUI::commitSettings() { e->setConf("centerPopup",settings.centerPopup); e->setConf("insIconsStyle",settings.insIconsStyle); e->setConf("classicChipOptions",settings.classicChipOptions); + e->setConf("classicExportOptions",settings.classicExportOptions); e->setConf("wasapiEx",settings.wasapiEx); e->setConf("chanOscThreads",settings.chanOscThreads); e->setConf("renderPoolThreads",settings.renderPoolThreads); From b90132d7330876b63a34ae0916014b70f20caa08 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Tue, 5 Dec 2023 16:42:08 +0400 Subject: [PATCH 02/30] the export types wtf is settings.iCannotWait ??? --- src/gui/exportWin.cpp | 208 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 207 insertions(+), 1 deletion(-) diff --git a/src/gui/exportWin.cpp b/src/gui/exportWin.cpp index 6e2c8b559..796412ba3 100644 --- a/src/gui/exportWin.cpp +++ b/src/gui/exportWin.cpp @@ -18,7 +18,213 @@ */ #include "gui.h" +#include "guiConst.h" +#include "../fileutils.h" +#include "misc/cpp/imgui_stdlib.h" void FurnaceGUI::drawExport() { - if (ImGui::Button("dummy")) ImGui::CloseCurrentPopup(); + exitDisabledTimer=1; + if (ImGui::BeginTabBar("ExportTypes")) { + if (ImGui::BeginTabItem("Audio")) { + static int audioExportType=0; + ImGui::RadioButton("one file",&audioExportType,0); + ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); + ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); + if (ImGui::InputInt("Loops",&exportLoops,1,2)) { + if (exportLoops<0) exportLoops=0; + } + if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { + if (exportFadeOut<0.0) exportFadeOut=0.0; + } + + if (ImGui::Button("Export")) { + switch (audioExportType) { + case 0: + openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + break; + case 1: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); + break; + case 2: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); + break; + } + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("VGM")) { + ImGui::Text("settings:"); + if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { + for (int i=0; i<7; i++) { + if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { + vgmExportVersion=vgmVersions[i]; + } + } + ImGui::EndCombo(); + } + ImGui::Checkbox("loop",&vgmExportLoop); + if (vgmExportLoop && e->song.loopModality==2) { + ImGui::Text("loop trail:"); + ImGui::Indent(); + if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { + vgmExportTrailingTicks=-1; + } + if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { + vgmExportTrailingTicks=-2; + } + if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { + vgmExportTrailingTicks=0; + } + if (vgmExportTrailingTicks>=0) { + ImGui::SameLine(); + if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { + if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + } + } + ImGui::Unindent(); + } + ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "inserts data blocks on pattern changes.\n" + "useful if you are writing a playback routine.\n\n" + + "the format of a pattern change data block is:\n" + "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" + "- ll: length, a 32-bit little-endian number\n" + "- oo: order\n" + "- rr: initial row (a 0Dxx effect is able to select a different row)\n" + "- pp: pattern index (one per channel)\n\n" + + "pattern indexes are ordered as they appear in the song." + ); + } + ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "required for DualPCM and MSM6258 export.\n\n" + "allows for volume/direction changes when playing samples,\n" + "at the cost of a massive increase in file size." + ); + } + ImGui::Text("chips to export:"); + bool hasOneAtLeast=false; + for (int i=0; isong.systemLen; i++) { + int minVersion=e->minVGMVersion(e->song.system[i]); + ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); + ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); + ImGui::EndDisabled(); + if (minVersion>vgmExportVersion) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + } + } else if (minVersion==0) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + } else { + if (willExport[i]) hasOneAtLeast=true; + } + } + ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); + if (hasOneAtLeast) { + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_VGM); + ImGui::CloseCurrentPopup(); + } + } else { + ImGui::Text("nothing to export"); + } + ImGui::EndTabItem(); + } + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat > 0) { + if (ImGui::BeginTabItem("ZSM")) { + ImGui::Text("Commander X16 Zsound Music File"); + if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { + if (zsmExportTickRate<1) zsmExportTickRate=1; + if (zsmExportTickRate>44100) zsmExportTickRate=44100; + } + ImGui::Checkbox("loop",&zsmExportLoop); + ImGui::SameLine(); + ImGui::Checkbox("optimize size",&zsmExportOptimize); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_ZSM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginTabItem("Amiga Validation")) { + ImGui::Text( + "this is NOT ROM export! only use for making sure the\n" + "Furnace Amiga emulator is working properly by\n" + "comparing it with real Amiga output." + ); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Directory"); + ImGui::SameLine(); + ImGui::InputText("##AVDPath",&workingDirROMExport); + if (ImGui::Button("Bake Data")) { + std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: out) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + } + if (ImGui::BeginTabItem("Text")) { + ImGui::Text( + "this option exports the song to a text file.\n" + ); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_TEXT); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Command Stream")) { + ImGui::Text( + "this option exports a text or binary file which\n" + "contains a dump of the internal command stream\n" + "produced when playing the song.\n\n" + + "technical/development use only!" + ); + if (ImGui::Button("Export (binary)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Export (text)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); } From d2ca97c57a09a06893135fe0559a908c8f642e00 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Tue, 5 Dec 2023 18:00:14 +0400 Subject: [PATCH 03/30] put the types in a child now the cancel button is neatly at the bottom :) --- src/gui/exportWin.cpp | 361 +++++++++++++++++++++--------------------- 1 file changed, 184 insertions(+), 177 deletions(-) diff --git a/src/gui/exportWin.cpp b/src/gui/exportWin.cpp index 796412ba3..ed1cc2f34 100644 --- a/src/gui/exportWin.cpp +++ b/src/gui/exportWin.cpp @@ -24,206 +24,213 @@ void FurnaceGUI::drawExport() { exitDisabledTimer=1; - if (ImGui::BeginTabBar("ExportTypes")) { - if (ImGui::BeginTabItem("Audio")) { - static int audioExportType=0; - ImGui::RadioButton("one file",&audioExportType,0); - ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); - ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); - if (ImGui::InputInt("Loops",&exportLoops,1,2)) { - if (exportLoops<0) exportLoops=0; - } - if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { - if (exportFadeOut<0.0) exportFadeOut=0.0; - } - if (ImGui::Button("Export")) { - switch (audioExportType) { - case 0: - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); - break; - case 1: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); - break; - case 2: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); - break; + ImVec2 avail=ImGui::GetContentRegionAvail(); + avail.y-=ImGui::GetFrameHeightWithSpacing(); + + if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + if (ImGui::BeginTabBar("ExportTypes")) { + if (ImGui::BeginTabItem("Audio")) { + static int audioExportType=0; + ImGui::RadioButton("one file",&audioExportType,0); + ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); + ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); + if (ImGui::InputInt("Loops",&exportLoops,1,2)) { + if (exportLoops<0) exportLoops=0; } - ImGui::CloseCurrentPopup(); + if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { + if (exportFadeOut<0.0) exportFadeOut=0.0; + } + + if (ImGui::Button("Export")) { + switch (audioExportType) { + case 0: + openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + break; + case 1: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); + break; + case 2: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); + break; + } + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); } - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("VGM")) { - ImGui::Text("settings:"); - if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { - for (int i=0; i<7; i++) { - if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { - vgmExportVersion=vgmVersions[i]; + if (ImGui::BeginTabItem("VGM")) { + ImGui::Text("settings:"); + if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { + for (int i=0; i<7; i++) { + if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { + vgmExportVersion=vgmVersions[i]; + } } + ImGui::EndCombo(); } - ImGui::EndCombo(); - } - ImGui::Checkbox("loop",&vgmExportLoop); - if (vgmExportLoop && e->song.loopModality==2) { - ImGui::Text("loop trail:"); - ImGui::Indent(); - if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { - vgmExportTrailingTicks=-1; - } - if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { - vgmExportTrailingTicks=-2; - } - if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { - vgmExportTrailingTicks=0; - } - if (vgmExportTrailingTicks>=0) { - ImGui::SameLine(); - if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { - if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + ImGui::Checkbox("loop",&vgmExportLoop); + if (vgmExportLoop && e->song.loopModality==2) { + ImGui::Text("loop trail:"); + ImGui::Indent(); + if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { + vgmExportTrailingTicks=-1; } + if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { + vgmExportTrailingTicks=-2; + } + if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { + vgmExportTrailingTicks=0; + } + if (vgmExportTrailingTicks>=0) { + ImGui::SameLine(); + if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { + if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + } + } + ImGui::Unindent(); } - ImGui::Unindent(); - } - ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "inserts data blocks on pattern changes.\n" - "useful if you are writing a playback routine.\n\n" + ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "inserts data blocks on pattern changes.\n" + "useful if you are writing a playback routine.\n\n" - "the format of a pattern change data block is:\n" - "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" - "- ll: length, a 32-bit little-endian number\n" - "- oo: order\n" - "- rr: initial row (a 0Dxx effect is able to select a different row)\n" - "- pp: pattern index (one per channel)\n\n" + "the format of a pattern change data block is:\n" + "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" + "- ll: length, a 32-bit little-endian number\n" + "- oo: order\n" + "- rr: initial row (a 0Dxx effect is able to select a different row)\n" + "- pp: pattern index (one per channel)\n\n" - "pattern indexes are ordered as they appear in the song." - ); - } - ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "required for DualPCM and MSM6258 export.\n\n" - "allows for volume/direction changes when playing samples,\n" - "at the cost of a massive increase in file size." - ); - } - ImGui::Text("chips to export:"); - bool hasOneAtLeast=false; - for (int i=0; isong.systemLen; i++) { - int minVersion=e->minVGMVersion(e->song.system[i]); - ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (minVersion>vgmExportVersion) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + "pattern indexes are ordered as they appear in the song." + ); + } + ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "required for DualPCM and MSM6258 export.\n\n" + "allows for volume/direction changes when playing samples,\n" + "at the cost of a massive increase in file size." + ); + } + ImGui::Text("chips to export:"); + bool hasOneAtLeast=false; + for (int i=0; isong.systemLen; i++) { + int minVersion=e->minVGMVersion(e->song.system[i]); + ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); + ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); + ImGui::EndDisabled(); + if (minVersion>vgmExportVersion) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + } + } else if (minVersion==0) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + } else { + if (willExport[i]) hasOneAtLeast=true; } - } else if (minVersion==0) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); + if (hasOneAtLeast) { + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_VGM); + ImGui::CloseCurrentPopup(); } } else { - if (willExport[i]) hasOneAtLeast=true; + ImGui::Text("nothing to export"); } - } - ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); - if (hasOneAtLeast) { - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - ImGui::CloseCurrentPopup(); - } - } else { - ImGui::Text("nothing to export"); - } - ImGui::EndTabItem(); - } - int numZSMCompat=0; - for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; - } - if (numZSMCompat > 0) { - if (ImGui::BeginTabItem("ZSM")) { - ImGui::Text("Commander X16 Zsound Music File"); - if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { - if (zsmExportTickRate<1) zsmExportTickRate=1; - if (zsmExportTickRate>44100) zsmExportTickRate=44100; - } - ImGui::Checkbox("loop",&zsmExportLoop); - ImGui::SameLine(); - ImGui::Checkbox("optimize size",&zsmExportOptimize); - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_ZSM); - ImGui::CloseCurrentPopup(); - } ImGui::EndTabItem(); } - } - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - if (numAmiga && settings.iCannotWait) { - if (ImGui::BeginTabItem("Amiga Validation")) { + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat > 0) { + if (ImGui::BeginTabItem("ZSM")) { + ImGui::Text("Commander X16 Zsound Music File"); + if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { + if (zsmExportTickRate<1) zsmExportTickRate=1; + if (zsmExportTickRate>44100) zsmExportTickRate=44100; + } + ImGui::Checkbox("loop",&zsmExportLoop); + ImGui::SameLine(); + ImGui::Checkbox("optimize size",&zsmExportOptimize); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_ZSM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginTabItem("Amiga Validation")) { + ImGui::Text( + "this is NOT ROM export! only use for making sure the\n" + "Furnace Amiga emulator is working properly by\n" + "comparing it with real Amiga output." + ); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Directory"); + ImGui::SameLine(); + ImGui::InputText("##AVDPath",&workingDirROMExport); + if (ImGui::Button("Bake Data")) { + std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: out) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + } + if (ImGui::BeginTabItem("Text")) { ImGui::Text( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." + "this option exports the song to a text file.\n" ); - ImGui::AlignTextToFramePadding(); - ImGui::Text("Directory"); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; - } - showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_TEXT); ImGui::CloseCurrentPopup(); } ImGui::EndTabItem(); } - } - if (ImGui::BeginTabItem("Text")) { - ImGui::Text( - "this option exports the song to a text file.\n" - ); - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); - ImGui::CloseCurrentPopup(); - } - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Command Stream")) { - ImGui::Text( - "this option exports a text or binary file which\n" - "contains a dump of the internal command stream\n" - "produced when playing the song.\n\n" + if (ImGui::BeginTabItem("Command Stream")) { + ImGui::Text( + "this option exports a text or binary file which\n" + "contains a dump of the internal command stream\n" + "produced when playing the song.\n\n" - "technical/development use only!" - ); - if (ImGui::Button("Export (binary)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); - ImGui::CloseCurrentPopup(); + "technical/development use only!" + ); + if (ImGui::Button("Export (binary)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Export (text)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); } - if (ImGui::Button("Export (text)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); - ImGui::CloseCurrentPopup(); - } - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); + ImGui::EndTabBar(); + } + ImGui::EndChild(); } ImGui::Separator(); if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); From 594eb55942398d874e32f689cd8d61e8a259e454 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Wed, 6 Dec 2023 15:50:19 +0400 Subject: [PATCH 04/30] rename the file --- CMakeLists.txt | 2 +- src/gui/{exportWin.cpp => exportOptions.cpp} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/gui/{exportWin.cpp => exportOptions.cpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5336f3131..ed571d76c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -779,7 +779,7 @@ src/gui/doAction.cpp src/gui/editing.cpp src/gui/editControls.cpp src/gui/effectList.cpp -src/gui/exportWin.cpp +src/gui/exportOptions.cpp src/gui/findReplace.cpp src/gui/fmPreview.cpp src/gui/gradient.cpp diff --git a/src/gui/exportWin.cpp b/src/gui/exportOptions.cpp similarity index 100% rename from src/gui/exportWin.cpp rename to src/gui/exportOptions.cpp From 96ad124100ea73dffa1086020c78902e9e9c00ea Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Fri, 8 Dec 2023 16:08:31 +0400 Subject: [PATCH 05/30] make a member of FurnaceGUI --- src/gui/exportOptions.cpp | 1 - src/gui/gui.cpp | 4 +++- src/gui/gui.h | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index ed1cc2f34..ab3323c0f 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -31,7 +31,6 @@ void FurnaceGUI::drawExport() { if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { if (ImGui::BeginTabBar("ExportTypes")) { if (ImGui::BeginTabItem("Audio")) { - static int audioExportType=0; ImGui::RadioButton("one file",&audioExportType,0); ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 99c7297ab..95b506891 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7688,7 +7688,9 @@ FurnaceGUI::FurnaceGUI(): introSkipDo(false), introStopped(false), curTutorial(-1), - curTutorialStep(0) { + curTutorialStep(0), + //audio export types (export options) + audioExportType(0) { // value keys valueKeys[SDLK_0]=0; valueKeys[SDLK_1]=1; diff --git a/src/gui/gui.h b/src/gui/gui.h index c9af9bd95..9e203ebca 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2267,6 +2267,9 @@ class FurnaceGUI { // tutorial int curTutorial, curTutorialStep; + //audio export types (export options) + int audioExportType; + void drawSSGEnv(unsigned char type, const ImVec2& size); void drawWaveform(unsigned char type, bool opz, const ImVec2& size); void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); From d347c85e1b5be1b556ee493c10f4a41c89d771b7 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Fri, 8 Dec 2023 23:06:56 +0400 Subject: [PATCH 06/30] remove extra indent --- src/gui/exportOptions.cpp | 348 +++++++++++++++++++------------------- 1 file changed, 174 insertions(+), 174 deletions(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index ab3323c0f..4e3982dec 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -30,203 +30,203 @@ void FurnaceGUI::drawExport() { if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { if (ImGui::BeginTabBar("ExportTypes")) { - if (ImGui::BeginTabItem("Audio")) { - ImGui::RadioButton("one file",&audioExportType,0); - ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); - ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); - if (ImGui::InputInt("Loops",&exportLoops,1,2)) { - if (exportLoops<0) exportLoops=0; - } - if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { - if (exportFadeOut<0.0) exportFadeOut=0.0; - } + if (ImGui::BeginTabItem("Audio")) { + ImGui::RadioButton("one file",&audioExportType,0); + ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); + ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); + if (ImGui::InputInt("Loops",&exportLoops,1,2)) { + if (exportLoops<0) exportLoops=0; + } + if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { + if (exportFadeOut<0.0) exportFadeOut=0.0; + } - if (ImGui::Button("Export")) { - switch (audioExportType) { - case 0: - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); - break; - case 1: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); - break; - case 2: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); - break; - } - ImGui::CloseCurrentPopup(); + if (ImGui::Button("Export")) { + switch (audioExportType) { + case 0: + openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + break; + case 1: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); + break; + case 2: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); + break; } - ImGui::EndTabItem(); + ImGui::CloseCurrentPopup(); } - if (ImGui::BeginTabItem("VGM")) { - ImGui::Text("settings:"); - if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { - for (int i=0; i<7; i++) { - if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { - vgmExportVersion=vgmVersions[i]; - } - } - ImGui::EndCombo(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("VGM")) { + ImGui::Text("settings:"); + if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { + for (int i=0; i<7; i++) { + if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { + vgmExportVersion=vgmVersions[i]; } - ImGui::Checkbox("loop",&vgmExportLoop); - if (vgmExportLoop && e->song.loopModality==2) { - ImGui::Text("loop trail:"); - ImGui::Indent(); - if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { - vgmExportTrailingTicks=-1; - } - if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { - vgmExportTrailingTicks=-2; - } - if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { - vgmExportTrailingTicks=0; - } - if (vgmExportTrailingTicks>=0) { - ImGui::SameLine(); - if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { - if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; - } - } - ImGui::Unindent(); - } - ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "inserts data blocks on pattern changes.\n" - "useful if you are writing a playback routine.\n\n" - - "the format of a pattern change data block is:\n" - "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" - "- ll: length, a 32-bit little-endian number\n" - "- oo: order\n" - "- rr: initial row (a 0Dxx effect is able to select a different row)\n" - "- pp: pattern index (one per channel)\n\n" - - "pattern indexes are ordered as they appear in the song." - ); - } - ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "required for DualPCM and MSM6258 export.\n\n" - "allows for volume/direction changes when playing samples,\n" - "at the cost of a massive increase in file size." - ); - } - ImGui::Text("chips to export:"); - bool hasOneAtLeast=false; - for (int i=0; isong.systemLen; i++) { - int minVersion=e->minVGMVersion(e->song.system[i]); - ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (minVersion>vgmExportVersion) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); - } - } else if (minVersion==0) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is not supported by the VGM format!"); - } - } else { - if (willExport[i]) hasOneAtLeast=true; - } - } - ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); - if (hasOneAtLeast) { - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - ImGui::CloseCurrentPopup(); - } - } else { - ImGui::Text("nothing to export"); - } - ImGui::EndTabItem(); - } - int numZSMCompat=0; - for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; - } - if (numZSMCompat > 0) { - if (ImGui::BeginTabItem("ZSM")) { - ImGui::Text("Commander X16 Zsound Music File"); - if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { - if (zsmExportTickRate<1) zsmExportTickRate=1; - if (zsmExportTickRate>44100) zsmExportTickRate=44100; } - ImGui::Checkbox("loop",&zsmExportLoop); - ImGui::SameLine(); - ImGui::Checkbox("optimize size",&zsmExportOptimize); - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_ZSM); - ImGui::CloseCurrentPopup(); - } - ImGui::EndTabItem(); + ImGui::EndCombo(); } - } - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - if (numAmiga && settings.iCannotWait) { - if (ImGui::BeginTabItem("Amiga Validation")) { - ImGui::Text( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." + ImGui::Checkbox("loop",&vgmExportLoop); + if (vgmExportLoop && e->song.loopModality==2) { + ImGui::Text("loop trail:"); + ImGui::Indent(); + if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { + vgmExportTrailingTicks=-1; + } + if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { + vgmExportTrailingTicks=-2; + } + if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { + vgmExportTrailingTicks=0; + } + if (vgmExportTrailingTicks>=0) { + ImGui::SameLine(); + if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { + if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + } + } + ImGui::Unindent(); + } + ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "inserts data blocks on pattern changes.\n" + "useful if you are writing a playback routine.\n\n" + + "the format of a pattern change data block is:\n" + "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" + "- ll: length, a 32-bit little-endian number\n" + "- oo: order\n" + "- rr: initial row (a 0Dxx effect is able to select a different row)\n" + "- pp: pattern index (one per channel)\n\n" + + "pattern indexes are ordered as they appear in the song." ); - ImGui::AlignTextToFramePadding(); - ImGui::Text("Directory"); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "required for DualPCM and MSM6258 export.\n\n" + "allows for volume/direction changes when playing samples,\n" + "at the cost of a massive increase in file size." + ); + } + ImGui::Text("chips to export:"); + bool hasOneAtLeast=false; + for (int i=0; isong.systemLen; i++) { + int minVersion=e->minVGMVersion(e->song.system[i]); + ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); + ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); + ImGui::EndDisabled(); + if (minVersion>vgmExportVersion) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; + } else if (minVersion==0) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is not supported by the VGM format!"); } - showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + } else { + if (willExport[i]) hasOneAtLeast=true; + } + } + ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); + if (hasOneAtLeast) { + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_VGM); ImGui::CloseCurrentPopup(); } - ImGui::EndTabItem(); + } else { + ImGui::Text("nothing to export"); } - } - if (ImGui::BeginTabItem("Text")) { - ImGui::Text( - "this option exports the song to a text file.\n" - ); + ImGui::EndTabItem(); + } + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat > 0) { + if (ImGui::BeginTabItem("ZSM")) { + ImGui::Text("Commander X16 Zsound Music File"); + if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { + if (zsmExportTickRate<1) zsmExportTickRate=1; + if (zsmExportTickRate>44100) zsmExportTickRate=44100; + } + ImGui::Checkbox("loop",&zsmExportLoop); + ImGui::SameLine(); + ImGui::Checkbox("optimize size",&zsmExportOptimize); if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); + openFileDialog(GUI_FILE_EXPORT_ZSM); ImGui::CloseCurrentPopup(); } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Command Stream")) { + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginTabItem("Amiga Validation")) { ImGui::Text( - "this option exports a text or binary file which\n" - "contains a dump of the internal command stream\n" - "produced when playing the song.\n\n" - - "technical/development use only!" + "this is NOT ROM export! only use for making sure the\n" + "Furnace Amiga emulator is working properly by\n" + "comparing it with real Amiga output." ); - if (ImGui::Button("Export (binary)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Export (text)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Directory"); + ImGui::SameLine(); + ImGui::InputText("##AVDPath",&workingDirROMExport); + if (ImGui::Button("Bake Data")) { + std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: out) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); ImGui::CloseCurrentPopup(); } ImGui::EndTabItem(); } + } + if (ImGui::BeginTabItem("Text")) { + ImGui::Text( + "this option exports the song to a text file.\n" + ); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_TEXT); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Command Stream")) { + ImGui::Text( + "this option exports a text or binary file which\n" + "contains a dump of the internal command stream\n" + "produced when playing the song.\n\n" + + "technical/development use only!" + ); + if (ImGui::Button("Export (binary)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Export (text)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + ImGui::CloseCurrentPopup(); + } + ImGui::EndTabItem(); + } ImGui::EndTabBar(); } ImGui::EndChild(); From 231a76d50ba43e01cd0b519118b7675029f16c4e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Dec 2023 19:51:21 -0500 Subject: [PATCH 07/30] dev190 - GUI: color scheme guru mode now you can fine-tune every color in the interface TODO: improve color config format --- src/engine/engine.h | 4 +- src/gui/gui.h | 33 ++++++++ src/gui/guiConst.cpp | 31 +++++++ src/gui/settings.cpp | 194 ++++++++++++++++++++++++++++++++----------- 4 files changed, 210 insertions(+), 52 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 4170119e9..7773183c9 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -54,8 +54,8 @@ class DivWorkPool; #define DIV_UNSTABLE -#define DIV_VERSION "dev189" -#define DIV_ENGINE_VERSION 189 +#define DIV_VERSION "dev190" +#define DIV_ENGINE_VERSION 190 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/gui/gui.h b/src/gui/gui.h index 57251fe6d..e591dd818 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -101,6 +101,7 @@ enum FurnaceGUIColors { GUI_COLOR_MODAL_BACKDROP, GUI_COLOR_HEADER, GUI_COLOR_TEXT, + GUI_COLOR_TEXT_DISABLED, GUI_COLOR_ACCENT_PRIMARY, GUI_COLOR_ACCENT_SECONDARY, GUI_COLOR_TITLE_INACTIVE, @@ -124,6 +125,36 @@ enum FurnaceGUIColors { GUI_COLOR_NAV_HIGHLIGHT, GUI_COLOR_NAV_WIN_HIGHLIGHT, GUI_COLOR_NAV_WIN_BACKDROP, + GUI_COLOR_PLOT_LINES, + GUI_COLOR_PLOT_LINES_HOVER, + GUI_COLOR_PLOT_HISTOGRAM, + GUI_COLOR_PLOT_HISTOGRAM_HOVER, + + GUI_COLOR_BUTTON, + GUI_COLOR_BUTTON_HOVER, + GUI_COLOR_BUTTON_ACTIVE, + GUI_COLOR_TAB, + GUI_COLOR_TAB_HOVER, + GUI_COLOR_TAB_ACTIVE, + GUI_COLOR_TAB_UNFOCUSED, + GUI_COLOR_TAB_UNFOCUSED_ACTIVE, + GUI_COLOR_IMGUI_HEADER, + GUI_COLOR_IMGUI_HEADER_HOVER, + GUI_COLOR_IMGUI_HEADER_ACTIVE, + GUI_COLOR_RESIZE_GRIP, + GUI_COLOR_RESIZE_GRIP_HOVER, + GUI_COLOR_RESIZE_GRIP_ACTIVE, + GUI_COLOR_WIDGET_BACKGROUND, + GUI_COLOR_WIDGET_BACKGROUND_HOVER, + GUI_COLOR_WIDGET_BACKGROUND_ACTIVE, + GUI_COLOR_SLIDER_GRAB, + GUI_COLOR_SLIDER_GRAB_ACTIVE, + GUI_COLOR_TITLE_BACKGROUND_ACTIVE, + GUI_COLOR_CHECK_MARK, + GUI_COLOR_TEXT_SELECTION, + GUI_COLOR_TABLE_ROW_EVEN, + GUI_COLOR_TABLE_ROW_ODD, + GUI_COLOR_TOGGLE_OFF, GUI_COLOR_TOGGLE_ON, GUI_COLOR_EDITING, @@ -1655,6 +1686,7 @@ class FurnaceGUI { int fontAutoHint; int fontAntiAlias; int selectAssetOnLoad; + int basicColors; unsigned int maxUndoSteps; String mainFontPath; String headFontPath; @@ -1850,6 +1882,7 @@ class FurnaceGUI { fontAutoHint(1), fontAntiAlias(1), selectAssetOnLoad(1), + basicColors(1), maxUndoSteps(100), mainFontPath(""), headFontPath(""), diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 9761af578..0966ecf11 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -794,6 +794,7 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={ D(GUI_COLOR_MODAL_BACKDROP,"",ImVec4(0.0f,0.0f,0.0f,0.55f)), D(GUI_COLOR_HEADER,"",ImVec4(0.2f,0.2f,0.2f,1.0f)), D(GUI_COLOR_TEXT,"",ImVec4(1.0f,1.0f,1.0f,1.0f)), + D(GUI_COLOR_TEXT_DISABLED,"",ImVec4(0.5f,0.5f,0.5f,1.0f)), D(GUI_COLOR_ACCENT_PRIMARY,"",ImVec4(0.06f,0.53f,0.98f,1.0f)), D(GUI_COLOR_ACCENT_SECONDARY,"",ImVec4(0.26f,0.59f,0.98f,1.0f)), D(GUI_COLOR_TITLE_INACTIVE,"",ImVec4(0.04f,0.04f,0.04f,1.0f)), @@ -817,6 +818,36 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={ D(GUI_COLOR_NAV_HIGHLIGHT,"",ImVec4(0.26f,0.59f,0.98f,1.0f)), D(GUI_COLOR_NAV_WIN_HIGHLIGHT,"",ImVec4(1.0f,1.0f,1.0f,0.7f)), D(GUI_COLOR_NAV_WIN_BACKDROP,"",ImVec4(0.8f,0.8f,0.8f,0.2f)), + D(GUI_COLOR_PLOT_LINES,"",ImVec4(0.61f,0.61f,0.61f,1.0f)), + D(GUI_COLOR_PLOT_LINES_HOVER,"",ImVec4(1.00f,0.43f,0.35f,1.00f)), + D(GUI_COLOR_PLOT_HISTOGRAM,"",ImVec4(0.0f,0.9f,1.0f,1.0f)), + D(GUI_COLOR_PLOT_HISTOGRAM_HOVER,"",ImVec4(0.0f,0.9f,1.0f,1.0f)), + + D(GUI_COLOR_BUTTON,"",ImVec4(0.085f,0.216f,0.343f,1.0f)), + D(GUI_COLOR_BUTTON_HOVER,"",ImVec4(0.075f,0.287f,0.49f,1.0f)), + D(GUI_COLOR_BUTTON_ACTIVE,"",ImVec4(0.06f,0.53f,0.98f,1.0f)), + D(GUI_COLOR_TAB,"",ImVec4(0.085f,0.216f,0.343f,1.0f)), + D(GUI_COLOR_TAB_HOVER,"",ImVec4(0.165f,0.313f,0.49f,1.0f)), + D(GUI_COLOR_TAB_ACTIVE,"",ImVec4(0.25f,0.47f,0.735f,1.0f)), + D(GUI_COLOR_TAB_UNFOCUSED,"",ImVec4(0.085f,0.216f,0.343f,1.0f)), + D(GUI_COLOR_TAB_UNFOCUSED_ACTIVE,"",ImVec4(0.075f,0.287f,0.49f,1.0f)), + D(GUI_COLOR_IMGUI_HEADER,"",ImVec4(0.083f,0.156f,0.245f,1.0f)), + D(GUI_COLOR_IMGUI_HEADER_HOVER,"",ImVec4(0.165f,0.313f,0.49f,1.0f)), + D(GUI_COLOR_IMGUI_HEADER_ACTIVE,"",ImVec4(0.26f,0.59f,0.98f,1.0f)), + D(GUI_COLOR_RESIZE_GRIP,"",ImVec4(0.083f,0.156f,0.245f,1.0f)), + D(GUI_COLOR_RESIZE_GRIP_HOVER,"",ImVec4(0.165f,0.313f,0.49f,1.0f)), + D(GUI_COLOR_RESIZE_GRIP_ACTIVE,"",ImVec4(0.26f,0.59f,0.98f,1.0f)), + D(GUI_COLOR_WIDGET_BACKGROUND,"",ImVec4(0.083f,0.156f,0.245f,1.0f)), + D(GUI_COLOR_WIDGET_BACKGROUND_HOVER,"",ImVec4(0.165f,0.313f,0.49f,1.0f)), + D(GUI_COLOR_WIDGET_BACKGROUND_ACTIVE,"",ImVec4(0.26f,0.59f,0.98f,1.0f)), + D(GUI_COLOR_SLIDER_GRAB,"",ImVec4(0.06f,0.53f,0.98f,1.0f)), + D(GUI_COLOR_SLIDER_GRAB_ACTIVE,"",ImVec4(0.06f,0.53f,0.98f,1.0f)), + D(GUI_COLOR_TITLE_BACKGROUND_ACTIVE,"",ImVec4(0.085f,0.216f,0.343f,1.0f)), + D(GUI_COLOR_CHECK_MARK,"",ImVec4(0.06f,0.53f,0.98f,1.0f)), + D(GUI_COLOR_TEXT_SELECTION,"",ImVec4(0.165f,0.313f,0.49f,1.0f)), + D(GUI_COLOR_TABLE_ROW_EVEN,"",ImVec4(0.0f,0.0f,0.0f,0.0f)), + D(GUI_COLOR_TABLE_ROW_ODD,"",ImVec4(1.0f,1.0f,1.0f,0.06f)), + D(GUI_COLOR_TOGGLE_OFF,"",ImVec4(0.2f,0.2f,0.2f,1.0f)), D(GUI_COLOR_TOGGLE_ON,"",ImVec4(0.2f,0.6f,0.2f,1.0f)), D(GUI_COLOR_EDITING,"",ImVec4(0.2f,0.1f,0.1f,1.0f)), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 585f49b18..c06e69c00 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3170,26 +3170,84 @@ void FurnaceGUI::drawSettings() { if (ImGui::Button("Reset defaults")) { showWarning("Are you sure you want to reset the color scheme?",GUI_WARN_RESET_COLORS); } - if (ImGui::TreeNode("General")) { - ImGui::Text("Color scheme type:"); - ImGui::Indent(); - if (ImGui::RadioButton("Dark##gcb0",settings.guiColorsBase==0)) { - settings.guiColorsBase=0; - applyUISettings(false); - settingsChanged=true; + bool basicColorsB=!settings.basicColors; + if (ImGui::Checkbox("Guru mode",&basicColorsB)) { + settings.basicColors=!basicColorsB; + applyUISettings(false); + settingsChanged=true; + } + if (settings.basicColors) { + if (ImGui::TreeNode("Interface")) { + if (ImGui::SliderInt("Frame shading",&settings.guiColorsShading,0,100,"%d%%")) { + if (settings.guiColorsShading<0) settings.guiColorsShading=0; + if (settings.guiColorsShading>100) settings.guiColorsShading=100; + applyUISettings(false); + settingsChanged=true; + } + ImGui::Text("Color scheme type:"); + ImGui::Indent(); + if (ImGui::RadioButton("Dark##gcb0",settings.guiColorsBase==0)) { + settings.guiColorsBase=0; + applyUISettings(false); + settingsChanged=true; + } + if (ImGui::RadioButton("Light##gcb1",settings.guiColorsBase==1)) { + settings.guiColorsBase=1; + applyUISettings(false); + settingsChanged=true; + } + ImGui::Unindent(); + + ImGui::Text("Accent colors:"); + ImGui::Indent(); + UI_COLOR_CONFIG(GUI_COLOR_ACCENT_PRIMARY,"Primary"); + UI_COLOR_CONFIG(GUI_COLOR_ACCENT_SECONDARY,"Secondary"); + ImGui::Unindent(); + + ImGui::TreePop(); } - if (ImGui::RadioButton("Light##gcb1",settings.guiColorsBase==1)) { - settings.guiColorsBase=1; - applyUISettings(false); - settingsChanged=true; - } - ImGui::Unindent(); - if (ImGui::SliderInt("Frame shading",&settings.guiColorsShading,0,100,"%d%%")) { - if (settings.guiColorsShading<0) settings.guiColorsShading=0; - if (settings.guiColorsShading>100) settings.guiColorsShading=100; - applyUISettings(false); - settingsChanged=true; + } else { + if (ImGui::TreeNode("Interface")) { + if (ImGui::SliderInt("Frame shading",&settings.guiColorsShading,0,100,"%d%%")) { + if (settings.guiColorsShading<0) settings.guiColorsShading=0; + if (settings.guiColorsShading>100) settings.guiColorsShading=100; + applyUISettings(false); + settingsChanged=true; + } + + UI_COLOR_CONFIG(GUI_COLOR_BUTTON,"Button"); + UI_COLOR_CONFIG(GUI_COLOR_BUTTON_HOVER,"Button (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_BUTTON_ACTIVE,"Button (active)"); + UI_COLOR_CONFIG(GUI_COLOR_TAB,"Tab"); + UI_COLOR_CONFIG(GUI_COLOR_TAB_HOVER,"Tab (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_TAB_ACTIVE,"Tab (active)"); + UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED,"Tab (unfocused)"); + UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED_ACTIVE,"Tab (unfocused and active)"); + UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER,"ImGui header"); + UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER_HOVER,"ImGui header (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER_ACTIVE,"ImGui header (active)"); + UI_COLOR_CONFIG(GUI_COLOR_RESIZE_GRIP,"Resize grip"); + UI_COLOR_CONFIG(GUI_COLOR_RESIZE_GRIP_HOVER,"Resize grip (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_RESIZE_GRIP_ACTIVE,"Resize grip (active)"); + UI_COLOR_CONFIG(GUI_COLOR_WIDGET_BACKGROUND,"Widget background"); + UI_COLOR_CONFIG(GUI_COLOR_WIDGET_BACKGROUND_HOVER,"Widget background (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_WIDGET_BACKGROUND_ACTIVE,"Widget background (active)"); + UI_COLOR_CONFIG(GUI_COLOR_SLIDER_GRAB,"Slider grab"); + UI_COLOR_CONFIG(GUI_COLOR_SLIDER_GRAB_ACTIVE,"Slider grab (active)"); + UI_COLOR_CONFIG(GUI_COLOR_TITLE_BACKGROUND_ACTIVE,"Title background (active)"); + UI_COLOR_CONFIG(GUI_COLOR_CHECK_MARK,"Checkbox/radio button mark"); + UI_COLOR_CONFIG(GUI_COLOR_TEXT_SELECTION,"Text selection"); + UI_COLOR_CONFIG(GUI_COLOR_PLOT_LINES,"Line plot"); + UI_COLOR_CONFIG(GUI_COLOR_PLOT_LINES_HOVER,"Line plot (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_PLOT_HISTOGRAM,"Histogram plot"); + UI_COLOR_CONFIG(GUI_COLOR_PLOT_HISTOGRAM_HOVER,"Histogram plot (hovered)"); + UI_COLOR_CONFIG(GUI_COLOR_TABLE_ROW_EVEN,"Table row (even)"); + UI_COLOR_CONFIG(GUI_COLOR_TABLE_ROW_ODD,"Table row (odd)"); + + ImGui::TreePop(); } + } + if (ImGui::TreeNode("Interface (other)")) { UI_COLOR_CONFIG(GUI_COLOR_BACKGROUND,"Background"); UI_COLOR_CONFIG(GUI_COLOR_FRAME_BACKGROUND,"Window background"); UI_COLOR_CONFIG(GUI_COLOR_FRAME_BACKGROUND_CHILD,"Sub-window background"); @@ -3197,8 +3255,7 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_MODAL_BACKDROP,"Modal backdrop"); UI_COLOR_CONFIG(GUI_COLOR_HEADER,"Header"); UI_COLOR_CONFIG(GUI_COLOR_TEXT,"Text"); - UI_COLOR_CONFIG(GUI_COLOR_ACCENT_PRIMARY,"Primary"); - UI_COLOR_CONFIG(GUI_COLOR_ACCENT_SECONDARY,"Secondary"); + UI_COLOR_CONFIG(GUI_COLOR_TEXT_DISABLED,"Text (disabled)"); UI_COLOR_CONFIG(GUI_COLOR_TITLE_INACTIVE,"Title bar (inactive)"); UI_COLOR_CONFIG(GUI_COLOR_TITLE_COLLAPSED,"Title bar (collapsed)"); UI_COLOR_CONFIG(GUI_COLOR_MENU_BAR,"Menu bar"); @@ -3219,11 +3276,11 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_DRAG_DROP_TARGET,"Drag and drop target"); UI_COLOR_CONFIG(GUI_COLOR_NAV_WIN_HIGHLIGHT,"Window switcher (highlight)"); UI_COLOR_CONFIG(GUI_COLOR_NAV_WIN_BACKDROP,"Window switcher backdrop"); + ImGui::TreePop(); + } + if (ImGui::TreeNode("Miscellaneous")) { UI_COLOR_CONFIG(GUI_COLOR_TOGGLE_ON,"Toggle on"); UI_COLOR_CONFIG(GUI_COLOR_TOGGLE_OFF,"Toggle off"); - UI_COLOR_CONFIG(GUI_COLOR_EDITING,"Editing"); - UI_COLOR_CONFIG(GUI_COLOR_EDITING_CLONE,"Editing (will clone)"); - UI_COLOR_CONFIG(GUI_COLOR_SONG_LOOP,"Song loop"); UI_COLOR_CONFIG(GUI_COLOR_PLAYBACK_STAT,"Playback status"); UI_COLOR_CONFIG(GUI_COLOR_DESTRUCTIVE,"Destructive hint"); UI_COLOR_CONFIG(GUI_COLOR_WARNING,"Warning hint"); @@ -3284,6 +3341,7 @@ void FurnaceGUI::drawSettings() { if (ImGui::TreeNode("Orders")) { UI_COLOR_CONFIG(GUI_COLOR_ORDER_ROW_INDEX,"Order number"); UI_COLOR_CONFIG(GUI_COLOR_ORDER_ACTIVE,"Playing order background"); + UI_COLOR_CONFIG(GUI_COLOR_SONG_LOOP,"Song loop"); UI_COLOR_CONFIG(GUI_COLOR_ORDER_SELECTED,"Selected order"); UI_COLOR_CONFIG(GUI_COLOR_ORDER_SIMILAR,"Similar patterns"); UI_COLOR_CONFIG(GUI_COLOR_ORDER_INACTIVE,"Inactive patterns"); @@ -3396,6 +3454,8 @@ void FurnaceGUI::drawSettings() { } if (ImGui::TreeNode("Pattern")) { UI_COLOR_CONFIG(GUI_COLOR_PATTERN_PLAY_HEAD,"Playhead"); + UI_COLOR_CONFIG(GUI_COLOR_EDITING,"Editing"); + UI_COLOR_CONFIG(GUI_COLOR_EDITING_CLONE,"Editing (will clone)"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_CURSOR,"Cursor"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_CURSOR_HOVER,"Cursor (hovered)"); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_CURSOR_ACTIVE,"Cursor (clicked)"); @@ -3819,6 +3879,7 @@ void FurnaceGUI::syncSettings() { settings.fontAutoHint=e->getConfInt("fontAutoHint",1); settings.fontAntiAlias=e->getConfInt("fontAntiAlias",1); settings.selectAssetOnLoad=e->getConfInt("selectAssetOnLoad",1); + settings.basicColors=e->getConfInt("basicColors",1); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.headFontSize,2,96); @@ -3985,6 +4046,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.fontAutoHint,0,2); clampSetting(settings.fontAntiAlias,0,1); clampSetting(settings.selectAssetOnLoad,0,1); + clampSetting(settings.basicColors,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -4268,6 +4330,7 @@ void FurnaceGUI::commitSettings() { e->setConf("fontAutoHint",settings.fontAutoHint); e->setConf("fontAntiAlias",settings.fontAntiAlias); e->setConf("selectAssetOnLoad",settings.selectAssetOnLoad); + e->setConf("basicColors",settings.basicColors); // colors for (int i=0; i Date: Thu, 21 Dec 2023 18:14:28 -0500 Subject: [PATCH 08/30] prepare for color scheme import/export chamges this includes a small refactor of the settings mechanism --- src/engine/configEngine.cpp | 6 +- src/engine/engine.h | 3 + src/gui/gui.h | 17 + src/gui/settings.cpp | 845 ++++++++++++++++++------------------ 4 files changed, 451 insertions(+), 420 deletions(-) diff --git a/src/engine/configEngine.cpp b/src/engine/configEngine.cpp index 123a19a81..f226d1364 100644 --- a/src/engine/configEngine.cpp +++ b/src/engine/configEngine.cpp @@ -167,4 +167,8 @@ void DivEngine::setConf(String key, String value) { bool DivEngine::hasConf(String key) { return conf.has(key); -} \ No newline at end of file +} + +DivConfig& DivEngine::getConfObject() { + return conf; +} diff --git a/src/engine/engine.h b/src/engine/engine.h index 7773183c9..eb4bc5bbb 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -702,6 +702,9 @@ class DivEngine { double getConfDouble(String key, double fallback); String getConfString(String key, String fallback); + // get config object + DivConfig& getConfObject(); + // set a config value void setConf(String key, bool value); void setConf(String key, int value); diff --git a/src/gui/gui.h b/src/gui/gui.h index e591dd818..34a9c87bc 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -468,6 +468,20 @@ enum FurnaceGUIMobileScenes { GUI_SCENE_OTHER, }; +enum FurnaceGUISettingGroups: unsigned int { + GUI_SETTINGS_GENERAL=1, + GUI_SETTINGS_AUDIO=2, + GUI_SETTINGS_MIDI=4, + GUI_SETTINGS_KEYBOARD=8, + GUI_SETTINGS_BEHAVIOR=16, + GUI_SETTINGS_FONT=32, + GUI_SETTINGS_APPEARANCE=64, + GUI_SETTINGS_LAYOUTS=128, + GUI_SETTINGS_COLOR=256, + + GUI_SETTINGS_ALL=0xffffffff +}; + enum FurnaceGUIFileDialogs { GUI_FILE_OPEN, GUI_FILE_OPEN_BACKUP, @@ -2453,6 +2467,9 @@ class FurnaceGUI { void resetColors(); void resetKeybinds(); + void readConfig(DivConfig& conf, FurnaceGUISettingGroups groups=GUI_SETTINGS_ALL); + void writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups=GUI_SETTINGS_ALL); + void syncSettings(); void commitSettings(); void syncTutorial(); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index c06e69c00..941580739 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3678,208 +3678,208 @@ void FurnaceGUI::drawSettings() { x=maxV; \ } -void FurnaceGUI::syncSettings() { - settings.mainFontSize=e->getConfInt("mainFontSize",18); - settings.headFontSize=e->getConfInt("headFontSize",27); - settings.patFontSize=e->getConfInt("patFontSize",18); - settings.iconSize=e->getConfInt("iconSize",16); - settings.audioEngine=(e->getConfString("audioEngine","SDL")=="SDL")?1:0; - if (e->getConfString("audioEngine","SDL")=="JACK") { +void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { + settings.mainFontSize=conf.getInt("mainFontSize",18); + settings.headFontSize=conf.getInt("headFontSize",27); + settings.patFontSize=conf.getInt("patFontSize",18); + settings.iconSize=conf.getInt("iconSize",16); + settings.audioEngine=(conf.getString("audioEngine","SDL")=="SDL")?1:0; + if (conf.getString("audioEngine","SDL")=="JACK") { settings.audioEngine=DIV_AUDIO_JACK; - } else if (e->getConfString("audioEngine","SDL")=="PortAudio") { + } else if (conf.getString("audioEngine","SDL")=="PortAudio") { settings.audioEngine=DIV_AUDIO_PORTAUDIO; } else { settings.audioEngine=DIV_AUDIO_SDL; } - settings.audioDevice=e->getConfString("audioDevice",""); - settings.audioChans=e->getConfInt("audioChans",2); - settings.midiInDevice=e->getConfString("midiInDevice",""); - settings.midiOutDevice=e->getConfString("midiOutDevice",""); - settings.renderDriver=e->getConfString("renderDriver",""); - settings.sdlAudioDriver=e->getConfString("sdlAudioDriver",""); - settings.audioQuality=e->getConfInt("audioQuality",0); - settings.audioHiPass=e->getConfInt("audioHiPass",1); - settings.audioBufSize=e->getConfInt("audioBufSize",1024); - settings.audioRate=e->getConfInt("audioRate",44100); - settings.arcadeCore=e->getConfInt("arcadeCore",0); - settings.ym2612Core=e->getConfInt("ym2612Core",0); - settings.snCore=e->getConfInt("snCore",0); - settings.nesCore=e->getConfInt("nesCore",0); - settings.fdsCore=e->getConfInt("fdsCore",0); - settings.c64Core=e->getConfInt("c64Core",0); - settings.pokeyCore=e->getConfInt("pokeyCore",1); - settings.opnCore=e->getConfInt("opnCore",1); - settings.opl2Core=e->getConfInt("opl2Core",0); - settings.opl3Core=e->getConfInt("opl3Core",0); - settings.arcadeCoreRender=e->getConfInt("arcadeCoreRender",1); - settings.ym2612CoreRender=e->getConfInt("ym2612CoreRender",0); - settings.snCoreRender=e->getConfInt("snCoreRender",0); - settings.nesCoreRender=e->getConfInt("nesCoreRender",0); - settings.fdsCoreRender=e->getConfInt("fdsCoreRender",1); - settings.c64CoreRender=e->getConfInt("c64CoreRender",1); - settings.pokeyCoreRender=e->getConfInt("pokeyCoreRender",1); - settings.opnCoreRender=e->getConfInt("opnCoreRender",1); - settings.opl2CoreRender=e->getConfInt("opl2CoreRender",0); - settings.opl3CoreRender=e->getConfInt("opl3CoreRender",0); - settings.pcSpeakerOutMethod=e->getConfInt("pcSpeakerOutMethod",0); - settings.yrw801Path=e->getConfString("yrw801Path",""); - settings.tg100Path=e->getConfString("tg100Path",""); - settings.mu5Path=e->getConfString("mu5Path",""); - settings.mainFont=e->getConfInt("mainFont",0); - settings.headFont=e->getConfInt("headFont",0); - settings.patFont=e->getConfInt("patFont",0); - settings.mainFontPath=e->getConfString("mainFontPath",""); - settings.headFontPath=e->getConfString("headFontPath",""); - settings.patFontPath=e->getConfString("patFontPath",""); - settings.patRowsBase=e->getConfInt("patRowsBase",0); - settings.orderRowsBase=e->getConfInt("orderRowsBase",1); - settings.soloAction=e->getConfInt("soloAction",0); - settings.pullDeleteBehavior=e->getConfInt("pullDeleteBehavior",1); - settings.wrapHorizontal=e->getConfInt("wrapHorizontal",0); - settings.wrapVertical=e->getConfInt("wrapVertical",0); - settings.macroView=e->getConfInt("macroView",0); - settings.fmNames=e->getConfInt("fmNames",0); - settings.allowEditDocking=e->getConfInt("allowEditDocking",1); - settings.chipNames=e->getConfInt("chipNames",0); - settings.overflowHighlight=e->getConfInt("overflowHighlight",0); - settings.partyTime=e->getConfInt("partyTime",0); - settings.flatNotes=e->getConfInt("flatNotes",0); - settings.germanNotation=e->getConfInt("germanNotation",0); - settings.stepOnDelete=e->getConfInt("stepOnDelete",0); - settings.scrollStep=e->getConfInt("scrollStep",0); - settings.sysSeparators=e->getConfInt("sysSeparators",1); - settings.forceMono=e->getConfInt("forceMono",0); - settings.controlLayout=e->getConfInt("controlLayout",3); - settings.statusDisplay=e->getConfInt("statusDisplay",0); - settings.dpiScale=e->getConfFloat("dpiScale",0.0f); - settings.viewPrevPattern=e->getConfInt("viewPrevPattern",1); - settings.guiColorsBase=e->getConfInt("guiColorsBase",0); - settings.guiColorsShading=e->getConfInt("guiColorsShading",0); - settings.avoidRaisingPattern=e->getConfInt("avoidRaisingPattern",0); - settings.insFocusesPattern=e->getConfInt("insFocusesPattern",1); - settings.stepOnInsert=e->getConfInt("stepOnInsert",0); - settings.unifiedDataView=e->getConfInt("unifiedDataView",0); - settings.sysFileDialog=e->getConfInt("sysFileDialog",SYS_FILE_DIALOG_DEFAULT); - settings.roundedWindows=e->getConfInt("roundedWindows",1); - settings.roundedButtons=e->getConfInt("roundedButtons",1); - settings.roundedMenus=e->getConfInt("roundedMenus",0); - settings.loadJapanese=e->getConfInt("loadJapanese",0); - settings.loadChinese=e->getConfInt("loadChinese",0); - settings.loadChineseTraditional=e->getConfInt("loadChineseTraditional",0); - settings.loadKorean=e->getConfInt("loadKorean",0); - settings.fmLayout=e->getConfInt("fmLayout",4); - settings.sampleLayout=e->getConfInt("sampleLayout",0); - settings.waveLayout=e->getConfInt("waveLayout",0); - settings.susPosition=e->getConfInt("susPosition",0); - settings.effectCursorDir=e->getConfInt("effectCursorDir",1); - settings.cursorPastePos=e->getConfInt("cursorPastePos",1); - settings.titleBarInfo=e->getConfInt("titleBarInfo",1); - settings.titleBarSys=e->getConfInt("titleBarSys",1); - settings.frameBorders=e->getConfInt("frameBorders",0); - settings.effectDeletionAltersValue=e->getConfInt("effectDeletionAltersValue",1); - settings.oscRoundedCorners=e->getConfInt("oscRoundedCorners",1); - settings.oscTakesEntireWindow=e->getConfInt("oscTakesEntireWindow",0); - settings.oscBorder=e->getConfInt("oscBorder",1); - settings.oscEscapesBoundary=e->getConfInt("oscEscapesBoundary",0); - settings.oscMono=e->getConfInt("oscMono",1); - settings.oscAntiAlias=e->getConfInt("oscAntiAlias",1); - settings.separateFMColors=e->getConfInt("separateFMColors",0); - settings.insEditColorize=e->getConfInt("insEditColorize",0); - settings.metroVol=e->getConfInt("metroVol",100); - settings.sampleVol=e->getConfInt("sampleVol",50); - settings.pushNibble=e->getConfInt("pushNibble",0); - settings.scrollChangesOrder=e->getConfInt("scrollChangesOrder",0); - settings.oplStandardWaveNames=e->getConfInt("oplStandardWaveNames",0); - settings.cursorMoveNoScroll=e->getConfInt("cursorMoveNoScroll",0); - settings.lowLatency=e->getConfInt("lowLatency",0); - settings.notePreviewBehavior=e->getConfInt("notePreviewBehavior",1); - settings.powerSave=e->getConfInt("powerSave",POWER_SAVE_DEFAULT); - settings.absorbInsInput=e->getConfInt("absorbInsInput",0); - settings.eventDelay=e->getConfInt("eventDelay",0); - settings.moveWindowTitle=e->getConfInt("moveWindowTitle",1); - settings.hiddenSystems=e->getConfInt("hiddenSystems",0); - settings.horizontalDataView=e->getConfInt("horizontalDataView",0); - settings.noMultiSystem=e->getConfInt("noMultiSystem",0); - settings.oldMacroVSlider=e->getConfInt("oldMacroVSlider",0); - settings.displayAllInsTypes=e->getConfInt("displayAllInsTypes",0); - settings.displayPartial=e->getConfInt("displayPartial",0); - settings.noteCellSpacing=e->getConfInt("noteCellSpacing",0); - settings.insCellSpacing=e->getConfInt("insCellSpacing",0); - settings.volCellSpacing=e->getConfInt("volCellSpacing",0); - settings.effectCellSpacing=e->getConfInt("effectCellSpacing",0); - settings.effectValCellSpacing=e->getConfInt("effectValCellSpacing",0); - settings.doubleClickColumn=e->getConfInt("doubleClickColumn",1); - settings.blankIns=e->getConfInt("blankIns",0); - settings.dragMovesSelection=e->getConfInt("dragMovesSelection",2); - settings.unsignedDetune=e->getConfInt("unsignedDetune",0); - settings.noThreadedInput=e->getConfInt("noThreadedInput",0); - settings.saveWindowPos=e->getConfInt("saveWindowPos",1); - settings.initialSysName=e->getConfString("initialSysName",""); - settings.clampSamples=e->getConfInt("clampSamples",0); - settings.noteOffLabel=e->getConfString("noteOffLabel","OFF"); - settings.noteRelLabel=e->getConfString("noteRelLabel","==="); - settings.macroRelLabel=e->getConfString("macroRelLabel","REL"); - settings.emptyLabel=e->getConfString("emptyLabel","..."); - settings.emptyLabel2=e->getConfString("emptyLabel2",".."); - settings.saveUnusedPatterns=e->getConfInt("saveUnusedPatterns",0); - settings.channelColors=e->getConfInt("channelColors",1); - settings.channelTextColors=e->getConfInt("channelTextColors",0); - settings.channelStyle=e->getConfInt("channelStyle",1); - settings.channelVolStyle=e->getConfInt("channelVolStyle",0); - settings.channelFeedbackStyle=e->getConfInt("channelFeedbackStyle",1); - settings.channelFont=e->getConfInt("channelFont",1); - settings.channelTextCenter=e->getConfInt("channelTextCenter",1); - settings.maxRecentFile=e->getConfInt("maxRecentFile",10); - settings.midiOutClock=e->getConfInt("midiOutClock",0); - settings.midiOutTime=e->getConfInt("midiOutTime",0); - settings.midiOutProgramChange=e->getConfInt("midiOutProgramChange",0); - settings.midiOutMode=e->getConfInt("midiOutMode",1); - settings.midiOutTimeRate=e->getConfInt("midiOutTimeRate",0); - settings.centerPattern=e->getConfInt("centerPattern",0); - settings.ordersCursor=e->getConfInt("ordersCursor",1); - settings.persistFadeOut=e->getConfInt("persistFadeOut",1); - settings.exportLoops=e->getConfInt("exportLoops",0); - settings.exportFadeOut=e->getConfDouble("exportFadeOut",0.0); - settings.macroLayout=e->getConfInt("macroLayout",0); - settings.doubleClickTime=e->getConfFloat("doubleClickTime",0.3f); - settings.oneDigitEffects=e->getConfInt("oneDigitEffects",0); - settings.disableFadeIn=e->getConfInt("disableFadeIn",0); - settings.alwaysPlayIntro=e->getConfInt("alwaysPlayIntro",0); - settings.cursorFollowsOrder=e->getConfInt("cursorFollowsOrder",1); - settings.iCannotWait=e->getConfInt("iCannotWait",0); - settings.orderButtonPos=e->getConfInt("orderButtonPos",2); - settings.compress=e->getConfInt("compress",1); - settings.newPatternFormat=e->getConfInt("newPatternFormat",1); - settings.renderBackend=e->getConfString("renderBackend",GUI_BACKEND_DEFAULT_NAME); - settings.renderClearPos=e->getConfInt("renderClearPos",0); - settings.insertBehavior=e->getConfInt("insertBehavior",1); - settings.pullDeleteRow=e->getConfInt("pullDeleteRow",1); - settings.newSongBehavior=e->getConfInt("newSongBehavior",0); - settings.memUsageUnit=e->getConfInt("memUsageUnit",1); - settings.cursorFollowsWheel=e->getConfInt("cursorFollowsWheel",0); - settings.noDMFCompat=e->getConfInt("noDMFCompat",0); - settings.removeInsOff=e->getConfInt("removeInsOff",0); - settings.removeVolOff=e->getConfInt("removeVolOff",0); - settings.playOnLoad=e->getConfInt("playOnLoad",0); - settings.insTypeMenu=e->getConfInt("insTypeMenu",1); - settings.capitalMenuBar=e->getConfInt("capitalMenuBar",0); - settings.centerPopup=e->getConfInt("centerPopup",1); - settings.insIconsStyle=e->getConfInt("insIconsStyle",1); - settings.classicChipOptions=e->getConfInt("classicChipOptions",0); - settings.wasapiEx=e->getConfInt("wasapiEx",0); - settings.chanOscThreads=e->getConfInt("chanOscThreads",0); - settings.renderPoolThreads=e->getConfInt("renderPoolThreads",0); - settings.showPool=e->getConfInt("showPool",0); - settings.writeInsNames=e->getConfInt("writeInsNames",1); - settings.readInsNames=e->getConfInt("readInsNames",1); - settings.defaultAuthorName=e->getConfString("defaultAuthorName",""); - settings.fontBackend=e->getConfInt("fontBackend",FONT_BACKEND_DEFAULT); - settings.fontHinting=e->getConfInt("fontHinting",0); - settings.fontBitmap=e->getConfInt("fontBitmap",0); - settings.fontAutoHint=e->getConfInt("fontAutoHint",1); - settings.fontAntiAlias=e->getConfInt("fontAntiAlias",1); - settings.selectAssetOnLoad=e->getConfInt("selectAssetOnLoad",1); - settings.basicColors=e->getConfInt("basicColors",1); + settings.audioDevice=conf.getString("audioDevice",""); + settings.audioChans=conf.getInt("audioChans",2); + settings.midiInDevice=conf.getString("midiInDevice",""); + settings.midiOutDevice=conf.getString("midiOutDevice",""); + settings.renderDriver=conf.getString("renderDriver",""); + settings.sdlAudioDriver=conf.getString("sdlAudioDriver",""); + settings.audioQuality=conf.getInt("audioQuality",0); + settings.audioHiPass=conf.getInt("audioHiPass",1); + settings.audioBufSize=conf.getInt("audioBufSize",1024); + settings.audioRate=conf.getInt("audioRate",44100); + settings.arcadeCore=conf.getInt("arcadeCore",0); + settings.ym2612Core=conf.getInt("ym2612Core",0); + settings.snCore=conf.getInt("snCore",0); + settings.nesCore=conf.getInt("nesCore",0); + settings.fdsCore=conf.getInt("fdsCore",0); + settings.c64Core=conf.getInt("c64Core",0); + settings.pokeyCore=conf.getInt("pokeyCore",1); + settings.opnCore=conf.getInt("opnCore",1); + settings.opl2Core=conf.getInt("opl2Core",0); + settings.opl3Core=conf.getInt("opl3Core",0); + settings.arcadeCoreRender=conf.getInt("arcadeCoreRender",1); + settings.ym2612CoreRender=conf.getInt("ym2612CoreRender",0); + settings.snCoreRender=conf.getInt("snCoreRender",0); + settings.nesCoreRender=conf.getInt("nesCoreRender",0); + settings.fdsCoreRender=conf.getInt("fdsCoreRender",1); + settings.c64CoreRender=conf.getInt("c64CoreRender",1); + settings.pokeyCoreRender=conf.getInt("pokeyCoreRender",1); + settings.opnCoreRender=conf.getInt("opnCoreRender",1); + settings.opl2CoreRender=conf.getInt("opl2CoreRender",0); + settings.opl3CoreRender=conf.getInt("opl3CoreRender",0); + settings.pcSpeakerOutMethod=conf.getInt("pcSpeakerOutMethod",0); + settings.yrw801Path=conf.getString("yrw801Path",""); + settings.tg100Path=conf.getString("tg100Path",""); + settings.mu5Path=conf.getString("mu5Path",""); + settings.mainFont=conf.getInt("mainFont",0); + settings.headFont=conf.getInt("headFont",0); + settings.patFont=conf.getInt("patFont",0); + settings.mainFontPath=conf.getString("mainFontPath",""); + settings.headFontPath=conf.getString("headFontPath",""); + settings.patFontPath=conf.getString("patFontPath",""); + settings.patRowsBase=conf.getInt("patRowsBase",0); + settings.orderRowsBase=conf.getInt("orderRowsBase",1); + settings.soloAction=conf.getInt("soloAction",0); + settings.pullDeleteBehavior=conf.getInt("pullDeleteBehavior",1); + settings.wrapHorizontal=conf.getInt("wrapHorizontal",0); + settings.wrapVertical=conf.getInt("wrapVertical",0); + settings.macroView=conf.getInt("macroView",0); + settings.fmNames=conf.getInt("fmNames",0); + settings.allowEditDocking=conf.getInt("allowEditDocking",1); + settings.chipNames=conf.getInt("chipNames",0); + settings.overflowHighlight=conf.getInt("overflowHighlight",0); + settings.partyTime=conf.getInt("partyTime",0); + settings.flatNotes=conf.getInt("flatNotes",0); + settings.germanNotation=conf.getInt("germanNotation",0); + settings.stepOnDelete=conf.getInt("stepOnDelete",0); + settings.scrollStep=conf.getInt("scrollStep",0); + settings.sysSeparators=conf.getInt("sysSeparators",1); + settings.forceMono=conf.getInt("forceMono",0); + settings.controlLayout=conf.getInt("controlLayout",3); + settings.statusDisplay=conf.getInt("statusDisplay",0); + settings.dpiScale=conf.getFloat("dpiScale",0.0f); + settings.viewPrevPattern=conf.getInt("viewPrevPattern",1); + settings.guiColorsBase=conf.getInt("guiColorsBase",0); + settings.guiColorsShading=conf.getInt("guiColorsShading",0); + settings.avoidRaisingPattern=conf.getInt("avoidRaisingPattern",0); + settings.insFocusesPattern=conf.getInt("insFocusesPattern",1); + settings.stepOnInsert=conf.getInt("stepOnInsert",0); + settings.unifiedDataView=conf.getInt("unifiedDataView",0); + settings.sysFileDialog=conf.getInt("sysFileDialog",SYS_FILE_DIALOG_DEFAULT); + settings.roundedWindows=conf.getInt("roundedWindows",1); + settings.roundedButtons=conf.getInt("roundedButtons",1); + settings.roundedMenus=conf.getInt("roundedMenus",0); + settings.loadJapanese=conf.getInt("loadJapanese",0); + settings.loadChinese=conf.getInt("loadChinese",0); + settings.loadChineseTraditional=conf.getInt("loadChineseTraditional",0); + settings.loadKorean=conf.getInt("loadKorean",0); + settings.fmLayout=conf.getInt("fmLayout",4); + settings.sampleLayout=conf.getInt("sampleLayout",0); + settings.waveLayout=conf.getInt("waveLayout",0); + settings.susPosition=conf.getInt("susPosition",0); + settings.effectCursorDir=conf.getInt("effectCursorDir",1); + settings.cursorPastePos=conf.getInt("cursorPastePos",1); + settings.titleBarInfo=conf.getInt("titleBarInfo",1); + settings.titleBarSys=conf.getInt("titleBarSys",1); + settings.frameBorders=conf.getInt("frameBorders",0); + settings.effectDeletionAltersValue=conf.getInt("effectDeletionAltersValue",1); + settings.oscRoundedCorners=conf.getInt("oscRoundedCorners",1); + settings.oscTakesEntireWindow=conf.getInt("oscTakesEntireWindow",0); + settings.oscBorder=conf.getInt("oscBorder",1); + settings.oscEscapesBoundary=conf.getInt("oscEscapesBoundary",0); + settings.oscMono=conf.getInt("oscMono",1); + settings.oscAntiAlias=conf.getInt("oscAntiAlias",1); + settings.separateFMColors=conf.getInt("separateFMColors",0); + settings.insEditColorize=conf.getInt("insEditColorize",0); + settings.metroVol=conf.getInt("metroVol",100); + settings.sampleVol=conf.getInt("sampleVol",50); + settings.pushNibble=conf.getInt("pushNibble",0); + settings.scrollChangesOrder=conf.getInt("scrollChangesOrder",0); + settings.oplStandardWaveNames=conf.getInt("oplStandardWaveNames",0); + settings.cursorMoveNoScroll=conf.getInt("cursorMoveNoScroll",0); + settings.lowLatency=conf.getInt("lowLatency",0); + settings.notePreviewBehavior=conf.getInt("notePreviewBehavior",1); + settings.powerSave=conf.getInt("powerSave",POWER_SAVE_DEFAULT); + settings.absorbInsInput=conf.getInt("absorbInsInput",0); + settings.eventDelay=conf.getInt("eventDelay",0); + settings.moveWindowTitle=conf.getInt("moveWindowTitle",1); + settings.hiddenSystems=conf.getInt("hiddenSystems",0); + settings.horizontalDataView=conf.getInt("horizontalDataView",0); + settings.noMultiSystem=conf.getInt("noMultiSystem",0); + settings.oldMacroVSlider=conf.getInt("oldMacroVSlider",0); + settings.displayAllInsTypes=conf.getInt("displayAllInsTypes",0); + settings.displayPartial=conf.getInt("displayPartial",0); + settings.noteCellSpacing=conf.getInt("noteCellSpacing",0); + settings.insCellSpacing=conf.getInt("insCellSpacing",0); + settings.volCellSpacing=conf.getInt("volCellSpacing",0); + settings.effectCellSpacing=conf.getInt("effectCellSpacing",0); + settings.effectValCellSpacing=conf.getInt("effectValCellSpacing",0); + settings.doubleClickColumn=conf.getInt("doubleClickColumn",1); + settings.blankIns=conf.getInt("blankIns",0); + settings.dragMovesSelection=conf.getInt("dragMovesSelection",2); + settings.unsignedDetune=conf.getInt("unsignedDetune",0); + settings.noThreadedInput=conf.getInt("noThreadedInput",0); + settings.saveWindowPos=conf.getInt("saveWindowPos",1); + settings.initialSysName=conf.getString("initialSysName",""); + settings.clampSamples=conf.getInt("clampSamples",0); + settings.noteOffLabel=conf.getString("noteOffLabel","OFF"); + settings.noteRelLabel=conf.getString("noteRelLabel","==="); + settings.macroRelLabel=conf.getString("macroRelLabel","REL"); + settings.emptyLabel=conf.getString("emptyLabel","..."); + settings.emptyLabel2=conf.getString("emptyLabel2",".."); + settings.saveUnusedPatterns=conf.getInt("saveUnusedPatterns",0); + settings.channelColors=conf.getInt("channelColors",1); + settings.channelTextColors=conf.getInt("channelTextColors",0); + settings.channelStyle=conf.getInt("channelStyle",1); + settings.channelVolStyle=conf.getInt("channelVolStyle",0); + settings.channelFeedbackStyle=conf.getInt("channelFeedbackStyle",1); + settings.channelFont=conf.getInt("channelFont",1); + settings.channelTextCenter=conf.getInt("channelTextCenter",1); + settings.maxRecentFile=conf.getInt("maxRecentFile",10); + settings.midiOutClock=conf.getInt("midiOutClock",0); + settings.midiOutTime=conf.getInt("midiOutTime",0); + settings.midiOutProgramChange=conf.getInt("midiOutProgramChange",0); + settings.midiOutMode=conf.getInt("midiOutMode",1); + settings.midiOutTimeRate=conf.getInt("midiOutTimeRate",0); + settings.centerPattern=conf.getInt("centerPattern",0); + settings.ordersCursor=conf.getInt("ordersCursor",1); + settings.persistFadeOut=conf.getInt("persistFadeOut",1); + settings.exportLoops=conf.getInt("exportLoops",0); + settings.exportFadeOut=conf.getDouble("exportFadeOut",0.0); + settings.macroLayout=conf.getInt("macroLayout",0); + settings.doubleClickTime=conf.getFloat("doubleClickTime",0.3f); + settings.oneDigitEffects=conf.getInt("oneDigitEffects",0); + settings.disableFadeIn=conf.getInt("disableFadeIn",0); + settings.alwaysPlayIntro=conf.getInt("alwaysPlayIntro",0); + settings.cursorFollowsOrder=conf.getInt("cursorFollowsOrder",1); + settings.iCannotWait=conf.getInt("iCannotWait",0); + settings.orderButtonPos=conf.getInt("orderButtonPos",2); + settings.compress=conf.getInt("compress",1); + settings.newPatternFormat=conf.getInt("newPatternFormat",1); + settings.renderBackend=conf.getString("renderBackend",GUI_BACKEND_DEFAULT_NAME); + settings.renderClearPos=conf.getInt("renderClearPos",0); + settings.insertBehavior=conf.getInt("insertBehavior",1); + settings.pullDeleteRow=conf.getInt("pullDeleteRow",1); + settings.newSongBehavior=conf.getInt("newSongBehavior",0); + settings.memUsageUnit=conf.getInt("memUsageUnit",1); + settings.cursorFollowsWheel=conf.getInt("cursorFollowsWheel",0); + settings.noDMFCompat=conf.getInt("noDMFCompat",0); + settings.removeInsOff=conf.getInt("removeInsOff",0); + settings.removeVolOff=conf.getInt("removeVolOff",0); + settings.playOnLoad=conf.getInt("playOnLoad",0); + settings.insTypeMenu=conf.getInt("insTypeMenu",1); + settings.capitalMenuBar=conf.getInt("capitalMenuBar",0); + settings.centerPopup=conf.getInt("centerPopup",1); + settings.insIconsStyle=conf.getInt("insIconsStyle",1); + settings.classicChipOptions=conf.getInt("classicChipOptions",0); + settings.wasapiEx=conf.getInt("wasapiEx",0); + settings.chanOscThreads=conf.getInt("chanOscThreads",0); + settings.renderPoolThreads=conf.getInt("renderPoolThreads",0); + settings.showPool=conf.getInt("showPool",0); + settings.writeInsNames=conf.getInt("writeInsNames",1); + settings.readInsNames=conf.getInt("readInsNames",1); + settings.defaultAuthorName=conf.getString("defaultAuthorName",""); + settings.fontBackend=conf.getInt("fontBackend",FONT_BACKEND_DEFAULT); + settings.fontHinting=conf.getInt("fontHinting",0); + settings.fontBitmap=conf.getInt("fontBitmap",0); + settings.fontAutoHint=conf.getInt("fontAutoHint",1); + settings.fontAntiAlias=conf.getInt("fontAntiAlias",1); + settings.selectAssetOnLoad=conf.getInt("selectAssetOnLoad",1); + settings.basicColors=conf.getInt("basicColors",1); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.headFontSize,2,96); @@ -4051,10 +4051,24 @@ void FurnaceGUI::syncSettings() { if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; - String initialSys2=e->getConfString("initialSys2",""); - bool oldVol=e->getConfInt("configVersion",DIV_ENGINE_VERSION)<135; + // keybinds + for (int i=0; idecodeSysDesc(e->getConfString("initialSys","")); + initialSys2=e->decodeSysDesc(conf.getString("initialSys","")); oldVol=false; } settings.initialSys.clear(); @@ -4081,18 +4095,225 @@ void FurnaceGUI::syncSettings() { settings.initialSys.set(fmt::sprintf("vol%d",i),newVol); settings.initialSys.set(fmt::sprintf("pan%d",i),newPan); } - e->setConf("initialSys2",settings.initialSys.toBase64()); - e->setConf("configVersion",DIV_ENGINE_VERSION); + conf.set("initialSys2",settings.initialSys.toBase64()); + conf.set("configVersion",DIV_ENGINE_VERSION); } } +} + +void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { + conf.set("mainFontSize",settings.mainFontSize); + conf.set("headFontSize",settings.headFontSize); + conf.set("patFontSize",settings.patFontSize); + conf.set("iconSize",settings.iconSize); + conf.set("audioEngine",String(audioBackends[settings.audioEngine])); + conf.set("audioDevice",settings.audioDevice); + conf.set("midiInDevice",settings.midiInDevice); + conf.set("midiOutDevice",settings.midiOutDevice); + conf.set("renderDriver",settings.renderDriver); + conf.set("sdlAudioDriver",settings.sdlAudioDriver); + conf.set("audioQuality",settings.audioQuality); + conf.set("audioHiPass",settings.audioHiPass); + conf.set("audioBufSize",settings.audioBufSize); + conf.set("audioRate",settings.audioRate); + conf.set("audioChans",settings.audioChans); + conf.set("arcadeCore",settings.arcadeCore); + conf.set("ym2612Core",settings.ym2612Core); + conf.set("snCore",settings.snCore); + conf.set("nesCore",settings.nesCore); + conf.set("fdsCore",settings.fdsCore); + conf.set("c64Core",settings.c64Core); + conf.set("pokeyCore",settings.pokeyCore); + conf.set("opnCore",settings.opnCore); + conf.set("opl2Core",settings.opl2Core); + conf.set("opl3Core",settings.opl3Core); + conf.set("arcadeCoreRender",settings.arcadeCoreRender); + conf.set("ym2612CoreRender",settings.ym2612CoreRender); + conf.set("snCoreRender",settings.snCoreRender); + conf.set("nesCoreRender",settings.nesCoreRender); + conf.set("fdsCoreRender",settings.fdsCoreRender); + conf.set("c64CoreRender",settings.c64CoreRender); + conf.set("pokeyCoreRender",settings.pokeyCoreRender); + conf.set("opnCoreRender",settings.opnCoreRender); + conf.set("opl2CoreRender",settings.opl2CoreRender); + conf.set("opl3CoreRender",settings.opl3CoreRender); + conf.set("pcSpeakerOutMethod",settings.pcSpeakerOutMethod); + conf.set("yrw801Path",settings.yrw801Path); + conf.set("tg100Path",settings.tg100Path); + conf.set("mu5Path",settings.mu5Path); + conf.set("mainFont",settings.mainFont); + conf.set("headFont",settings.headFont); + conf.set("patFont",settings.patFont); + conf.set("mainFontPath",settings.mainFontPath); + conf.set("headFontPath",settings.headFontPath); + conf.set("patFontPath",settings.patFontPath); + conf.set("patRowsBase",settings.patRowsBase); + conf.set("orderRowsBase",settings.orderRowsBase); + conf.set("soloAction",settings.soloAction); + conf.set("pullDeleteBehavior",settings.pullDeleteBehavior); + conf.set("wrapHorizontal",settings.wrapHorizontal); + conf.set("wrapVertical",settings.wrapVertical); + conf.set("macroView",settings.macroView); + conf.set("fmNames",settings.fmNames); + conf.set("allowEditDocking",settings.allowEditDocking); + conf.set("chipNames",settings.chipNames); + conf.set("overflowHighlight",settings.overflowHighlight); + conf.set("partyTime",settings.partyTime); + conf.set("flatNotes",settings.flatNotes); + conf.set("germanNotation",settings.germanNotation); + conf.set("stepOnDelete",settings.stepOnDelete); + conf.set("scrollStep",settings.scrollStep); + conf.set("sysSeparators",settings.sysSeparators); + conf.set("forceMono",settings.forceMono); + conf.set("controlLayout",settings.controlLayout); + conf.set("statusDisplay",settings.statusDisplay); + conf.set("dpiScale",settings.dpiScale); + conf.set("viewPrevPattern",settings.viewPrevPattern); + conf.set("guiColorsBase",settings.guiColorsBase); + conf.set("guiColorsShading",settings.guiColorsShading); + conf.set("avoidRaisingPattern",settings.avoidRaisingPattern); + conf.set("insFocusesPattern",settings.insFocusesPattern); + conf.set("stepOnInsert",settings.stepOnInsert); + conf.set("unifiedDataView",settings.unifiedDataView); + conf.set("sysFileDialog",settings.sysFileDialog); + conf.set("roundedWindows",settings.roundedWindows); + conf.set("roundedButtons",settings.roundedButtons); + conf.set("roundedMenus",settings.roundedMenus); + conf.set("loadJapanese",settings.loadJapanese); + conf.set("loadChinese",settings.loadChinese); + conf.set("loadChineseTraditional",settings.loadChineseTraditional); + conf.set("loadKorean",settings.loadKorean); + conf.set("fmLayout",settings.fmLayout); + conf.set("sampleLayout",settings.sampleLayout); + conf.set("waveLayout",settings.waveLayout); + conf.set("susPosition",settings.susPosition); + conf.set("effectCursorDir",settings.effectCursorDir); + conf.set("cursorPastePos",settings.cursorPastePos); + conf.set("titleBarInfo",settings.titleBarInfo); + conf.set("titleBarSys",settings.titleBarSys); + conf.set("frameBorders",settings.frameBorders); + conf.set("effectDeletionAltersValue",settings.effectDeletionAltersValue); + conf.set("oscRoundedCorners",settings.oscRoundedCorners); + conf.set("oscTakesEntireWindow",settings.oscTakesEntireWindow); + conf.set("oscBorder",settings.oscBorder); + conf.set("oscEscapesBoundary",settings.oscEscapesBoundary); + conf.set("oscMono",settings.oscMono); + conf.set("oscAntiAlias",settings.oscAntiAlias); + conf.set("separateFMColors",settings.separateFMColors); + conf.set("insEditColorize",settings.insEditColorize); + conf.set("metroVol",settings.metroVol); + conf.set("sampleVol",settings.sampleVol); + conf.set("pushNibble",settings.pushNibble); + conf.set("scrollChangesOrder",settings.scrollChangesOrder); + conf.set("oplStandardWaveNames",settings.oplStandardWaveNames); + conf.set("cursorMoveNoScroll",settings.cursorMoveNoScroll); + conf.set("lowLatency",settings.lowLatency); + conf.set("notePreviewBehavior",settings.notePreviewBehavior); + conf.set("powerSave",settings.powerSave); + conf.set("absorbInsInput",settings.absorbInsInput); + conf.set("eventDelay",settings.eventDelay); + conf.set("moveWindowTitle",settings.moveWindowTitle); + conf.set("hiddenSystems",settings.hiddenSystems); + conf.set("initialSys2",settings.initialSys.toBase64()); + conf.set("initialSysName",settings.initialSysName); + conf.set("horizontalDataView",settings.horizontalDataView); + conf.set("noMultiSystem",settings.noMultiSystem); + conf.set("oldMacroVSlider",settings.oldMacroVSlider); + conf.set("displayAllInsTypes",settings.displayAllInsTypes); + conf.set("displayPartial",settings.displayPartial); + conf.set("noteCellSpacing",settings.noteCellSpacing); + conf.set("insCellSpacing",settings.insCellSpacing); + conf.set("volCellSpacing",settings.volCellSpacing); + conf.set("effectCellSpacing",settings.effectCellSpacing); + conf.set("effectValCellSpacing",settings.effectValCellSpacing); + conf.set("doubleClickColumn",settings.doubleClickColumn); + conf.set("blankIns",settings.blankIns); + conf.set("dragMovesSelection",settings.dragMovesSelection); + conf.set("unsignedDetune",settings.unsignedDetune); + conf.set("noThreadedInput",settings.noThreadedInput); + conf.set("saveWindowPos",settings.saveWindowPos); + conf.set("clampSamples",settings.clampSamples); + conf.set("noteOffLabel",settings.noteOffLabel); + conf.set("noteRelLabel",settings.noteRelLabel); + conf.set("macroRelLabel",settings.macroRelLabel); + conf.set("emptyLabel",settings.emptyLabel); + conf.set("emptyLabel2",settings.emptyLabel2); + conf.set("saveUnusedPatterns",settings.saveUnusedPatterns); + conf.set("channelColors",settings.channelColors); + conf.set("channelTextColors",settings.channelTextColors); + conf.set("channelStyle",settings.channelStyle); + conf.set("channelVolStyle",settings.channelVolStyle); + conf.set("channelFeedbackStyle",settings.channelFeedbackStyle); + conf.set("channelFont",settings.channelFont); + conf.set("channelTextCenter",settings.channelTextCenter); + conf.set("maxRecentFile",settings.maxRecentFile); + conf.set("midiOutClock",settings.midiOutClock); + conf.set("midiOutTime",settings.midiOutTime); + conf.set("midiOutProgramChange",settings.midiOutProgramChange); + conf.set("midiOutMode",settings.midiOutMode); + conf.set("midiOutTimeRate",settings.midiOutTimeRate); + conf.set("centerPattern",settings.centerPattern); + conf.set("ordersCursor",settings.ordersCursor); + conf.set("persistFadeOut",settings.persistFadeOut); + conf.set("exportLoops",settings.exportLoops); + conf.set("exportFadeOut",settings.exportFadeOut); + conf.set("macroLayout",settings.macroLayout); + conf.set("doubleClickTime",settings.doubleClickTime); + conf.set("oneDigitEffects",settings.oneDigitEffects); + conf.set("disableFadeIn",settings.disableFadeIn); + conf.set("alwaysPlayIntro",settings.alwaysPlayIntro); + conf.set("cursorFollowsOrder",settings.cursorFollowsOrder); + conf.set("iCannotWait",settings.iCannotWait); + conf.set("orderButtonPos",settings.orderButtonPos); + conf.set("compress",settings.compress); + conf.set("newPatternFormat",settings.newPatternFormat); + conf.set("renderBackend",settings.renderBackend); + conf.set("renderClearPos",settings.renderClearPos); + conf.set("insertBehavior",settings.insertBehavior); + conf.set("pullDeleteRow",settings.pullDeleteRow); + conf.set("newSongBehavior",settings.newSongBehavior); + conf.set("memUsageUnit",settings.memUsageUnit); + conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); + conf.set("noDMFCompat",settings.noDMFCompat); + conf.set("removeInsOff",settings.removeInsOff); + conf.set("removeVolOff",settings.removeVolOff); + conf.set("playOnLoad",settings.playOnLoad); + conf.set("insTypeMenu",settings.insTypeMenu); + conf.set("capitalMenuBar",settings.capitalMenuBar); + conf.set("centerPopup",settings.centerPopup); + conf.set("insIconsStyle",settings.insIconsStyle); + conf.set("classicChipOptions",settings.classicChipOptions); + conf.set("wasapiEx",settings.wasapiEx); + conf.set("chanOscThreads",settings.chanOscThreads); + conf.set("renderPoolThreads",settings.renderPoolThreads); + conf.set("showPool",settings.showPool); + conf.set("writeInsNames",settings.writeInsNames); + conf.set("readInsNames",settings.readInsNames); + conf.set("defaultAuthorName",settings.defaultAuthorName); + conf.set("fontBackend",settings.fontBackend); + conf.set("fontHinting",settings.fontHinting); + conf.set("fontBitmap",settings.fontBitmap); + conf.set("fontAutoHint",settings.fontAutoHint); + conf.set("fontAntiAlias",settings.fontAntiAlias); + conf.set("selectAssetOnLoad",settings.selectAssetOnLoad); + conf.set("basicColors",settings.basicColors); + + // colors + for (int i=0; igetConfInt(String("keybind_GUI_ACTION_")+String(guiActions[i].name),guiActions[i].defaultBind); + conf.set(String("keybind_GUI_ACTION_")+String(guiActions[i].name),actionKeys[i]); } - decodeKeyMap(noteKeys,e->getConfString("noteKeys",DEFAULT_NOTE_KEYS)); + conf.set("noteKeys",encodeKeyMap(noteKeys)); +} + +void FurnaceGUI::syncSettings() { + readConfig(e->getConfObject()); parseKeybinds(); @@ -4136,217 +4357,10 @@ void FurnaceGUI::commitSettings() { settings.audioHiPass!=e->getConfInt("audioHiPass",1) ); - e->setConf("mainFontSize",settings.mainFontSize); - e->setConf("headFontSize",settings.headFontSize); - e->setConf("patFontSize",settings.patFontSize); - e->setConf("iconSize",settings.iconSize); - e->setConf("audioEngine",String(audioBackends[settings.audioEngine])); - e->setConf("audioDevice",settings.audioDevice); - e->setConf("midiInDevice",settings.midiInDevice); - e->setConf("midiOutDevice",settings.midiOutDevice); - e->setConf("renderDriver",settings.renderDriver); - e->setConf("sdlAudioDriver",settings.sdlAudioDriver); - e->setConf("audioQuality",settings.audioQuality); - e->setConf("audioHiPass",settings.audioHiPass); - e->setConf("audioBufSize",settings.audioBufSize); - e->setConf("audioRate",settings.audioRate); - e->setConf("audioChans",settings.audioChans); - e->setConf("arcadeCore",settings.arcadeCore); - e->setConf("ym2612Core",settings.ym2612Core); - e->setConf("snCore",settings.snCore); - e->setConf("nesCore",settings.nesCore); - e->setConf("fdsCore",settings.fdsCore); - e->setConf("c64Core",settings.c64Core); - e->setConf("pokeyCore",settings.pokeyCore); - e->setConf("opnCore",settings.opnCore); - e->setConf("opl2Core",settings.opl2Core); - e->setConf("opl3Core",settings.opl3Core); - e->setConf("arcadeCoreRender",settings.arcadeCoreRender); - e->setConf("ym2612CoreRender",settings.ym2612CoreRender); - e->setConf("snCoreRender",settings.snCoreRender); - e->setConf("nesCoreRender",settings.nesCoreRender); - e->setConf("fdsCoreRender",settings.fdsCoreRender); - e->setConf("c64CoreRender",settings.c64CoreRender); - e->setConf("pokeyCoreRender",settings.pokeyCoreRender); - e->setConf("opnCoreRender",settings.opnCoreRender); - e->setConf("opl2CoreRender",settings.opl2CoreRender); - e->setConf("opl3CoreRender",settings.opl3CoreRender); - e->setConf("pcSpeakerOutMethod",settings.pcSpeakerOutMethod); - e->setConf("yrw801Path",settings.yrw801Path); - e->setConf("tg100Path",settings.tg100Path); - e->setConf("mu5Path",settings.mu5Path); - e->setConf("mainFont",settings.mainFont); - e->setConf("headFont",settings.headFont); - e->setConf("patFont",settings.patFont); - e->setConf("mainFontPath",settings.mainFontPath); - e->setConf("headFontPath",settings.headFontPath); - e->setConf("patFontPath",settings.patFontPath); - e->setConf("patRowsBase",settings.patRowsBase); - e->setConf("orderRowsBase",settings.orderRowsBase); - e->setConf("soloAction",settings.soloAction); - e->setConf("pullDeleteBehavior",settings.pullDeleteBehavior); - e->setConf("wrapHorizontal",settings.wrapHorizontal); - e->setConf("wrapVertical",settings.wrapVertical); - e->setConf("macroView",settings.macroView); - e->setConf("fmNames",settings.fmNames); - e->setConf("allowEditDocking",settings.allowEditDocking); - e->setConf("chipNames",settings.chipNames); - e->setConf("overflowHighlight",settings.overflowHighlight); - e->setConf("partyTime",settings.partyTime); - e->setConf("flatNotes",settings.flatNotes); - e->setConf("germanNotation",settings.germanNotation); - e->setConf("stepOnDelete",settings.stepOnDelete); - e->setConf("scrollStep",settings.scrollStep); - e->setConf("sysSeparators",settings.sysSeparators); - e->setConf("forceMono",settings.forceMono); - e->setConf("controlLayout",settings.controlLayout); - e->setConf("statusDisplay",settings.statusDisplay); - e->setConf("dpiScale",settings.dpiScale); - e->setConf("viewPrevPattern",settings.viewPrevPattern); - e->setConf("guiColorsBase",settings.guiColorsBase); - e->setConf("guiColorsShading",settings.guiColorsShading); - e->setConf("avoidRaisingPattern",settings.avoidRaisingPattern); - e->setConf("insFocusesPattern",settings.insFocusesPattern); - e->setConf("stepOnInsert",settings.stepOnInsert); - e->setConf("unifiedDataView",settings.unifiedDataView); - e->setConf("sysFileDialog",settings.sysFileDialog); - e->setConf("roundedWindows",settings.roundedWindows); - e->setConf("roundedButtons",settings.roundedButtons); - e->setConf("roundedMenus",settings.roundedMenus); - e->setConf("loadJapanese",settings.loadJapanese); - e->setConf("loadChinese",settings.loadChinese); - e->setConf("loadChineseTraditional",settings.loadChineseTraditional); - e->setConf("loadKorean",settings.loadKorean); - e->setConf("fmLayout",settings.fmLayout); - e->setConf("sampleLayout",settings.sampleLayout); - e->setConf("waveLayout",settings.waveLayout); - e->setConf("susPosition",settings.susPosition); - e->setConf("effectCursorDir",settings.effectCursorDir); - e->setConf("cursorPastePos",settings.cursorPastePos); - e->setConf("titleBarInfo",settings.titleBarInfo); - e->setConf("titleBarSys",settings.titleBarSys); - e->setConf("frameBorders",settings.frameBorders); - e->setConf("effectDeletionAltersValue",settings.effectDeletionAltersValue); - e->setConf("oscRoundedCorners",settings.oscRoundedCorners); - e->setConf("oscTakesEntireWindow",settings.oscTakesEntireWindow); - e->setConf("oscBorder",settings.oscBorder); - e->setConf("oscEscapesBoundary",settings.oscEscapesBoundary); - e->setConf("oscMono",settings.oscMono); - e->setConf("oscAntiAlias",settings.oscAntiAlias); - e->setConf("separateFMColors",settings.separateFMColors); - e->setConf("insEditColorize",settings.insEditColorize); - e->setConf("metroVol",settings.metroVol); - e->setConf("sampleVol",settings.sampleVol); - e->setConf("pushNibble",settings.pushNibble); - e->setConf("scrollChangesOrder",settings.scrollChangesOrder); - e->setConf("oplStandardWaveNames",settings.oplStandardWaveNames); - e->setConf("cursorMoveNoScroll",settings.cursorMoveNoScroll); - e->setConf("lowLatency",settings.lowLatency); - e->setConf("notePreviewBehavior",settings.notePreviewBehavior); - e->setConf("powerSave",settings.powerSave); - e->setConf("absorbInsInput",settings.absorbInsInput); - e->setConf("eventDelay",settings.eventDelay); - e->setConf("moveWindowTitle",settings.moveWindowTitle); - e->setConf("hiddenSystems",settings.hiddenSystems); - e->setConf("initialSys2",settings.initialSys.toBase64()); - e->setConf("initialSysName",settings.initialSysName); - e->setConf("horizontalDataView",settings.horizontalDataView); - e->setConf("noMultiSystem",settings.noMultiSystem); - e->setConf("oldMacroVSlider",settings.oldMacroVSlider); - e->setConf("displayAllInsTypes",settings.displayAllInsTypes); - e->setConf("displayPartial",settings.displayPartial); - e->setConf("noteCellSpacing",settings.noteCellSpacing); - e->setConf("insCellSpacing",settings.insCellSpacing); - e->setConf("volCellSpacing",settings.volCellSpacing); - e->setConf("effectCellSpacing",settings.effectCellSpacing); - e->setConf("effectValCellSpacing",settings.effectValCellSpacing); - e->setConf("doubleClickColumn",settings.doubleClickColumn); - e->setConf("blankIns",settings.blankIns); - e->setConf("dragMovesSelection",settings.dragMovesSelection); - e->setConf("unsignedDetune",settings.unsignedDetune); - e->setConf("noThreadedInput",settings.noThreadedInput); - e->setConf("saveWindowPos",settings.saveWindowPos); - e->setConf("clampSamples",settings.clampSamples); - e->setConf("noteOffLabel",settings.noteOffLabel); - e->setConf("noteRelLabel",settings.noteRelLabel); - e->setConf("macroRelLabel",settings.macroRelLabel); - e->setConf("emptyLabel",settings.emptyLabel); - e->setConf("emptyLabel2",settings.emptyLabel2); - e->setConf("saveUnusedPatterns",settings.saveUnusedPatterns); - e->setConf("channelColors",settings.channelColors); - e->setConf("channelTextColors",settings.channelTextColors); - e->setConf("channelStyle",settings.channelStyle); - e->setConf("channelVolStyle",settings.channelVolStyle); - e->setConf("channelFeedbackStyle",settings.channelFeedbackStyle); - e->setConf("channelFont",settings.channelFont); - e->setConf("channelTextCenter",settings.channelTextCenter); - e->setConf("maxRecentFile",settings.maxRecentFile); - e->setConf("midiOutClock",settings.midiOutClock); - e->setConf("midiOutTime",settings.midiOutTime); - e->setConf("midiOutProgramChange",settings.midiOutProgramChange); - e->setConf("midiOutMode",settings.midiOutMode); - e->setConf("midiOutTimeRate",settings.midiOutTimeRate); - e->setConf("centerPattern",settings.centerPattern); - e->setConf("ordersCursor",settings.ordersCursor); - e->setConf("persistFadeOut",settings.persistFadeOut); - e->setConf("exportLoops",settings.exportLoops); - e->setConf("exportFadeOut",settings.exportFadeOut); - e->setConf("macroLayout",settings.macroLayout); - e->setConf("doubleClickTime",settings.doubleClickTime); - e->setConf("oneDigitEffects",settings.oneDigitEffects); - e->setConf("disableFadeIn",settings.disableFadeIn); - e->setConf("alwaysPlayIntro",settings.alwaysPlayIntro); - e->setConf("cursorFollowsOrder",settings.cursorFollowsOrder); - e->setConf("iCannotWait",settings.iCannotWait); - e->setConf("orderButtonPos",settings.orderButtonPos); - e->setConf("compress",settings.compress); - e->setConf("newPatternFormat",settings.newPatternFormat); - e->setConf("renderBackend",settings.renderBackend); - e->setConf("renderClearPos",settings.renderClearPos); - e->setConf("insertBehavior",settings.insertBehavior); - e->setConf("pullDeleteRow",settings.pullDeleteRow); - e->setConf("newSongBehavior",settings.newSongBehavior); - e->setConf("memUsageUnit",settings.memUsageUnit); - e->setConf("cursorFollowsWheel",settings.cursorFollowsWheel); - e->setConf("noDMFCompat",settings.noDMFCompat); - e->setConf("removeInsOff",settings.removeInsOff); - e->setConf("removeVolOff",settings.removeVolOff); - e->setConf("playOnLoad",settings.playOnLoad); - e->setConf("insTypeMenu",settings.insTypeMenu); - e->setConf("capitalMenuBar",settings.capitalMenuBar); - e->setConf("centerPopup",settings.centerPopup); - e->setConf("insIconsStyle",settings.insIconsStyle); - e->setConf("classicChipOptions",settings.classicChipOptions); - e->setConf("wasapiEx",settings.wasapiEx); - e->setConf("chanOscThreads",settings.chanOscThreads); - e->setConf("renderPoolThreads",settings.renderPoolThreads); - e->setConf("showPool",settings.showPool); - e->setConf("writeInsNames",settings.writeInsNames); - e->setConf("readInsNames",settings.readInsNames); - e->setConf("defaultAuthorName",settings.defaultAuthorName); - e->setConf("fontBackend",settings.fontBackend); - e->setConf("fontHinting",settings.fontHinting); - e->setConf("fontBitmap",settings.fontBitmap); - e->setConf("fontAutoHint",settings.fontAutoHint); - e->setConf("fontAntiAlias",settings.fontAntiAlias); - e->setConf("selectAssetOnLoad",settings.selectAssetOnLoad); - e->setConf("basicColors",settings.basicColors); - - // colors - for (int i=0; isetConf(guiColors[i].name,(int)ImGui::ColorConvertFloat4ToU32(uiColors[i])); - } - - // keybinds - for (int i=0; isetConf(String("keybind_GUI_ACTION_")+String(guiActions[i].name),actionKeys[i]); - } + writeConfig(e->getConfObject()); parseKeybinds(); - e->setConf("noteKeys",encodeKeyMap(noteKeys)); - midiMap.compile(); midiMap.write(e->getConfigPath()+DIR_SEPARATOR_STR+"midiIn_"+stripName(settings.midiInDevice)+".cfg"); @@ -4853,13 +4867,6 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { chanOscWorkPool=NULL; } - // colors - if (updateFonts) { - for (int i=0; igetConfInt(guiColors[i].name,guiColors[i].defaultColor)); - } - } - for (int i=0; i<64; i++) { ImVec4 col1=uiColors[GUI_COLOR_PATTERN_VOLUME_MIN]; ImVec4 col2=uiColors[GUI_COLOR_PATTERN_VOLUME_HALF]; From 33c26266f3d7458aa27f17528e96b1249e92438b Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Thu, 21 Dec 2023 15:21:17 -0800 Subject: [PATCH 09/30] Document "Guru mode". --- doc/2-interface/settings.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index b3a93b04c..369ab0b58 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -509,6 +509,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Import** - **Export** - **Reset defaults** +- **Guru mode**: exposes additional color settings that would otherwise be automatically calculated. - **General** - **Color scheme type:** - **Dark** From a7d6728b44e8441c81d22e3e8083ac2125d4f2bf Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 21 Dec 2023 18:53:47 -0500 Subject: [PATCH 10/30] asdf --- doc/2-interface/settings.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index 369ab0b58..f65f23fcb 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -498,7 +498,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Rounded window corners** - **Rounded buttons** - **Rounded menu corners** -- **Borders around widgets**: draws thin borders on buttons, checkboxes, text widgets, and the like. +- **Borders around widgets**: draws borders on buttons, checkboxes, text widgets, and the like. @@ -509,7 +509,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Import** - **Export** - **Reset defaults** -- **Guru mode**: exposes additional color settings that would otherwise be automatically calculated. +- **Guru mode**: exposes all color options (instead of accent colors). - **General** - **Color scheme type:** - **Dark** From df3e3e8aeceb966a74e27492818ae53977671d39 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 21 Dec 2023 19:57:26 -0500 Subject: [PATCH 11/30] bunch of code de-duplication --- src/gui/exportOptions.cpp | 374 +++++++++++++++++++++----------------- src/gui/gui.cpp | 171 +---------------- src/gui/gui.h | 9 +- 3 files changed, 219 insertions(+), 335 deletions(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 4e3982dec..d5765fe2b 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -22,144 +22,224 @@ #include "../fileutils.h" #include "misc/cpp/imgui_stdlib.h" -void FurnaceGUI::drawExport() { +void FurnaceGUI::drawExportAudio() { exitDisabledTimer=1; + ImGui::RadioButton("one file",&audioExportType,0); + ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); + ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); + if (ImGui::InputInt("Loops",&exportLoops,1,2)) { + if (exportLoops<0) exportLoops=0; + } + if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { + if (exportFadeOut<0.0) exportFadeOut=0.0; + } + + if (ImGui::Button("Export")) { + switch (audioExportType) { + case 0: + openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); + break; + case 1: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); + break; + case 2: + openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); + break; + } + ImGui::CloseCurrentPopup(); + } +} + +void FurnaceGUI::drawExportVGM() { + exitDisabledTimer=1; + + ImGui::Text("settings:"); + if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { + for (int i=0; i<7; i++) { + if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { + vgmExportVersion=vgmVersions[i]; + } + } + ImGui::EndCombo(); + } + ImGui::Checkbox("loop",&vgmExportLoop); + if (vgmExportLoop && e->song.loopModality==2) { + ImGui::Text("loop trail:"); + ImGui::Indent(); + if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { + vgmExportTrailingTicks=-1; + } + if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { + vgmExportTrailingTicks=-2; + } + if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { + vgmExportTrailingTicks=0; + } + if (vgmExportTrailingTicks>=0) { + ImGui::SameLine(); + if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { + if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; + } + } + ImGui::Unindent(); + } + ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "inserts data blocks on pattern changes.\n" + "useful if you are writing a playback routine.\n\n" + + "the format of a pattern change data block is:\n" + "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" + "- ll: length, a 32-bit little-endian number\n" + "- oo: order\n" + "- rr: initial row (a 0Dxx effect is able to select a different row)\n" + "- pp: pattern index (one per channel)\n\n" + + "pattern indexes are ordered as they appear in the song." + ); + } + ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "required for DualPCM and MSM6258 export.\n\n" + "allows for volume/direction changes when playing samples,\n" + "at the cost of a massive increase in file size." + ); + } + ImGui::Text("chips to export:"); + bool hasOneAtLeast=false; + for (int i=0; isong.systemLen; i++) { + int minVersion=e->minVGMVersion(e->song.system[i]); + ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); + ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); + ImGui::EndDisabled(); + if (minVersion>vgmExportVersion) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); + } + } else if (minVersion==0) { + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("this chip is not supported by the VGM format!"); + } + } else { + if (willExport[i]) hasOneAtLeast=true; + } + } + ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); + if (hasOneAtLeast) { + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_VGM); + ImGui::CloseCurrentPopup(); + } + } else { + ImGui::Text("nothing to export"); + } +} + +void FurnaceGUI::drawExportZSM() { + exitDisabledTimer=1; + + ImGui::Text("Commander X16 Zsound Music File"); + if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { + if (zsmExportTickRate<1) zsmExportTickRate=1; + if (zsmExportTickRate>44100) zsmExportTickRate=44100; + } + ImGui::Checkbox("loop",&zsmExportLoop); + ImGui::SameLine(); + ImGui::Checkbox("optimize size",&zsmExportOptimize); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_ZSM); + ImGui::CloseCurrentPopup(); + } +} + +void FurnaceGUI::drawExportAmigaVal() { + exitDisabledTimer=1; + + ImGui::Text( + "this is NOT ROM export! only use for making sure the\n" + "Furnace Amiga emulator is working properly by\n" + "comparing it with real Amiga output." + ); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Directory"); + ImGui::SameLine(); + ImGui::InputText("##AVDPath",&workingDirROMExport); + if (ImGui::Button("Bake Data")) { + std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: out) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); + ImGui::CloseCurrentPopup(); + } +} + +void FurnaceGUI::drawExportText() { + exitDisabledTimer=1; + + ImGui::Text( + "this option exports the song to a text file.\n" + ); + if (ImGui::Button("Export")) { + openFileDialog(GUI_FILE_EXPORT_TEXT); + ImGui::CloseCurrentPopup(); + } +} + +void FurnaceGUI::drawExportCommand() { + exitDisabledTimer=1; + + ImGui::Text( + "this option exports a text or binary file which\n" + "contains a dump of the internal command stream\n" + "produced when playing the song.\n\n" + + "technical/development use only!" + ); + if (ImGui::Button("Export (binary)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Export (text)")) { + openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); + ImGui::CloseCurrentPopup(); + } +} + +void FurnaceGUI::drawExport() { ImVec2 avail=ImGui::GetContentRegionAvail(); avail.y-=ImGui::GetFrameHeightWithSpacing(); if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { if (ImGui::BeginTabBar("ExportTypes")) { if (ImGui::BeginTabItem("Audio")) { - ImGui::RadioButton("one file",&audioExportType,0); - ImGui::RadioButton("multiple files (one per chip)",&audioExportType,1); - ImGui::RadioButton("multiple files (one per channel)",&audioExportType,2); - if (ImGui::InputInt("Loops",&exportLoops,1,2)) { - if (exportLoops<0) exportLoops=0; - } - if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { - if (exportFadeOut<0.0) exportFadeOut=0.0; - } - - if (ImGui::Button("Export")) { - switch (audioExportType) { - case 0: - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); - break; - case 1: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); - break; - case 2: - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); - break; - } - ImGui::CloseCurrentPopup(); - } + drawExportAudio(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("VGM")) { - ImGui::Text("settings:"); - if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { - for (int i=0; i<7; i++) { - if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { - vgmExportVersion=vgmVersions[i]; - } - } - ImGui::EndCombo(); - } - ImGui::Checkbox("loop",&vgmExportLoop); - if (vgmExportLoop && e->song.loopModality==2) { - ImGui::Text("loop trail:"); - ImGui::Indent(); - if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { - vgmExportTrailingTicks=-1; - } - if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { - vgmExportTrailingTicks=-2; - } - if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { - vgmExportTrailingTicks=0; - } - if (vgmExportTrailingTicks>=0) { - ImGui::SameLine(); - if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { - if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; - } - } - ImGui::Unindent(); - } - ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "inserts data blocks on pattern changes.\n" - "useful if you are writing a playback routine.\n\n" - - "the format of a pattern change data block is:\n" - "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" - "- ll: length, a 32-bit little-endian number\n" - "- oo: order\n" - "- rr: initial row (a 0Dxx effect is able to select a different row)\n" - "- pp: pattern index (one per channel)\n\n" - - "pattern indexes are ordered as they appear in the song." - ); - } - ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "required for DualPCM and MSM6258 export.\n\n" - "allows for volume/direction changes when playing samples,\n" - "at the cost of a massive increase in file size." - ); - } - ImGui::Text("chips to export:"); - bool hasOneAtLeast=false; - for (int i=0; isong.systemLen; i++) { - int minVersion=e->minVGMVersion(e->song.system[i]); - ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (minVersion>vgmExportVersion) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); - } - } else if (minVersion==0) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is not supported by the VGM format!"); - } - } else { - if (willExport[i]) hasOneAtLeast=true; - } - } - ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); - if (hasOneAtLeast) { - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - ImGui::CloseCurrentPopup(); - } - } else { - ImGui::Text("nothing to export"); - } + drawExportVGM(); ImGui::EndTabItem(); } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; } - if (numZSMCompat > 0) { + if (numZSMCompat>0) { if (ImGui::BeginTabItem("ZSM")) { - ImGui::Text("Commander X16 Zsound Music File"); - if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) { - if (zsmExportTickRate<1) zsmExportTickRate=1; - if (zsmExportTickRate>44100) zsmExportTickRate=44100; - } - ImGui::Checkbox("loop",&zsmExportLoop); - ImGui::SameLine(); - ImGui::Checkbox("optimize size",&zsmExportOptimize); - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_ZSM); - ImGui::CloseCurrentPopup(); - } + drawExportZSM(); ImGui::EndTabItem(); } } @@ -169,62 +249,16 @@ void FurnaceGUI::drawExport() { } if (numAmiga && settings.iCannotWait) { if (ImGui::BeginTabItem("Amiga Validation")) { - ImGui::Text( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." - ); - ImGui::AlignTextToFramePadding(); - ImGui::Text("Directory"); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; - } - showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); - ImGui::CloseCurrentPopup(); - } + drawExportAmigaVal(); ImGui::EndTabItem(); } } if (ImGui::BeginTabItem("Text")) { - ImGui::Text( - "this option exports the song to a text file.\n" - ); - if (ImGui::Button("Export")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); - ImGui::CloseCurrentPopup(); - } + drawExportText(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Command Stream")) { - ImGui::Text( - "this option exports a text or binary file which\n" - "contains a dump of the internal command stream\n" - "produced when playing the song.\n\n" - - "technical/development use only!" - ); - if (ImGui::Button("Export (binary)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Export (text)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); - ImGui::CloseCurrentPopup(); - } + drawExportCommand(); ImGui::EndTabItem(); } ImGui::EndTabBar(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index dc3c61d91..98e824f35 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4103,130 +4103,20 @@ bool FurnaceGUI::loop() { ImGui::Separator(); if (settings.classicExportOptions) { if (ImGui::BeginMenu("export audio...")) { - exitDisabledTimer=1; - if (ImGui::MenuItem("one file")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); - } - if (ImGui::MenuItem("multiple files (one per chip)")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_SYS); - } - if (ImGui::MenuItem("multiple files (one per channel)")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_PER_CHANNEL); - } - if (ImGui::InputInt("Loops",&exportLoops,1,2)) { - if (exportLoops<0) exportLoops=0; - } - if (ImGui::InputDouble("Fade out (seconds)",&exportFadeOut,1.0,2.0,"%.1f")) { - if (exportFadeOut<0.0) exportFadeOut=0.0; - } + drawExportAudio(); ImGui::EndMenu(); } if (ImGui::BeginMenu("export VGM...")) { - exitDisabledTimer=1; - ImGui::Text("settings:"); - if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) { - for (int i=0; i<7; i++) { - if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) { - vgmExportVersion=vgmVersions[i]; - } - } - ImGui::EndCombo(); - } - ImGui::Checkbox("loop",&vgmExportLoop); - if (vgmExportLoop && e->song.loopModality==2) { - ImGui::Text("loop trail:"); - ImGui::Indent(); - if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { - vgmExportTrailingTicks=-1; - } - if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) { - vgmExportTrailingTicks=-2; - } - if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) { - vgmExportTrailingTicks=0; - } - if (vgmExportTrailingTicks>=0) { - ImGui::SameLine(); - if (ImGui::InputInt("##TrailTicks",&vgmExportTrailingTicks,1,100)) { - if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; - } - } - ImGui::Unindent(); - } - ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "inserts data blocks on pattern changes.\n" - "useful if you are writing a playback routine.\n\n" - - "the format of a pattern change data block is:\n" - "67 66 FE ll ll ll ll 01 oo rr pp pp pp ...\n" - "- ll: length, a 32-bit little-endian number\n" - "- oo: order\n" - "- rr: initial row (a 0Dxx effect is able to select a different row)\n" - "- pp: pattern index (one per channel)\n\n" - - "pattern indexes are ordered as they appear in the song." - ); - } - ImGui::Checkbox("direct stream mode",&vgmExportDirectStream); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "required for DualPCM and MSM6258 export.\n\n" - "allows for volume/direction changes when playing samples,\n" - "at the cost of a massive increase in file size." - ); - } - ImGui::Text("chips to export:"); - bool hasOneAtLeast=false; - for (int i=0; isong.systemLen; i++) { - int minVersion=e->minVGMVersion(e->song.system[i]); - ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); - ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); - ImGui::EndDisabled(); - if (minVersion>vgmExportVersion) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff); - } - } else if (minVersion==0) { - if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { - ImGui::SetTooltip("this chip is not supported by the VGM format!"); - } - } else { - if (willExport[i]) hasOneAtLeast=true; - } - } - ImGui::Text("select the chip you wish to export,"); - ImGui::Text("but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); - if (hasOneAtLeast) { - if (ImGui::MenuItem("click to export")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - } - } else { - ImGui::Text("nothing to export"); - } + drawExportVGM(); ImGui::EndMenu(); } int numZSMCompat=0; for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i] == DIV_SYSTEM_VERA) || (e->song.system[i] == DIV_SYSTEM_YM2151)) numZSMCompat++; + if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; } if (numZSMCompat > 0) { if (ImGui::BeginMenu("export ZSM...")) { - exitDisabledTimer=1; - ImGui::Text("Commander X16 Zsound Music File"); - if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,10)) { - if (zsmExportTickRate<1) zsmExportTickRate=1; - if (zsmExportTickRate>44100) zsmExportTickRate=44100; - } - ImGui::Checkbox("loop",&zsmExportLoop); - ImGui::SameLine(); - ImGui::Checkbox("optimize size",&zsmExportOptimize); - ImGui::SameLine(); - if (ImGui::Button("Begin Export")) { - openFileDialog(GUI_FILE_EXPORT_ZSM); - ImGui::CloseCurrentPopup(); - } + drawExportZSM(); ImGui::EndMenu(); } } @@ -4236,62 +4126,16 @@ bool FurnaceGUI::loop() { } if (numAmiga && settings.iCannotWait) { if (ImGui::BeginMenu("export Amiga validation data...")) { - exitDisabledTimer=1; - ImGui::Text( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." - ); - ImGui::AlignTextToFramePadding(); - ImGui::Text("Directory"); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; - } - showError(fmt::sprintf("Done! Baked %d files.",(int)out.size())); - ImGui::CloseCurrentPopup(); - } + drawExportAmigaVal(); ImGui::EndMenu(); } } if (ImGui::BeginMenu("export text...")) { - exitDisabledTimer=1; - ImGui::Text( - "this option exports the song to a text file.\n" - ); - if (ImGui::Button("export")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); - } + drawExportText(); ImGui::EndMenu(); } if (ImGui::BeginMenu("export command stream...")) { - exitDisabledTimer=1; - ImGui::Text( - "this option exports a text or binary file which\n" - "contains a dump of the internal command stream\n" - "produced when playing the song.\n\n" - - "technical/development use only!" - ); - if (ImGui::Button("export (binary)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); - } - if (ImGui::Button("export (text)")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); - } + drawExportCommand(); ImGui::EndMenu(); } } else { @@ -7750,7 +7594,6 @@ FurnaceGUI::FurnaceGUI(): introStopped(false), curTutorial(-1), curTutorialStep(0), - //audio export types (export options) audioExportType(0) { // value keys valueKeys[SDLK_0]=0; diff --git a/src/gui/gui.h b/src/gui/gui.h index 63c61551a..d709cb048 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2334,9 +2334,16 @@ class FurnaceGUI { // tutorial int curTutorial, curTutorialStep; - //audio export types (export options) + // audio export types (export options) int audioExportType; + void drawExportAudio(); + void drawExportVGM(); + void drawExportZSM(); + void drawExportAmigaVal(); + void drawExportText(); + void drawExportCommand(); + void drawSSGEnv(unsigned char type, const ImVec2& size); void drawWaveform(unsigned char type, bool opz, const ImVec2& size); void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); From 5697330c04b6ee59bcc013fa88fd301fac4b9827 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 21 Dec 2023 20:08:15 -0500 Subject: [PATCH 12/30] i won't call it classic --- src/gui/gui.cpp | 2 +- src/gui/gui.h | 4 ++-- src/gui/settings.cpp | 26 +++++++++++++++++--------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 98e824f35..8ab1abd9b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4101,7 +4101,7 @@ bool FurnaceGUI::loop() { openFileDialog(GUI_FILE_SAVE_DMF_LEGACY); } ImGui::Separator(); - if (settings.classicExportOptions) { + if (settings.exportOptionsLayout) { if (ImGui::BeginMenu("export audio...")) { drawExportAudio(); ImGui::EndMenu(); diff --git a/src/gui/gui.h b/src/gui/gui.h index d709cb048..9b35b4f23 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1689,7 +1689,7 @@ class FurnaceGUI { int centerPopup; int insIconsStyle; int classicChipOptions; - int classicExportOptions; + int exportOptionsLayout; int wasapiEx; int chanOscThreads; int renderPoolThreads; @@ -1886,7 +1886,7 @@ class FurnaceGUI { centerPopup(1), insIconsStyle(1), classicChipOptions(0), - classicExportOptions(0), // poll? + exportOptionsLayout(1), wasapiEx(0), chanOscThreads(0), renderPoolThreads(0), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 86b1ed964..8cc0d6b73 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2660,6 +2660,20 @@ void FurnaceGUI::drawSettings() { } ImGui::Unindent(); + ImGui::Text("Export options layout:"); + if (ImGui::RadioButton("Sub-menus in File menu##eol0",settings.exportOptionsLayout==0)) { + settings.exportOptionsLayout=0; + settingsChanged=true; + } + if (ImGui::RadioButton("Modal window with tabs##eol1",settings.exportOptionsLayout==1)) { + settings.exportOptionsLayout=1; + settingsChanged=true; + } + if (ImGui::RadioButton("Modal windows with options in File menu##eol2",settings.exportOptionsLayout==2)) { + settings.exportOptionsLayout=2; + settingsChanged=true; + } + bool capitalMenuBarB=settings.capitalMenuBar; if (ImGui::Checkbox("Capitalize menu bar",&capitalMenuBarB)) { settings.capitalMenuBar=capitalMenuBarB; @@ -2672,12 +2686,6 @@ void FurnaceGUI::drawSettings() { settingsChanged=true; } - bool classicExportOptionsB=settings.classicExportOptions; - if (ImGui::Checkbox("Display separate export options in File menu",&classicExportOptionsB)) { - settings.classicExportOptions=classicExportOptionsB; - settingsChanged=true; - } - // SUBSECTION ORDERS CONFIG_SUBSECTION("Orders"); // sorry. temporarily disabled until ImGui has a way to add separators in tables arbitrarily. @@ -3873,7 +3881,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.centerPopup=conf.getInt("centerPopup",1); settings.insIconsStyle=conf.getInt("insIconsStyle",1); settings.classicChipOptions=conf.getInt("classicChipOptions",0); - settings.classicExportOptions=conf.getInt("classicExportOptions",0); + settings.exportOptionsLayout=conf.getInt("exportOptionsLayout",1); settings.wasapiEx=conf.getInt("wasapiEx",0); settings.chanOscThreads=conf.getInt("chanOscThreads",0); settings.renderPoolThreads=conf.getInt("renderPoolThreads",0); @@ -4042,7 +4050,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.centerPopup,0,1); clampSetting(settings.insIconsStyle,0,2); clampSetting(settings.classicChipOptions,0,1); - clampSetting(settings.classicExportOptions,0,1); + clampSetting(settings.exportOptionsLayout,0,2); clampSetting(settings.wasapiEx,0,1); clampSetting(settings.chanOscThreads,0,256); clampSetting(settings.renderPoolThreads,0,DIV_MAX_CHIPS); @@ -4292,7 +4300,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("centerPopup",settings.centerPopup); conf.set("insIconsStyle",settings.insIconsStyle); conf.set("classicChipOptions",settings.classicChipOptions); - conf.set("classicExportOptions",settings.classicExportOptions); + conf.set("exportOptionsLayout",settings.exportOptionsLayout); conf.set("wasapiEx",settings.wasapiEx); conf.set("chanOscThreads",settings.chanOscThreads); conf.set("renderPoolThreads",settings.renderPoolThreads); From f8b0c556cac0cd5303c70e837a8ee5a3901191c3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 00:14:52 -0500 Subject: [PATCH 13/30] Namco WSG: fix vol macro scaling --- src/engine/platform/namcowsg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index 0aa4bbd94..223216f66 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -199,7 +199,7 @@ void DivPlatformNamcoWSG::tick(bool sysTick) { for (int i=0; i>4; + chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol,chan[i].std.vol.val,15); } if (chan[i].std.duty.had) { chan[i].noise=chan[i].std.duty.val; From f80340ebccd7aa0af444c371f547c48cf49817c1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 15:43:41 -0500 Subject: [PATCH 14/30] more work --- src/gui/doAction.cpp | 1 + src/gui/editControls.cpp | 20 ++------------------ src/gui/exportOptions.cpp | 2 +- src/gui/gui.cpp | 9 ++++++--- src/gui/gui.h | 3 ++- src/gui/guiConst.cpp | 2 +- src/gui/settings.cpp | 2 ++ 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 73d3876e7..645c684d2 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -66,6 +66,7 @@ void FurnaceGUI::doAction(int what) { openFileDialog(GUI_FILE_SAVE); break; case GUI_ACTION_EXPORT: + curExportType=-1; displayExport=true; break; case GUI_ACTION_UNDO: diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index b9b8a7409..1ce85020d 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -519,24 +519,8 @@ void FurnaceGUI::drawMobileControls() { openFileDialog(GUI_FILE_SAVE_DMF_LEGACY); } ImGui::SameLine(); - if (ImGui::Button("Export Audio")) { - openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); - } - ImGui::SameLine(); - if (ImGui::Button("Export VGM")) { - openFileDialog(GUI_FILE_EXPORT_VGM); - } - - if (ImGui::Button("CmdStream")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); - } - ImGui::SameLine(); - if (ImGui::Button("CmdStream Text")) { - openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); - } - ImGui::SameLine(); - if (ImGui::Button("Text")) { - openFileDialog(GUI_FILE_EXPORT_TEXT); + if (ImGui::Button("Export")) { + doAction(GUI_ACTION_EXPORT); } if (ImGui::Button("Restore Backup")) { diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index d5765fe2b..dc0af0c28 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -223,7 +223,7 @@ void FurnaceGUI::drawExport() { ImVec2 avail=ImGui::GetContentRegionAvail(); avail.y-=ImGui::GetFrameHeightWithSpacing(); - if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + if (ImGui::BeginChild("sysPickerC",avail,false)) { if (ImGui::BeginTabBar("ExportTypes")) { if (ImGui::BeginTabItem("Audio")) { drawExportAudio(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 8ab1abd9b..5a7d77fca 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4101,7 +4101,7 @@ bool FurnaceGUI::loop() { openFileDialog(GUI_FILE_SAVE_DMF_LEGACY); } ImGui::Separator(); - if (settings.exportOptionsLayout) { + if (settings.exportOptionsLayout==0) { if (ImGui::BeginMenu("export audio...")) { drawExportAudio(); ImGui::EndMenu(); @@ -4114,7 +4114,7 @@ bool FurnaceGUI::loop() { for (int i=0; isong.systemLen; i++) { if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; } - if (numZSMCompat > 0) { + if (numZSMCompat>0) { if (ImGui::BeginMenu("export ZSM...")) { drawExportZSM(); ImGui::EndMenu(); @@ -4138,6 +4138,8 @@ bool FurnaceGUI::loop() { drawExportCommand(); ImGui::EndMenu(); } + } else if (settings.exportOptionsLayout==2) { + } else { if (ImGui::MenuItem("export...",BIND_FOR(GUI_ACTION_EXPORT))) { displayExport=true; @@ -7594,7 +7596,8 @@ FurnaceGUI::FurnaceGUI(): introStopped(false), curTutorial(-1), curTutorialStep(0), - audioExportType(0) { + audioExportType(0), + curExportType(-1) { // value keys valueKeys[SDLK_0]=0; valueKeys[SDLK_1]=1; diff --git a/src/gui/gui.h b/src/gui/gui.h index 9b35b4f23..7e1c26379 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2334,8 +2334,9 @@ class FurnaceGUI { // tutorial int curTutorial, curTutorialStep; - // audio export types (export options) + // export options int audioExportType; + int curExportType; void drawExportAudio(); void drawExportVGM(); diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index b3824e360..b2417761b 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -537,7 +537,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={ D("OPEN_BACKUP", "Restore backup", 0), D("SAVE", "Save file", FURKMOD_CMD|SDLK_s), D("SAVE_AS", "Save as", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_s), - D("EXPORT", "Export", FURKMOD_CMD|SDLK_e), + D("EXPORT", "Export", 0), D("UNDO", "Undo", FURKMOD_CMD|SDLK_z), #ifdef __APPLE__ D("REDO", "Redo", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_z), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 8cc0d6b73..86fdcd826 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2661,6 +2661,7 @@ void FurnaceGUI::drawSettings() { ImGui::Unindent(); ImGui::Text("Export options layout:"); + ImGui::Indent(); if (ImGui::RadioButton("Sub-menus in File menu##eol0",settings.exportOptionsLayout==0)) { settings.exportOptionsLayout=0; settingsChanged=true; @@ -2673,6 +2674,7 @@ void FurnaceGUI::drawSettings() { settings.exportOptionsLayout=2; settingsChanged=true; } + ImGui::Unindent(); bool capitalMenuBarB=settings.capitalMenuBar; if (ImGui::Checkbox("Capitalize menu bar",&capitalMenuBarB)) { From 15f0f50deff4a4890cb1affc0ed56726f53567da Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 18:23:11 -0500 Subject: [PATCH 15/30] part 2 of more work --- src/gui/doAction.cpp | 2 +- src/gui/gui.cpp | 39 +++++++++++++++++++++++++++++++++++++-- src/gui/gui.h | 13 ++++++++++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 645c684d2..c04f14118 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -66,7 +66,7 @@ void FurnaceGUI::doAction(int what) { openFileDialog(GUI_FILE_SAVE); break; case GUI_ACTION_EXPORT: - curExportType=-1; + curExportType=GUI_EXPORT_NONE; displayExport=true; break; case GUI_ACTION_UNDO: diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 5a7d77fca..e74d33807 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4139,7 +4139,42 @@ bool FurnaceGUI::loop() { ImGui::EndMenu(); } } else if (settings.exportOptionsLayout==2) { - + if (ImGui::MenuItem("export audio...")) { + curExportType=GUI_EXPORT_AUDIO; + displayExport=true; + } + if (ImGui::MenuItem("export VGM...")) { + curExportType=GUI_EXPORT_VGM; + displayExport=true; + } + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat>0) { + if (ImGui::MenuItem("export ZSM...")) { + curExportType=GUI_EXPORT_ZSM; + displayExport=true; + } + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::MenuItem("export Amiga validation data...")) { + curExportType=GUI_EXPORT_AMIGA_VAL; + displayExport=true; + } + } + if (ImGui::MenuItem("export text...")) { + curExportType=GUI_EXPORT_TEXT; + displayExport=true; + } + if (ImGui::MenuItem("export command stream...")) { + curExportType=GUI_EXPORT_CMD_STREAM; + displayExport=true; + } } else { if (ImGui::MenuItem("export...",BIND_FOR(GUI_ACTION_EXPORT))) { displayExport=true; @@ -7597,7 +7632,7 @@ FurnaceGUI::FurnaceGUI(): curTutorial(-1), curTutorialStep(0), audioExportType(0), - curExportType(-1) { + curExportType(GUI_EXPORT_NONE) { // value keys valueKeys[SDLK_0]=0; valueKeys[SDLK_1]=1; diff --git a/src/gui/gui.h b/src/gui/gui.h index 7e1c26379..f1aa1915e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -549,6 +549,17 @@ enum FurnaceGUIWarnings { GUI_WARN_GENERIC }; +enum FurnaceGUIExportTypes { + GUI_EXPORT_NONE=-1, + + GUI_EXPORT_AUDIO=0, + GUI_EXPORT_VGM, + GUI_EXPORT_ZSM, + GUI_EXPORT_CMD_STREAM, + GUI_EXPORT_AMIGA_VAL, + GUI_EXPORT_TEXT +}; + enum FurnaceGUIFMAlgs { FM_ALGS_4OP, FM_ALGS_2OP_OPL, @@ -2336,7 +2347,7 @@ class FurnaceGUI { // export options int audioExportType; - int curExportType; + FurnaceGUIExportTypes curExportType; void drawExportAudio(); void drawExportVGM(); From 3f92cc801322f2b2a1d79319b12f828ffc19d6de Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Fri, 22 Dec 2023 23:08:20 +0300 Subject: [PATCH 16/30] correct bug in OpenMPT paste --- src/gui/editing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index d27c55a13..22e0249f5 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -771,10 +771,10 @@ unsigned int convertEffectMPT_S3M(unsigned char symbol, unsigned int val) { return (0x80<<8)|((val&0xf)<<4); break; case 0xC: - return (0xFC<<8)|(val&0xf); + return (0xEC<<8)|(val&0xf); break; case 0xD: - return (0xFD<<8)|(val&0xf); + return (0xED<<8)|(val&0xf); break; default: break; From f7d325d4d71df51bd347f6998a11627c542b0d69 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 18:39:00 -0500 Subject: [PATCH 17/30] fix crash when making the export window too small --- src/gui/exportOptions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index dc0af0c28..04fe51966 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -263,8 +263,8 @@ void FurnaceGUI::drawExport() { } ImGui::EndTabBar(); } - ImGui::EndChild(); } + ImGui::EndChild(); ImGui::Separator(); if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); } From c65debad68d0ae8e42f28ef94ab837877e2d4725 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 18:56:02 -0500 Subject: [PATCH 18/30] GUI: implement separate export options --- src/gui/exportOptions.cpp | 126 ++++++++++++++++++++++++++++---------- 1 file changed, 92 insertions(+), 34 deletions(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 04fe51966..b4e99dcf8 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -224,44 +224,102 @@ void FurnaceGUI::drawExport() { avail.y-=ImGui::GetFrameHeightWithSpacing(); if (ImGui::BeginChild("sysPickerC",avail,false)) { - if (ImGui::BeginTabBar("ExportTypes")) { - if (ImGui::BeginTabItem("Audio")) { + if (settings.exportOptionsLayout==1 || curExportType==GUI_EXPORT_NONE) { + if (ImGui::BeginTabBar("ExportTypes")) { + if (ImGui::BeginTabItem("Audio")) { + drawExportAudio(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("VGM")) { + drawExportVGM(); + ImGui::EndTabItem(); + } + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat>0) { + if (ImGui::BeginTabItem("ZSM")) { + drawExportZSM(); + ImGui::EndTabItem(); + } + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginTabItem("Amiga Validation")) { + drawExportAmigaVal(); + ImGui::EndTabItem(); + } + } + if (ImGui::BeginTabItem("Text")) { + drawExportText(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Command Stream")) { + drawExportCommand(); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + } else switch (curExportType) { + case GUI_EXPORT_AUDIO: drawExportAudio(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("VGM")) { + break; + case GUI_EXPORT_VGM: drawExportVGM(); - ImGui::EndTabItem(); - } - int numZSMCompat=0; - for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; - } - if (numZSMCompat>0) { - if (ImGui::BeginTabItem("ZSM")) { - drawExportZSM(); - ImGui::EndTabItem(); - } - } - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - if (numAmiga && settings.iCannotWait) { - if (ImGui::BeginTabItem("Amiga Validation")) { - drawExportAmigaVal(); - ImGui::EndTabItem(); - } - } - if (ImGui::BeginTabItem("Text")) { + break; + case GUI_EXPORT_ZSM: + drawExportZSM(); + break; + case GUI_EXPORT_AMIGA_VAL: + drawExportAmigaVal(); + break; + case GUI_EXPORT_TEXT: drawExportText(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Command Stream")) { + break; + case GUI_EXPORT_CMD_STREAM: drawExportCommand(); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); + break; + default: + ImGui::Text("congratulations! you've unlocked a secret panel."); + if (ImGui::Button("Toggle hidden systems")) { + settings.hiddenSystems=!settings.hiddenSystems; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Toggle all instrument types")) { + settings.displayAllInsTypes=!settings.displayAllInsTypes; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set pitch linearity to Partial")) { + e->song.linearPitch=1; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Enable multi-threading settings")) { + settings.showPool=1; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set fat to max")) { + ImGuiStyle& sty=ImGui::GetStyle(); + sty.FramePadding=ImVec2(20.0f*dpiScale,20.0f*dpiScale); + sty.ItemSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); + sty.ItemInnerSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set muscle and fat to zero")) { + ImGuiStyle& sty=ImGui::GetStyle(); + sty.FramePadding=ImVec2(0,0); + sty.ItemSpacing=ImVec2(0,0); + sty.ItemInnerSpacing=ImVec2(0,0); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Tell tildearrow this must be a mistake")) { + showError("yeah, it's a bug. write a bug report in the GitHub page and tell me how did you get here."); + ImGui::CloseCurrentPopup(); + } + break; } } ImGui::EndChild(); From 27f4f6830e15dce234a04f17564e15d99be639ca Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 22 Dec 2023 19:18:23 -0500 Subject: [PATCH 19/30] GUI: improve the buttons --- src/gui/exportOptions.cpp | 255 +++++++++++++++++++++----------------- src/gui/gui.cpp | 5 +- src/gui/gui.h | 14 +-- 3 files changed, 150 insertions(+), 124 deletions(-) diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index b4e99dcf8..165ba5f95 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -21,8 +21,9 @@ #include "guiConst.h" #include "../fileutils.h" #include "misc/cpp/imgui_stdlib.h" +#include -void FurnaceGUI::drawExportAudio() { +void FurnaceGUI::drawExportAudio(bool onWindow) { exitDisabledTimer=1; ImGui::RadioButton("one file",&audioExportType,0); @@ -35,7 +36,13 @@ void FurnaceGUI::drawExportAudio() { if (exportFadeOut<0.0) exportFadeOut=0.0; } - if (ImGui::Button("Export")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + + if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) { switch (audioExportType) { case 0: openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE); @@ -51,7 +58,7 @@ void FurnaceGUI::drawExportAudio() { } } -void FurnaceGUI::drawExportVGM() { +void FurnaceGUI::drawExportVGM(bool onWindow) { exitDisabledTimer=1; ImGui::Text("settings:"); @@ -129,16 +136,25 @@ void FurnaceGUI::drawExportVGM() { } ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1); if (hasOneAtLeast) { - if (ImGui::Button("Export")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) { openFileDialog(GUI_FILE_EXPORT_VGM); ImGui::CloseCurrentPopup(); } } else { ImGui::Text("nothing to export"); + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(400.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + } } } -void FurnaceGUI::drawExportZSM() { +void FurnaceGUI::drawExportZSM(bool onWindow) { exitDisabledTimer=1; ImGui::Text("Commander X16 Zsound Music File"); @@ -149,13 +165,18 @@ void FurnaceGUI::drawExportZSM() { ImGui::Checkbox("loop",&zsmExportLoop); ImGui::SameLine(); ImGui::Checkbox("optimize size",&zsmExportOptimize); - if (ImGui::Button("Export")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) { openFileDialog(GUI_FILE_EXPORT_ZSM); ImGui::CloseCurrentPopup(); } } -void FurnaceGUI::drawExportAmigaVal() { +void FurnaceGUI::drawExportAmigaVal(bool onWindow) { exitDisabledTimer=1; ImGui::Text( @@ -167,7 +188,12 @@ void FurnaceGUI::drawExportAmigaVal() { ImGui::Text("Directory"); ImGui::SameLine(); ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button("Bake Data")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button("Bake Data",ImVec2(200.0f*dpiScale,0))) { std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); if (workingDirROMExport.size()>0) { if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; @@ -187,19 +213,24 @@ void FurnaceGUI::drawExportAmigaVal() { } } -void FurnaceGUI::drawExportText() { +void FurnaceGUI::drawExportText(bool onWindow) { exitDisabledTimer=1; ImGui::Text( "this option exports the song to a text file.\n" ); - if (ImGui::Button("Export")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) { openFileDialog(GUI_FILE_EXPORT_TEXT); ImGui::CloseCurrentPopup(); } } -void FurnaceGUI::drawExportCommand() { +void FurnaceGUI::drawExportCommand(bool onWindow) { exitDisabledTimer=1; ImGui::Text( @@ -209,120 +240,118 @@ void FurnaceGUI::drawExportCommand() { "technical/development use only!" ); - if (ImGui::Button("Export (binary)")) { + if (onWindow) { + ImGui::Separator(); + if (ImGui::Button("Cancel",ImVec2(133.3f*dpiScale,0))) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + } + if (ImGui::Button("Export (binary)",ImVec2(133.3f*dpiScale,0))) { openFileDialog(GUI_FILE_EXPORT_CMDSTREAM_BINARY); ImGui::CloseCurrentPopup(); } - if (ImGui::Button("Export (text)")) { + ImGui::SameLine(); + if (ImGui::Button("Export (text)",ImVec2(133.3f*dpiScale,0))) { openFileDialog(GUI_FILE_EXPORT_CMDSTREAM); ImGui::CloseCurrentPopup(); } } void FurnaceGUI::drawExport() { - ImVec2 avail=ImGui::GetContentRegionAvail(); - avail.y-=ImGui::GetFrameHeightWithSpacing(); - - if (ImGui::BeginChild("sysPickerC",avail,false)) { - if (settings.exportOptionsLayout==1 || curExportType==GUI_EXPORT_NONE) { - if (ImGui::BeginTabBar("ExportTypes")) { - if (ImGui::BeginTabItem("Audio")) { - drawExportAudio(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("VGM")) { - drawExportVGM(); - ImGui::EndTabItem(); - } - int numZSMCompat=0; - for (int i=0; isong.systemLen; i++) { - if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; - } - if (numZSMCompat>0) { - if (ImGui::BeginTabItem("ZSM")) { - drawExportZSM(); - ImGui::EndTabItem(); - } - } - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - if (numAmiga && settings.iCannotWait) { - if (ImGui::BeginTabItem("Amiga Validation")) { - drawExportAmigaVal(); - ImGui::EndTabItem(); - } - } - if (ImGui::BeginTabItem("Text")) { - drawExportText(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Command Stream")) { - drawExportCommand(); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); + if (settings.exportOptionsLayout==1 || curExportType==GUI_EXPORT_NONE) { + if (ImGui::BeginTabBar("ExportTypes")) { + if (ImGui::BeginTabItem("Audio")) { + drawExportAudio(true); + ImGui::EndTabItem(); } - } else switch (curExportType) { - case GUI_EXPORT_AUDIO: - drawExportAudio(); - break; - case GUI_EXPORT_VGM: - drawExportVGM(); - break; - case GUI_EXPORT_ZSM: - drawExportZSM(); - break; - case GUI_EXPORT_AMIGA_VAL: - drawExportAmigaVal(); - break; - case GUI_EXPORT_TEXT: - drawExportText(); - break; - case GUI_EXPORT_CMD_STREAM: - drawExportCommand(); - break; - default: - ImGui::Text("congratulations! you've unlocked a secret panel."); - if (ImGui::Button("Toggle hidden systems")) { - settings.hiddenSystems=!settings.hiddenSystems; - ImGui::CloseCurrentPopup(); + if (ImGui::BeginTabItem("VGM")) { + drawExportVGM(true); + ImGui::EndTabItem(); + } + int numZSMCompat=0; + for (int i=0; isong.systemLen; i++) { + if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++; + } + if (numZSMCompat>0) { + if (ImGui::BeginTabItem("ZSM")) { + drawExportZSM(true); + ImGui::EndTabItem(); } - if (ImGui::Button("Toggle all instrument types")) { - settings.displayAllInsTypes=!settings.displayAllInsTypes; - ImGui::CloseCurrentPopup(); + } + int numAmiga=0; + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; + } + if (numAmiga && settings.iCannotWait) { + if (ImGui::BeginTabItem("Amiga Validation")) { + drawExportAmigaVal(true); + ImGui::EndTabItem(); } - if (ImGui::Button("Set pitch linearity to Partial")) { - e->song.linearPitch=1; - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Enable multi-threading settings")) { - settings.showPool=1; - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Set fat to max")) { - ImGuiStyle& sty=ImGui::GetStyle(); - sty.FramePadding=ImVec2(20.0f*dpiScale,20.0f*dpiScale); - sty.ItemSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); - sty.ItemInnerSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Set muscle and fat to zero")) { - ImGuiStyle& sty=ImGui::GetStyle(); - sty.FramePadding=ImVec2(0,0); - sty.ItemSpacing=ImVec2(0,0); - sty.ItemInnerSpacing=ImVec2(0,0); - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Tell tildearrow this must be a mistake")) { - showError("yeah, it's a bug. write a bug report in the GitHub page and tell me how did you get here."); - ImGui::CloseCurrentPopup(); - } - break; + } + if (ImGui::BeginTabItem("Text")) { + drawExportText(true); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Command Stream")) { + drawExportCommand(true); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); } + } else switch (curExportType) { + case GUI_EXPORT_AUDIO: + drawExportAudio(true); + break; + case GUI_EXPORT_VGM: + drawExportVGM(true); + break; + case GUI_EXPORT_ZSM: + drawExportZSM(true); + break; + case GUI_EXPORT_AMIGA_VAL: + drawExportAmigaVal(true); + break; + case GUI_EXPORT_TEXT: + drawExportText(true); + break; + case GUI_EXPORT_CMD_STREAM: + drawExportCommand(true); + break; + default: + ImGui::Text("congratulations! you've unlocked a secret panel."); + if (ImGui::Button("Toggle hidden systems")) { + settings.hiddenSystems=!settings.hiddenSystems; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Toggle all instrument types")) { + settings.displayAllInsTypes=!settings.displayAllInsTypes; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set pitch linearity to Partial")) { + e->song.linearPitch=1; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Enable multi-threading settings")) { + settings.showPool=1; + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set fat to max")) { + ImGuiStyle& sty=ImGui::GetStyle(); + sty.FramePadding=ImVec2(20.0f*dpiScale,20.0f*dpiScale); + sty.ItemSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); + sty.ItemInnerSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Set muscle and fat to zero")) { + ImGuiStyle& sty=ImGui::GetStyle(); + sty.FramePadding=ImVec2(0,0); + sty.ItemSpacing=ImVec2(0,0); + sty.ItemInnerSpacing=ImVec2(0,0); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Tell tildearrow this must be a mistake")) { + showError("yeah, it's a bug. write a bug report in the GitHub page and tell me how did you get here."); + ImGui::CloseCurrentPopup(); + } + break; } - ImGui::EndChild(); - ImGui::Separator(); - if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index e74d33807..7d17af0ee 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5420,11 +5420,8 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } - if (ImGui::BeginPopupModal("Export",NULL,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + if (ImGui::BeginPopupModal("Export",NULL,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::SetWindowPos(ImVec2(((canvasW)-ImGui::GetWindowSize().x)*0.5,((canvasH)-ImGui::GetWindowSize().y)*0.5)); - if (ImGui::GetWindowSize().x Date: Fri, 22 Dec 2023 20:22:53 -0500 Subject: [PATCH 20/30] GUI: now let's put these config options into group s --- src/gui/gui.h | 1 + src/gui/settings.cpp | 222 ++++++++++++++++++++++++++----------------- 2 files changed, 137 insertions(+), 86 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index fed9eea90..1cfbfc011 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -478,6 +478,7 @@ enum FurnaceGUISettingGroups: unsigned int { GUI_SETTINGS_APPEARANCE=64, GUI_SETTINGS_LAYOUTS=128, GUI_SETTINGS_COLOR=256, + GUI_SETTINGS_EMULATION=512, GUI_SETTINGS_ALL=0xffffffff }; diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 86fdcd826..b71582c7f 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4121,51 +4121,141 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { } void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { - conf.set("mainFontSize",settings.mainFontSize); - conf.set("headFontSize",settings.headFontSize); - conf.set("patFontSize",settings.patFontSize); - conf.set("iconSize",settings.iconSize); - conf.set("audioEngine",String(audioBackends[settings.audioEngine])); - conf.set("audioDevice",settings.audioDevice); - conf.set("midiInDevice",settings.midiInDevice); - conf.set("midiOutDevice",settings.midiOutDevice); - conf.set("renderDriver",settings.renderDriver); - conf.set("sdlAudioDriver",settings.sdlAudioDriver); - conf.set("audioQuality",settings.audioQuality); - conf.set("audioHiPass",settings.audioHiPass); - conf.set("audioBufSize",settings.audioBufSize); - conf.set("audioRate",settings.audioRate); - conf.set("audioChans",settings.audioChans); - conf.set("arcadeCore",settings.arcadeCore); - conf.set("ym2612Core",settings.ym2612Core); - conf.set("snCore",settings.snCore); - conf.set("nesCore",settings.nesCore); - conf.set("fdsCore",settings.fdsCore); - conf.set("c64Core",settings.c64Core); - conf.set("pokeyCore",settings.pokeyCore); - conf.set("opnCore",settings.opnCore); - conf.set("opl2Core",settings.opl2Core); - conf.set("opl3Core",settings.opl3Core); - conf.set("arcadeCoreRender",settings.arcadeCoreRender); - conf.set("ym2612CoreRender",settings.ym2612CoreRender); - conf.set("snCoreRender",settings.snCoreRender); - conf.set("nesCoreRender",settings.nesCoreRender); - conf.set("fdsCoreRender",settings.fdsCoreRender); - conf.set("c64CoreRender",settings.c64CoreRender); - conf.set("pokeyCoreRender",settings.pokeyCoreRender); - conf.set("opnCoreRender",settings.opnCoreRender); - conf.set("opl2CoreRender",settings.opl2CoreRender); - conf.set("opl3CoreRender",settings.opl3CoreRender); - conf.set("pcSpeakerOutMethod",settings.pcSpeakerOutMethod); - conf.set("yrw801Path",settings.yrw801Path); - conf.set("tg100Path",settings.tg100Path); - conf.set("mu5Path",settings.mu5Path); - conf.set("mainFont",settings.mainFont); - conf.set("headFont",settings.headFont); - conf.set("patFont",settings.patFont); - conf.set("mainFontPath",settings.mainFontPath); - conf.set("headFontPath",settings.headFontPath); - conf.set("patFontPath",settings.patFontPath); + // general + if (groups&GUI_SETTINGS_GENERAL) { + conf.set("renderDriver",settings.renderDriver); + conf.set("noDMFCompat",settings.noDMFCompat); + + conf.set("dpiScale",settings.dpiScale); + + conf.set("initialSys2",settings.initialSys.toBase64()); + conf.set("initialSysName",settings.initialSysName); + } + + // audio + if (groups&GUI_SETTINGS_AUDIO) { + conf.set("audioEngine",String(audioBackends[settings.audioEngine])); + conf.set("audioDevice",settings.audioDevice); + conf.set("midiInDevice",settings.midiInDevice); + conf.set("midiOutDevice",settings.midiOutDevice); + conf.set("sdlAudioDriver",settings.sdlAudioDriver); + conf.set("audioQuality",settings.audioQuality); + conf.set("audioHiPass",settings.audioHiPass); + conf.set("audioBufSize",settings.audioBufSize); + conf.set("audioRate",settings.audioRate); + conf.set("audioChans",settings.audioChans); + } + + // MIDI + if (groups&GUI_SETTINGS_MIDI) { + + } + + // keyboard + if (groups&GUI_SETTINGS_KEYBOARD) { + // keybinds + for (int i=0; i Date: Sat, 23 Dec 2023 04:39:55 -0500 Subject: [PATCH 21/30] just a bit more --- src/gui/settings.cpp | 275 +++++++++++++++++++++++-------------------- 1 file changed, 150 insertions(+), 125 deletions(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index b71582c7f..3867166f4 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4130,6 +4130,22 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("initialSys2",settings.initialSys.toBase64()); conf.set("initialSysName",settings.initialSysName); + + conf.set("noThreadedInput",settings.noThreadedInput); + conf.set("powerSave",settings.powerSave); + conf.set("eventDelay",settings.eventDelay); + + conf.set("renderBackend",settings.renderBackend); + conf.set("renderClearPos",settings.renderClearPos); + + conf.set("chanOscThreads",settings.chanOscThreads); + conf.set("renderPoolThreads",settings.renderPoolThreads); + conf.set("showPool",settings.showPool); + conf.set("writeInsNames",settings.writeInsNames); + conf.set("readInsNames",settings.readInsNames); + conf.set("defaultAuthorName",settings.defaultAuthorName); + + conf.set("hiddenSystems",settings.hiddenSystems); } // audio @@ -4144,11 +4160,24 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("audioBufSize",settings.audioBufSize); conf.set("audioRate",settings.audioRate); conf.set("audioChans",settings.audioChans); + + conf.set("lowLatency",settings.lowLatency); + + conf.set("metroVol",settings.metroVol); + conf.set("sampleVol",settings.sampleVol); + + conf.set("wasapiEx",settings.wasapiEx); + + conf.set("clampSamples",settings.clampSamples); } // MIDI if (groups&GUI_SETTINGS_MIDI) { - + conf.set("midiOutClock",settings.midiOutClock); + conf.set("midiOutTime",settings.midiOutTime); + conf.set("midiOutProgramChange",settings.midiOutProgramChange); + conf.set("midiOutMode",settings.midiOutMode); + conf.set("midiOutTimeRate",settings.midiOutTimeRate); } // keyboard @@ -4185,6 +4214,12 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("loadChinese",settings.loadChinese); conf.set("loadChineseTraditional",settings.loadChineseTraditional); conf.set("loadKorean",settings.loadKorean); + + conf.set("fontBackend",settings.fontBackend); + conf.set("fontHinting",settings.fontHinting); + conf.set("fontBitmap",settings.fontBitmap); + conf.set("fontAutoHint",settings.fontAutoHint); + conf.set("fontAntiAlias",settings.fontAntiAlias); } // appearance @@ -4203,6 +4238,33 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("channelFeedbackStyle",settings.channelFeedbackStyle); conf.set("channelFont",settings.channelFont); conf.set("channelTextCenter",settings.channelTextCenter); + + conf.set("roundedWindows",settings.roundedWindows); + conf.set("roundedButtons",settings.roundedButtons); + conf.set("roundedMenus",settings.roundedMenus); + + conf.set("separateFMColors",settings.separateFMColors); + conf.set("insEditColorize",settings.insEditColorize); + + conf.set("chipNames",settings.chipNames); + conf.set("overflowHighlight",settings.overflowHighlight); + conf.set("partyTime",settings.partyTime); + conf.set("flatNotes",settings.flatNotes); + conf.set("germanNotation",settings.germanNotation); + + conf.set("frameBorders",settings.frameBorders); + + conf.set("noteOffLabel",settings.noteOffLabel); + conf.set("noteRelLabel",settings.noteRelLabel); + conf.set("macroRelLabel",settings.macroRelLabel); + conf.set("emptyLabel",settings.emptyLabel); + conf.set("emptyLabel2",settings.emptyLabel2); + + conf.set("noteCellSpacing",settings.noteCellSpacing); + conf.set("insCellSpacing",settings.insCellSpacing); + conf.set("volCellSpacing",settings.volCellSpacing); + conf.set("effectCellSpacing",settings.effectCellSpacing); + conf.set("effectValCellSpacing",settings.effectValCellSpacing); } // layout @@ -4255,131 +4317,94 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("mu5Path",settings.mu5Path); } - // TODO: the fucking rest - conf.set("patRowsBase",settings.patRowsBase); - conf.set("orderRowsBase",settings.orderRowsBase); - conf.set("soloAction",settings.soloAction); - conf.set("pullDeleteBehavior",settings.pullDeleteBehavior); - conf.set("wrapHorizontal",settings.wrapHorizontal); - conf.set("wrapVertical",settings.wrapVertical); - conf.set("macroView",settings.macroView); - conf.set("fmNames",settings.fmNames); - conf.set("allowEditDocking",settings.allowEditDocking); - conf.set("chipNames",settings.chipNames); - conf.set("overflowHighlight",settings.overflowHighlight); - conf.set("partyTime",settings.partyTime); - conf.set("flatNotes",settings.flatNotes); - conf.set("germanNotation",settings.germanNotation); - conf.set("stepOnDelete",settings.stepOnDelete); - conf.set("scrollStep",settings.scrollStep); - conf.set("sysSeparators",settings.sysSeparators); - conf.set("forceMono",settings.forceMono); - conf.set("controlLayout",settings.controlLayout); - conf.set("statusDisplay",settings.statusDisplay); - conf.set("viewPrevPattern",settings.viewPrevPattern); - conf.set("avoidRaisingPattern",settings.avoidRaisingPattern); - conf.set("insFocusesPattern",settings.insFocusesPattern); - conf.set("stepOnInsert",settings.stepOnInsert); - conf.set("unifiedDataView",settings.unifiedDataView); - conf.set("sysFileDialog",settings.sysFileDialog); - conf.set("roundedWindows",settings.roundedWindows); - conf.set("roundedButtons",settings.roundedButtons); - conf.set("roundedMenus",settings.roundedMenus); - conf.set("susPosition",settings.susPosition); - conf.set("effectCursorDir",settings.effectCursorDir); - conf.set("cursorPastePos",settings.cursorPastePos); - conf.set("titleBarInfo",settings.titleBarInfo); - conf.set("titleBarSys",settings.titleBarSys); - conf.set("frameBorders",settings.frameBorders); - conf.set("effectDeletionAltersValue",settings.effectDeletionAltersValue); + conf.set("patRowsBase",settings.patRowsBase); + conf.set("orderRowsBase",settings.orderRowsBase); + conf.set("soloAction",settings.soloAction); + conf.set("pullDeleteBehavior",settings.pullDeleteBehavior); + conf.set("wrapHorizontal",settings.wrapHorizontal); + conf.set("wrapVertical",settings.wrapVertical); + conf.set("macroView",settings.macroView); + conf.set("fmNames",settings.fmNames); + conf.set("allowEditDocking",settings.allowEditDocking); + + conf.set("stepOnDelete",settings.stepOnDelete); + conf.set("scrollStep",settings.scrollStep); + conf.set("sysSeparators",settings.sysSeparators); + conf.set("forceMono",settings.forceMono); + conf.set("controlLayout",settings.controlLayout); + conf.set("statusDisplay",settings.statusDisplay); + conf.set("viewPrevPattern",settings.viewPrevPattern); + conf.set("avoidRaisingPattern",settings.avoidRaisingPattern); + conf.set("insFocusesPattern",settings.insFocusesPattern); + conf.set("stepOnInsert",settings.stepOnInsert); + conf.set("unifiedDataView",settings.unifiedDataView); + conf.set("sysFileDialog",settings.sysFileDialog); + conf.set("susPosition",settings.susPosition); + conf.set("effectCursorDir",settings.effectCursorDir); + conf.set("cursorPastePos",settings.cursorPastePos); + conf.set("titleBarInfo",settings.titleBarInfo); + conf.set("titleBarSys",settings.titleBarSys); + + conf.set("effectDeletionAltersValue",settings.effectDeletionAltersValue); - conf.set("separateFMColors",settings.separateFMColors); - conf.set("insEditColorize",settings.insEditColorize); - conf.set("metroVol",settings.metroVol); - conf.set("sampleVol",settings.sampleVol); - conf.set("pushNibble",settings.pushNibble); - conf.set("scrollChangesOrder",settings.scrollChangesOrder); - conf.set("oplStandardWaveNames",settings.oplStandardWaveNames); - conf.set("cursorMoveNoScroll",settings.cursorMoveNoScroll); - conf.set("lowLatency",settings.lowLatency); - conf.set("notePreviewBehavior",settings.notePreviewBehavior); - conf.set("powerSave",settings.powerSave); - conf.set("absorbInsInput",settings.absorbInsInput); - conf.set("eventDelay",settings.eventDelay); - conf.set("moveWindowTitle",settings.moveWindowTitle); - conf.set("hiddenSystems",settings.hiddenSystems); - conf.set("horizontalDataView",settings.horizontalDataView); - conf.set("noMultiSystem",settings.noMultiSystem); - conf.set("oldMacroVSlider",settings.oldMacroVSlider); - conf.set("displayAllInsTypes",settings.displayAllInsTypes); - conf.set("displayPartial",settings.displayPartial); - conf.set("noteCellSpacing",settings.noteCellSpacing); - conf.set("insCellSpacing",settings.insCellSpacing); - conf.set("volCellSpacing",settings.volCellSpacing); - conf.set("effectCellSpacing",settings.effectCellSpacing); - conf.set("effectValCellSpacing",settings.effectValCellSpacing); - conf.set("doubleClickColumn",settings.doubleClickColumn); - conf.set("blankIns",settings.blankIns); - conf.set("dragMovesSelection",settings.dragMovesSelection); - conf.set("unsignedDetune",settings.unsignedDetune); - conf.set("noThreadedInput",settings.noThreadedInput); - conf.set("saveWindowPos",settings.saveWindowPos); - conf.set("clampSamples",settings.clampSamples); - conf.set("noteOffLabel",settings.noteOffLabel); - conf.set("noteRelLabel",settings.noteRelLabel); - conf.set("macroRelLabel",settings.macroRelLabel); - conf.set("emptyLabel",settings.emptyLabel); - conf.set("emptyLabel2",settings.emptyLabel2); - conf.set("saveUnusedPatterns",settings.saveUnusedPatterns); - conf.set("maxRecentFile",settings.maxRecentFile); - conf.set("midiOutClock",settings.midiOutClock); - conf.set("midiOutTime",settings.midiOutTime); - conf.set("midiOutProgramChange",settings.midiOutProgramChange); - conf.set("midiOutMode",settings.midiOutMode); - conf.set("midiOutTimeRate",settings.midiOutTimeRate); - conf.set("centerPattern",settings.centerPattern); - conf.set("ordersCursor",settings.ordersCursor); - conf.set("persistFadeOut",settings.persistFadeOut); - conf.set("exportLoops",settings.exportLoops); - conf.set("exportFadeOut",settings.exportFadeOut); - conf.set("macroLayout",settings.macroLayout); - conf.set("doubleClickTime",settings.doubleClickTime); - conf.set("oneDigitEffects",settings.oneDigitEffects); - conf.set("disableFadeIn",settings.disableFadeIn); - conf.set("alwaysPlayIntro",settings.alwaysPlayIntro); - conf.set("cursorFollowsOrder",settings.cursorFollowsOrder); - conf.set("iCannotWait",settings.iCannotWait); - conf.set("orderButtonPos",settings.orderButtonPos); - conf.set("compress",settings.compress); - conf.set("newPatternFormat",settings.newPatternFormat); - conf.set("renderBackend",settings.renderBackend); - conf.set("renderClearPos",settings.renderClearPos); - conf.set("insertBehavior",settings.insertBehavior); - conf.set("pullDeleteRow",settings.pullDeleteRow); - conf.set("newSongBehavior",settings.newSongBehavior); - conf.set("memUsageUnit",settings.memUsageUnit); - conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); - conf.set("removeInsOff",settings.removeInsOff); - conf.set("removeVolOff",settings.removeVolOff); - conf.set("playOnLoad",settings.playOnLoad); - conf.set("insTypeMenu",settings.insTypeMenu); - conf.set("capitalMenuBar",settings.capitalMenuBar); - conf.set("centerPopup",settings.centerPopup); - conf.set("insIconsStyle",settings.insIconsStyle); - conf.set("classicChipOptions",settings.classicChipOptions); - conf.set("wasapiEx",settings.wasapiEx); - conf.set("chanOscThreads",settings.chanOscThreads); - conf.set("renderPoolThreads",settings.renderPoolThreads); - conf.set("showPool",settings.showPool); - conf.set("writeInsNames",settings.writeInsNames); - conf.set("readInsNames",settings.readInsNames); - conf.set("defaultAuthorName",settings.defaultAuthorName); - conf.set("fontBackend",settings.fontBackend); - conf.set("fontHinting",settings.fontHinting); - conf.set("fontBitmap",settings.fontBitmap); - conf.set("fontAutoHint",settings.fontAutoHint); - conf.set("fontAntiAlias",settings.fontAntiAlias); - conf.set("selectAssetOnLoad",settings.selectAssetOnLoad); + + conf.set("pushNibble",settings.pushNibble); + conf.set("scrollChangesOrder",settings.scrollChangesOrder); + conf.set("oplStandardWaveNames",settings.oplStandardWaveNames); + conf.set("cursorMoveNoScroll",settings.cursorMoveNoScroll); + + conf.set("notePreviewBehavior",settings.notePreviewBehavior); + + conf.set("absorbInsInput",settings.absorbInsInput); + + conf.set("moveWindowTitle",settings.moveWindowTitle); + + conf.set("horizontalDataView",settings.horizontalDataView); + conf.set("noMultiSystem",settings.noMultiSystem); + conf.set("oldMacroVSlider",settings.oldMacroVSlider); + conf.set("displayAllInsTypes",settings.displayAllInsTypes); + conf.set("displayPartial",settings.displayPartial); + conf.set("doubleClickColumn",settings.doubleClickColumn); + conf.set("blankIns",settings.blankIns); + conf.set("dragMovesSelection",settings.dragMovesSelection); + conf.set("unsignedDetune",settings.unsignedDetune); + + conf.set("saveWindowPos",settings.saveWindowPos); + + conf.set("saveUnusedPatterns",settings.saveUnusedPatterns); + conf.set("maxRecentFile",settings.maxRecentFile); + + conf.set("centerPattern",settings.centerPattern); + conf.set("ordersCursor",settings.ordersCursor); + conf.set("persistFadeOut",settings.persistFadeOut); + conf.set("exportLoops",settings.exportLoops); + conf.set("exportFadeOut",settings.exportFadeOut); + conf.set("macroLayout",settings.macroLayout); + conf.set("doubleClickTime",settings.doubleClickTime); + conf.set("oneDigitEffects",settings.oneDigitEffects); + conf.set("disableFadeIn",settings.disableFadeIn); + conf.set("alwaysPlayIntro",settings.alwaysPlayIntro); + conf.set("cursorFollowsOrder",settings.cursorFollowsOrder); + conf.set("iCannotWait",settings.iCannotWait); + conf.set("orderButtonPos",settings.orderButtonPos); + conf.set("compress",settings.compress); + conf.set("newPatternFormat",settings.newPatternFormat); + + conf.set("insertBehavior",settings.insertBehavior); + conf.set("pullDeleteRow",settings.pullDeleteRow); + conf.set("newSongBehavior",settings.newSongBehavior); + conf.set("memUsageUnit",settings.memUsageUnit); + conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); + conf.set("removeInsOff",settings.removeInsOff); + conf.set("removeVolOff",settings.removeVolOff); + conf.set("playOnLoad",settings.playOnLoad); + conf.set("insTypeMenu",settings.insTypeMenu); + conf.set("capitalMenuBar",settings.capitalMenuBar); + conf.set("centerPopup",settings.centerPopup); + conf.set("insIconsStyle",settings.insIconsStyle); + conf.set("classicChipOptions",settings.classicChipOptions); + + conf.set("selectAssetOnLoad",settings.selectAssetOnLoad); } void FurnaceGUI::syncSettings() { From e42bccdb50861123686eb5a03fd2ccb75cdc5525 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 23 Dec 2023 17:51:08 -0500 Subject: [PATCH 22/30] GUI: writeConfig now grouped --- src/gui/settings.cpp | 184 ++++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 3867166f4..9cc08fd82 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3754,7 +3754,6 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.pullDeleteBehavior=conf.getInt("pullDeleteBehavior",1); settings.wrapHorizontal=conf.getInt("wrapHorizontal",0); settings.wrapVertical=conf.getInt("wrapVertical",0); - settings.macroView=conf.getInt("macroView",0); settings.fmNames=conf.getInt("fmNames",0); settings.allowEditDocking=conf.getInt("allowEditDocking",1); settings.chipNames=conf.getInt("chipNames",0); @@ -3938,7 +3937,6 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.pullDeleteBehavior,0,1); clampSetting(settings.wrapHorizontal,0,2); clampSetting(settings.wrapVertical,0,3); - clampSetting(settings.macroView,0,1); clampSetting(settings.fmNames,0,2); clampSetting(settings.allowEditDocking,0,1); clampSetting(settings.chipNames,0,1); @@ -4146,6 +4144,32 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("defaultAuthorName",settings.defaultAuthorName); conf.set("hiddenSystems",settings.hiddenSystems); + conf.set("allowEditDocking",settings.allowEditDocking); + conf.set("sysFileDialog",settings.sysFileDialog); + conf.set("displayAllInsTypes",settings.displayAllInsTypes); + conf.set("displayPartial",settings.displayPartial); + + conf.set("blankIns",settings.blankIns); + + conf.set("saveWindowPos",settings.saveWindowPos); + + conf.set("saveUnusedPatterns",settings.saveUnusedPatterns); + conf.set("maxRecentFile",settings.maxRecentFile); + + conf.set("persistFadeOut",settings.persistFadeOut); + conf.set("exportLoops",settings.exportLoops); + conf.set("exportFadeOut",settings.exportFadeOut); + + conf.set("doubleClickTime",settings.doubleClickTime); + conf.set("disableFadeIn",settings.disableFadeIn); + conf.set("alwaysPlayIntro",settings.alwaysPlayIntro); + conf.set("iCannotWait",settings.iCannotWait); + + conf.set("compress",settings.compress); + conf.set("newPatternFormat",settings.newPatternFormat); + conf.set("newSongBehavior",settings.newSongBehavior); + conf.set("playOnLoad",settings.playOnLoad); + conf.set("centerPopup",settings.centerPopup); } // audio @@ -4169,6 +4193,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("wasapiEx",settings.wasapiEx); conf.set("clampSamples",settings.clampSamples); + conf.set("forceMono",settings.forceMono); } // MIDI @@ -4193,7 +4218,44 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { // behavior if (groups&GUI_SETTINGS_BEHAVIOR) { + conf.set("soloAction",settings.soloAction); + conf.set("pullDeleteBehavior",settings.pullDeleteBehavior); + conf.set("wrapHorizontal",settings.wrapHorizontal); + conf.set("wrapVertical",settings.wrapVertical); + + conf.set("stepOnDelete",settings.stepOnDelete); + conf.set("scrollStep",settings.scrollStep); + conf.set("avoidRaisingPattern",settings.avoidRaisingPattern); + conf.set("insFocusesPattern",settings.insFocusesPattern); + conf.set("stepOnInsert",settings.stepOnInsert); + conf.set("effectCursorDir",settings.effectCursorDir); + conf.set("cursorPastePos",settings.cursorPastePos); + + conf.set("effectDeletionAltersValue",settings.effectDeletionAltersValue); + conf.set("pushNibble",settings.pushNibble); + conf.set("scrollChangesOrder",settings.scrollChangesOrder); + conf.set("cursorMoveNoScroll",settings.cursorMoveNoScroll); + + conf.set("notePreviewBehavior",settings.notePreviewBehavior); + + conf.set("absorbInsInput",settings.absorbInsInput); + + conf.set("moveWindowTitle",settings.moveWindowTitle); + + conf.set("doubleClickColumn",settings.doubleClickColumn); + conf.set("dragMovesSelection",settings.dragMovesSelection); + + conf.set("cursorFollowsOrder",settings.cursorFollowsOrder); + + conf.set("insertBehavior",settings.insertBehavior); + conf.set("pullDeleteRow",settings.pullDeleteRow); + conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); + conf.set("removeInsOff",settings.removeInsOff); + conf.set("removeVolOff",settings.removeVolOff); + conf.set("insTypeMenu",settings.insTypeMenu); + + conf.set("selectAssetOnLoad",settings.selectAssetOnLoad); } // font @@ -4265,6 +4327,31 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("volCellSpacing",settings.volCellSpacing); conf.set("effectCellSpacing",settings.effectCellSpacing); conf.set("effectValCellSpacing",settings.effectValCellSpacing); + + conf.set("patRowsBase",settings.patRowsBase); + conf.set("orderRowsBase",settings.orderRowsBase); + conf.set("fmNames",settings.fmNames); + conf.set("statusDisplay",settings.statusDisplay); + conf.set("viewPrevPattern",settings.viewPrevPattern); + conf.set("susPosition",settings.susPosition); + + conf.set("titleBarInfo",settings.titleBarInfo); + conf.set("titleBarSys",settings.titleBarSys); + + conf.set("oplStandardWaveNames",settings.oplStandardWaveNames); + + conf.set("horizontalDataView",settings.horizontalDataView); + conf.set("noMultiSystem",settings.noMultiSystem); + conf.set("oldMacroVSlider",settings.oldMacroVSlider); + conf.set("unsignedDetune",settings.unsignedDetune); + conf.set("centerPattern",settings.centerPattern); + conf.set("ordersCursor",settings.ordersCursor); + conf.set("oneDigitEffects",settings.oneDigitEffects); + conf.set("orderButtonPos",settings.orderButtonPos); + conf.set("memUsageUnit",settings.memUsageUnit); + conf.set("capitalMenuBar",settings.capitalMenuBar); + conf.set("insIconsStyle",settings.insIconsStyle); + conf.set("sysSeparators",settings.sysSeparators); } // layout @@ -4273,6 +4360,10 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("sampleLayout",settings.sampleLayout); conf.set("waveLayout",settings.waveLayout); conf.set("exportOptionsLayout",settings.exportOptionsLayout); + conf.set("unifiedDataView",settings.unifiedDataView); + conf.set("macroLayout",settings.macroLayout); + conf.set("controlLayout",settings.controlLayout); + conf.set("classicChipOptions",settings.classicChipOptions); } // color @@ -4316,95 +4407,6 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("tg100Path",settings.tg100Path); conf.set("mu5Path",settings.mu5Path); } - - conf.set("patRowsBase",settings.patRowsBase); - conf.set("orderRowsBase",settings.orderRowsBase); - conf.set("soloAction",settings.soloAction); - conf.set("pullDeleteBehavior",settings.pullDeleteBehavior); - conf.set("wrapHorizontal",settings.wrapHorizontal); - conf.set("wrapVertical",settings.wrapVertical); - conf.set("macroView",settings.macroView); - conf.set("fmNames",settings.fmNames); - conf.set("allowEditDocking",settings.allowEditDocking); - - conf.set("stepOnDelete",settings.stepOnDelete); - conf.set("scrollStep",settings.scrollStep); - conf.set("sysSeparators",settings.sysSeparators); - conf.set("forceMono",settings.forceMono); - conf.set("controlLayout",settings.controlLayout); - conf.set("statusDisplay",settings.statusDisplay); - conf.set("viewPrevPattern",settings.viewPrevPattern); - conf.set("avoidRaisingPattern",settings.avoidRaisingPattern); - conf.set("insFocusesPattern",settings.insFocusesPattern); - conf.set("stepOnInsert",settings.stepOnInsert); - conf.set("unifiedDataView",settings.unifiedDataView); - conf.set("sysFileDialog",settings.sysFileDialog); - conf.set("susPosition",settings.susPosition); - conf.set("effectCursorDir",settings.effectCursorDir); - conf.set("cursorPastePos",settings.cursorPastePos); - conf.set("titleBarInfo",settings.titleBarInfo); - conf.set("titleBarSys",settings.titleBarSys); - - conf.set("effectDeletionAltersValue",settings.effectDeletionAltersValue); - - - conf.set("pushNibble",settings.pushNibble); - conf.set("scrollChangesOrder",settings.scrollChangesOrder); - conf.set("oplStandardWaveNames",settings.oplStandardWaveNames); - conf.set("cursorMoveNoScroll",settings.cursorMoveNoScroll); - - conf.set("notePreviewBehavior",settings.notePreviewBehavior); - - conf.set("absorbInsInput",settings.absorbInsInput); - - conf.set("moveWindowTitle",settings.moveWindowTitle); - - conf.set("horizontalDataView",settings.horizontalDataView); - conf.set("noMultiSystem",settings.noMultiSystem); - conf.set("oldMacroVSlider",settings.oldMacroVSlider); - conf.set("displayAllInsTypes",settings.displayAllInsTypes); - conf.set("displayPartial",settings.displayPartial); - conf.set("doubleClickColumn",settings.doubleClickColumn); - conf.set("blankIns",settings.blankIns); - conf.set("dragMovesSelection",settings.dragMovesSelection); - conf.set("unsignedDetune",settings.unsignedDetune); - - conf.set("saveWindowPos",settings.saveWindowPos); - - conf.set("saveUnusedPatterns",settings.saveUnusedPatterns); - conf.set("maxRecentFile",settings.maxRecentFile); - - conf.set("centerPattern",settings.centerPattern); - conf.set("ordersCursor",settings.ordersCursor); - conf.set("persistFadeOut",settings.persistFadeOut); - conf.set("exportLoops",settings.exportLoops); - conf.set("exportFadeOut",settings.exportFadeOut); - conf.set("macroLayout",settings.macroLayout); - conf.set("doubleClickTime",settings.doubleClickTime); - conf.set("oneDigitEffects",settings.oneDigitEffects); - conf.set("disableFadeIn",settings.disableFadeIn); - conf.set("alwaysPlayIntro",settings.alwaysPlayIntro); - conf.set("cursorFollowsOrder",settings.cursorFollowsOrder); - conf.set("iCannotWait",settings.iCannotWait); - conf.set("orderButtonPos",settings.orderButtonPos); - conf.set("compress",settings.compress); - conf.set("newPatternFormat",settings.newPatternFormat); - - conf.set("insertBehavior",settings.insertBehavior); - conf.set("pullDeleteRow",settings.pullDeleteRow); - conf.set("newSongBehavior",settings.newSongBehavior); - conf.set("memUsageUnit",settings.memUsageUnit); - conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); - conf.set("removeInsOff",settings.removeInsOff); - conf.set("removeVolOff",settings.removeVolOff); - conf.set("playOnLoad",settings.playOnLoad); - conf.set("insTypeMenu",settings.insTypeMenu); - conf.set("capitalMenuBar",settings.capitalMenuBar); - conf.set("centerPopup",settings.centerPopup); - conf.set("insIconsStyle",settings.insIconsStyle); - conf.set("classicChipOptions",settings.classicChipOptions); - - conf.set("selectAssetOnLoad",settings.selectAssetOnLoad); } void FurnaceGUI::syncSettings() { From ed37b5123f831bac5489b3518b3d222d719264b8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 23 Dec 2023 18:10:19 -0500 Subject: [PATCH 23/30] GUI: use refactored code for color scheme export --- src/gui/settings.cpp | 47 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 9cc08fd82..94d312f34 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3696,6 +3696,36 @@ void FurnaceGUI::drawSettings() { } void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { + if (groups&GUI_SETTINGS_GENERAL) { + } + + if (groups&GUI_SETTINGS_AUDIO) { + } + + if (groups&GUI_SETTINGS_MIDI) { + } + + if (groups&GUI_SETTINGS_KEYBOARD) { + } + + if (groups&GUI_SETTINGS_BEHAVIOR) { + } + + if (groups&GUI_SETTINGS_FONT) { + } + + if (groups&GUI_SETTINGS_APPEARANCE) { + } + + if (groups&GUI_SETTINGS_LAYOUTS) { + } + + if (groups&GUI_SETTINGS_COLOR) { + } + + if (groups&GUI_SETTINGS_EMULATION) { + } + settings.mainFontSize=conf.getInt("mainFontSize",18); settings.headFontSize=conf.getInt("headFontSize",27); settings.patFontSize=conf.getInt("patFontSize",18); @@ -4553,18 +4583,23 @@ bool FurnaceGUI::importColors(String path) { } bool FurnaceGUI::exportColors(String path) { + DivConfig c; + + c.set("configVersion",DIV_ENGINE_VERSION); + writeConfig(c,GUI_SETTINGS_COLOR); + FILE* f=ps_fopen(path.c_str(),"wb"); if (f==NULL) { logW("error while opening color file for export: %s",strerror(errno)); return false; } - fprintf(f,"configVersion=%d\n",DIV_ENGINE_VERSION); - for (int i=0; i Date: Sat, 23 Dec 2023 18:25:43 -0500 Subject: [PATCH 24/30] prepare to fix paate overflow undo corruption --- src/gui/gui.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/gui.h b/src/gui/gui.h index 1cfbfc011..39fac0132 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -885,6 +885,14 @@ struct SelectionPoint { xCoarse(0), xFine(0), y(0) {} }; +struct UndoRegion { + struct UndoRegionPoint { + int ord, x, y; + UndoRegionPoint(): + ord(0), x(0), y(0) {} + } begin, end; +}; + enum ActionType { GUI_UNDO_CHANGE_ORDER, GUI_UNDO_PATTERN_EDIT, From ce8eb34fbf05e50bffdb440fd5ac8a7a042672d4 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 23 Dec 2023 18:35:23 -0500 Subject: [PATCH 26/30] update to-do list --- TODO.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/TODO.md b/TODO.md index 06951982a..f1918edef 100644 --- a/TODO.md +++ b/TODO.md @@ -1,15 +1,12 @@ # to-do -- add cheat code to insert bruno time (blank) - -# THE REAL TO-DO LIST - +- finish color import improvements (settings refactor) +- new undo stuff +- fix some bugs - finish auto-clone once you have done all of this (maybe not the first one), release 0.6.1 -Furnace is like alcohol... - # and then - new oscilloscope renderer - custom code that uses texture and fixes two issues: too many vertices, and broken anti-aliasing From e58307684c017530fa72ab6a4cb434d41d8a2911 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 23 Dec 2023 20:05:07 -0500 Subject: [PATCH 27/30] GUI: aaaaaaaand here we go importColors and exportColors now use the same framework as settings --- src/gui/settings.cpp | 592 ++++++++++++++++++++++--------------------- 1 file changed, 298 insertions(+), 294 deletions(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 94d312f34..708fe67b2 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3697,236 +3697,325 @@ void FurnaceGUI::drawSettings() { void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { if (groups&GUI_SETTINGS_GENERAL) { + settings.renderDriver=conf.getString("renderDriver",""); + settings.noDMFCompat=conf.getInt("noDMFCompat",0); + + settings.dpiScale=conf.getFloat("dpiScale",0.0f); + + settings.initialSysName=conf.getString("initialSysName",""); + + // initial system + String initialSys2=conf.getString("initialSys2",""); + bool oldVol=conf.getInt("configVersion",DIV_ENGINE_VERSION)<135; + if (initialSys2.empty()) { + initialSys2=e->decodeSysDesc(conf.getString("initialSys","")); + oldVol=false; + } + settings.initialSys.clear(); + settings.initialSys.loadFromBase64(initialSys2.c_str()); + if (settings.initialSys.getInt("id0",0)==0) { + settings.initialSys.clear(); + settings.initialSys.set("id0",e->systemToFileFur(DIV_SYSTEM_YM2612)); + settings.initialSys.set("vol0",1.0f); + settings.initialSys.set("pan0",0.0f); + settings.initialSys.set("fr0",0.0f); + settings.initialSys.set("flags0",""); + settings.initialSys.set("id1",e->systemToFileFur(DIV_SYSTEM_SMS)); + settings.initialSys.set("vol1",0.5f); + settings.initialSys.set("pan1",0); + settings.initialSys.set("fr1",0); + settings.initialSys.set("flags1",""); + } else { + if (oldVol) { + for (int i=0; settings.initialSys.getInt(fmt::sprintf("id%d",i),0); i++) { + float newVol=settings.initialSys.getInt(fmt::sprintf("vol%d",i),64); + float newPan=settings.initialSys.getInt(fmt::sprintf("pan%d",i),0); + newVol/=64.0f; + newPan/=127.0f; + settings.initialSys.set(fmt::sprintf("vol%d",i),newVol); + settings.initialSys.set(fmt::sprintf("pan%d",i),newPan); + } + conf.set("initialSys2",settings.initialSys.toBase64()); + conf.set("configVersion",DIV_ENGINE_VERSION); + } + } + + settings.noThreadedInput=conf.getInt("noThreadedInput",0); + settings.powerSave=conf.getInt("powerSave",POWER_SAVE_DEFAULT); + settings.eventDelay=conf.getInt("eventDelay",0); + + settings.renderBackend=conf.getString("renderBackend",GUI_BACKEND_DEFAULT_NAME); + settings.renderClearPos=conf.getInt("renderClearPos",0); + + settings.chanOscThreads=conf.getInt("chanOscThreads",0); + settings.renderPoolThreads=conf.getInt("renderPoolThreads",0); + settings.showPool=conf.getInt("showPool",0); + settings.writeInsNames=conf.getInt("writeInsNames",1); + settings.readInsNames=conf.getInt("readInsNames",1); + settings.defaultAuthorName=conf.getString("defaultAuthorName",""); + + settings.hiddenSystems=conf.getInt("hiddenSystems",0); + settings.allowEditDocking=conf.getInt("allowEditDocking",1); + settings.sysFileDialog=conf.getInt("sysFileDialog",SYS_FILE_DIALOG_DEFAULT); + settings.displayAllInsTypes=conf.getInt("displayAllInsTypes",0); + settings.displayPartial=conf.getInt("displayPartial",0); + + settings.blankIns=conf.getInt("blankIns",0); + + settings.saveWindowPos=conf.getInt("saveWindowPos",1); + + settings.saveUnusedPatterns=conf.getInt("saveUnusedPatterns",0); + settings.maxRecentFile=conf.getInt("maxRecentFile",10); + + settings.persistFadeOut=conf.getInt("persistFadeOut",1); + settings.exportLoops=conf.getInt("exportLoops",0); + settings.exportFadeOut=conf.getDouble("exportFadeOut",0.0); + + settings.doubleClickTime=conf.getFloat("doubleClickTime",0.3f); + settings.disableFadeIn=conf.getInt("disableFadeIn",0); + settings.alwaysPlayIntro=conf.getInt("alwaysPlayIntro",0); + settings.iCannotWait=conf.getInt("iCannotWait",0); + + settings.compress=conf.getInt("compress",1); + settings.newPatternFormat=conf.getInt("newPatternFormat",1); + settings.newSongBehavior=conf.getInt("newSongBehavior",0); + settings.playOnLoad=conf.getInt("playOnLoad",0); + settings.centerPopup=conf.getInt("centerPopup",1); } if (groups&GUI_SETTINGS_AUDIO) { + settings.audioEngine=(conf.getString("audioEngine","SDL")=="SDL")?1:0; + if (conf.getString("audioEngine","SDL")=="JACK") { + settings.audioEngine=DIV_AUDIO_JACK; + } else if (conf.getString("audioEngine","SDL")=="PortAudio") { + settings.audioEngine=DIV_AUDIO_PORTAUDIO; + } else { + settings.audioEngine=DIV_AUDIO_SDL; + } + settings.audioDevice=conf.getString("audioDevice",""); + settings.sdlAudioDriver=conf.getString("sdlAudioDriver",""); + settings.audioQuality=conf.getInt("audioQuality",0); + settings.audioHiPass=conf.getInt("audioHiPass",1); + settings.audioBufSize=conf.getInt("audioBufSize",1024); + settings.audioRate=conf.getInt("audioRate",44100); + settings.audioChans=conf.getInt("audioChans",2); + + settings.lowLatency=conf.getInt("lowLatency",0); + + settings.metroVol=conf.getInt("metroVol",100); + settings.sampleVol=conf.getInt("sampleVol",50); + + settings.wasapiEx=conf.getInt("wasapiEx",0); + + settings.clampSamples=conf.getInt("clampSamples",0); + settings.forceMono=conf.getInt("forceMono",0); } if (groups&GUI_SETTINGS_MIDI) { + settings.midiInDevice=conf.getString("midiInDevice",""); + settings.midiOutDevice=conf.getString("midiOutDevice",""); + settings.midiOutClock=conf.getInt("midiOutClock",0); + settings.midiOutTime=conf.getInt("midiOutTime",0); + settings.midiOutProgramChange=conf.getInt("midiOutProgramChange",0); + settings.midiOutMode=conf.getInt("midiOutMode",1); + settings.midiOutTimeRate=conf.getInt("midiOutTimeRate",0); } if (groups&GUI_SETTINGS_KEYBOARD) { + // keybinds + for (int i=0; idecodeSysDesc(conf.getString("initialSys","")); - oldVol=false; - } - settings.initialSys.clear(); - settings.initialSys.loadFromBase64(initialSys2.c_str()); - if (settings.initialSys.getInt("id0",0)==0) { - settings.initialSys.clear(); - settings.initialSys.set("id0",e->systemToFileFur(DIV_SYSTEM_YM2612)); - settings.initialSys.set("vol0",1.0f); - settings.initialSys.set("pan0",0.0f); - settings.initialSys.set("fr0",0.0f); - settings.initialSys.set("flags0",""); - settings.initialSys.set("id1",e->systemToFileFur(DIV_SYSTEM_SMS)); - settings.initialSys.set("vol1",0.5f); - settings.initialSys.set("pan1",0); - settings.initialSys.set("fr1",0); - settings.initialSys.set("flags1",""); - } else { - if (oldVol) { - for (int i=0; settings.initialSys.getInt(fmt::sprintf("id%d",i),0); i++) { - float newVol=settings.initialSys.getInt(fmt::sprintf("vol%d",i),64); - float newPan=settings.initialSys.getInt(fmt::sprintf("pan%d",i),0); - newVol/=64.0f; - newPan/=127.0f; - settings.initialSys.set(fmt::sprintf("vol%d",i),newVol); - settings.initialSys.set(fmt::sprintf("pan%d",i),newPan); - } - conf.set("initialSys2",settings.initialSys.toBase64()); - conf.set("configVersion",DIV_ENGINE_VERSION); - } - } + if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; } void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { @@ -4206,8 +4246,6 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { if (groups&GUI_SETTINGS_AUDIO) { conf.set("audioEngine",String(audioBackends[settings.audioEngine])); conf.set("audioDevice",settings.audioDevice); - conf.set("midiInDevice",settings.midiInDevice); - conf.set("midiOutDevice",settings.midiOutDevice); conf.set("sdlAudioDriver",settings.sdlAudioDriver); conf.set("audioQuality",settings.audioQuality); conf.set("audioHiPass",settings.audioHiPass); @@ -4228,6 +4266,8 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { // MIDI if (groups&GUI_SETTINGS_MIDI) { + conf.set("midiInDevice",settings.midiInDevice); + conf.set("midiOutDevice",settings.midiOutDevice); conf.set("midiOutClock",settings.midiOutClock); conf.set("midiOutTime",settings.midiOutTime); conf.set("midiOutProgramChange",settings.midiOutProgramChange); @@ -4534,50 +4574,14 @@ void FurnaceGUI::commitSettings() { } bool FurnaceGUI::importColors(String path) { - FILE* f=ps_fopen(path.c_str(),"rb"); - if (f==NULL) { + DivConfig c; + if (!c.loadFromFile(path.c_str(),false,false)) { logW("error while opening color file for import: %s",strerror(errno)); return false; } - resetColors(); - char line[4096]; - while (!feof(f)) { - String key=""; - String value=""; - bool keyOrValue=false; - if (fgets(line,4095,f)==NULL) { - break; - } - for (char* i=line; *i; i++) { - if (*i=='\n') continue; - if (keyOrValue) { - value+=*i; - } else { - if (*i=='=') { - keyOrValue=true; - } else { - key+=*i; - } - } - } - if (keyOrValue) { - // unoptimal - const char* cs=key.c_str(); - for (int i=0; i Date: Sun, 24 Dec 2023 16:59:09 -0500 Subject: [PATCH 28/30] set writeInsNames to 0 by default so we can beat .dmp --- src/gui/gui.h | 2 +- src/gui/settings.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index 39fac0132..51abb74ae 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1911,7 +1911,7 @@ class FurnaceGUI { chanOscThreads(0), renderPoolThreads(0), showPool(0), - writeInsNames(1), + writeInsNames(0), readInsNames(1), fontBackend(1), fontHinting(0), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 708fe67b2..8c503d72b 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3750,7 +3750,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.chanOscThreads=conf.getInt("chanOscThreads",0); settings.renderPoolThreads=conf.getInt("renderPoolThreads",0); settings.showPool=conf.getInt("showPool",0); - settings.writeInsNames=conf.getInt("writeInsNames",1); + settings.writeInsNames=conf.getInt("writeInsNames",0); settings.readInsNames=conf.getInt("readInsNames",1); settings.defaultAuthorName=conf.getString("defaultAuthorName",""); From 8eed9ff94079ad995fd7c5cf3efea9fbbe8a1950 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 26 Dec 2023 14:56:24 -0500 Subject: [PATCH 29/30] aaaaa --- src/gui/editing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index 22e0249f5..50c92aadf 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -1117,7 +1117,7 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String if (invalidData) { - logW("invalid OpenMPT clipboard data! failed at line %d char %d",i,charPos); + logW("invalid clipboard data! failed at line %d char %d",i,charPos); logW("%s",line.c_str()); break; } From 07b037349b2419736359f25e114e5798e17bb327 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 27 Dec 2023 14:49:35 -0500 Subject: [PATCH 30/30] fix text export crash --- src/engine/fileOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index cb6f4fa90..1dd9d89d4 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -6492,7 +6492,7 @@ SafeWriter* DivEngine::saveText(bool separatePatterns) { if (ins->type==DIV_INS_GB) { w->writeText("- Game Boy parameters:\n"); w->writeText(fmt::sprintf(" - volume: %d\n",ins->gb.envVol)); - w->writeText(fmt::sprintf(" - direction: %d\n",gbEnvDir[ins->gb.envDir?1:0])); + w->writeText(fmt::sprintf(" - direction: %s\n",gbEnvDir[ins->gb.envDir?1:0])); w->writeText(fmt::sprintf(" - length: %d\n",ins->gb.envLen)); w->writeText(fmt::sprintf(" - sound length: %d\n",ins->gb.soundLen)); w->writeText(fmt::sprintf(" - use software envelope: %s\n",trueFalse[ins->gb.softEnv?1:0]));