furnace/src/gui/sysManager.cpp

180 lines
6.8 KiB
C++
Raw Normal View History

2022-08-19 05:41:45 -04:00
/**
* Furnace Tracker - multi-system chiptune tracker
2024-01-16 21:26:57 -05:00
* Copyright (C) 2021-2024 tildearrow and contributors
2022-08-19 05:41:45 -04:00
*
* 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"
#include "misc/cpp/imgui_stdlib.h"
#include "IconsFontAwesome4.h"
2022-08-26 19:51:17 -04:00
#include <fmt/printf.h>
2022-08-19 05:41:45 -04:00
#include <imgui.h>
void FurnaceGUI::drawSysManager() {
if (nextWindow==GUI_WINDOW_SYS_MANAGER) {
sysManagerOpen=true;
ImGui::SetNextWindowFocus();
nextWindow=GUI_WINDOW_NOTHING;
}
if (!sysManagerOpen) return;
2022-11-29 16:09:50 -05:00
if (mobileUI) {
patWindowPos=(portrait?ImVec2(0.0f,(mobileMenuPos*-0.65*canvasH)):ImVec2((0.16*canvasH)+0.5*canvasW*mobileMenuPos,0.0f));
patWindowSize=(portrait?ImVec2(canvasW,canvasH-(0.16*canvasW)):ImVec2(canvasW-(0.16*canvasH),canvasH));
ImGui::SetNextWindowPos(patWindowPos);
ImGui::SetNextWindowSize(patWindowSize);
} else {
//ImGui::SetNextWindowSizeConstraints(ImVec2(440.0f*dpiScale,400.0f*dpiScale),ImVec2(canvasW,canvasH));
}
2024-05-27 18:53:46 -04:00
if (ImGui::Begin("Chip Manager",&sysManagerOpen,globalWinFlags,_("Chip Manager"))) {
2024-05-26 20:31:17 -04:00
ImGui::Checkbox(_("Preserve channel order"),&preserveChanPos);
ImGui::SameLine();
2024-05-26 20:31:17 -04:00
ImGui::Checkbox(_("Clone channel data"),&sysDupCloneChannels);
2024-02-22 12:48:16 -05:00
ImGui::SameLine();
2024-05-26 20:31:17 -04:00
ImGui::Checkbox(_("Clone at end"),&sysDupEnd);
2022-08-26 17:44:27 -04:00
if (ImGui::BeginTable("SystemList",3)) {
2022-08-26 19:51:17 -04:00
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed);
ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch);
ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthFixed);
2022-08-26 17:44:27 -04:00
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
ImGui::TableNextColumn();
ImGui::TableNextColumn();
2024-05-26 20:31:17 -04:00
ImGui::Text(_("Name"));
2022-08-26 19:51:17 -04:00
ImGui::TableNextColumn();
2024-05-26 20:31:17 -04:00
ImGui::Text(_("Actions"));
2022-08-26 19:51:17 -04:00
for (unsigned char i=0; i<e->song.systemLen; i++) {
2022-08-26 17:44:27 -04:00
ImGui::PushID(i);
ImGui::TableNextRow();
ImGui::TableNextColumn();
if (ImGui::Button(ICON_FA_ARROWS)) {
}
if (ImGui::BeginDragDropSource()) {
2022-08-26 19:51:17 -04:00
sysToMove=i;
ImGui::SetDragDropPayload("FUR_SYS",NULL,0,ImGuiCond_Once);
ImGui::Button(ICON_FA_ARROWS "##SysDrag");
2022-08-26 17:44:27 -04:00
ImGui::EndDragDropSource();
} else if (ImGui::IsItemHovered()) {
2024-05-26 20:31:17 -04:00
ImGui::SetTooltip(_("(drag to swap chips)"));
2022-08-26 17:44:27 -04:00
}
if (ImGui::BeginDragDropTarget()) {
2022-08-26 19:51:17 -04:00
const ImGuiPayload* dragItem=ImGui::AcceptDragDropPayload("FUR_SYS");
2022-08-26 17:44:27 -04:00
if (dragItem!=NULL) {
2022-08-26 19:51:17 -04:00
if (dragItem->IsDataType("FUR_SYS")) {
if (sysToMove!=i && sysToMove>=0) {
e->swapSystem(sysToMove,i,preserveChanPos);
2022-10-16 19:28:42 -04:00
MARK_MODIFIED;
2022-08-26 17:44:27 -04:00
}
2022-08-26 19:51:17 -04:00
sysToMove=-1;
2022-08-26 17:44:27 -04:00
}
}
ImGui::EndDragDropTarget();
}
ImGui::TableNextColumn();
2024-08-19 03:45:00 -04:00
bool isNotCollapsed=true;
2022-08-26 19:51:17 -04:00
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);
2024-03-03 13:39:45 -05:00
isNotCollapsed=false;
2022-08-26 19:51:17 -04:00
ImGui::TreePop();
}
2024-10-10 15:25:12 -04:00
if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary) && isNotCollapsed) {
2024-03-03 13:39:45 -05:00
if (e->song.system[i]!=DIV_SYSTEM_NULL) {
const DivSysDef* sysDef=e->getSystemDef(e->song.system[i]);
2024-03-22 07:20:24 -04:00
if (ImGui::BeginTooltip()) {
ImGui::PushTextWrapPos(420.0f*dpiScale); // arbitrary constant
2024-03-03 13:39:45 -05:00
ImGui::TextWrapped("%s",sysDef->description);
ImGui::Separator();
2024-10-10 15:25:12 -04:00
drawSystemChannelInfoText(sysDef);
drawSystemChannelInfo(sysDef);
2024-03-03 13:39:45 -05:00
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
}
}
}
2022-08-26 17:44:27 -04:00
ImGui::TableNextColumn();
2024-05-26 20:31:17 -04:00
if (ImGui::Button(_("Clone##SysDup"))) {
2024-02-22 12:48:16 -05:00
if (!e->duplicateSystem(i,sysDupCloneChannels,sysDupEnd)) {
2024-05-26 20:31:17 -04:00
showError(fmt::sprintf(_("cannot clone chip! (%s)"),e->getLastError()));
} else {
2024-08-15 12:27:30 -04:00
if (e->song.autoSystem) {
autoDetectSystem();
updateWindowTitle();
}
updateROMExportAvail();
MARK_MODIFIED;
}
}
ImGui::SameLine();
2024-05-26 20:31:17 -04:00
ImGui::Button(_("Change##SysChange"));
2022-08-26 20:30:13 -04:00
if (ImGui::BeginPopupContextItem("SysPickerC",ImGuiPopupFlags_MouseButtonLeft)) {
2024-08-24 05:24:58 -04:00
DivSystem picked=systemPicker(false);
2022-08-26 20:30:13 -04:00
if (picked!=DIV_SYSTEM_NULL) {
if (e->changeSystem(i,picked,preserveChanPos)) {
MARK_MODIFIED;
if (e->song.autoSystem) {
autoDetectSystem();
}
updateWindowTitle();
2024-08-15 12:27:30 -04:00
updateROMExportAvail();
} else {
2024-05-26 20:31:17 -04:00
showError(fmt::sprintf(_("cannot change chip! (%s)"),e->getLastError()));
2022-09-21 20:27:42 -04:00
}
2022-08-27 00:35:16 -04:00
ImGui::CloseCurrentPopup();
2022-08-26 20:30:13 -04:00
}
ImGui::EndPopup();
}
2022-08-26 19:51:17 -04:00
ImGui::SameLine();
ImGui::BeginDisabled(e->song.systemLen<=1);
2023-08-26 07:37:28 -04:00
pushDestColor();
2023-08-27 02:18:39 -04:00
if (ImGui::Button(ICON_FA_TIMES "##SysRemove")) {
2022-08-26 19:51:17 -04:00
sysToDelete=i;
2024-05-26 20:31:17 -04:00
showWarning(_("Are you sure you want to remove this chip?"),GUI_WARN_SYSTEM_DEL);
2022-08-26 19:51:17 -04:00
}
2023-08-26 07:37:28 -04:00
popDestColor();
2022-08-26 19:51:17 -04:00
if (ImGui::IsItemHovered()) {
2024-05-26 20:31:17 -04:00
ImGui::SetTooltip(_("Remove"));
2022-08-26 19:51:17 -04:00
}
ImGui::EndDisabled();
2022-08-26 17:44:27 -04:00
ImGui::PopID();
}
if (e->song.systemLen<DIV_MAX_CHIPS) {
2022-08-26 19:51:17 -04:00
ImGui::TableNextRow();
ImGui::TableNextColumn();
ImGui::TableNextColumn();
ImGui::Button(ICON_FA_PLUS "##SysAdd");
2022-08-26 20:30:13 -04:00
if (ImGui::BeginPopupContextItem("SysPickerA",ImGuiPopupFlags_MouseButtonLeft)) {
2024-08-24 05:24:58 -04:00
DivSystem picked=systemPicker(false);
2022-08-26 20:30:13 -04:00
if (picked!=DIV_SYSTEM_NULL) {
if (!e->addSystem(picked)) {
2024-05-26 20:31:17 -04:00
showError(fmt::sprintf(_("cannot add chip! (%s)"),e->getLastError()));
2022-10-16 19:28:42 -04:00
} else {
MARK_MODIFIED;
2022-08-26 20:30:13 -04:00
}
2022-09-21 20:27:42 -04:00
if (e->song.autoSystem) {
autoDetectSystem();
}
2022-08-26 20:30:13 -04:00
updateWindowTitle();
2024-08-15 12:27:30 -04:00
updateROMExportAvail();
2022-08-27 00:35:16 -04:00
ImGui::CloseCurrentPopup();
2022-08-26 20:30:13 -04:00
}
ImGui::EndPopup();
}
2022-08-26 19:51:17 -04:00
}
2022-08-26 17:44:27 -04:00
ImGui::EndTable();
}
2022-08-19 05:41:45 -04:00
}
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_SYS_MANAGER;
ImGui::End();
}