diff --git a/CMakeLists.txt b/CMakeLists.txt index 57b342527..3cdeefe36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -993,6 +993,7 @@ src/gui/memory.cpp src/gui/mixer.cpp src/gui/midiMap.cpp src/gui/multiInsSetup.cpp +src/gui/newPattern.cpp src/gui/newSong.cpp src/gui/orders.cpp src/gui/osc.cpp diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index 3b16af41b..38bda31c3 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -476,6 +476,8 @@ void FurnaceGUI::drawMobileControls() { ImGui::EndTable(); } + ImGui::Checkbox("New Pattern",&newPatternRenderer); + ImGui::Separator(); switch (mobScene) { diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 9cab5c014..98be36f9b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4931,6 +4931,8 @@ bool FurnaceGUI::loop() { } ImGui::EndMenu(); } + ImGui::Checkbox("New Pattern",&newPatternRenderer); + ImGui::SameLine(); ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_PLAYBACK_STAT]); if (e->isPlaying() && settings.playbackTime) { TimeMicros totalTime=e->getCurTime(); @@ -8765,6 +8767,7 @@ FurnaceGUI::FurnaceGUI(): replacePendingSample(false), displayExportingROM(false), displayExportingCS(false), + newPatternRenderer(false), quitNoSave(false), changeCoarse(false), orderLock(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 008e1a40d..e96267036 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1747,6 +1747,7 @@ class FurnaceGUI { bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex, displayEditString; bool displayPendingSamples, replacePendingSample; bool displayExportingROM, displayExportingCS; + bool newPatternRenderer; bool quitNoSave; bool changeCoarse; bool orderLock; @@ -3058,6 +3059,7 @@ class FurnaceGUI { void drawGrooves(); void drawOrders(); void drawPattern(); + void drawPatternNew(); void drawInsList(bool asChild=false); void drawInsEdit(); void drawInsSID3(DivInstrument* ins); diff --git a/src/gui/newPattern.cpp b/src/gui/newPattern.cpp new file mode 100644 index 000000000..1e0e25941 --- /dev/null +++ b/src/gui/newPattern.cpp @@ -0,0 +1,102 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2025 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. + */ + +// for suck's fake Clang extension! +#define _USE_MATH_DEFINES +#include "gui.h" +#include "../ta-log.h" +#include "imgui_internal.h" +#include "IconsFontAwesome4.h" +#include "furIcons.h" +#include "misc/cpp/imgui_stdlib.h" +#include "guiConst.h" +#include "../utfutils.h" +#include + +void FurnaceGUI::drawPatternNew() { + if (nextWindow==GUI_WINDOW_PATTERN) { + patternOpen=true; + ImGui::SetNextWindowFocus(); + nextWindow=GUI_WINDOW_NOTHING; + } + if (!patternOpen) return; + + if (e->isPlaying() && followPattern) { + if (oldRowChanged || !e->isStepping()) { + if (e->isStepping()) pendingStepUpdate=1; + cursor.y=oldRow; + cursor.order=curOrder; + if (selStart.xCoarse==selEnd.xCoarse && selStart.xFine==selEnd.xFine && selStart.y==selEnd.y && selStart.order==selEnd.order && !selecting) { + selStart=cursor; + selEnd=cursor; + } + } + } + sel1=selStart; + sel2=selEnd; + if (sel2.order