diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 8ea22a144..0d53e97da 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1783,7 +1783,31 @@ void FurnaceGUI::showError(String what) { #define B30(tt) (macroDragBit30?((((tt)&0xc0000000)==0x40000000 || ((tt)&0xc0000000)==0x80000000)?0x40000000:0):0) #define MACRO_DRAG(t) \ - if (macroDragBitMode) { \ + if (macroDragSettingBit30) { \ + if (macroDragLastX!=x || macroDragLastY!=y) { \ + macroDragLastX=x; \ + macroDragLastY=y; \ + if (macroDragInitialValueSet) { \ + if (!macroDragInitialValue) { \ + if (t[x]&0x80000000) { \ + t[x]&=~0x40000000; \ + } else { \ + t[x]|=0x40000000; \ + } \ + } else { \ + if (t[x]&0x80000000) { \ + t[x]|=0x40000000; \ + } else { \ + t[x]&=~0x40000000; \ + } \ + } \ + } else { \ + macroDragInitialValue=(((t[x])&0xc0000000)==0x40000000 || ((t[x])&0xc0000000)==0x80000000); \ + macroDragInitialValueSet=true; \ + t[x]^=0x40000000; \ + } \ + } \ + } else if (macroDragBitMode) { \ if (macroDragLastX!=x || macroDragLastY!=y) { \ macroDragLastX=x; \ macroDragLastY=y; \ @@ -4893,6 +4917,7 @@ FurnaceGUI::FurnaceGUI(): macroDragInitialValue(false), macroDragChar(false), macroDragBit30(false), + macroDragSettingBit30(false), macroDragLineMode(false), macroDragMouseMoved(false), macroDragLineInitial(0,0), diff --git a/src/gui/gui.h b/src/gui/gui.h index a7f906aea..80aa087ff 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1397,6 +1397,7 @@ class FurnaceGUI { bool macroDragInitialValue; bool macroDragChar; bool macroDragBit30; + bool macroDragSettingBit30; bool macroDragLineMode; bool macroDragMouseMoved; ImVec2 macroDragLineInitial; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 2a2c8ecd5..c89652a37 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -1374,6 +1374,7 @@ void FurnaceGUI::drawMacros(std::vector& macros) { macroDragLen=totalFit; macroDragActive=true; macroDragBit30=i.bit30; + macroDragSettingBit30=false; macroDragTarget=i.macro->val; macroDragChar=false; macroDragLineMode=(i.isBitfield)?false:ImGui::IsItemClicked(ImGuiMouseButton_Right); @@ -1442,9 +1443,24 @@ void FurnaceGUI::drawMacros(std::vector& macros) { } // bit 30 area - // TODO: ability to set it if (i.bit30) { PlotCustom("##IMacroBit30",bit30Indicator,totalFit,macroDragScroll,NULL,0,1,ImVec2(availableWidth,12.0f*dpiScale),sizeof(float),i.color,i.macro->len-macroDragScroll,¯oHoverBit30); + if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { + macroDragStart=ImGui::GetItemRectMin(); + macroDragAreaSize=ImVec2(availableWidth,12.0f*dpiScale); + macroDragInitialValueSet=false; + macroDragInitialValue=false; + macroDragLen=totalFit; + macroDragActive=true; + macroDragBit30=i.bit30; + macroDragSettingBit30=true; + macroDragTarget=i.macro->val; + macroDragChar=false; + macroDragLineMode=false; + macroDragLineInitial=ImVec2(0,0); + lastMacroDesc=i; + processDrags(ImGui::GetMousePos().x,ImGui::GetMousePos().y); + } } // loop area