From 6ccd2e222b97abc0fa5f28b17c46e07aaacaab4c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 16:10:51 -0500 Subject: [PATCH 1/7] try CoInitializeEx on Windows --- src/main.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 07905852..8c90c7c8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,7 @@ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include +#include #include #else #include @@ -243,6 +244,12 @@ void initParams() { // TODO: add crash log int main(int argc, char** argv) { initLog(); +#ifdef _WIN32 + HRESULT coResult=CoInitializeEx(NULL,COINIT_MULTITHREADED); + if (coResult!=S_OK) { + logE("CoInitializeEx failed!"); + } +#endif #if !(defined(__APPLE__) || defined(_WIN32) || defined(ANDROID)) // workaround for Wayland HiDPI issue if (getenv("SDL_VIDEODRIVER")==NULL) { @@ -446,6 +453,12 @@ int main(int argc, char** argv) { logI("stopping engine."); e.quit(); + +#ifdef _WIN32 + if (coResult==S_OK || coResult==S_FALSE) { + CoUninitialize(); + } +#endif return 0; } From 7dc3dc96c4c0bec8e13f32feba056ba040c60239 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 16:41:54 -0500 Subject: [PATCH 2/7] GUI: find and replace, part 5 --- src/gui/findReplace.cpp | 41 +++++++++++++++++++++++++++++++++++------ src/gui/gui.h | 19 +++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index 8c05be99..071d05ea 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -17,6 +17,7 @@ const char* queryModes[GUI_QUERY_MAX]={ const char* queryReplaceModes[GUI_QUERY_REPLACE_MAX]={ "set", "add", + "add (overflow)", "clear" }; @@ -363,18 +364,33 @@ void FurnaceGUI::drawFindReplace() { } if (ImGui::TreeNode("Replace")) { - if (ImGui::BeginTable("QueryReplace",3)) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Text("Note"); + if (ImGui::BeginTable("QueryReplace",3,ImGuiTableFlags_BordersOuter)) { + ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.5); + ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch,0.5); ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Ins"); + ImGui::Checkbox("Note",&queryReplaceNoteDo); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##NRMode",&queryReplaceNoteMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); + ImGui::TableNextColumn(); + ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Volume"); + ImGui::Checkbox("Ins",&queryReplaceInsDo); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##IRMode",&queryReplaceInsMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Checkbox("Volume",&queryReplaceVolDo); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##VRMode",&queryReplaceVolMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); /*ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -386,6 +402,19 @@ void FurnaceGUI::drawFindReplace() { ImGui::EndTable(); } + ImGui::Text("Effect replace mode:"); + if (ImGui::RadioButton("Clear effects",queryReplaceEffectPos==0)) { + queryReplaceEffectPos=0; + } + if (ImGui::RadioButton("Replace matches only",queryReplaceEffectPos==1)) { + queryReplaceEffectPos=1; + } + if (ImGui::RadioButton("Replace matches, then free spaces",queryReplaceEffectPos==2)) { + queryReplaceEffectPos=2; + } + if (ImGui::RadioButton("Insert in free spaces",queryReplaceEffectPos==3)) { + queryReplaceEffectPos=3; + } if (ImGui::Button("Replace##QueryReplace")) { // TODO } diff --git a/src/gui/gui.h b/src/gui/gui.h index 2ee6170a..107deb9d 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -818,6 +818,7 @@ enum FurnaceGUIFindQueryModes { enum FurnaceGUIFindQueryReplaceModes { GUI_QUERY_REPLACE_SET=0, GUI_QUERY_REPLACE_ADD, + GUI_QUERY_REPLACE_ADD_OVERFLOW, GUI_QUERY_REPLACE_CLEAR, GUI_QUERY_REPLACE_MAX @@ -1175,6 +1176,24 @@ class FurnaceGUI { int curQueryRangeY; int curQueryEffectPos; + int queryReplaceEffectCount; + int queryReplaceEffectPos; + int queryReplaceNoteMode; + int queryReplaceInsMode; + int queryReplaceVolMode; + int queryReplaceEffectMode[8]; + int queryReplaceEffectValMode[8]; + int queryReplaceNote; + int queryReplaceIns; + int queryReplaceVol; + int queryReplaceEffect[8]; + int queryReplaceEffectVal[8]; + bool queryReplaceNoteDo; + bool queryReplaceInsDo; + bool queryReplaceVolDo; + bool queryReplaceEffectDo[8]; + bool queryReplaceEffectValDo[8]; + struct ActiveNote { int chan; int note; From 04bbffac13e4bbf3773b925be6b9ae884ef6d1af Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 16:54:14 -0500 Subject: [PATCH 3/7] more MIDI debug messages --- src/audio/rtmidi.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/audio/rtmidi.cpp b/src/audio/rtmidi.cpp index a5c5bad0..b431a89d 100644 --- a/src/audio/rtmidi.cpp +++ b/src/audio/rtmidi.cpp @@ -75,8 +75,12 @@ bool TAMidiInRtMidi::openDevice(String name) { try { bool portOpen=false; unsigned int count=port->getPortCount(); + logD("finding port %s...",name); for (unsigned int i=0; igetPortName(i)==name) { + String portName=port->getPortName(i); + logV("- %d: %s",i,portName); + if (portName==name) { + logD("opening port %d...",i); port->openPort(i); portOpen=true; break; @@ -184,8 +188,12 @@ bool TAMidiOutRtMidi::openDevice(String name) { try { bool portOpen=false; unsigned int count=port->getPortCount(); + logD("finding port %s...",name); for (unsigned int i=0; igetPortName(i)==name) { + String portName=port->getPortName(i); + logV("- %d: %s",i,portName); + if (portName==name) { + logD("opening port %d...",i); port->openPort(i); portOpen=true; break; @@ -248,4 +256,4 @@ bool TAMidiOutRtMidi::quit() { port=NULL; } return true; -} \ No newline at end of file +} From eac4f50d9297f5478c8ca596389193f305f4cd19 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 18:04:50 -0500 Subject: [PATCH 4/7] sanitize MIDI port names on Windows/Linux --- src/audio/rtmidi.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/audio/rtmidi.cpp b/src/audio/rtmidi.cpp index b431a89d..31a3e66a 100644 --- a/src/audio/rtmidi.cpp +++ b/src/audio/rtmidi.cpp @@ -21,6 +21,26 @@ #include "../ta-log.h" #include "taAudio.h" +String sanitizePortName(const String& name) { +#if defined(_WIN32) + // remove port number + size_t namePos=name.rfind(' '); + if (namePos!=String::npos) { + return name.substr(0,namePos); + } + return name; +#elif defined(__linux__) + // remove port location + size_t namePos=name.rfind(' '); + if (namePos!=String::npos) { + return name.substr(0,namePos); + } + return name; +#else + return name; +#endif +} + // --- IN --- bool TAMidiInRtMidi::gather() { @@ -56,7 +76,7 @@ std::vector TAMidiInRtMidi::listDevices() { unsigned int count=port->getPortCount(); logD("got port count."); for (unsigned int i=0; igetPortName(i); + String name=sanitizePortName(port->getPortName(i)); if (name!="") ret.push_back(name); } } catch (RtMidiError& e) { @@ -77,7 +97,7 @@ bool TAMidiInRtMidi::openDevice(String name) { unsigned int count=port->getPortCount(); logD("finding port %s...",name); for (unsigned int i=0; igetPortName(i); + String portName=sanitizePortName(port->getPortName(i)); logV("- %d: %s",i,portName); if (portName==name) { logD("opening port %d...",i); @@ -190,7 +210,7 @@ bool TAMidiOutRtMidi::openDevice(String name) { unsigned int count=port->getPortCount(); logD("finding port %s...",name); for (unsigned int i=0; igetPortName(i); + String portName=sanitizePortName(port->getPortName(i)); logV("- %d: %s",i,portName); if (portName==name) { logD("opening port %d...",i); @@ -230,7 +250,7 @@ std::vector TAMidiOutRtMidi::listDevices() { try { unsigned int count=port->getPortCount(); for (unsigned int i=0; igetPortName(i); + String name=sanitizePortName(port->getPortName(i)); if (name!="") ret.push_back(name); } } catch (RtMidiError& e) { From dd05429c0eb8da08f329bb0f8d37d2cd94915b1f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 18:16:51 -0500 Subject: [PATCH 5/7] WaveSynth: initialize wave to 0 on SCC/Bubble Syst --- src/engine/platform/bubsyswsg.cpp | 2 +- src/engine/platform/scc.cpp | 2 +- src/engine/waveSynth.cpp | 7 ++++++- src/engine/waveSynth.h | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index 85d50e66..48a07880 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -306,7 +306,7 @@ void DivPlatformBubSysWSG::reset() { for (int i=0; i<2; i++) { chan[i]=DivPlatformBubSysWSG::Channel(); chan[i].std.setEngine(parent); - chan[i].ws.setEngine(parent); + chan[i].ws.setEngine(parent,8); chan[i].ws.init(NULL,32,15,false); } if (dumpWrites) { diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index 011f63bc..0cfe5a46 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -332,7 +332,7 @@ void DivPlatformSCC::reset() { for (int i=0; i<5; i++) { chan[i]=DivPlatformSCC::Channel(); chan[i].std.setEngine(parent); - chan[i].ws.setEngine(parent); + chan[i].ws.setEngine(parent,128); chan[i].ws.init(NULL,32,255,false); chan[i].vol=15; chan[i].outVol=15; diff --git a/src/engine/waveSynth.cpp b/src/engine/waveSynth.cpp index e6903168..82b5d5dd 100644 --- a/src/engine/waveSynth.cpp +++ b/src/engine/waveSynth.cpp @@ -243,8 +243,13 @@ void DivWaveSynth::changeWave2(int num) { first=true; } -void DivWaveSynth::setEngine(DivEngine* engine) { +void DivWaveSynth::setEngine(DivEngine* engine, int waveFloor) { e=engine; + memset(wave1,waveFloor,256); + memset(wave2,waveFloor,256); + for (int i=0; i<256; i++) { + output[i]=waveFloor; + } } void DivWaveSynth::init(DivInstrument* which, int w, int h, bool insChanged) { diff --git a/src/engine/waveSynth.h b/src/engine/waveSynth.h index 8709b084..26f5b259 100644 --- a/src/engine/waveSynth.h +++ b/src/engine/waveSynth.h @@ -70,7 +70,7 @@ class DivWaveSynth { * @param insChanged whether the instrument has changed. */ void init(DivInstrument* which, int width, int height, bool insChanged=false); - void setEngine(DivEngine* engine); + void setEngine(DivEngine* engine, int waveFloor=0); DivWaveSynth(): e(NULL), pos(0), From 936d9dfa49f996910ff54b72abc3d13c8569865c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Jun 2022 18:52:38 -0500 Subject: [PATCH 6/7] GUI: find and replace, part 6 --- src/gui/findReplace.cpp | 85 +++++++++++++++++++++++++++++++++++++---- src/gui/gui.cpp | 26 +++++++++++++ src/gui/gui.h | 2 +- src/gui/intConst.cpp | 1 + src/gui/intConst.h | 1 + 5 files changed, 106 insertions(+), 9 deletions(-) diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index 071d05ea..7ac12d1d 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -3,6 +3,7 @@ #include "IconsFontAwesome4.h" #include "misc/cpp/imgui_stdlib.h" #include "guiConst.h" +#include "intConst.h" const char* queryModes[GUI_QUERY_MAX]={ "ignore", @@ -290,7 +291,11 @@ void FurnaceGUI::drawFindReplace() { curQuery.push_back(FurnaceGUIFindQuery()); } - if (ImGui::BeginTable("QueryLimits",2)) { + if (ImGui::BeginTable("QueryLimits",3)) { + ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.5f); + ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch,0.5f); + ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -333,6 +338,7 @@ void FurnaceGUI::drawFindReplace() { } ImGui::EndDisabled(); + ImGui::TableNextColumn(); ImGui::Text("Match effect position:"); if (ImGui::RadioButton("No",curQueryEffectPos==0)) { @@ -356,8 +362,6 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Checkbox("From start",&curQueryFromStart); - ImGui::TableNextColumn(); ImGui::Checkbox("Backwards",&curQueryBackwards); ImGui::EndTable(); @@ -373,10 +377,49 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextColumn(); ImGui::Checkbox("Note",&queryReplaceNoteDo); ImGui::TableNextColumn(); + ImGui::BeginDisabled(!queryReplaceNoteDo); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::Combo("##NRMode",&queryReplaceNoteMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); ImGui::TableNextColumn(); - + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (queryReplaceNoteMode==GUI_QUERY_REPLACE_SET) { + if (queryReplaceNote==130) { + snprintf(tempID,1024,"REL"); + } else if (queryReplaceNote==129) { + snprintf(tempID,1024,"==="); + } else if (queryReplaceNote==128) { + snprintf(tempID,1024,"OFF"); + } else if (queryReplaceNote>=-60 && queryReplaceNote<120) { + snprintf(tempID,1024,"%s",noteNames[queryReplaceNote+60]); + } else { + snprintf(tempID,1024,"???"); + queryReplaceNote=0; + } + if (ImGui::BeginCombo("##NRValueC",tempID)) { + for (int j=0; j<180; j++) { + snprintf(tempID,1024,"%s",noteNames[j]); + if (ImGui::Selectable(tempID,queryReplaceNote==(j-60))) { + queryReplaceNote=j-60; + } + } + if (ImGui::Selectable("OFF",queryReplaceNote==128)) { + queryReplaceNote=128; + } + if (ImGui::Selectable("===",queryReplaceNote==129)) { + queryReplaceNote=129; + } + if (ImGui::Selectable("REL",queryReplaceNote==130)) { + queryReplaceNote=130; + } + ImGui::EndCombo(); + } + } else if (queryReplaceNoteMode==GUI_QUERY_REPLACE_ADD || queryReplaceNoteMode==GUI_QUERY_REPLACE_ADD_OVERFLOW) { + if (ImGui::InputInt("##NRValue",&queryReplaceNote,1,12)) { + if (queryReplaceNote<-180) queryReplaceNote=-180; + if (queryReplaceNote>180) queryReplaceNote=180; + } + } + ImGui::EndDisabled(); ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -384,6 +427,19 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::Combo("##IRMode",&queryReplaceInsMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (queryReplaceInsMode==GUI_QUERY_REPLACE_SET) { + if (ImGui::InputScalar("##IRValueH",ImGuiDataType_S32,&queryReplaceIns,&_ONE,&_SIXTEEN,"%.2X",ImGuiInputTextFlags_CharsHexadecimal)) { + if (queryReplaceIns<0) queryReplaceIns=0; + if (queryReplaceIns>255) queryReplaceIns=255; + } + } else if (queryReplaceInsMode==GUI_QUERY_REPLACE_ADD || queryReplaceInsMode==GUI_QUERY_REPLACE_ADD_OVERFLOW) { + if (ImGui::InputInt("##IRValue",&queryReplaceIns,1,12)) { + if (queryReplaceIns<-255) queryReplaceIns=-255; + if (queryReplaceIns>255) queryReplaceIns=255; + } + } ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -391,14 +447,27 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::Combo("##VRMode",&queryReplaceVolMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); - - /*ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Effect"); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (queryReplaceVolMode==GUI_QUERY_REPLACE_SET) { + if (ImGui::InputScalar("##VRValueH",ImGuiDataType_S32,&queryReplaceVol,&_ONE,&_SIXTEEN,"%.2X",ImGuiInputTextFlags_CharsHexadecimal)) { + if (queryReplaceVol<0) queryReplaceVol=0; + if (queryReplaceVol>255) queryReplaceVol=255; + } + } else if (queryReplaceVolMode==GUI_QUERY_REPLACE_ADD || queryReplaceVolMode==GUI_QUERY_REPLACE_ADD_OVERFLOW) { + if (ImGui::InputInt("##VRValue",&queryReplaceVol,1,12)) { + if (queryReplaceVol<-255) queryReplaceVol=-255; + if (queryReplaceVol>255) queryReplaceVol=255; + } + } ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Value");*/ + ImGui::Text("Later"); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Later"); ImGui::EndTable(); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ed1805f7..c1107d2e 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4431,6 +4431,25 @@ FurnaceGUI::FurnaceGUI(): wavePreviewLen(32), wavePreviewHeight(255), wavePreviewInit(true), + pgSys(0), + pgAddr(0), + pgVal(0), + curQueryRangeX(false), + curQueryBackwards(false), + curQueryRangeXMin(0), curQueryRangeXMax(0), + curQueryRangeY(0), + curQueryEffectPos(0), + queryReplaceEffectCount(0), + queryReplaceEffectPos(0), + queryReplaceNoteMode(0), + queryReplaceInsMode(0), + queryReplaceVolMode(0), + queryReplaceNote(0), + queryReplaceIns(0), + queryReplaceVol(0), + queryReplaceNoteDo(false), + queryReplaceInsDo(false), + queryReplaceVolDo(false), wavePreviewOn(false), wavePreviewKey((SDL_Scancode)0), wavePreviewNote(0), @@ -4624,4 +4643,11 @@ FurnaceGUI::FurnaceGUI(): memset(pianoKeyHit,0,sizeof(float)*180); memset(pianoKeyPressed,0,sizeof(bool)*180); + + memset(queryReplaceEffectMode,0,sizeof(int)*8); + memset(queryReplaceEffectValMode,0,sizeof(int)*8); + memset(queryReplaceEffect,0,sizeof(int)*8); + memset(queryReplaceEffectVal,0,sizeof(int)*8); + memset(queryReplaceEffectDo,0,sizeof(bool)*8); + memset(queryReplaceEffectValDo,0,sizeof(bool)*8); } diff --git a/src/gui/gui.h b/src/gui/gui.h index 107deb9d..8d565da2 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1171,7 +1171,7 @@ class FurnaceGUI { int pgSys, pgAddr, pgVal; std::vector curQuery; - bool curQueryRangeX, curQueryFromStart, curQueryBackwards; + bool curQueryRangeX, curQueryBackwards; int curQueryRangeXMin, curQueryRangeXMax; int curQueryRangeY; int curQueryEffectPos; diff --git a/src/gui/intConst.cpp b/src/gui/intConst.cpp index 9c7f53b9..8bee0f88 100644 --- a/src/gui/intConst.cpp +++ b/src/gui/intConst.cpp @@ -25,6 +25,7 @@ const int _THREE=3; const int _SEVEN=7; const int _TEN=10; const int _FIFTEEN=15; +const int _SIXTEEN=16; const int _THIRTY_ONE=31; const int _SIXTY_FOUR=64; const int _ONE_HUNDRED=100; diff --git a/src/gui/intConst.h b/src/gui/intConst.h index c6b13b9a..98c6c34f 100644 --- a/src/gui/intConst.h +++ b/src/gui/intConst.h @@ -27,6 +27,7 @@ extern const int _THREE; extern const int _SEVEN; extern const int _TEN; extern const int _FIFTEEN; +extern const int _SIXTEEN; extern const int _THIRTY_ONE; extern const int _SIXTY_FOUR; extern const int _ONE_HUNDRED; From 30bd73f83a5306fecfe2cc33591addf8f1f653cb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 10 Jun 2022 02:17:17 -0500 Subject: [PATCH 7/7] GUI: find and replace, part 7 the next parts will be dedicated on getting it working --- src/gui/findReplace.cpp | 69 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index 7ac12d1d..36048737 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -425,6 +425,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextColumn(); ImGui::Checkbox("Ins",&queryReplaceInsDo); ImGui::TableNextColumn(); + ImGui::BeginDisabled(!queryReplaceInsDo); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::Combo("##IRMode",&queryReplaceInsMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); ImGui::TableNextColumn(); @@ -440,11 +441,13 @@ void FurnaceGUI::drawFindReplace() { if (queryReplaceIns>255) queryReplaceIns=255; } } + ImGui::EndDisabled(); ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Checkbox("Volume",&queryReplaceVolDo); ImGui::TableNextColumn(); + ImGui::BeginDisabled(!queryReplaceVolDo); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::Combo("##VRMode",&queryReplaceVolMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX); ImGui::TableNextColumn(); @@ -460,14 +463,72 @@ void FurnaceGUI::drawFindReplace() { if (queryReplaceVol>255) queryReplaceVol=255; } } + ImGui::EndDisabled(); + + for (int i=0; i255) queryReplaceEffect[i]=255; + } + } else if (queryReplaceEffectMode[i]==GUI_QUERY_REPLACE_ADD || queryReplaceEffectMode[i]==GUI_QUERY_REPLACE_ADD_OVERFLOW) { + if (ImGui::InputInt("##ERValue",&queryReplaceEffect[i],1,12)) { + if (queryReplaceEffect[i]<-255) queryReplaceEffect[i]=-255; + if (queryReplaceEffect[i]>255) queryReplaceEffect[i]=255; + } + } + ImGui::EndDisabled(); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Checkbox("Value",&queryReplaceEffectValDo[i]); + ImGui::TableNextColumn(); + ImGui::BeginDisabled(!queryReplaceEffectValDo[i]); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + ImGui::Combo("##ERMode",&queryReplaceEffectValMode[i],queryReplaceModes,GUI_QUERY_REPLACE_MAX); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); + if (queryReplaceEffectValMode[i]==GUI_QUERY_REPLACE_SET) { + if (ImGui::InputScalar("##ERValueH",ImGuiDataType_S32,&queryReplaceEffectVal[i],&_ONE,&_SIXTEEN,"%.2X",ImGuiInputTextFlags_CharsHexadecimal)) { + if (queryReplaceEffectVal[i]<0) queryReplaceEffectVal[i]=0; + if (queryReplaceEffectVal[i]>255) queryReplaceEffectVal[i]=255; + } + } else if (queryReplaceEffectValMode[i]==GUI_QUERY_REPLACE_ADD || queryReplaceEffectValMode[i]==GUI_QUERY_REPLACE_ADD_OVERFLOW) { + if (ImGui::InputInt("##ERValue",&queryReplaceEffectVal[i],1,12)) { + if (queryReplaceEffectVal[i]<-255) queryReplaceEffectVal[i]=-255; + if (queryReplaceEffectVal[i]>255) queryReplaceEffectVal[i]=255; + } + } + ImGui::EndDisabled(); + + + ImGui::PopID(); + } ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Later"); - - ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Later"); + if (queryReplaceEffectCount<8) { + if (ImGui::Button("Add effect")) { + queryReplaceEffectCount++; + } + } + ImGui::TableNextColumn(); + if (queryReplaceEffectCount>0) { + if (ImGui::Button("Remove effect")) { + queryReplaceEffectCount--; + } + } ImGui::EndTable(); }