mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-14 16:55:06 +00:00
178 lines
4 KiB
C++
178 lines
4 KiB
C++
#include "../engine/engine.h"
|
|
#include "imgui.h"
|
|
#include "imgui_impl_sdl.h"
|
|
#include "imgui_impl_sdlrenderer.h"
|
|
#include <SDL.h>
|
|
#include <map>
|
|
|
|
enum FurnaceGUIColors {
|
|
GUI_COLOR_BACKGROUND=0,
|
|
GUI_COLOR_FRAME_BACKGROUND,
|
|
GUI_COLOR_HEADER,
|
|
GUI_COLOR_ITEM_BACKGROUND,
|
|
GUI_COLOR_ITEM_FOREGROUND,
|
|
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,
|
|
GUI_COLOR_PLAYBACK_STAT,
|
|
GUI_COLOR_MAX
|
|
};
|
|
|
|
enum FurnaceGUIWindows {
|
|
GUI_WINDOW_NOTHING=0,
|
|
GUI_WINDOW_EDIT_CONTROLS,
|
|
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
|
|
};
|
|
|
|
enum FurnaceGUIFileDialogs {
|
|
GUI_FILE_OPEN,
|
|
GUI_FILE_SAVE,
|
|
GUI_FILE_SAMPLE_OPEN,
|
|
GUI_FILE_SAMPLE_SAVE
|
|
};
|
|
|
|
struct SelectionPoint {
|
|
int xCoarse, xFine;
|
|
int y;
|
|
SelectionPoint():
|
|
xCoarse(0), xFine(0), y(0) {}
|
|
};
|
|
|
|
class FurnaceGUI {
|
|
DivEngine* e;
|
|
|
|
SDL_Window* sdlWin;
|
|
SDL_Renderer* sdlRend;
|
|
|
|
String workingDir, fileName, clipboard, errorString, lastError;
|
|
|
|
bool quit, willCommit;
|
|
|
|
FurnaceGUIFileDialogs curFileDialog;
|
|
|
|
int scrW, scrH;
|
|
|
|
double dpiScale;
|
|
|
|
int aboutScroll, aboutSin;
|
|
float aboutHue;
|
|
|
|
ImFont* mainFont;
|
|
ImFont* iconFont;
|
|
ImFont* patFont;
|
|
ImFont* bigFont;
|
|
ImVec4 uiColors[GUI_COLOR_MAX];
|
|
ImVec4 volColors[128];
|
|
|
|
int mainFontSize, patFontSize;
|
|
|
|
char finalLayoutPath[4096];
|
|
|
|
int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep;
|
|
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
|
|
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
|
|
SelectionPoint selStart, selEnd;
|
|
bool selecting, curNibble, extraChannelButtons;
|
|
FurnaceGUIWindows curWindow;
|
|
|
|
std::map<SDL_Keycode,int> noteKeys;
|
|
std::map<SDL_Keycode,int> valueKeys;
|
|
|
|
int arpMacroScroll;
|
|
|
|
ImVec2 macroDragStart;
|
|
ImVec2 macroDragAreaSize;
|
|
int* macroDragTarget;
|
|
int macroDragLen;
|
|
int macroDragMin, macroDragMax;
|
|
bool macroDragActive;
|
|
|
|
ImVec2 macroLoopDragStart;
|
|
ImVec2 macroLoopDragAreaSize;
|
|
signed char* macroLoopDragTarget;
|
|
int macroLoopDragLen;
|
|
bool macroLoopDragActive;
|
|
|
|
ImVec2 waveDragStart;
|
|
ImVec2 waveDragAreaSize;
|
|
int* waveDragTarget;
|
|
int waveDragLen;
|
|
int waveDragMin, waveDragMax;
|
|
bool waveDragActive;
|
|
|
|
float nextScroll;
|
|
|
|
void updateWindowTitle();
|
|
void prepareLayout();
|
|
|
|
void drawEditControls();
|
|
void drawSongInfo();
|
|
void drawOrders();
|
|
void drawPattern();
|
|
void drawInsList();
|
|
void drawInsEdit();
|
|
void drawWaveList();
|
|
void drawWaveEdit();
|
|
void drawSampleList();
|
|
void drawSampleEdit();
|
|
void drawAbout();
|
|
void drawSettings();
|
|
|
|
void commitSettings();
|
|
|
|
void startSelection(int xCoarse, int xFine, int y);
|
|
void updateSelection(int xCoarse, int xFine, int y);
|
|
void finishSelection();
|
|
|
|
void moveCursor(int x, int y);
|
|
void editAdvance();
|
|
void doDelete();
|
|
void doPullDelete();
|
|
void doInsert();
|
|
void doCopy(bool cut);
|
|
void doPaste();
|
|
|
|
void keyDown(SDL_Event& ev);
|
|
void keyUp(SDL_Event& ev);
|
|
|
|
void openFileDialog(FurnaceGUIFileDialogs type);
|
|
int save(String path);
|
|
int load(String path);
|
|
|
|
void showError(String what);
|
|
|
|
public:
|
|
const char* noteName(short note, short octave);
|
|
bool decodeNote(const char* what, short& note, short& octave);
|
|
void bindEngine(DivEngine* eng);
|
|
void updateScroll(int amount);
|
|
bool loop();
|
|
bool finish();
|
|
bool init();
|
|
FurnaceGUI();
|
|
};
|