furnace/src/gui/gui.h

832 lines
22 KiB
C
Raw Normal View History

2022-02-15 03:12:20 +00:00
/**
* Furnace Tracker - multi-system chiptune tracker
* Copyright (C) 2021-2022 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.
*/
2021-12-11 07:10:09 +00:00
#include "../engine/engine.h"
2021-12-11 08:11:40 +00:00
#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_sdlrenderer.h"
#include <SDL.h>
2021-12-24 23:27:55 +00:00
#include <deque>
2022-03-02 07:22:51 +00:00
#include <initializer_list>
2021-12-14 22:45:37 +00:00
#include <map>
#include <vector>
2021-12-11 07:10:09 +00:00
#include "fileDialog.h"
2022-03-01 03:42:52 +00:00
#define rightClickable if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) ImGui::SetKeyboardFocusHere(-1);
#define handleUnimportant if (settings.insFocusesPattern && patternOpen) {nextWindow=GUI_WINDOW_PATTERN;}
#define unimportant(x) if (x) {handleUnimportant}
2021-12-13 22:09:46 +00:00
enum FurnaceGUIColors {
GUI_COLOR_BACKGROUND=0,
GUI_COLOR_FRAME_BACKGROUND,
GUI_COLOR_MODAL_BACKDROP,
2021-12-13 22:09:46 +00:00
GUI_COLOR_HEADER,
GUI_COLOR_TEXT,
GUI_COLOR_ACCENT_PRIMARY,
GUI_COLOR_ACCENT_SECONDARY,
GUI_COLOR_EDITING,
2022-01-27 06:04:26 +00:00
GUI_COLOR_SONG_LOOP,
2022-01-29 23:56:08 +00:00
GUI_COLOR_VOLMETER_LOW,
GUI_COLOR_VOLMETER_HIGH,
GUI_COLOR_VOLMETER_PEAK,
GUI_COLOR_MACRO_VOLUME,
GUI_COLOR_MACRO_PITCH,
GUI_COLOR_MACRO_OTHER,
GUI_COLOR_MACRO_WAVE,
2021-12-29 04:10:30 +00:00
GUI_COLOR_INSTR_FM,
GUI_COLOR_INSTR_STD,
2022-01-09 22:48:09 +00:00
GUI_COLOR_INSTR_GB,
GUI_COLOR_INSTR_C64,
GUI_COLOR_INSTR_AMIGA,
GUI_COLOR_INSTR_PCE,
GUI_COLOR_INSTR_AY,
2022-01-14 05:02:10 +00:00
GUI_COLOR_INSTR_AY8930,
2022-01-14 20:21:57 +00:00
GUI_COLOR_INSTR_TIA,
2022-01-15 04:26:22 +00:00
GUI_COLOR_INSTR_SAA1099,
GUI_COLOR_INSTR_VIC,
GUI_COLOR_INSTR_PET,
GUI_COLOR_INSTR_VRC6,
GUI_COLOR_INSTR_OPLL,
GUI_COLOR_INSTR_OPL,
GUI_COLOR_INSTR_FDS,
GUI_COLOR_INSTR_VBOY,
GUI_COLOR_INSTR_N163,
GUI_COLOR_INSTR_SCC,
GUI_COLOR_INSTR_OPZ,
GUI_COLOR_INSTR_POKEY,
GUI_COLOR_INSTR_BEEPER,
GUI_COLOR_INSTR_SWAN,
2022-02-20 17:15:15 +00:00
GUI_COLOR_INSTR_MIKEY,
2022-03-10 22:46:40 +00:00
GUI_COLOR_INSTR_VERA,
GUI_COLOR_INSTR_X1_010,
2022-01-09 22:48:09 +00:00
GUI_COLOR_INSTR_UNKNOWN,
2021-12-23 16:29:11 +00:00
GUI_COLOR_CHANNEL_FM,
GUI_COLOR_CHANNEL_PULSE,
GUI_COLOR_CHANNEL_NOISE,
GUI_COLOR_CHANNEL_WAVE,
GUI_COLOR_CHANNEL_PCM,
2021-12-23 22:09:33 +00:00
GUI_COLOR_CHANNEL_OP,
GUI_COLOR_CHANNEL_MUTED,
2021-12-23 16:29:11 +00:00
GUI_COLOR_PATTERN_CURSOR,
GUI_COLOR_PATTERN_CURSOR_HOVER,
GUI_COLOR_PATTERN_CURSOR_ACTIVE,
GUI_COLOR_PATTERN_SELECTION,
GUI_COLOR_PATTERN_SELECTION_HOVER,
GUI_COLOR_PATTERN_SELECTION_ACTIVE,
2021-12-13 22:09:46 +00:00
GUI_COLOR_PATTERN_HI_1,
GUI_COLOR_PATTERN_HI_2,
GUI_COLOR_PATTERN_ROW_INDEX,
GUI_COLOR_PATTERN_ACTIVE,
GUI_COLOR_PATTERN_INACTIVE,
GUI_COLOR_PATTERN_INS,
GUI_COLOR_PATTERN_VOLUME_MAX,
GUI_COLOR_PATTERN_VOLUME_HALF,
GUI_COLOR_PATTERN_VOLUME_MIN,
GUI_COLOR_PATTERN_EFFECT_INVALID,
GUI_COLOR_PATTERN_EFFECT_PITCH,
GUI_COLOR_PATTERN_EFFECT_VOLUME,
GUI_COLOR_PATTERN_EFFECT_PANNING,
GUI_COLOR_PATTERN_EFFECT_SONG,
GUI_COLOR_PATTERN_EFFECT_TIME,
GUI_COLOR_PATTERN_EFFECT_SPEED,
GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY,
GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY,
GUI_COLOR_PATTERN_EFFECT_MISC,
GUI_COLOR_EE_VALUE,
2021-12-21 07:30:09 +00:00
GUI_COLOR_PLAYBACK_STAT,
2021-12-13 22:09:46 +00:00
GUI_COLOR_MAX
};
2021-12-14 22:45:37 +00:00
enum FurnaceGUIWindows {
GUI_WINDOW_NOTHING=0,
2021-12-15 22:32:08 +00:00
GUI_WINDOW_EDIT_CONTROLS,
2021-12-14 22:45:37 +00:00
GUI_WINDOW_SONG_INFO,
GUI_WINDOW_ORDERS,
GUI_WINDOW_INS_LIST,
GUI_WINDOW_PATTERN,
GUI_WINDOW_INS_EDIT,
GUI_WINDOW_WAVE_LIST,
GUI_WINDOW_WAVE_EDIT,
GUI_WINDOW_SAMPLE_LIST,
GUI_WINDOW_SAMPLE_EDIT,
GUI_WINDOW_MIXER,
GUI_WINDOW_ABOUT,
GUI_WINDOW_SETTINGS,
GUI_WINDOW_DEBUG,
2022-02-12 07:14:25 +00:00
GUI_WINDOW_OSCILLOSCOPE,
GUI_WINDOW_VOL_METER,
GUI_WINDOW_STATS,
GUI_WINDOW_COMPAT_FLAGS,
GUI_WINDOW_PIANO,
GUI_WINDOW_NOTES,
GUI_WINDOW_CHANNELS,
GUI_WINDOW_REGISTER_VIEW
2021-12-14 22:45:37 +00:00
};
enum FurnaceGUIFileDialogs {
GUI_FILE_OPEN,
GUI_FILE_SAVE,
GUI_FILE_SAVE_DMF_LEGACY,
2022-01-19 08:15:20 +00:00
GUI_FILE_INS_OPEN,
GUI_FILE_INS_SAVE,
GUI_FILE_WAVE_OPEN,
GUI_FILE_WAVE_SAVE,
GUI_FILE_SAMPLE_OPEN,
GUI_FILE_SAMPLE_SAVE,
GUI_FILE_EXPORT_AUDIO_ONE,
GUI_FILE_EXPORT_AUDIO_PER_SYS,
GUI_FILE_EXPORT_AUDIO_PER_CHANNEL,
GUI_FILE_EXPORT_VGM,
GUI_FILE_EXPORT_ROM,
GUI_FILE_LOAD_MAIN_FONT,
GUI_FILE_LOAD_PAT_FONT
};
2021-12-30 23:52:36 +00:00
enum FurnaceGUIWarnings {
GUI_WARN_QUIT,
GUI_WARN_NEW,
2022-01-29 06:22:32 +00:00
GUI_WARN_OPEN,
GUI_WARN_OPEN_DROP,
GUI_WARN_RESET_LAYOUT,
2022-01-29 06:22:32 +00:00
GUI_WARN_GENERIC
2021-12-30 23:52:36 +00:00
};
2022-02-10 06:45:26 +00:00
enum FurnaceGUIFMAlgs {
FM_ALGS_4OP,
FM_ALGS_2OP_OPL,
FM_ALGS_4OP_OPL
};
enum FurnaceGUIActions {
2022-02-11 06:56:59 +00:00
GUI_ACTION_GLOBAL_MIN=0,
GUI_ACTION_OPEN,
GUI_ACTION_SAVE,
GUI_ACTION_SAVE_AS,
GUI_ACTION_UNDO,
GUI_ACTION_REDO,
GUI_ACTION_PLAY_TOGGLE,
GUI_ACTION_PLAY,
GUI_ACTION_STOP,
GUI_ACTION_PLAY_REPEAT,
GUI_ACTION_PLAY_CURSOR,
GUI_ACTION_STEP_ONE,
GUI_ACTION_OCTAVE_UP,
GUI_ACTION_OCTAVE_DOWN,
GUI_ACTION_INS_UP,
GUI_ACTION_INS_DOWN,
GUI_ACTION_STEP_UP,
GUI_ACTION_STEP_DOWN,
GUI_ACTION_TOGGLE_EDIT,
GUI_ACTION_METRONOME,
GUI_ACTION_REPEAT_PATTERN,
GUI_ACTION_FOLLOW_ORDERS,
GUI_ACTION_FOLLOW_PATTERN,
GUI_ACTION_PANIC,
GUI_ACTION_WINDOW_EDIT_CONTROLS,
GUI_ACTION_WINDOW_ORDERS,
GUI_ACTION_WINDOW_INS_LIST,
GUI_ACTION_WINDOW_INS_EDIT,
GUI_ACTION_WINDOW_SONG_INFO,
GUI_ACTION_WINDOW_PATTERN,
GUI_ACTION_WINDOW_WAVE_LIST,
GUI_ACTION_WINDOW_WAVE_EDIT,
GUI_ACTION_WINDOW_SAMPLE_LIST,
GUI_ACTION_WINDOW_SAMPLE_EDIT,
GUI_ACTION_WINDOW_ABOUT,
GUI_ACTION_WINDOW_SETTINGS,
GUI_ACTION_WINDOW_MIXER,
GUI_ACTION_WINDOW_DEBUG,
2022-02-12 07:14:25 +00:00
GUI_ACTION_WINDOW_OSCILLOSCOPE,
GUI_ACTION_WINDOW_VOL_METER,
GUI_ACTION_WINDOW_STATS,
GUI_ACTION_WINDOW_COMPAT_FLAGS,
GUI_ACTION_WINDOW_PIANO,
GUI_ACTION_WINDOW_NOTES,
GUI_ACTION_WINDOW_CHANNELS,
GUI_ACTION_WINDOW_REGISTER_VIEW,
GUI_ACTION_COLLAPSE_WINDOW,
GUI_ACTION_CLOSE_WINDOW,
2022-02-11 06:56:59 +00:00
GUI_ACTION_GLOBAL_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_MIN,
GUI_ACTION_PAT_NOTE_UP,
GUI_ACTION_PAT_NOTE_DOWN,
GUI_ACTION_PAT_OCTAVE_UP,
GUI_ACTION_PAT_OCTAVE_DOWN,
GUI_ACTION_PAT_SELECT_ALL,
GUI_ACTION_PAT_CUT,
GUI_ACTION_PAT_COPY,
GUI_ACTION_PAT_PASTE,
GUI_ACTION_PAT_PASTE_MIX,
GUI_ACTION_PAT_PASTE_MIX_BG,
GUI_ACTION_PAT_PASTE_FLOOD,
GUI_ACTION_PAT_PASTE_OVERFLOW,
GUI_ACTION_PAT_CURSOR_UP,
GUI_ACTION_PAT_CURSOR_DOWN,
GUI_ACTION_PAT_CURSOR_LEFT,
GUI_ACTION_PAT_CURSOR_RIGHT,
GUI_ACTION_PAT_CURSOR_UP_ONE,
GUI_ACTION_PAT_CURSOR_DOWN_ONE,
GUI_ACTION_PAT_CURSOR_LEFT_CHANNEL,
GUI_ACTION_PAT_CURSOR_RIGHT_CHANNEL,
GUI_ACTION_PAT_CURSOR_NEXT_CHANNEL,
GUI_ACTION_PAT_CURSOR_PREVIOUS_CHANNEL,
GUI_ACTION_PAT_CURSOR_BEGIN,
GUI_ACTION_PAT_CURSOR_END,
GUI_ACTION_PAT_CURSOR_UP_COARSE,
GUI_ACTION_PAT_CURSOR_DOWN_COARSE,
GUI_ACTION_PAT_SELECTION_UP,
GUI_ACTION_PAT_SELECTION_DOWN,
GUI_ACTION_PAT_SELECTION_LEFT,
GUI_ACTION_PAT_SELECTION_RIGHT,
GUI_ACTION_PAT_SELECTION_UP_ONE,
GUI_ACTION_PAT_SELECTION_DOWN_ONE,
GUI_ACTION_PAT_SELECTION_BEGIN,
GUI_ACTION_PAT_SELECTION_END,
GUI_ACTION_PAT_SELECTION_UP_COARSE,
GUI_ACTION_PAT_SELECTION_DOWN_COARSE,
GUI_ACTION_PAT_DELETE,
GUI_ACTION_PAT_PULL_DELETE,
GUI_ACTION_PAT_INSERT,
GUI_ACTION_PAT_MUTE_CURSOR,
GUI_ACTION_PAT_SOLO_CURSOR,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_UNMUTE_ALL,
GUI_ACTION_PAT_NEXT_ORDER,
GUI_ACTION_PAT_PREV_ORDER,
GUI_ACTION_PAT_COLLAPSE,
GUI_ACTION_PAT_INCREASE_COLUMNS,
GUI_ACTION_PAT_DECREASE_COLUMNS,
GUI_ACTION_PAT_INTERPOLATE,
2022-03-12 08:04:34 +00:00
GUI_ACTION_PAT_FADE,
GUI_ACTION_PAT_INVERT_VALUES,
GUI_ACTION_PAT_FLIP_SELECTION,
GUI_ACTION_PAT_COLLAPSE_ROWS,
GUI_ACTION_PAT_EXPAND_ROWS,
GUI_ACTION_PAT_COLLAPSE_PAT,
GUI_ACTION_PAT_EXPAND_PAT,
GUI_ACTION_PAT_COLLAPSE_SONG,
GUI_ACTION_PAT_EXPAND_SONG,
GUI_ACTION_PAT_LATCH,
2022-02-11 06:56:59 +00:00
GUI_ACTION_PAT_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_INS_LIST_MIN,
GUI_ACTION_INS_LIST_ADD,
GUI_ACTION_INS_LIST_DUPLICATE,
GUI_ACTION_INS_LIST_OPEN,
GUI_ACTION_INS_LIST_SAVE,
GUI_ACTION_INS_LIST_MOVE_UP,
GUI_ACTION_INS_LIST_MOVE_DOWN,
GUI_ACTION_INS_LIST_DELETE,
GUI_ACTION_INS_LIST_EDIT,
GUI_ACTION_INS_LIST_UP,
GUI_ACTION_INS_LIST_DOWN,
2022-02-11 06:56:59 +00:00
GUI_ACTION_INS_LIST_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_WAVE_LIST_MIN,
GUI_ACTION_WAVE_LIST_ADD,
GUI_ACTION_WAVE_LIST_DUPLICATE,
GUI_ACTION_WAVE_LIST_OPEN,
GUI_ACTION_WAVE_LIST_SAVE,
GUI_ACTION_WAVE_LIST_MOVE_UP,
GUI_ACTION_WAVE_LIST_MOVE_DOWN,
GUI_ACTION_WAVE_LIST_DELETE,
GUI_ACTION_WAVE_LIST_EDIT,
GUI_ACTION_WAVE_LIST_UP,
GUI_ACTION_WAVE_LIST_DOWN,
2022-02-11 06:56:59 +00:00
GUI_ACTION_WAVE_LIST_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_SAMPLE_LIST_MIN,
GUI_ACTION_SAMPLE_LIST_ADD,
GUI_ACTION_SAMPLE_LIST_DUPLICATE,
GUI_ACTION_SAMPLE_LIST_OPEN,
GUI_ACTION_SAMPLE_LIST_SAVE,
GUI_ACTION_SAMPLE_LIST_MOVE_UP,
GUI_ACTION_SAMPLE_LIST_MOVE_DOWN,
GUI_ACTION_SAMPLE_LIST_DELETE,
GUI_ACTION_SAMPLE_LIST_EDIT,
GUI_ACTION_SAMPLE_LIST_UP,
GUI_ACTION_SAMPLE_LIST_DOWN,
GUI_ACTION_SAMPLE_LIST_PREVIEW,
GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,
2022-02-11 06:56:59 +00:00
GUI_ACTION_SAMPLE_LIST_MAX,
2022-02-11 06:56:59 +00:00
GUI_ACTION_ORDERS_MIN,
GUI_ACTION_ORDERS_UP,
GUI_ACTION_ORDERS_DOWN,
GUI_ACTION_ORDERS_LEFT,
GUI_ACTION_ORDERS_RIGHT,
GUI_ACTION_ORDERS_INCREASE,
GUI_ACTION_ORDERS_DECREASE,
GUI_ACTION_ORDERS_EDIT_MODE,
GUI_ACTION_ORDERS_LINK,
GUI_ACTION_ORDERS_ADD,
GUI_ACTION_ORDERS_DUPLICATE,
GUI_ACTION_ORDERS_DEEP_CLONE,
GUI_ACTION_ORDERS_DUPLICATE_END,
GUI_ACTION_ORDERS_DEEP_CLONE_END,
GUI_ACTION_ORDERS_REMOVE,
GUI_ACTION_ORDERS_MOVE_UP,
GUI_ACTION_ORDERS_MOVE_DOWN,
GUI_ACTION_ORDERS_REPLAY,
2022-02-11 06:56:59 +00:00
GUI_ACTION_ORDERS_MAX,
2022-02-10 22:44:27 +00:00
GUI_ACTION_MAX
};
enum PasteMode {
GUI_PASTE_MODE_NORMAL=0,
GUI_PASTE_MODE_MIX_FG,
GUI_PASTE_MODE_MIX_BG,
GUI_PASTE_MODE_FLOOD,
GUI_PASTE_MODE_OVERFLOW
};
2022-02-11 06:56:59 +00:00
#define FURKMOD_CTRL (1<<31)
#define FURKMOD_SHIFT (1<<29)
#define FURKMOD_META (1<<28)
#define FURKMOD_ALT (1<<27)
#define FURK_MASK 0x40ffffff
2022-02-11 06:56:59 +00:00
2021-12-14 09:45:44 +00:00
struct SelectionPoint {
int xCoarse, xFine;
int y;
2021-12-14 22:45:37 +00:00
SelectionPoint():
xCoarse(0), xFine(0), y(0) {}
2021-12-14 09:45:44 +00:00
};
2021-12-22 22:59:19 +00:00
enum ActionType {
GUI_UNDO_CHANGE_ORDER,
GUI_UNDO_PATTERN_EDIT,
GUI_UNDO_PATTERN_DELETE,
GUI_UNDO_PATTERN_PULL,
GUI_UNDO_PATTERN_PUSH,
GUI_UNDO_PATTERN_CUT,
GUI_UNDO_PATTERN_PASTE,
GUI_UNDO_PATTERN_CHANGE_INS,
GUI_UNDO_PATTERN_INTERPOLATE,
2022-03-12 08:04:34 +00:00
GUI_UNDO_PATTERN_FADE,
GUI_UNDO_PATTERN_SCALE,
GUI_UNDO_PATTERN_RANDOMIZE,
GUI_UNDO_PATTERN_INVERT_VAL,
GUI_UNDO_PATTERN_FLIP,
GUI_UNDO_PATTERN_COLLAPSE,
GUI_UNDO_PATTERN_EXPAND
2021-12-22 22:59:19 +00:00
};
2021-12-26 23:05:18 +00:00
struct UndoPatternData {
int chan, pat, row, col;
short oldVal, newVal;
UndoPatternData(int c, int p, int r, int co, short v1, short v2):
chan(c),
pat(p),
row(r),
2021-12-26 23:28:06 +00:00
col(co),
2021-12-26 23:05:18 +00:00
oldVal(v1),
newVal(v2) {}
};
struct UndoOrderData {
int chan, ord;
unsigned char oldVal, newVal;
UndoOrderData(int c, int o, unsigned char v1, unsigned char v2):
chan(c),
ord(o),
oldVal(v1),
newVal(v2) {}
2021-12-22 22:59:19 +00:00
};
struct UndoStep {
ActionType type;
2021-12-26 23:05:18 +00:00
SelectionPoint cursor, selStart, selEnd;
int order;
bool nibble;
int oldOrdersLen, newOrdersLen;
int oldPatLen, newPatLen;
std::vector<UndoOrderData> ord;
std::vector<UndoPatternData> pat;
2021-12-22 22:59:19 +00:00
};
2022-02-15 23:52:12 +00:00
struct Particle {
ImU32* colors;
const char* type;
ImVec2 pos, speed;
float gravity, friction, life, lifeSpeed;
bool update(float frameTime);
2022-02-15 23:52:12 +00:00
Particle(ImU32* color, const char* ty, float x, float y, float sX, float sY, float g, float fr, float l, float lS):
colors(color),
type(ty),
pos(x,y),
speed(sX,sY),
gravity(g),
friction(fr),
life(l),
lifeSpeed(lS) {}
};
2022-03-01 22:19:52 +00:00
struct FurnaceGUISysDef {
const char* name;
2022-03-02 07:22:51 +00:00
std::vector<int> definition;
FurnaceGUISysDef(const char* n, std::initializer_list<int> def):
name(n), definition(def) {
}
2022-03-01 22:19:52 +00:00
};
struct FurnaceGUISysCategory {
const char* name;
std::vector<FurnaceGUISysDef> systems;
FurnaceGUISysCategory(const char* n):
name(n) {}
FurnaceGUISysCategory():
name(NULL) {}
};
2021-12-11 07:10:09 +00:00
class FurnaceGUI {
DivEngine* e;
2021-12-11 08:11:40 +00:00
SDL_Window* sdlWin;
SDL_Renderer* sdlRend;
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile;
String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport, workingDirVGMExport, workingDirFont;
String mmlString[12];
String mmlStringW;
bool quit, warnQuit, willCommit, edit, modified, displayError, displayExporting, vgmExportLoop;
2022-03-01 22:19:52 +00:00
bool displayNew;
bool willExport[32];
FurnaceGUIFileDialogs curFileDialog;
2021-12-30 23:52:36 +00:00
FurnaceGUIWarnings warnAction;
2021-12-11 08:11:40 +00:00
FurnaceGUIFileDialog* fileDialog;
2021-12-11 08:11:40 +00:00
int scrW, scrH;
double dpiScale;
2022-02-20 09:26:35 +00:00
double aboutScroll, aboutSin;
2021-12-19 04:03:50 +00:00
float aboutHue;
2021-12-11 08:11:40 +00:00
ImFont* mainFont;
2021-12-21 05:30:55 +00:00
ImFont* iconFont;
2021-12-11 08:11:40 +00:00
ImFont* patFont;
2021-12-19 04:03:50 +00:00
ImFont* bigFont;
2021-12-13 22:09:46 +00:00
ImVec4 uiColors[GUI_COLOR_MAX];
ImVec4 volColors[128];
ImU32 pitchGrad[256];
ImU32 volGrad[256];
ImU32 noteGrad[256];
ImU32 panGrad[256];
ImU32 insGrad[256];
ImU32 sysCmd1Grad[256];
ImU32 sysCmd2Grad[256];
2021-12-11 08:11:40 +00:00
2022-01-16 22:25:43 +00:00
struct Settings {
int mainFontSize, patFontSize, iconSize;
int audioEngine;
int audioQuality;
2022-01-16 22:25:43 +00:00
int arcadeCore;
int ym2612Core;
int saaCore;
2022-01-16 22:25:43 +00:00
int mainFont;
int patFont;
int audioRate;
int audioBufSize;
2022-01-19 23:04:07 +00:00
int patRowsBase;
int orderRowsBase;
int soloAction;
int pullDeleteBehavior;
int wrapHorizontal;
int wrapVertical;
2022-01-23 21:34:20 +00:00
int macroView;
2022-01-27 20:01:05 +00:00
int fmNames;
int allowEditDocking;
2022-01-28 08:17:35 +00:00
int chipNames;
int overflowHighlight;
int partyTime;
2022-02-03 19:40:09 +00:00
int germanNotation;
int stepOnDelete;
int scrollStep;
int sysSeparators;
int forceMono;
int controlLayout;
int restartOnFlagChange;
2022-02-15 06:46:03 +00:00
int statusDisplay;
2022-02-15 22:42:56 +00:00
float dpiScale;
int viewPrevPattern;
int guiColorsBase;
int avoidRaisingPattern;
int insFocusesPattern;
int stepOnInsert;
// TODO flags
int unifiedDataView;
int sysFileDialog;
// end
2022-01-16 22:25:43 +00:00
unsigned int maxUndoSteps;
String mainFontPath;
String patFontPath;
2022-02-14 02:42:57 +00:00
String audioDevice;
2022-01-16 22:25:43 +00:00
Settings():
mainFontSize(18),
patFontSize(18),
iconSize(16),
audioEngine(DIV_AUDIO_SDL),
audioQuality(0),
2022-01-16 22:25:43 +00:00
arcadeCore(0),
ym2612Core(0),
saaCore(1),
2022-01-16 22:25:43 +00:00
mainFont(0),
patFont(0),
audioRate(44100),
audioBufSize(1024),
2022-01-19 23:04:07 +00:00
patRowsBase(0),
orderRowsBase(1),
soloAction(0),
pullDeleteBehavior(1),
wrapHorizontal(0),
wrapVertical(0),
2022-01-23 21:34:20 +00:00
macroView(0),
2022-01-27 20:01:05 +00:00
fmNames(0),
allowEditDocking(0),
2022-01-28 08:17:35 +00:00
chipNames(0),
overflowHighlight(0),
partyTime(0),
2022-02-03 19:40:09 +00:00
germanNotation(0),
stepOnDelete(0),
scrollStep(0),
sysSeparators(1),
forceMono(0),
controlLayout(0),
restartOnFlagChange(1),
2022-02-15 06:46:03 +00:00
statusDisplay(0),
2022-02-15 22:42:56 +00:00
dpiScale(0.0f),
viewPrevPattern(1),
guiColorsBase(0),
avoidRaisingPattern(0),
insFocusesPattern(1),
stepOnInsert(0),
unifiedDataView(0),
sysFileDialog(1),
2022-01-16 22:25:43 +00:00
maxUndoSteps(100),
mainFontPath(""),
2022-02-14 02:42:57 +00:00
patFontPath(""),
audioDevice("") {}
2022-01-16 22:25:43 +00:00
} settings;
2021-12-20 03:51:02 +00:00
2021-12-19 21:01:24 +00:00
char finalLayoutPath[4096];
2021-12-19 08:16:24 +00:00
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor;
2022-03-02 07:22:51 +00:00
int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory;
2021-12-15 22:32:08 +00:00
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
2021-12-20 03:51:02 +00:00
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
bool mixerOpen, debugOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen;
bool pianoOpen, notesOpen, channelsOpen, regViewOpen;
2022-01-20 07:11:03 +00:00
SelectionPoint selStart, selEnd, cursor;
2022-02-21 08:05:00 +00:00
bool selecting, curNibble, orderNibble, followOrders, followPattern, changeAllOrders;
bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame;
FurnaceGUIWindows curWindow, nextWindow;
2022-01-29 23:56:08 +00:00
float peak[2];
2022-02-15 18:38:59 +00:00
float patChanX[DIV_MAX_CHANS+1];
float patChanSlideY[DIV_MAX_CHANS+1];
2022-03-02 07:22:51 +00:00
const int* nextDesc;
2021-12-14 22:45:37 +00:00
bool opMaskNote, opMaskIns, opMaskVol, opMaskEffect, opMaskEffectVal;
short latchNote, latchIns, latchVol, latchEffect, latchEffectVal;
2022-02-11 06:56:59 +00:00
// bit 31: ctrl
// bit 30: reserved for SDL scancode mask
// bit 29: shift
// bit 28: meta (win)
// bit 27: alt
// bit 24-26: reserved
2022-02-10 22:44:27 +00:00
int actionKeys[GUI_ACTION_MAX];
2022-02-11 06:56:59 +00:00
std::map<int,int> actionMapGlobal;
std::map<int,int> actionMapPat;
std::map<int,int> actionMapOrders;
std::map<int,int> actionMapInsList;
std::map<int,int> actionMapWaveList;
std::map<int,int> actionMapSampleList;
2022-02-10 22:44:27 +00:00
2022-02-01 23:08:19 +00:00
std::vector<DivRegWrite> pgProgram;
int pgSys, pgAddr, pgVal;
struct ActiveNote {
int chan;
int note;
ActiveNote(int c, int n):
chan(c),
note(n) {}
};
std::vector<ActiveNote> activeNotes;
std::vector<DivCommand> cmdStream;
2022-02-15 23:52:12 +00:00
std::vector<Particle> particles;
2022-03-01 22:19:52 +00:00
std::vector<FurnaceGUISysCategory> sysCategories;
bool wavePreviewOn;
SDL_Scancode wavePreviewKey;
int wavePreviewNote;
2022-01-20 21:51:31 +00:00
bool samplePreviewOn;
SDL_Scancode samplePreviewKey;
int samplePreviewNote;
// SDL_Scancode,int
2022-02-21 23:01:41 +00:00
std::map<int,int> noteKeys;
// SDL_Keycode,int
2022-02-21 23:01:41 +00:00
std::map<int,int> valueKeys;
2021-12-11 21:44:02 +00:00
2021-12-12 23:19:43 +00:00
int arpMacroScroll;
ImVec2 macroDragStart;
ImVec2 macroDragAreaSize;
unsigned char* macroDragCTarget;
int* macroDragTarget;
int macroDragLen;
int macroDragMin, macroDragMax;
int macroDragLastX, macroDragLastY;
int macroDragBitOff;
2022-01-21 22:00:28 +00:00
int macroDragScroll;
bool macroDragBitMode;
bool macroDragInitialValueSet;
bool macroDragInitialValue;
bool macroDragChar;
bool macroDragLineMode; // TODO
bool macroDragActive;
ImVec2 macroLoopDragStart;
ImVec2 macroLoopDragAreaSize;
signed char* macroLoopDragTarget;
int macroLoopDragLen;
bool macroLoopDragActive;
2021-12-18 22:54:26 +00:00
ImVec2 waveDragStart;
ImVec2 waveDragAreaSize;
int* waveDragTarget;
int waveDragLen;
int waveDragMin, waveDragMax;
bool waveDragActive;
int bindSetTarget, bindSetPrevValue;
bool bindSetActive, bindSetPending;
float nextScroll, nextAddScroll;
ImVec2 patWindowPos, patWindowSize;
// pattern view specific
ImVec2 threeChars, twoChars;
SelectionPoint sel1, sel2;
int dummyRows, demandX;
2022-03-12 08:04:34 +00:00
int transposeAmount, randomizeMin, randomizeMax, fadeMin, fadeMax;
float scaleMax;
2022-03-12 08:40:56 +00:00
bool fadeMode, randomMode;
2021-12-13 22:09:46 +00:00
2021-12-26 23:05:18 +00:00
int oldOrdersLen;
DivOrders oldOrders;
2022-01-08 06:57:37 +00:00
DivPattern* oldPat[128];
2021-12-24 23:27:55 +00:00
std::deque<UndoStep> undoHist;
std::deque<UndoStep> redoHist;
2022-02-10 08:15:39 +00:00
float keyHit[DIV_MAX_CHANS];
2022-02-22 05:13:32 +00:00
int lastIns[DIV_MAX_CHANS];
2022-02-10 08:15:39 +00:00
2022-02-10 06:45:26 +00:00
void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size);
2022-02-28 23:16:05 +00:00
void drawFMEnv(unsigned char tl, unsigned char ar, unsigned char dr, unsigned char d2r, unsigned char rr, unsigned char sl, float maxTl, float maxArDr, const ImVec2& size);
2022-02-10 06:45:26 +00:00
2021-12-15 22:32:08 +00:00
void updateWindowTitle();
2021-12-19 21:01:24 +00:00
void prepareLayout();
2021-12-15 22:32:08 +00:00
void patternRow(int i, bool isPlaying, float lineHeight, int chans, int ord);
void actualWaveList();
void actualSampleList();
2021-12-15 22:32:08 +00:00
void drawEditControls();
2021-12-14 09:45:44 +00:00
void drawSongInfo();
void drawOrders();
void drawPattern();
void drawInsList();
2021-12-14 09:45:44 +00:00
void drawInsEdit();
void drawWaveList();
void drawWaveEdit();
void drawSampleList();
void drawSampleEdit();
void drawMixer();
2022-01-27 22:49:00 +00:00
void drawOsc();
2022-01-29 23:56:08 +00:00
void drawVolMeter();
void drawStats();
void drawCompatFlags();
void drawPiano();
void drawNotes();
void drawChannels();
void drawRegView();
2021-12-19 04:03:50 +00:00
void drawAbout();
2021-12-20 03:51:02 +00:00
void drawSettings();
2022-01-27 05:29:16 +00:00
void drawDebug();
2022-03-01 22:19:52 +00:00
void drawNewSong();
2021-12-20 03:51:02 +00:00
2022-02-11 06:56:59 +00:00
void parseKeybinds();
void promptKey(int which);
void doAction(int what);
2022-02-11 06:56:59 +00:00
2022-01-16 22:25:43 +00:00
void syncSettings();
2021-12-20 03:51:02 +00:00
void commitSettings();
void processDrags(int dragX, int dragY);
2021-12-14 09:45:44 +00:00
2021-12-14 22:45:37 +00:00
void startSelection(int xCoarse, int xFine, int y);
void updateSelection(int xCoarse, int xFine, int y);
void finishSelection();
2022-01-22 08:12:02 +00:00
void moveCursor(int x, int y, bool select);
void moveCursorPrevChannel(bool overflow);
void moveCursorNextChannel(bool overflow);
void moveCursorTop(bool select);
void moveCursorBottom(bool select);
2021-12-14 22:45:37 +00:00
void editAdvance();
2021-12-26 23:05:18 +00:00
void prepareUndo(ActionType action);
void makeUndo(ActionType action);
2021-12-29 05:50:00 +00:00
void doSelectAll();
void doDelete();
2021-12-19 07:12:19 +00:00
void doPullDelete();
void doInsert();
2022-01-17 07:06:05 +00:00
void doTranspose(int amount);
2021-12-19 07:12:19 +00:00
void doCopy(bool cut);
void doPaste(PasteMode mode=GUI_PASTE_MODE_NORMAL);
void doChangeIns(int ins);
void doInterpolate();
2022-03-12 08:04:34 +00:00
void doFade(int p0, int p1, bool mode);
void doInvertValues();
void doScale(float top);
2022-03-12 08:40:56 +00:00
void doRandomize(int bottom, int top, bool mode);
void doFlip();
void doCollapse(int divider);
void doExpand(int multiplier);
2021-12-26 23:05:18 +00:00
void doUndo();
void doRedo();
void editOptions(bool topMenu);
2021-12-14 22:45:37 +00:00
void play(int row=0);
void stop();
void previewNote(int refChan, int note);
void stopPreviewNote(SDL_Scancode scancode);
2021-12-14 22:45:37 +00:00
void keyDown(SDL_Event& ev);
void keyUp(SDL_Event& ev);
void openFileDialog(FurnaceGUIFileDialogs type);
int save(String path, int dmfVersion);
int load(String path);
void exportAudio(String path, DivAudioExportModes mode);
void applyUISettings();
void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel);
void encodeMMLStr(String& target, unsigned char* macro, unsigned char macroLen, signed char macroLoop, signed char macroRel);
void decodeMMLStr(String& source, unsigned char* macro, unsigned char& macroLen, signed char& macroLoop, int macroMin, int macroMax, signed char& macroRel);
void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, signed char& macroLoop, int macroMin, int macroMax, signed char& macroRel);
void decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMax);
String encodeKeyMap(std::map<int,int>& map);
void decodeKeyMap(std::map<int,int>& map, String source);
2022-01-28 08:17:35 +00:00
const char* getSystemName(DivSystem which);
2021-12-11 07:10:09 +00:00
public:
2022-02-06 04:48:56 +00:00
void showWarning(String what, FurnaceGUIWarnings type);
void showError(String what);
2021-12-13 07:03:36 +00:00
const char* noteName(short note, short octave);
2021-12-19 07:12:19 +00:00
bool decodeNote(const char* what, short& note, short& octave);
2021-12-11 07:10:09 +00:00
void bindEngine(DivEngine* eng);
2021-12-20 03:51:02 +00:00
void updateScroll(int amount);
void addScroll(int amount);
void setFileName(String name);
2021-12-11 08:11:40 +00:00
bool loop();
2021-12-19 21:01:24 +00:00
bool finish();
2021-12-11 08:11:40 +00:00
bool init();
2021-12-11 07:10:09 +00:00
FurnaceGUI();
2021-12-11 21:44:02 +00:00
};