diff --git a/src/gui/gui.h b/src/gui/gui.h index d7b5a28ee..05a8f94eb 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2974,7 +2974,7 @@ class FurnaceGUI { void drawTutorial(); void drawXYOsc(); void drawUserPresets(); - void drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffset=-1); + void drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffset=-1, float width=-1.0f); void drawSystemChannelInfoText(const DivSysDef* whichDef); void assignActionMap(std::map& actionMap, int first, int last); diff --git a/src/gui/sysManager.cpp b/src/gui/sysManager.cpp index f8a629230..0d19ea55d 100644 --- a/src/gui/sysManager.cpp +++ b/src/gui/sysManager.cpp @@ -46,6 +46,7 @@ void FurnaceGUI::drawSysManager() { ImGui::SameLine(); ImGui::Checkbox(_("Clone at end"),&sysDupEnd); + // this is a "rack" style chip list int dispatchOff=0; for (int i=0; isong.systemLen; i++) { String rackID=fmt::sprintf("SysEntry%d",i); @@ -54,6 +55,7 @@ void FurnaceGUI::drawSysManager() { ImGui::PushID(i); if (ImGui::BeginChild(rackID.c_str(),ImVec2(0,0),ImGuiChildFlags_Border|ImGuiChildFlags_AutoResizeY)) { + // swap handle and name if (ImGui::Button(ICON_FA_ARROWS)) { } if (ImGui::BeginDragDropSource()) { @@ -78,11 +80,12 @@ void FurnaceGUI::drawSysManager() { ImGui::EndDragDropTarget(); } ImGui::SameLine(); - float buttonInnerSize=ImGui::CalcTextSize(ICON_FA_CLONE ICON_FA_EJECT ICON_FA_TIMES).x; - float sideButtonSize=ImGui::GetStyle().ItemSpacing.x*3.0f+buttonInnerSize+ImGui::GetStyle().ItemInnerSpacing.x*6; + float buttonInnerSize=ImGui::CalcTextSize(ICON_FA_CLONE).x; + float sideButtonSize=ImGui::GetStyle().ItemSpacing.x*3.0f+buttonInnerSize*3.0f+ImGui::GetStyle().FramePadding.x*6; ImGui::AlignTextToFramePadding(); ImGui::ScrollText(ImGui::GetID(rackNameID.c_str()),sysDef->name,ImVec2(0.0f,0.0f),ImVec2(ImGui::GetContentRegionAvail().x-sideButtonSize,0)); ImGui::Dummy(ImVec2(ImGui::GetContentRegionAvail().x-sideButtonSize,1.0f)); + // action buttons ImGui::SameLine(); if (ImGui::Button(ICON_FA_CLONE "##SysDup")) { if (!e->duplicateSystem(i,sysDupCloneChannels,sysDupEnd)) { @@ -95,7 +98,8 @@ void FurnaceGUI::drawSysManager() { updateROMExportAvail(); MARK_MODIFIED; } - }if (ImGui::IsItemHovered()) { + } + if (ImGui::IsItemHovered()) { ImGui::SetTooltip(_("Clone")); } ImGui::SameLine(); @@ -136,29 +140,31 @@ void FurnaceGUI::drawSysManager() { } ImGui::EndDisabled(); - drawSystemChannelInfo(sysDef,dispatchOff); - - ImGui::Separator(); + // channel LEDs and chip config button + drawSystemChannelInfo(sysDef,dispatchOff,ImGui::GetContentRegionAvail().x-(ImGui::CalcTextSize(ICON_FA_CHEVRON_DOWN).x+ImGui::GetStyle().FramePadding.x*2.0f+ImGui::GetStyle().ItemSpacing.x)); ImGuiID openedID=ImGui::GetID("OpenSysConfig"); bool opened=openedConfig->GetBool(openedID,false); - if (opened) { - ImGui::Indent(); - drawSysConf(i,i,e->song.system[i],e->song.systemFlags[i],true); - ImGui::Unindent(); - } + ImGui::SameLine(); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize,0.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameShading,0.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding,0.0f); ImGui::PushStyleColor(ImGuiCol_Button,0); ImGui::PushStyleColor(ImGuiCol_ButtonHovered,ImGui::GetColorU32(uiColors[GUI_COLOR_SCROLL])); ImGui::PushStyleColor(ImGuiCol_ButtonActive,ImGui::GetColorU32(uiColors[GUI_COLOR_SCROLL_ACTIVE])); - if (ImGui::Button(opened?(ICON_FA_CHEVRON_UP " " ICON_FA_CHEVRON_UP " " ICON_FA_CHEVRON_UP " " "###OpenThing"):(ICON_FA_CHEVRON_DOWN " " ICON_FA_CHEVRON_DOWN " " ICON_FA_CHEVRON_DOWN " " "###OpenThing"),ImVec2(ImGui::GetContentRegionAvail().x,0.0f))) { + if (ImGui::SmallButton(opened?(ICON_FA_CHEVRON_UP "###OpenThing"):(ICON_FA_CHEVRON_DOWN "###OpenThing"))) { opened=!opened; openedConfig->SetBool(openedID,opened); } ImGui::PopStyleColor(3); ImGui::PopStyleVar(3); + + if (opened) { + ImGui::Separator(); + ImGui::Indent(); + drawSysConf(i,i,e->song.system[i],e->song.systemFlags[i],true); + ImGui::Unindent(); + } } ImGui::EndChild(); ImGui::PopID(); @@ -189,122 +195,6 @@ void FurnaceGUI::drawSysManager() { ImGui::EndPopup(); } } - - /* - if (ImGui::BeginTable("SystemList",3)) { - ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthFixed); - ImGui::TableNextRow(ImGuiTableRowFlags_Headers); - ImGui::TableNextColumn(); - ImGui::TableNextColumn(); - ImGui::Text(_("Name")); - ImGui::TableNextColumn(); - ImGui::Text(_("Actions")); - for (unsigned char i=0; isong.systemLen; i++) { - ImGui::PushID(i); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::TableNextColumn(); - bool isNotCollapsed=true; - if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { - drawSysConf(i,i,e->song.system[i],e->song.systemFlags[i],true); - isNotCollapsed=false; - ImGui::TreePop(); - } - if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary) && isNotCollapsed) { - if (e->song.system[i]!=DIV_SYSTEM_NULL) { - const DivSysDef* sysDef=e->getSystemDef(e->song.system[i]); - if (ImGui::BeginTooltip()) { - ImGui::Dummy(ImVec2(MIN(scrW*dpiScale,400.0f*dpiScale),0.0f)); - ImGui::PushTextWrapPos(MIN(scrW*dpiScale,400.0f*dpiScale)); // arbitrary constant - ImGui::TextWrapped("%s",sysDef->description); - ImGui::Separator(); - drawSystemChannelInfoText(sysDef); - drawSystemChannelInfo(sysDef); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } - } - } - ImGui::TableNextColumn(); - if (ImGui::Button(_("Clone##SysDup"))) { - if (!e->duplicateSystem(i,sysDupCloneChannels,sysDupEnd)) { - showError(fmt::sprintf(_("cannot clone chip! (%s)"),e->getLastError())); - } else { - if (e->song.autoSystem) { - autoDetectSystem(); - updateWindowTitle(); - } - updateROMExportAvail(); - MARK_MODIFIED; - } - } - ImGui::SameLine(); - ImGui::Button(_("Change##SysChange")); - if (ImGui::BeginPopupContextItem("SysPickerC",ImGuiPopupFlags_MouseButtonLeft)) { - DivSystem picked=systemPicker(false); - if (picked!=DIV_SYSTEM_NULL) { - if (e->changeSystem(i,picked,preserveChanPos)) { - MARK_MODIFIED; - if (e->song.autoSystem) { - autoDetectSystem(); - } - updateWindowTitle(); - updateROMExportAvail(); - } else { - showError(fmt::sprintf(_("cannot change chip! (%s)"),e->getLastError())); - } - ImGui::CloseCurrentPopup(); - } - if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - ImGui::SameLine(); - ImGui::BeginDisabled(e->song.systemLen<=1); - pushDestColor(); - if (ImGui::Button(ICON_FA_TIMES "##SysRemove")) { - sysToDelete=i; - showWarning(_("Are you sure you want to remove this chip?"),GUI_WARN_SYSTEM_DEL); - } - popDestColor(); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(_("Remove")); - } - ImGui::EndDisabled(); - ImGui::PopID(); - } - if (e->song.systemLenaddSystem(picked)) { - showError(fmt::sprintf(_("cannot add chip! (%s)"),e->getLastError())); - } else { - MARK_MODIFIED; - } - if (e->song.autoSystem) { - autoDetectSystem(); - } - updateWindowTitle(); - updateROMExportAvail(); - ImGui::CloseCurrentPopup(); - } - if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - } - ImGui::EndTable(); - } - */ } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_SYS_MANAGER; ImGui::End(); diff --git a/src/gui/sysMiscInfo.cpp b/src/gui/sysMiscInfo.cpp index 7ae34e1e0..138d7efd2 100644 --- a/src/gui/sysMiscInfo.cpp +++ b/src/gui/sysMiscInfo.cpp @@ -296,19 +296,19 @@ const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) { } } -void FurnaceGUI::drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffset) { +void FurnaceGUI::drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffset, float tooltipWidth) { ImDrawList* dl=ImGui::GetWindowDrawList(); const ImVec2 p=ImGui::GetCursorScreenPos(); + if (tooltipWidth<=0.0f) tooltipWidth=ImGui::GetContentRegionAvail().x; ImVec2 sep=ImGui::GetStyle().ItemSpacing; ImVec2 ledSize=ImVec2( - (ImGui::GetContentRegionAvail().x-sep.x*(whichDef->channels-1))/(float)whichDef->channels, + (tooltipWidth-sep.x*(whichDef->channels-1))/(float)whichDef->channels, 8.0f*dpiScale ); - if (ledSize.x<7.5f*dpiScale) ledSize.x=7.5f*dpiScale; + if (ledSize.x<8.0f*dpiScale) ledSize.x=8.0f*dpiScale; float x=p.x, y=p.y; - float tooltipWidth=ImGui::GetContentRegionAvail().x; for (int i=0; ichannels; i++) { - if (x>tooltipWidth+p.x) { + if (x+ledSize.x-0.125>tooltipWidth+p.x) { x=p.x; y+=ledSize.y+sep.y; } @@ -328,7 +328,7 @@ void FurnaceGUI::drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffs dl->AddRectFilled(ImVec2(x,y),ImVec2(x+ledSize.x,y+ledSize.y),ImGui::GetColorU32(color),ledSize.y); x+=ledSize.x+sep.x; } - ImGui::Dummy(ImVec2(0,(y-p.y)+ledSize.y)); + ImGui::Dummy(ImVec2(tooltipWidth,(y-p.y)+ledSize.y)); } void FurnaceGUI::drawSystemChannelInfoText(const DivSysDef* whichDef) {