2022-02-18 03:59:11 +00:00
/**
* Furnace Tracker - multi - system chiptune tracker
2023-01-20 00:18:40 +00:00
* Copyright ( C ) 2021 - 2023 tildearrow and contributors
2022-02-18 03:59:11 +00: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"
2022-03-21 22:34:43 +00:00
# include "fonts.h"
2022-02-18 03:59:11 +00:00
# include "../ta-log.h"
2022-04-06 18:53:39 +00:00
# include "../fileutils.h"
2022-08-13 23:00:29 +00:00
# include "../utfutils.h"
2022-02-18 03:59:11 +00:00
# include "util.h"
2022-03-29 21:09:15 +00:00
# include "guiConst.h"
2022-04-30 06:37:37 +00:00
# include "intConst.h"
2022-03-21 22:34:43 +00:00
# include "ImGuiFileDialog.h"
2022-02-18 03:59:11 +00:00
# include "IconsFontAwesome4.h"
# include "misc/cpp/imgui_stdlib.h"
# include <fmt/printf.h>
2022-03-29 22:38:30 +00:00
# include <imgui.h>
2022-02-18 03:59:11 +00:00
2022-02-21 23:01:41 +00:00
# define DEFAULT_NOTE_KEYS "5:7;6:4;7:3;8:16;10:6;11:8;12:24;13:10;16:11;17:9;18:26;19:28;20:12;21:17;22:1;23:19;24:23;25:5;26:14;27:2;28:21;29:0;30:100;31:13;32:15;34:18;35:20;36:22;38:25;39:27;43:100;46:101;47:29;48:31;53:102;"
2022-11-10 21:56:28 +00:00
# if defined(_WIN32) || defined(__APPLE__) || defined(IS_MOBILE)
2022-04-16 23:35:25 +00:00
# define POWER_SAVE_DEFAULT 1
# else
// currently off on Linux/other due to Mesa catch-up behavior.
# define POWER_SAVE_DEFAULT 0
# endif
2022-12-28 21:08:14 +00:00
# if defined(__HAIKU__) || defined(IS_MOBILE) || (defined(_WIN32) && !defined(_WIN64))
2022-07-24 03:11:30 +00:00
// NFD doesn't support Haiku
2022-12-28 21:08:14 +00:00
// NFD doesn't support Windows XP either
2022-07-24 03:11:30 +00:00
# define SYS_FILE_DIALOG_DEFAULT 0
# else
# define SYS_FILE_DIALOG_DEFAULT 1
# endif
2022-02-18 03:59:11 +00:00
const char * mainFonts [ ] = {
" IBM Plex Sans " ,
" Liberation Sans " ,
" Exo " ,
" Proggy Clean " ,
" GNU Unifont " ,
" <Use system font> " ,
" <Custom...> "
} ;
const char * patFonts [ ] = {
" IBM Plex Mono " ,
" Mononoki " ,
" PT Mono " ,
" Proggy Clean " ,
" GNU Unifont " ,
" <Use system font> " ,
" <Custom...> "
} ;
const char * audioBackends [ ] = {
" JACK " ,
" SDL "
} ;
2023-01-05 07:40:17 +00:00
const bool isProAudio [ ] = {
true ,
false
} ;
const char * nonProAudioOuts [ ] = {
" Mono " ,
" Stereo " ,
" What? " ,
" Quadraphonic " ,
" What? " ,
" 5.1 Surround " ,
" What? " ,
" 7.1 Surround "
} ;
2022-02-18 03:59:11 +00:00
const char * audioQualities [ ] = {
" High " ,
" Low "
} ;
const char * arcadeCores [ ] = {
" ymfm " ,
" Nuked-OPM "
} ;
const char * ym2612Cores [ ] = {
" Nuked-OPN2 " ,
" ymfm "
} ;
2022-05-26 23:46:20 +00:00
const char * snCores [ ] = {
" MAME " ,
" Nuked-PSG Mod "
} ;
2022-05-02 04:20:20 +00:00
const char * nesCores [ ] = {
" puNES " ,
" NSFplay "
} ;
2022-08-28 20:10:16 +00:00
const char * c64Cores [ ] = {
" reSID " ,
" reSIDfp "
} ;
2022-12-22 21:40:29 +00:00
const char * pokeyCores [ ] = {
2022-12-22 22:17:38 +00:00
" Atari800 (mzpokeysnd) " ,
" ASAP (C++ port) "
2022-12-22 21:40:29 +00:00
} ;
2022-12-24 07:29:37 +00:00
const char * opnCores [ ] = {
" ymfm only " ,
" Nuked-OPN2 (FM) + ymfm (SSG/ADPCM) "
} ;
2022-06-03 06:18:32 +00:00
const char * pcspkrOutMethods [ ] = {
" evdev SND_TONE " ,
" KIOCSOUND on /dev/tty1 " ,
" /dev/port " ,
" KIOCSOUND on standard output " ,
" outb() "
} ;
2022-03-29 22:38:30 +00:00
const char * valueInputStyles [ ] = {
" Disabled/custom " ,
" Two octaves (0 is C-4, F is D#5) " ,
" Raw (note number is value) " ,
" Two octaves alternate (lower keys are 0-9, upper keys are A-F) " ,
" Use dual control change (one for each nibble) " ,
2022-04-01 06:50:01 +00:00
" Use 14-bit control change " ,
" Use single control change (imprecise) "
} ;
const char * valueSInputStyles [ ] = {
" Disabled/custom " ,
" Use dual control change (one for each nibble) " ,
" Use 14-bit control change " ,
" Use single control change (imprecise) "
2022-03-29 22:38:30 +00:00
} ;
const char * messageTypes [ ] = {
" --select-- " ,
" ??? " ,
" ??? " ,
" ??? " ,
" ??? " ,
" ??? " ,
" ??? " ,
" ??? " ,
" Note Off " ,
" Note On " ,
" Aftertouch " ,
" Control " ,
" Program " ,
" ChanPressure " ,
" Pitch Bend " ,
" SysEx "
} ;
const char * messageChannels [ ] = {
" 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " , " 8 " , " 9 " , " 10 " , " 11 " , " 12 " , " 13 " , " 14 " , " 15 " , " 16 " , " Any "
} ;
2022-04-01 06:50:01 +00:00
const char * specificControls [ 18 ] = {
" Instrument " ,
" Volume " ,
" Effect 1 type " ,
" Effect 1 value " ,
" Effect 2 type " ,
" Effect 2 value " ,
" Effect 3 type " ,
" Effect 3 value " ,
" Effect 4 type " ,
" Effect 4 value " ,
" Effect 5 type " ,
" Effect 5 value " ,
" Effect 6 type " ,
" Effect 6 value " ,
" Effect 7 type " ,
" Effect 7 value " ,
" Effect 8 type " ,
" Effect 8 value "
} ;
2022-02-18 03:59:11 +00:00
# define SAMPLE_RATE_SELECTABLE(x) \
if ( ImGui : : Selectable ( # x , settings . audioRate = = x ) ) { \
settings . audioRate = x ; \
}
# define BUFFER_SIZE_SELECTABLE(x) \
if ( ImGui : : Selectable ( # x , settings . audioBufSize = = x ) ) { \
settings . audioBufSize = x ; \
}
2023-01-05 07:40:17 +00:00
# define CHANS_SELECTABLE(x) \
if ( ImGui : : Selectable ( nonProAudioOuts [ x - 1 ] , settings . audioChans = = x ) ) { \
settings . audioChans = x ; \
}
2022-02-18 03:59:11 +00:00
# define UI_COLOR_CONFIG(what,label) \
2022-04-11 07:53:21 +00:00
if ( ImGui : : ColorEdit4 ( label " ##CC_ " # what , ( float * ) & uiColors [ what ] ) ) { \
applyUISettings ( false ) ; \
}
2022-02-18 03:59:11 +00:00
# define KEYBIND_CONFIG_BEGIN(id) \
if ( ImGui : : BeginTable ( id , 2 ) ) {
# define KEYBIND_CONFIG_END \
ImGui : : EndTable ( ) ; \
}
2022-03-29 21:09:15 +00:00
# define UI_KEYBIND_CONFIG(what) \
2022-02-18 03:59:11 +00:00
ImGui : : TableNextRow ( ) ; \
ImGui : : TableNextColumn ( ) ; \
2022-04-06 06:52:58 +00:00
ImGui : : TextUnformatted ( guiActions [ what ] . friendlyName ) ; \
2022-02-18 03:59:11 +00:00
ImGui : : TableNextColumn ( ) ; \
if ( ImGui : : Button ( fmt : : sprintf ( " %s##KC_ " # what , ( bindSetPending & & bindSetTarget = = what ) ? " Press key... " : getKeyName ( actionKeys [ what ] ) ) . c_str ( ) ) ) { \
promptKey ( what ) ; \
} \
if ( ImGui : : IsItemClicked ( ImGuiMouseButton_Right ) ) actionKeys [ what ] = 0 ;
2022-03-29 22:38:30 +00:00
String stripName ( String what ) {
String ret ;
for ( char & i : what ) {
if ( ( i > = ' A ' & & i < = ' Z ' ) | | ( i > = ' a ' & & i < = ' z ' ) | | ( i > = ' 0 ' & & i < = ' 9 ' ) ) {
ret + = i ;
} else {
ret + = ' - ' ;
}
}
return ret ;
}
2022-02-18 03:59:11 +00:00
void FurnaceGUI : : promptKey ( int which ) {
bindSetTarget = which ;
bindSetActive = true ;
bindSetPending = true ;
bindSetPrevValue = actionKeys [ which ] ;
actionKeys [ which ] = 0 ;
}
2022-02-21 23:01:41 +00:00
struct MappedInput {
int scan ;
int val ;
MappedInput ( ) :
scan ( SDL_SCANCODE_UNKNOWN ) , val ( 0 ) { }
MappedInput ( int s , int v ) :
scan ( s ) , val ( v ) { }
} ;
2022-02-18 03:59:11 +00:00
void FurnaceGUI : : drawSettings ( ) {
if ( nextWindow = = GUI_WINDOW_SETTINGS ) {
settingsOpen = true ;
ImGui : : SetNextWindowFocus ( ) ;
nextWindow = GUI_WINDOW_NOTHING ;
}
if ( ! settingsOpen ) return ;
2022-11-07 22:05:16 +00:00
if ( mobileUI ) {
ImVec2 setWindowPos = ImVec2 ( 0 , 0 ) ;
ImVec2 setWindowSize = ImVec2 ( canvasW , canvasH ) ;
ImGui : : SetNextWindowPos ( setWindowPos ) ;
ImGui : : SetNextWindowSize ( setWindowSize ) ;
}
2022-05-19 21:35:00 +00:00
if ( ImGui : : Begin ( " Settings " , & settingsOpen , ImGuiWindowFlags_NoDocking | globalWinFlags ) ) {
2022-04-13 07:09:59 +00:00
if ( ! settingsOpen ) {
settingsOpen = true ;
showWarning ( " Do you want to save your settings? " , GUI_WARN_CLOSE_SETTINGS ) ;
}
2022-02-18 03:59:11 +00:00
if ( ImGui : : BeginTabBar ( " settingsTab " ) ) {
if ( ImGui : : BeginTabItem ( " General " ) ) {
2022-05-03 06:48:57 +00:00
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
ImGui : : Text ( " Workspace layout: " ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Import " ) ) {
openFileDialog ( GUI_FILE_IMPORT_LAYOUT ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Export " ) ) {
openFileDialog ( GUI_FILE_EXPORT_LAYOUT ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Reset " ) ) {
showWarning ( " Are you sure you want to reset the workspace layout? " , GUI_WARN_RESET_LAYOUT ) ;
}
2022-04-30 06:37:37 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-08-22 19:17:19 +00:00
2022-07-23 23:22:42 +00:00
ImGui : : Text ( " Initial system: " ) ;
2022-05-03 06:48:57 +00:00
ImGui : : SameLine ( ) ;
2022-07-23 23:22:42 +00:00
if ( ImGui : : Button ( " Current system " ) ) {
2022-05-03 06:48:57 +00:00
settings . initialSys . clear ( ) ;
for ( int i = 0 ; i < e - > song . systemLen ; i + + ) {
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " id%d " , i ) , e - > systemToFileFur ( e - > song . system [ i ] ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , ( float ) e - > song . systemVol [ i ] ) ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , i ) , ( float ) e - > song . systemPan [ i ] ) ;
settings . initialSys . set ( fmt : : sprintf ( " fr%d " , i ) , ( float ) e - > song . systemPanFR [ i ] ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , i ) , e - > song . systemFlags [ i ] . toBase64 ( ) ) ;
2022-05-03 06:48:57 +00:00
}
2022-07-23 23:22:42 +00:00
settings . initialSysName = e - > song . systemName ;
2022-04-30 06:37:37 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Randomize " ) ) {
settings . initialSys . clear ( ) ;
int howMany = 1 + rand ( ) % 3 ;
int totalAvailSys = 0 ;
for ( totalAvailSys = 0 ; availableSystems [ totalAvailSys ] ; totalAvailSys + + ) ;
if ( totalAvailSys > 0 ) {
for ( int i = 0 ; i < howMany ; i + + ) {
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " id%d " , i ) , e - > systemToFileFur ( ( DivSystem ) availableSystems [ rand ( ) % totalAvailSys ] ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , 1.0f ) ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , i ) , 0.0f ) ;
settings . initialSys . set ( fmt : : sprintf ( " fr%d " , i ) , 0.0f ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , i ) , " " ) ;
2022-05-03 06:48:57 +00:00
}
} else {
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " id0 " , e - > systemToFileFur ( DIV_SYSTEM_DUMMY ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " vol0 " , 1.0f ) ;
settings . initialSys . set ( " pan0 " , 0.0f ) ;
settings . initialSys . set ( " fr0 " , 0.0f ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " flags0 " , " " ) ;
howMany = 1 ;
2022-04-30 06:37:37 +00:00
}
2022-07-23 23:22:42 +00:00
// randomize system name
std : : vector < String > wordPool [ 6 ] ;
2022-09-30 07:14:54 +00:00
for ( int i = 0 ; i < howMany ; i + + ) {
2022-07-23 23:22:42 +00:00
int wpPos = 0 ;
2022-09-30 07:14:54 +00:00
DivSystem sysID = e - > systemFromFileFur ( settings . initialSys . getInt ( fmt : : sprintf ( " id%d " , i ) , 0 ) ) ;
String sName = e - > getSystemName ( sysID ) ;
2022-07-23 23:22:42 +00:00
String nameWord ;
sName + = " " ;
for ( char & i : sName ) {
if ( i = = ' ' ) {
if ( nameWord ! = " " ) {
wordPool [ wpPos + + ] . push_back ( nameWord ) ;
if ( wpPos > = 6 ) break ;
nameWord = " " ;
}
} else {
nameWord + = i ;
}
}
}
settings . initialSysName = " " ;
for ( int i = 0 ; i < 6 ; i + + ) {
if ( wordPool [ i ] . empty ( ) ) continue ;
settings . initialSysName + = wordPool [ i ] [ rand ( ) % wordPool [ i ] . size ( ) ] ;
settings . initialSysName + = " " ;
}
2022-05-03 06:48:57 +00:00
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Reset to defaults " ) ) {
settings . initialSys . clear ( ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " id0 " , e - > systemToFileFur ( DIV_SYSTEM_YM2612 ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " vol0 " , 1.0f ) ;
settings . initialSys . set ( " pan0 " , 0.0f ) ;
settings . initialSys . set ( " fr0 " , 0.0f ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( " flags0 " , " " ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " id1 " , e - > systemToFileFur ( DIV_SYSTEM_SMS ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " vol1 " , 0.5f ) ;
settings . initialSys . set ( " pan1 " , 0.0f ) ;
settings . initialSys . set ( " fr1 " , 0.0f ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( " flags1 " , " " ) ;
2022-07-23 23:22:42 +00:00
settings . initialSysName = " Sega Genesis/Mega Drive " ;
2022-04-30 06:37:37 +00:00
}
2022-07-23 23:22:42 +00:00
ImGui : : Text ( " Name " ) ;
ImGui : : SameLine ( ) ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
ImGui : : InputText ( " ##InitSysName " , & settings . initialSysName ) ;
2022-11-12 07:27:05 +00:00
int sysCount = 0 ;
int doRemove = - 1 ;
2022-09-30 05:26:54 +00:00
for ( size_t i = 0 ; settings . initialSys . getInt ( fmt : : sprintf ( " id%d " , i ) , 0 ) ; i + + ) {
DivSystem sysID = e - > systemFromFileFur ( settings . initialSys . getInt ( fmt : : sprintf ( " id%d " , i ) , 0 ) ) ;
2023-01-06 22:43:08 +00:00
float sysVol = settings . initialSys . getFloat ( fmt : : sprintf ( " vol%d " , i ) , 0 ) ;
float sysPan = settings . initialSys . getFloat ( fmt : : sprintf ( " pan%d " , i ) , 0 ) ;
float sysPanFR = settings . initialSys . getFloat ( fmt : : sprintf ( " fr%d " , i ) , 0 ) ;
2022-09-30 05:26:54 +00:00
2022-11-12 07:27:05 +00:00
sysCount = i + 1 ;
2022-09-30 05:26:54 +00:00
//bool doRemove=false;
2023-01-06 22:43:08 +00:00
bool doInvert = ( sysVol < 0 ) ;
float vol = fabs ( sysVol ) ;
2022-05-03 06:48:57 +00:00
ImGui : : PushID ( i ) ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x - ImGui : : CalcTextSize ( " Invert " ) . x - ImGui : : GetFrameHeightWithSpacing ( ) * 2.0 - ImGui : : GetStyle ( ) . ItemSpacing . x ) ;
2022-09-30 05:26:54 +00:00
if ( ImGui : : BeginCombo ( " ##System " , getSystemName ( sysID ) ) ) {
2022-05-03 06:48:57 +00:00
for ( int j = 0 ; availableSystems [ j ] ; j + + ) {
2022-09-30 05:26:54 +00:00
if ( ImGui : : Selectable ( getSystemName ( ( DivSystem ) availableSystems [ j ] ) , sysID = = availableSystems [ j ] ) ) {
sysID = ( DivSystem ) availableSystems [ j ] ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " id%d " , i ) , ( int ) e - > systemToFileFur ( sysID ) ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , i ) , " " ) ;
2022-05-03 06:48:57 +00:00
}
2022-04-30 06:37:37 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndCombo ( ) ;
2022-04-30 06:37:37 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : SameLine ( ) ;
if ( ImGui : : Checkbox ( " Invert " , & doInvert ) ) {
2023-01-06 22:43:08 +00:00
sysVol = - sysVol ;
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , sysVol ) ;
2022-05-03 06:48:57 +00:00
}
ImGui : : SameLine ( ) ;
2022-09-30 05:26:54 +00:00
//ImGui::BeginDisabled(settings.initialSys.size()<=4);
2022-05-03 06:48:57 +00:00
if ( ImGui : : Button ( ICON_FA_MINUS " ##InitSysRemove " ) ) {
2022-11-12 07:27:05 +00:00
doRemove = i ;
2022-05-03 06:48:57 +00:00
}
2022-09-30 05:26:54 +00:00
//ImGui::EndDisabled();
2023-01-06 22:43:08 +00:00
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( CWSliderFloat ( " Volume " , & vol , 0.0f , 3.0f ) ) {
if ( doInvert ) {
if ( vol < 0.0001 ) vol = 0.0001 ;
}
if ( vol < 0 ) vol = 0 ;
if ( vol > 10 ) vol = 10 ;
sysVol = doInvert ? - vol : vol ;
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , ( float ) sysVol ) ;
} rightClickable
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( CWSliderFloat ( " Panning " , & sysPan , - 1.0f , 1.0f ) ) {
if ( sysPan < - 1.0f ) sysPan = - 1.0f ;
if ( sysPan > 1.0f ) sysPan = 1.0f ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , i ) , ( float ) sysPan ) ;
2022-05-03 06:48:57 +00:00
} rightClickable
2023-01-06 22:43:08 +00:00
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( CWSliderFloat ( " Front/Rear " , & sysPanFR , - 1.0f , 1.0f ) ) {
if ( sysPanFR < - 1.0f ) sysPanFR = - 1.0f ;
if ( sysPanFR > 1.0f ) sysPanFR = 1.0f ;
settings . initialSys . set ( fmt : : sprintf ( " fr%d " , i ) , ( float ) sysPanFR ) ;
2022-09-30 07:14:54 +00:00
} rightClickable
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
// oh please MSVC don't cry
if ( ImGui : : TreeNode ( " Configure " ) ) {
2022-09-30 05:26:54 +00:00
String sysFlagsS = settings . initialSys . getString ( fmt : : sprintf ( " flags%d " , i ) , " " ) ;
DivConfig sysFlags ;
sysFlags . loadFromBase64 ( sysFlagsS . c_str ( ) ) ;
2022-09-30 07:14:54 +00:00
if ( drawSysConf ( - 1 , sysID , sysFlags , false ) ) {
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , i ) , sysFlags . toBase64 ( ) ) ;
}
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
}
2022-04-30 06:37:37 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : PopID ( ) ;
2022-04-30 06:37:37 +00:00
}
2022-11-12 07:27:05 +00:00
if ( doRemove > = 0 & & sysCount > 1 ) {
for ( int i = doRemove ; i < sysCount - 1 ; i + + ) {
int sysID = settings . initialSys . getInt ( fmt : : sprintf ( " id%d " , i + 1 ) , 0 ) ;
2023-01-06 22:43:08 +00:00
float sysVol = settings . initialSys . getFloat ( fmt : : sprintf ( " vol%d " , i + 1 ) , 0 ) ;
float sysPan = settings . initialSys . getFloat ( fmt : : sprintf ( " pan%d " , i + 1 ) , 0 ) ;
float sysPanFR = settings . initialSys . getFloat ( fmt : : sprintf ( " fr%d " , i + 1 ) , 0 ) ;
2022-11-12 07:27:05 +00:00
String sysFlags = settings . initialSys . getString ( fmt : : sprintf ( " flags%d " , i + 1 ) , " " ) ;
settings . initialSys . set ( fmt : : sprintf ( " id%d " , i ) , sysID ) ;
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , sysVol ) ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , i ) , sysPan ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( fmt : : sprintf ( " fr%d " , i ) , sysPanFR ) ;
2022-11-12 07:27:05 +00:00
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , i ) , sysFlags ) ;
}
settings . initialSys . remove ( fmt : : sprintf ( " id%d " , sysCount - 1 ) ) ;
settings . initialSys . remove ( fmt : : sprintf ( " vol%d " , sysCount - 1 ) ) ;
settings . initialSys . remove ( fmt : : sprintf ( " pan%d " , sysCount - 1 ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . remove ( fmt : : sprintf ( " fr%d " , sysCount - 1 ) ) ;
2022-11-12 07:27:05 +00:00
settings . initialSys . remove ( fmt : : sprintf ( " flags%d " , sysCount - 1 ) ) ;
}
if ( sysCount < 32 ) if ( ImGui : : Button ( ICON_FA_PLUS " ##InitSysAdd " ) ) {
settings . initialSys . set ( fmt : : sprintf ( " id%d " , sysCount ) , ( int ) e - > systemToFileFur ( DIV_SYSTEM_YM2612 ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , sysCount ) , 1.0f ) ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , sysCount ) , 0.0f ) ;
settings . initialSys . set ( fmt : : sprintf ( " fr%d " , sysCount ) , 0.0f ) ;
2022-11-12 07:27:05 +00:00
settings . initialSys . set ( fmt : : sprintf ( " flags%d " , sysCount ) , " " ) ;
2022-05-03 06:48:57 +00:00
}
2022-04-30 06:37:37 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-04-30 06:37:37 +00:00
2023-01-14 19:07:50 +00:00
if ( CWSliderFloat ( " Double-click time (seconds) " , & settings . doubleClickTime , 0.02 , 1.0 , " %.2f " ) ) {
if ( settings . doubleClickTime < 0.02 ) settings . doubleClickTime = 0.02 ;
if ( settings . doubleClickTime > 1.0 ) settings . doubleClickTime = 1.0 ;
applyUISettings ( false ) ;
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Toggle channel solo on: " ) ;
if ( ImGui : : RadioButton ( " Right-click or double-click##soloA " , settings . soloAction = = 0 ) ) {
settings . soloAction = 0 ;
}
if ( ImGui : : RadioButton ( " Right-click##soloR " , settings . soloAction = = 1 ) ) {
settings . soloAction = 1 ;
}
if ( ImGui : : RadioButton ( " Double-click##soloD " , settings . soloAction = = 2 ) ) {
settings . soloAction = 2 ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool pushNibbleB = settings . pushNibble ;
if ( ImGui : : Checkbox ( " Push value when overwriting instead of clearing it " , & pushNibbleB ) ) {
settings . pushNibble = pushNibbleB ;
}
2022-04-13 22:42:55 +00:00
2022-05-03 06:48:57 +00:00
bool pullDeleteBehaviorB = settings . pullDeleteBehavior ;
if ( ImGui : : Checkbox ( " Move cursor up on backspace-delete " , & pullDeleteBehaviorB ) ) {
settings . pullDeleteBehavior = pullDeleteBehaviorB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool stepOnDeleteB = settings . stepOnDelete ;
if ( ImGui : : Checkbox ( " Move cursor by edit step on delete " , & stepOnDeleteB ) ) {
settings . stepOnDelete = stepOnDeleteB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool absorbInsInputB = settings . absorbInsInput ;
if ( ImGui : : Checkbox ( " Change current instrument when changing instrument column (absorb) " , & absorbInsInputB ) ) {
settings . absorbInsInput = absorbInsInputB ;
}
2022-04-21 07:35:50 +00:00
2022-05-03 06:48:57 +00:00
bool effectDeletionAltersValueB = settings . effectDeletionAltersValue ;
if ( ImGui : : Checkbox ( " Delete effect value when deleting effect " , & effectDeletionAltersValueB ) ) {
settings . effectDeletionAltersValue = effectDeletionAltersValueB ;
}
2022-04-07 07:02:52 +00:00
2022-05-03 06:48:57 +00:00
bool scrollChangesOrderB = settings . scrollChangesOrder ;
if ( ImGui : : Checkbox ( " Change order when scrolling outside of pattern bounds " , & scrollChangesOrderB ) ) {
settings . scrollChangesOrder = scrollChangesOrderB ;
}
2022-04-14 06:25:21 +00:00
2022-05-03 06:48:57 +00:00
bool stepOnInsertB = settings . stepOnInsert ;
if ( ImGui : : Checkbox ( " Move cursor by edit step on insert (push) " , & stepOnInsertB ) ) {
settings . stepOnInsert = stepOnInsertB ;
}
2022-03-12 07:32:02 +00:00
2022-05-03 06:48:57 +00:00
bool cursorPastePosB = settings . cursorPastePos ;
if ( ImGui : : Checkbox ( " Move cursor to end of clipboard content when pasting " , & cursorPastePosB ) ) {
settings . cursorPastePos = cursorPastePosB ;
}
2022-04-04 00:20:30 +00:00
2022-05-03 06:48:57 +00:00
bool cursorMoveNoScrollB = settings . cursorMoveNoScroll ;
if ( ImGui : : Checkbox ( " Don't scroll when moving cursor " , & cursorMoveNoScrollB ) ) {
settings . cursorMoveNoScroll = cursorMoveNoScrollB ;
}
2022-04-15 02:57:39 +00:00
2022-05-31 00:02:24 +00:00
bool doubleClickColumnB = settings . doubleClickColumn ;
if ( ImGui : : Checkbox ( " Double click selects entire column " , & doubleClickColumnB ) ) {
settings . doubleClickColumn = doubleClickColumnB ;
}
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
bool allowEditDockingB = settings . allowEditDocking ;
if ( ImGui : : Checkbox ( " Allow docking editors " , & allowEditDockingB ) ) {
settings . allowEditDocking = allowEditDockingB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool avoidRaisingPatternB = settings . avoidRaisingPattern ;
if ( ImGui : : Checkbox ( " Don't raise pattern editor on click " , & avoidRaisingPatternB ) ) {
settings . avoidRaisingPattern = avoidRaisingPatternB ;
}
2022-03-04 07:40:42 +00:00
2022-05-03 06:48:57 +00:00
bool insFocusesPatternB = settings . insFocusesPattern ;
if ( ImGui : : Checkbox ( " Focus pattern editor when selecting instrument " , & insFocusesPatternB ) ) {
settings . insFocusesPattern = insFocusesPatternB ;
}
2022-03-05 07:13:15 +00:00
2022-05-03 06:48:57 +00:00
bool restartOnFlagChangeB = settings . restartOnFlagChange ;
2022-08-11 10:38:31 +00:00
if ( ImGui : : Checkbox ( " Restart song when changing chip properties " , & restartOnFlagChangeB ) ) {
2022-05-03 06:48:57 +00:00
settings . restartOnFlagChange = restartOnFlagChangeB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool sysFileDialogB = settings . sysFileDialog ;
if ( ImGui : : Checkbox ( " Use system file picker " , & sysFileDialogB ) ) {
settings . sysFileDialog = sysFileDialogB ;
}
2022-03-13 23:32:35 +00:00
2022-05-03 06:48:57 +00:00
bool moveWindowTitleB = settings . moveWindowTitle ;
if ( ImGui : : Checkbox ( " Only allow window movement when clicking on title bar " , & moveWindowTitleB ) ) {
settings . moveWindowTitle = moveWindowTitleB ;
applyUISettings ( false ) ;
}
2022-04-25 21:46:38 +00:00
2022-05-03 06:48:57 +00:00
bool eventDelayB = settings . eventDelay ;
if ( ImGui : : Checkbox ( " Enable event delay " , & eventDelayB ) ) {
settings . eventDelay = eventDelayB ;
applyUISettings ( false ) ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip ( " may cause issues with high-polling-rate mice when previewing notes. " ) ;
}
2022-04-25 21:46:38 +00:00
2022-05-03 06:48:57 +00:00
bool powerSaveB = settings . powerSave ;
if ( ImGui : : Checkbox ( " Power-saving mode " , & powerSaveB ) ) {
settings . powerSave = powerSaveB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip ( " saves power by lowering the frame rate to 2fps when idle. \n may cause issues under Mesa drivers! " ) ;
}
2022-04-16 23:35:25 +00:00
2022-11-10 21:53:18 +00:00
# ifndef IS_MOBILE
2022-07-20 05:32:06 +00:00
bool noThreadedInputB = settings . noThreadedInput ;
if ( ImGui : : Checkbox ( " Disable threaded input (restart after changing!) " , & noThreadedInputB ) ) {
settings . noThreadedInput = noThreadedInputB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip ( " threaded input processes key presses for note preview on a separate thread (on supported platforms), which reduces latency. \n however, crashes have been reported when threaded input is on. enable this option if that is the case. " ) ;
}
2022-08-22 19:17:19 +00:00
bool saveWindowPosB = settings . saveWindowPos ;
2022-09-08 06:45:05 +00:00
if ( ImGui : : Checkbox ( " Remember window position " , & saveWindowPosB ) ) {
2022-08-22 19:17:19 +00:00
settings . saveWindowPos = saveWindowPosB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
2022-09-08 06:45:05 +00:00
ImGui : : SetTooltip ( " remembers the window's last position on startup. " ) ;
2022-08-22 19:17:19 +00:00
}
2022-11-10 21:53:18 +00:00
# endif
2022-08-22 19:17:19 +00:00
2022-06-03 23:30:40 +00:00
bool blankInsB = settings . blankIns ;
if ( ImGui : : Checkbox ( " New instruments are blank " , & blankInsB ) ) {
settings . blankIns = blankInsB ;
}
2022-08-16 08:42:17 +00:00
bool saveUnusedPatternsB = settings . saveUnusedPatterns ;
if ( ImGui : : Checkbox ( " Save unused patterns " , & saveUnusedPatternsB ) ) {
settings . saveUnusedPatterns = saveUnusedPatternsB ;
}
2022-11-06 05:37:57 +00:00
ImGui : : Text ( " Audio export loop/fade out time: " ) ;
if ( ImGui : : RadioButton ( " Set to these values on start-up:##fot0 " , settings . persistFadeOut = = 0 ) ) {
settings . persistFadeOut = 0 ;
}
ImGui : : BeginDisabled ( settings . persistFadeOut ) ;
if ( ImGui : : InputInt ( " Loops " , & settings . exportLoops , 1 , 2 ) ) {
if ( exportLoops < 0 ) exportLoops = 0 ;
exportLoops = settings . exportLoops ;
}
if ( ImGui : : InputDouble ( " Fade out (seconds) " , & settings . exportFadeOut , 1.0 , 2.0 , " %.1f " ) ) {
if ( exportFadeOut < 0.0 ) exportFadeOut = 0.0 ;
exportFadeOut = settings . exportFadeOut ;
}
ImGui : : EndDisabled ( ) ;
if ( ImGui : : RadioButton ( " Remember last values##fot1 " , settings . persistFadeOut = = 1 ) ) {
settings . persistFadeOut = 1 ;
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Note preview behavior: " ) ;
if ( ImGui : : RadioButton ( " Never##npb0 " , settings . notePreviewBehavior = = 0 ) ) {
settings . notePreviewBehavior = 0 ;
}
if ( ImGui : : RadioButton ( " When cursor is in Note column##npb1 " , settings . notePreviewBehavior = = 1 ) ) {
settings . notePreviewBehavior = 1 ;
}
if ( ImGui : : RadioButton ( " When cursor is in Note column or not in edit mode##npb2 " , settings . notePreviewBehavior = = 2 ) ) {
settings . notePreviewBehavior = 2 ;
}
if ( ImGui : : RadioButton ( " Always##npb3 " , settings . notePreviewBehavior = = 3 ) ) {
settings . notePreviewBehavior = 3 ;
}
2022-04-16 18:13:19 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Wrap pattern cursor horizontally: " ) ;
if ( ImGui : : RadioButton ( " No##wrapH0 " , settings . wrapHorizontal = = 0 ) ) {
settings . wrapHorizontal = 0 ;
}
if ( ImGui : : RadioButton ( " Yes##wrapH1 " , settings . wrapHorizontal = = 1 ) ) {
settings . wrapHorizontal = 1 ;
}
if ( ImGui : : RadioButton ( " Yes, and move to next/prev row##wrapH2 " , settings . wrapHorizontal = = 2 ) ) {
settings . wrapHorizontal = 2 ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Wrap pattern cursor vertically: " ) ;
if ( ImGui : : RadioButton ( " No##wrapV0 " , settings . wrapVertical = = 0 ) ) {
settings . wrapVertical = 0 ;
}
if ( ImGui : : RadioButton ( " Yes##wrapV1 " , settings . wrapVertical = = 1 ) ) {
settings . wrapVertical = 1 ;
}
if ( ImGui : : RadioButton ( " Yes, and move to next/prev pattern##wrapV2 " , settings . wrapVertical = = 2 ) ) {
settings . wrapVertical = 2 ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Cursor movement keys behavior: " ) ;
if ( ImGui : : RadioButton ( " Move by one##cmk0 " , settings . scrollStep = = 0 ) ) {
settings . scrollStep = 0 ;
}
if ( ImGui : : RadioButton ( " Move by Edit Step##cmk1 " , settings . scrollStep = = 1 ) ) {
settings . scrollStep = 1 ;
}
2022-03-12 07:32:02 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Effect input cursor behavior: " ) ;
if ( ImGui : : RadioButton ( " Move down##eicb0 " , settings . effectCursorDir = = 0 ) ) {
settings . effectCursorDir = 0 ;
}
if ( ImGui : : RadioButton ( " Move to effect value (otherwise move down)##eicb1 " , settings . effectCursorDir = = 1 ) ) {
settings . effectCursorDir = 1 ;
}
if ( ImGui : : RadioButton ( " Move to effect value/next effect and wrap around##eicb2 " , settings . effectCursorDir = = 2 ) ) {
settings . effectCursorDir = 2 ;
}
2022-06-20 21:24:14 +00:00
ImGui : : Text ( " Allow dragging selection: " ) ;
if ( ImGui : : RadioButton ( " No##dms0 " , settings . dragMovesSelection = = 0 ) ) {
settings . dragMovesSelection = 0 ;
}
if ( ImGui : : RadioButton ( " Yes##dms1 " , settings . dragMovesSelection = = 1 ) ) {
settings . dragMovesSelection = 1 ;
}
if ( ImGui : : RadioButton ( " Yes (while holding Ctrl only)##dms2 " , settings . dragMovesSelection = = 2 ) ) {
settings . dragMovesSelection = 2 ;
}
2022-04-08 07:16:57 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndChild ( ) ;
2022-02-18 03:59:11 +00:00
ImGui : : EndTabItem ( ) ;
}
2022-03-28 08:46:50 +00:00
if ( ImGui : : BeginTabItem ( " Audio/MIDI " ) ) {
2022-05-03 06:48:57 +00:00
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
2023-01-05 07:40:17 +00:00
# ifdef HAVE_JACK
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Backend " ) ;
ImGui : : SameLine ( ) ;
2023-01-05 07:40:17 +00:00
int prevAudioEngine = settings . audioEngine ;
if ( ImGui : : Combo ( " ##Backend " , & settings . audioEngine , audioBackends , 2 ) ) {
if ( settings . audioEngine ! = prevAudioEngine ) {
if ( ! isProAudio [ settings . audioEngine ] ) settings . audioChans = 2 ;
}
}
# endif
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Device " ) ;
ImGui : : SameLine ( ) ;
String audioDevName = settings . audioDevice . empty ( ) ? " <System default> " : settings . audioDevice ;
if ( ImGui : : BeginCombo ( " ##AudioDevice " , audioDevName . c_str ( ) ) ) {
if ( ImGui : : Selectable ( " <System default> " , settings . audioDevice . empty ( ) ) ) {
settings . audioDevice = " " ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
for ( String & i : e - > getAudioDevices ( ) ) {
if ( ImGui : : Selectable ( i . c_str ( ) , i = = settings . audioDevice ) ) {
settings . audioDevice = i ;
}
}
ImGui : : EndCombo ( ) ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Sample rate " ) ;
ImGui : : SameLine ( ) ;
String sr = fmt : : sprintf ( " %d " , settings . audioRate ) ;
if ( ImGui : : BeginCombo ( " ##SampleRate " , sr . c_str ( ) ) ) {
SAMPLE_RATE_SELECTABLE ( 8000 ) ;
SAMPLE_RATE_SELECTABLE ( 16000 ) ;
SAMPLE_RATE_SELECTABLE ( 22050 ) ;
SAMPLE_RATE_SELECTABLE ( 32000 ) ;
SAMPLE_RATE_SELECTABLE ( 44100 ) ;
SAMPLE_RATE_SELECTABLE ( 48000 ) ;
SAMPLE_RATE_SELECTABLE ( 88200 ) ;
SAMPLE_RATE_SELECTABLE ( 96000 ) ;
SAMPLE_RATE_SELECTABLE ( 192000 ) ;
ImGui : : EndCombo ( ) ;
}
2022-02-18 03:59:11 +00:00
2023-01-05 07:40:17 +00:00
if ( isProAudio [ settings . audioEngine ] ) {
ImGui : : Text ( " Outputs " ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : InputInt ( " ##AudioChansI " , & settings . audioChans , 1 , 1 ) ) {
if ( settings . audioChans < 1 ) settings . audioChans = 1 ;
if ( settings . audioChans > 16 ) settings . audioChans = 16 ;
}
} else {
ImGui : : Text ( " Channels " ) ;
ImGui : : SameLine ( ) ;
String chStr = ( settings . audioChans < 1 | | settings . audioChans > 8 ) ? " What? " : nonProAudioOuts [ settings . audioChans - 1 ] ;
if ( ImGui : : BeginCombo ( " ##AudioChans " , chStr . c_str ( ) ) ) {
CHANS_SELECTABLE ( 1 ) ;
CHANS_SELECTABLE ( 2 ) ;
CHANS_SELECTABLE ( 4 ) ;
CHANS_SELECTABLE ( 6 ) ;
CHANS_SELECTABLE ( 8 ) ;
ImGui : : EndCombo ( ) ;
}
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Buffer size " ) ;
ImGui : : SameLine ( ) ;
String bs = fmt : : sprintf ( " %d (latency: ~%.1fms) " , settings . audioBufSize , 2000.0 * ( double ) settings . audioBufSize / ( double ) MAX ( 1 , settings . audioRate ) ) ;
if ( ImGui : : BeginCombo ( " ##BufferSize " , bs . c_str ( ) ) ) {
BUFFER_SIZE_SELECTABLE ( 64 ) ;
BUFFER_SIZE_SELECTABLE ( 128 ) ;
BUFFER_SIZE_SELECTABLE ( 256 ) ;
BUFFER_SIZE_SELECTABLE ( 512 ) ;
BUFFER_SIZE_SELECTABLE ( 1024 ) ;
BUFFER_SIZE_SELECTABLE ( 2048 ) ;
ImGui : : EndCombo ( ) ;
}
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Quality " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##Quality " , & settings . audioQuality , audioQualities , 2 ) ;
2022-04-13 07:29:07 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Metronome volume " ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : SliderInt ( " ##MetroVol " , & settings . metroVol , 0 , 200 , " %d%% " ) ) {
if ( settings . metroVol < 0 ) settings . metroVol = 0 ;
if ( settings . metroVol > 200 ) settings . metroVol = 200 ;
e - > setMetronomeVol ( ( ( float ) settings . metroVol ) / 100.0f ) ;
}
2022-04-15 10:37:23 +00:00
2022-05-03 06:48:57 +00:00
bool lowLatencyB = settings . lowLatency ;
if ( ImGui : : Checkbox ( " Low-latency mode (experimental!) " , & lowLatencyB ) ) {
settings . lowLatency = lowLatencyB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip ( " reduces latency by running the engine faster than the tick rate. \n useful for live playback/jam mode. \n \n warning: experimental! may produce glitches. \n only enable if your buffer size is small (10ms or less). " ) ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool forceMonoB = settings . forceMono ;
if ( ImGui : : Checkbox ( " Force mono audio " , & forceMonoB ) ) {
settings . forceMono = forceMonoB ;
}
2022-02-18 03:59:11 +00:00
2022-07-25 23:41:47 +00:00
bool clampSamplesB = settings . clampSamples ;
if ( ImGui : : Checkbox ( " Software clipping " , & clampSamplesB ) ) {
settings . clampSamples = clampSamplesB ;
}
2022-05-03 06:48:57 +00:00
TAAudioDesc & audioWant = e - > getAudioDescWant ( ) ;
TAAudioDesc & audioGot = e - > getAudioDescGot ( ) ;
2022-02-18 03:59:11 +00:00
2023-01-05 07:40:17 +00:00
ImGui : : Text ( " want: %d samples @ %.0fHz (%d channels) " , audioWant . bufsize , audioWant . rate , audioWant . outChans ) ;
ImGui : : Text ( " got: %d samples @ %.0fHz (%d channels) " , audioGot . bufsize , audioGot . rate , audioWant . outChans ) ;
2022-03-28 08:46:50 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
ImGui : : Text ( " MIDI input " ) ;
ImGui : : SameLine ( ) ;
String midiInName = settings . midiInDevice . empty ( ) ? " <disabled> " : settings . midiInDevice ;
bool hasToReloadMidi = false ;
if ( ImGui : : BeginCombo ( " ##MidiInDevice " , midiInName . c_str ( ) ) ) {
if ( ImGui : : Selectable ( " <disabled> " , settings . midiInDevice . empty ( ) ) ) {
settings . midiInDevice = " " ;
2022-04-01 07:21:10 +00:00
hasToReloadMidi = true ;
2022-03-28 08:46:50 +00:00
}
2022-05-03 06:48:57 +00:00
for ( String & i : e - > getMidiIns ( ) ) {
if ( ImGui : : Selectable ( i . c_str ( ) , i = = settings . midiInDevice ) ) {
settings . midiInDevice = i ;
hasToReloadMidi = true ;
}
}
ImGui : : EndCombo ( ) ;
2022-03-28 08:46:50 +00:00
}
2022-05-03 06:48:57 +00:00
if ( hasToReloadMidi ) {
2022-08-22 19:17:19 +00:00
midiMap . read ( e - > getConfigPath ( ) + DIR_SEPARATOR_STR + " midiIn_ " + stripName ( settings . midiInDevice ) + " .cfg " ) ;
2022-05-03 06:48:57 +00:00
midiMap . compile ( ) ;
2022-03-28 08:46:50 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " MIDI output " ) ;
ImGui : : SameLine ( ) ;
String midiOutName = settings . midiOutDevice . empty ( ) ? " <disabled> " : settings . midiOutDevice ;
if ( ImGui : : BeginCombo ( " ##MidiOutDevice " , midiOutName . c_str ( ) ) ) {
if ( ImGui : : Selectable ( " <disabled> " , settings . midiOutDevice . empty ( ) ) ) {
settings . midiOutDevice = " " ;
2022-03-28 08:46:50 +00:00
}
2022-05-03 06:48:57 +00:00
for ( String & i : e - > getMidiIns ( ) ) {
if ( ImGui : : Selectable ( i . c_str ( ) , i = = settings . midiOutDevice ) ) {
settings . midiOutDevice = i ;
}
}
ImGui : : EndCombo ( ) ;
2022-03-28 08:46:50 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " MIDI input settings " ) ) {
ImGui : : Checkbox ( " Note input " , & midiMap . noteInput ) ;
ImGui : : Checkbox ( " Velocity input " , & midiMap . volInput ) ;
// TODO
//ImGui::Checkbox("Use raw velocity value (don't map from linear to log)",&midiMap.rawVolume);
//ImGui::Checkbox("Polyphonic/chord input",&midiMap.polyInput);
ImGui : : Checkbox ( " Map MIDI channels to direct channels " , & midiMap . directChannel ) ;
2022-05-08 07:07:58 +00:00
ImGui : : Checkbox ( " Map Yamaha FM voice data to instruments " , & midiMap . yamahaFMResponse ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Checkbox ( " Program change is instrument selection " , & midiMap . programChange ) ;
//ImGui::Checkbox("Listen to MIDI clock",&midiMap.midiClock);
//ImGui::Checkbox("Listen to MIDI time code",&midiMap.midiTimeCode);
ImGui : : Combo ( " Value input style " , & midiMap . valueInputStyle , valueInputStyles , 7 ) ;
if ( midiMap . valueInputStyle > 3 ) {
if ( midiMap . valueInputStyle = = 6 ) {
if ( ImGui : : InputInt ( " Control##valueCCS " , & midiMap . valueInputControlSingle , 1 , 16 ) ) {
if ( midiMap . valueInputControlSingle < 0 ) midiMap . valueInputControlSingle = 0 ;
if ( midiMap . valueInputControlSingle > 127 ) midiMap . valueInputControlSingle = 127 ;
}
} else {
if ( ImGui : : InputInt ( ( midiMap . valueInputStyle = = 4 ) ? " CC of upper nibble##valueCC1 " : " MSB CC##valueCC1 " , & midiMap . valueInputControlMSB , 1 , 16 ) ) {
if ( midiMap . valueInputControlMSB < 0 ) midiMap . valueInputControlMSB = 0 ;
if ( midiMap . valueInputControlMSB > 127 ) midiMap . valueInputControlMSB = 127 ;
}
if ( ImGui : : InputInt ( ( midiMap . valueInputStyle = = 4 ) ? " CC of lower nibble##valueCC2 " : " LSB CC##valueCC2 " , & midiMap . valueInputControlLSB , 1 , 16 ) ) {
if ( midiMap . valueInputControlLSB < 0 ) midiMap . valueInputControlLSB = 0 ;
if ( midiMap . valueInputControlLSB > 127 ) midiMap . valueInputControlLSB = 127 ;
}
2022-04-01 06:50:01 +00:00
}
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Per-column control change " ) ) {
for ( int i = 0 ; i < 18 ; i + + ) {
ImGui : : PushID ( i ) ;
ImGui : : Combo ( specificControls [ i ] , & midiMap . valueInputSpecificStyle [ i ] , valueSInputStyles , 4 ) ;
if ( midiMap . valueInputSpecificStyle [ i ] > 0 ) {
ImGui : : Indent ( ) ;
if ( midiMap . valueInputSpecificStyle [ i ] = = 3 ) {
if ( ImGui : : InputInt ( " Control##valueCCS " , & midiMap . valueInputSpecificSingle [ i ] , 1 , 16 ) ) {
if ( midiMap . valueInputSpecificSingle [ i ] < 0 ) midiMap . valueInputSpecificSingle [ i ] = 0 ;
if ( midiMap . valueInputSpecificSingle [ i ] > 127 ) midiMap . valueInputSpecificSingle [ i ] = 127 ;
}
} else {
if ( ImGui : : InputInt ( ( midiMap . valueInputSpecificStyle [ i ] = = 4 ) ? " CC of upper nibble##valueCC1 " : " MSB CC##valueCC1 " , & midiMap . valueInputSpecificMSB [ i ] , 1 , 16 ) ) {
if ( midiMap . valueInputSpecificMSB [ i ] < 0 ) midiMap . valueInputSpecificMSB [ i ] = 0 ;
if ( midiMap . valueInputSpecificMSB [ i ] > 127 ) midiMap . valueInputSpecificMSB [ i ] = 127 ;
}
if ( ImGui : : InputInt ( ( midiMap . valueInputSpecificStyle [ i ] = = 4 ) ? " CC of lower nibble##valueCC2 " : " LSB CC##valueCC2 " , & midiMap . valueInputSpecificLSB [ i ] , 1 , 16 ) ) {
if ( midiMap . valueInputSpecificLSB [ i ] < 0 ) midiMap . valueInputSpecificLSB [ i ] = 0 ;
if ( midiMap . valueInputSpecificLSB [ i ] > 127 ) midiMap . valueInputSpecificLSB [ i ] = 127 ;
}
2022-04-01 06:50:01 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : Unindent ( ) ;
2022-04-01 06:50:01 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : PopID ( ) ;
2022-04-01 06:50:01 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : SliderFloat ( " Volume curve " , & midiMap . volExp , 0.01 , 8.0 , " %.2f " ) ) {
if ( midiMap . volExp < 0.01 ) midiMap . volExp = 0.01 ;
if ( midiMap . volExp > 8.0 ) midiMap . volExp = 8.0 ;
} rightClickable
float curve [ 128 ] ;
for ( int i = 0 ; i < 128 ; i + + ) {
curve [ i ] = ( int ) ( pow ( ( double ) i / 127.0 , midiMap . volExp ) * 127.0 ) ;
}
ImGui : : PlotLines ( " ##VolCurveDisplay " , curve , 128 , 0 , " Volume curve " , 0.0 , 127.0 , ImVec2 ( 200.0f * dpiScale , 200.0f * dpiScale ) ) ;
2022-03-29 22:38:30 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Actions: " ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_PLUS " ##AddAction " ) ) {
midiMap . binds . push_back ( MIDIBind ( ) ) ;
}
2022-04-01 03:48:46 +00:00
ImGui : : SameLine ( ) ;
2022-05-03 06:48:57 +00:00
if ( ImGui : : Button ( ICON_FA_EXTERNAL_LINK " ##AddLearnAction " ) ) {
midiMap . binds . push_back ( MIDIBind ( ) ) ;
learning = midiMap . binds . size ( ) - 1 ;
}
if ( learning ! = - 1 ) {
ImGui : : SameLine ( ) ;
ImGui : : Text ( " (learning! press a button or move a slider/knob/something on your device.) " ) ;
}
if ( ImGui : : BeginTable ( " MIDIActions " , 7 ) ) {
ImGui : : TableSetupColumn ( " c0 " , ImGuiTableColumnFlags_WidthStretch , 0.2 ) ;
ImGui : : TableSetupColumn ( " c1 " , ImGuiTableColumnFlags_WidthStretch , 0.1 ) ;
ImGui : : TableSetupColumn ( " c2 " , ImGuiTableColumnFlags_WidthStretch , 0.3 ) ;
ImGui : : TableSetupColumn ( " c3 " , ImGuiTableColumnFlags_WidthStretch , 0.2 ) ;
ImGui : : TableSetupColumn ( " c4 " , ImGuiTableColumnFlags_WidthStretch , 0.5 ) ;
ImGui : : TableSetupColumn ( " c5 " , ImGuiTableColumnFlags_WidthFixed ) ;
ImGui : : TableSetupColumn ( " c6 " , ImGuiTableColumnFlags_WidthFixed ) ;
2022-03-29 22:38:30 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : TableNextRow ( ImGuiTableRowFlags_Headers ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Type " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Channel " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Note/Control " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Velocity/Value " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Action " ) ;
2022-03-29 22:38:30 +00:00
ImGui : : TableNextColumn ( ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Learn " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Remove " ) ;
for ( size_t i = 0 ; i < midiMap . binds . size ( ) ; i + + ) {
MIDIBind & bind = midiMap . binds [ i ] ;
char bindID [ 1024 ] ;
ImGui : : PushID ( i ) ;
ImGui : : TableNextRow ( ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( ImGui : : BeginCombo ( " ##BType " , messageTypes [ bind . type ] ) ) {
for ( int j = 8 ; j < 15 ; j + + ) {
if ( ImGui : : Selectable ( messageTypes [ j ] , bind . type = = j ) ) {
bind . type = j ;
}
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndCombo ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( ImGui : : BeginCombo ( " ##BChannel " , messageChannels [ bind . channel ] ) ) {
if ( ImGui : : Selectable ( messageChannels [ 16 ] , bind . channel = = 16 ) ) {
bind . channel = 16 ;
}
for ( int j = 0 ; j < 16 ; j + + ) {
if ( ImGui : : Selectable ( messageChannels [ j ] , bind . channel = = j ) ) {
bind . channel = j ;
}
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndCombo ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
if ( bind . data1 = = 128 ) {
snprintf ( bindID , 1024 , " Any " ) ;
} else {
2022-04-14 21:20:10 +00:00
const char * nName = " ??? " ;
2022-05-03 06:48:57 +00:00
if ( ( bind . data1 + 60 ) > 0 & & ( bind . data1 + 60 ) < 180 ) {
nName = noteNames [ bind . data1 + 60 ] ;
}
snprintf ( bindID , 1024 , " %d (0x%.2X, %s) " , bind . data1 , bind . data1 , nName ) ;
}
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( ImGui : : BeginCombo ( " ##BValue1 " , bindID ) ) {
if ( ImGui : : Selectable ( " Any " , bind . data1 = = 128 ) ) {
bind . data1 = 128 ;
2022-04-14 21:20:10 +00:00
}
2022-05-03 06:48:57 +00:00
for ( int j = 0 ; j < 128 ; j + + ) {
const char * nName = " ??? " ;
if ( ( j + 60 ) > 0 & & ( j + 60 ) < 180 ) {
nName = noteNames [ j + 60 ] ;
}
snprintf ( bindID , 1024 , " %d (0x%.2X, %s)##BV1_%d " , j , j , nName , j ) ;
if ( ImGui : : Selectable ( bindID , bind . data1 = = j ) ) {
bind . data1 = j ;
}
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndCombo ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
if ( bind . data2 = = 128 ) {
snprintf ( bindID , 1024 , " Any " ) ;
} else {
snprintf ( bindID , 1024 , " %d (0x%.2X) " , bind . data2 , bind . data2 ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( ImGui : : BeginCombo ( " ##BValue2 " , bindID ) ) {
if ( ImGui : : Selectable ( " Any " , bind . data2 = = 128 ) ) {
bind . data2 = 128 ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
for ( int j = 0 ; j < 128 ; j + + ) {
snprintf ( bindID , 1024 , " %d (0x%.2X)##BV2_%d " , j , j , j ) ;
if ( ImGui : : Selectable ( bindID , bind . data2 = = j ) ) {
bind . data2 = j ;
}
}
ImGui : : EndCombo ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
ImGui : : SetNextItemWidth ( ImGui : : GetContentRegionAvail ( ) . x ) ;
if ( ImGui : : BeginCombo ( " ##BAction " , ( bind . action = = 0 ) ? " --none-- " : guiActions [ bind . action ] . friendlyName ) ) {
if ( ImGui : : Selectable ( " --none-- " , bind . action = = 0 ) ) {
bind . action = 0 ;
}
for ( int j = 0 ; j < GUI_ACTION_MAX ; j + + ) {
if ( strcmp ( guiActions [ j ] . friendlyName , " " ) = = 0 ) continue ;
if ( strstr ( guiActions [ j ] . friendlyName , " --- " ) = = guiActions [ j ] . friendlyName ) {
ImGui : : TextUnformatted ( guiActions [ j ] . friendlyName ) ;
} else {
snprintf ( bindID , 1024 , " %s##BA_%d " , guiActions [ j ] . friendlyName , j ) ;
if ( ImGui : : Selectable ( bindID , bind . action = = j ) ) {
bind . action = j ;
}
}
}
ImGui : : EndCombo ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
if ( ImGui : : Button ( ( learning = = ( int ) i ) ? ( " waiting...##BLearn " ) : ( ICON_FA_SQUARE_O " ##BLearn " ) ) ) {
if ( learning = = ( int ) i ) {
learning = - 1 ;
2022-03-29 22:38:30 +00:00
} else {
2022-05-03 06:48:57 +00:00
learning = i ;
2022-03-29 22:38:30 +00:00
}
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
if ( ImGui : : Button ( ICON_FA_TIMES " ##BRemove " ) ) {
midiMap . binds . erase ( midiMap . binds . begin ( ) + i ) ;
if ( learning = = ( int ) i ) learning = - 1 ;
i - - ;
2022-03-31 23:39:01 +00:00
}
2022-03-29 22:38:30 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : PopID ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndTable ( ) ;
2022-03-29 22:38:30 +00:00
}
2022-09-26 06:27:36 +00:00
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " MIDI output settings " ) ) {
ImGui : : Text ( " Output mode: " ) ;
if ( ImGui : : RadioButton ( " Off (use for TX81Z) " , settings . midiOutMode = = 0 ) ) {
settings . midiOutMode = 0 ;
}
if ( ImGui : : RadioButton ( " Melodic " , settings . midiOutMode = = 1 ) ) {
settings . midiOutMode = 1 ;
}
/*
if ( ImGui : : RadioButton ( " Light Show (use for Launchpad) " , settings . midiOutMode = = 2 ) ) {
settings . midiOutMode = 2 ;
} */
bool midiOutClockB = settings . midiOutClock ;
if ( ImGui : : Checkbox ( " Send MIDI clock " , & midiOutClockB ) ) {
settings . midiOutClock = midiOutClockB ;
}
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
}
2022-03-29 22:38:30 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndChild ( ) ;
2022-02-18 03:59:11 +00:00
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Emulation " ) ) {
2022-05-03 06:48:57 +00:00
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
ImGui : : Text ( " Arcade/YM2151 core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##ArcadeCore " , & settings . arcadeCore , arcadeCores , 2 ) ;
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Genesis/YM2612 core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##YM2612Core " , & settings . ym2612Core , ym2612Cores , 2 ) ;
2022-02-18 03:59:11 +00:00
2022-05-26 23:46:20 +00:00
ImGui : : Text ( " SN76489 core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##SNCore " , & settings . snCore , snCores , 2 ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " NES core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##NESCore " , & settings . nesCore , nesCores , 2 ) ;
2022-05-02 21:53:55 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " FDS core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##FDSCore " , & settings . fdsCore , nesCores , 2 ) ;
2022-05-11 21:39:36 +00:00
2022-08-28 20:10:16 +00:00
ImGui : : Text ( " SID core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##C64Core " , & settings . c64Core , c64Cores , 2 ) ;
2022-12-22 21:40:29 +00:00
ImGui : : Text ( " POKEY core " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##POKEYCore " , & settings . pokeyCore , pokeyCores , 2 ) ;
2022-12-24 07:29:37 +00:00
ImGui : : Text ( " OPN/OPNA/OPNB cores " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##OPNCore " , & settings . opnCore , opnCores , 2 ) ;
2022-06-03 06:18:32 +00:00
ImGui : : Separator ( ) ;
ImGui : : Text ( " PC Speaker strategy " ) ;
ImGui : : SameLine ( ) ;
ImGui : : Combo ( " ##PCSOutMethod " , & settings . pcSpeakerOutMethod , pcspkrOutMethods , 5 ) ;
2022-05-11 21:39:36 +00:00
ImGui : : Separator ( ) ;
ImGui : : Text ( " Sample ROMs: " ) ;
ImGui : : Text ( " OPL4 YRW801 path " ) ;
ImGui : : SameLine ( ) ;
ImGui : : InputText ( " ##YRW801Path " , & settings . yrw801Path ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FOLDER " ##YRW801Load " ) ) {
openFileDialog ( GUI_FILE_YRW801_ROM_OPEN ) ;
}
ImGui : : Text ( " MultiPCM TG100 path " ) ;
ImGui : : SameLine ( ) ;
ImGui : : InputText ( " ##TG100Path " , & settings . tg100Path ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FOLDER " ##TG100Load " ) ) {
openFileDialog ( GUI_FILE_TG100_ROM_OPEN ) ;
}
ImGui : : Text ( " MultiPCM MU5 path " ) ;
ImGui : : SameLine ( ) ;
ImGui : : InputText ( " ##MU5Path " , & settings . mu5Path ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FOLDER " ##MU5Load " ) ) {
openFileDialog ( GUI_FILE_MU5_ROM_OPEN ) ;
}
2022-05-03 06:48:57 +00:00
}
ImGui : : EndChild ( ) ;
2022-02-18 03:59:11 +00:00
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Appearance " ) ) {
2022-05-03 06:48:57 +00:00
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
2023-02-05 20:24:11 +00:00
if ( ImGui : : BeginCombo ( " Render driver " , settings . renderDriver . empty ( ) ? " Automatic " : settings . renderDriver . c_str ( ) ) ) {
if ( ImGui : : Selectable ( " Automatic " , settings . renderDriver . empty ( ) ) ) {
settings . renderDriver = " " ;
}
for ( String & i : availRenderDrivers ) {
if ( ImGui : : Selectable ( i . c_str ( ) , i = = settings . renderDriver ) ) {
settings . renderDriver = i ;
}
}
ImGui : : EndCombo ( ) ;
}
2022-05-03 06:48:57 +00:00
bool dpiScaleAuto = ( settings . dpiScale < 0.5f ) ;
if ( ImGui : : Checkbox ( " Automatic UI scaling factor " , & dpiScaleAuto ) ) {
if ( dpiScaleAuto ) {
settings . dpiScale = 0.0f ;
} else {
settings . dpiScale = 1.0f ;
}
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ! dpiScaleAuto ) {
if ( ImGui : : SliderFloat ( " UI scaling factor " , & settings . dpiScale , 1.0f , 3.0f , " %.2fx " ) ) {
if ( settings . dpiScale < 0.5f ) settings . dpiScale = 0.5f ;
if ( settings . dpiScale > 3.0f ) settings . dpiScale = 3.0f ;
} rightClickable
}
ImGui : : Text ( " Main font " ) ;
2022-02-18 03:59:11 +00:00
ImGui : : SameLine ( ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Combo ( " ##MainFont " , & settings . mainFont , mainFonts , 7 ) ;
if ( settings . mainFont = = 6 ) {
ImGui : : InputText ( " ##MainFontPath " , & settings . mainFontPath ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FOLDER " ##MainFontLoad " ) ) {
openFileDialog ( GUI_FILE_LOAD_MAIN_FONT ) ;
}
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : InputInt ( " Size##MainFontSize " , & settings . mainFontSize ) ) {
if ( settings . mainFontSize < 3 ) settings . mainFontSize = 3 ;
if ( settings . mainFontSize > 96 ) settings . mainFontSize = 96 ;
}
ImGui : : Text ( " Pattern font " ) ;
2022-02-18 03:59:11 +00:00
ImGui : : SameLine ( ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Combo ( " ##PatFont " , & settings . patFont , patFonts , 7 ) ;
if ( settings . patFont = = 6 ) {
ImGui : : InputText ( " ##PatFontPath " , & settings . patFontPath ) ;
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( ICON_FA_FOLDER " ##PatFontLoad " ) ) {
openFileDialog ( GUI_FILE_LOAD_PAT_FONT ) ;
}
}
if ( ImGui : : InputInt ( " Size##PatFontSize " , & settings . patFontSize ) ) {
if ( settings . patFontSize < 3 ) settings . patFontSize = 3 ;
if ( settings . patFontSize > 96 ) settings . patFontSize = 96 ;
2022-02-18 03:59:11 +00:00
}
2022-05-08 02:39:29 +00:00
if ( ImGui : : InputInt ( " Icon size " , & settings . iconSize ) ) {
if ( settings . iconSize < 3 ) settings . iconSize = 3 ;
if ( settings . iconSize > 48 ) settings . iconSize = 48 ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool loadJapaneseB = settings . loadJapanese ;
if ( ImGui : : Checkbox ( " Display Japanese characters " , & loadJapaneseB ) ) {
settings . loadJapanese = loadJapaneseB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip (
" Only toggle this option if you have enough graphics memory. \n "
" This is a temporary solution until dynamic font atlas is implemented in Dear ImGui. \n \n "
" このオプションは、十分なグラフィックメモリがある場合にのみ切り替えてください。 \n "
" これは、Dear ImGuiにダイナミックフォントアトラスが実装されるまでの一時的な解決策です。 "
) ;
}
2022-02-18 03:59:11 +00:00
2022-05-14 01:52:33 +00:00
bool loadChineseB = settings . loadChinese ;
if ( ImGui : : Checkbox ( " Display Chinese (Simplified) characters " , & loadChineseB ) ) {
settings . loadChinese = loadChineseB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip (
" Only toggle this option if you have enough graphics memory. \n "
" This is a temporary solution until dynamic font atlas is implemented in Dear ImGui. \n \n "
" 请在确保你有足够的显存后再启动此设定 \n "
" 这是一个在ImGui实现动态字体加载之前的临时解决方案 "
) ;
}
2022-08-25 23:49:08 +00:00
bool loadChineseTraditionalB = settings . loadChineseTraditional ;
if ( ImGui : : Checkbox ( " Display Chinese (Traditional) characters " , & loadChineseTraditionalB ) ) {
settings . loadChineseTraditional = loadChineseTraditionalB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip (
" Only toggle this option if you have enough graphics memory. \n "
" This is a temporary solution until dynamic font atlas is implemented in Dear ImGui. \n \n "
" 請在確保你有足夠的顯存后再啟動此設定 \n "
" 這是一個在ImGui實現動態字體加載之前的臨時解決方案 "
) ;
}
bool loadKoreanB = settings . loadKorean ;
if ( ImGui : : Checkbox ( " Display Korean characters " , & loadKoreanB ) ) {
settings . loadKorean = loadKoreanB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip (
" Only toggle this option if you have enough graphics memory. \n "
" This is a temporary solution until dynamic font atlas is implemented in Dear ImGui. \n \n "
" 그래픽 메모리가 충분한 경우에만 이 옵션을 선택하십시오. \n "
" 이 옵션은 Dear ImGui에 동적 글꼴 아틀라스가 구현될 때까지 임시 솔루션입니다. "
) ;
}
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-02-18 03:59:11 +00:00
2022-09-10 23:53:27 +00:00
if ( ImGui : : InputInt ( " Number of recent files " , & settings . maxRecentFile ) ) {
if ( settings . maxRecentFile < 0 ) settings . maxRecentFile = 0 ;
if ( settings . maxRecentFile > 30 ) settings . maxRecentFile = 30 ;
}
ImGui : : Separator ( ) ;
2022-08-13 23:00:29 +00:00
ImGui : : Text ( " Pattern view labels: " ) ;
ImGui : : InputTextWithHint ( " Note off (3-char) " , " OFF " , & settings . noteOffLabel ) ;
ImGui : : InputTextWithHint ( " Note release (3-char) " , " === " , & settings . noteRelLabel ) ;
ImGui : : InputTextWithHint ( " Macro release (3-char) " , " REL " , & settings . macroRelLabel ) ;
ImGui : : InputTextWithHint ( " Empty field (3-char) " , " ... " , & settings . emptyLabel ) ;
ImGui : : InputTextWithHint ( " Empty field (2-char) " , " .. " , & settings . emptyLabel2 ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Orders row number format: " ) ;
if ( ImGui : : RadioButton ( " Decimal##orbD " , settings . orderRowsBase = = 0 ) ) {
settings . orderRowsBase = 0 ;
}
if ( ImGui : : RadioButton ( " Hexadecimal##orbH " , settings . orderRowsBase = = 1 ) ) {
settings . orderRowsBase = 1 ;
}
2022-04-04 18:25:38 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Pattern row number format: " ) ;
if ( ImGui : : RadioButton ( " Decimal##prbD " , settings . patRowsBase = = 0 ) ) {
settings . patRowsBase = 0 ;
}
if ( ImGui : : RadioButton ( " Hexadecimal##prbH " , settings . patRowsBase = = 1 ) ) {
settings . patRowsBase = 1 ;
}
2022-04-04 18:25:38 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " FM parameter names: " ) ;
if ( ImGui : : RadioButton ( " Friendly##fmn0 " , settings . fmNames = = 0 ) ) {
settings . fmNames = 0 ;
}
if ( ImGui : : RadioButton ( " Technical##fmn1 " , settings . fmNames = = 1 ) ) {
settings . fmNames = 1 ;
}
if ( ImGui : : RadioButton ( " Technical (alternate)##fmn2 " , settings . fmNames = = 2 ) ) {
settings . fmNames = 2 ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Title bar: " ) ;
if ( ImGui : : RadioButton ( " Furnace##tbar0 " , settings . titleBarInfo = = 0 ) ) {
settings . titleBarInfo = 0 ;
updateWindowTitle ( ) ;
}
if ( ImGui : : RadioButton ( " Song Name - Furnace##tbar1 " , settings . titleBarInfo = = 1 ) ) {
settings . titleBarInfo = 1 ;
updateWindowTitle ( ) ;
}
if ( ImGui : : RadioButton ( " file_name.fur - Furnace##tbar2 " , settings . titleBarInfo = = 2 ) ) {
settings . titleBarInfo = 2 ;
updateWindowTitle ( ) ;
}
if ( ImGui : : RadioButton ( " /path/to/file.fur - Furnace##tbar3 " , settings . titleBarInfo = = 3 ) ) {
settings . titleBarInfo = 3 ;
updateWindowTitle ( ) ;
}
2022-03-25 23:16:47 +00:00
2022-05-03 06:48:57 +00:00
bool titleBarSysB = settings . titleBarSys ;
if ( ImGui : : Checkbox ( " Display system name on title bar " , & titleBarSysB ) ) {
settings . titleBarSys = titleBarSysB ;
updateWindowTitle ( ) ;
}
2022-03-27 08:38:04 +00:00
2022-05-05 05:52:15 +00:00
bool noMultiSystemB = settings . noMultiSystem ;
if ( ImGui : : Checkbox ( " Display chip names instead of \" multi-system \" in title bar " , & noMultiSystemB ) ) {
settings . noMultiSystem = noMultiSystemB ;
updateWindowTitle ( ) ;
}
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Status bar: " ) ;
if ( ImGui : : RadioButton ( " Cursor details##sbar0 " , settings . statusDisplay = = 0 ) ) {
settings . statusDisplay = 0 ;
}
if ( ImGui : : RadioButton ( " File path##sbar1 " , settings . statusDisplay = = 1 ) ) {
settings . statusDisplay = 1 ;
}
if ( ImGui : : RadioButton ( " Cursor details or file path##sbar2 " , settings . statusDisplay = = 2 ) ) {
settings . statusDisplay = 2 ;
}
if ( ImGui : : RadioButton ( " Nothing##sbar3 " , settings . statusDisplay = = 3 ) ) {
settings . statusDisplay = 3 ;
}
2022-04-12 01:27:23 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Play/edit controls layout: " ) ;
if ( ImGui : : RadioButton ( " Classic##ecl0 " , settings . controlLayout = = 0 ) ) {
settings . controlLayout = 0 ;
}
if ( ImGui : : RadioButton ( " Compact##ecl1 " , settings . controlLayout = = 1 ) ) {
settings . controlLayout = 1 ;
}
if ( ImGui : : RadioButton ( " Compact (vertical)##ecl2 " , settings . controlLayout = = 2 ) ) {
settings . controlLayout = 2 ;
}
if ( ImGui : : RadioButton ( " Split##ecl3 " , settings . controlLayout = = 3 ) ) {
settings . controlLayout = 3 ;
}
2022-04-13 02:30:12 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " FM parameter editor layout: " ) ;
if ( ImGui : : RadioButton ( " Modern##fml0 " , settings . fmLayout = = 0 ) ) {
settings . fmLayout = 0 ;
}
if ( ImGui : : RadioButton ( " Compact (2x2, classic)##fml1 " , settings . fmLayout = = 1 ) ) {
settings . fmLayout = 1 ;
}
if ( ImGui : : RadioButton ( " Compact (1x4)##fml2 " , settings . fmLayout = = 2 ) ) {
settings . fmLayout = 2 ;
}
if ( ImGui : : RadioButton ( " Compact (4x1)##fml3 " , settings . fmLayout = = 3 ) ) {
settings . fmLayout = 3 ;
}
2022-06-13 08:54:42 +00:00
if ( ImGui : : RadioButton ( " Alternate (2x2)##fml4 " , settings . fmLayout = = 4 ) ) {
settings . fmLayout = 4 ;
}
if ( ImGui : : RadioButton ( " Alternate (1x4)##fml5 " , settings . fmLayout = = 5 ) ) {
settings . fmLayout = 5 ;
}
if ( ImGui : : RadioButton ( " Alternate (4x1)##fml5 " , settings . fmLayout = = 6 ) ) {
settings . fmLayout = 6 ;
}
2022-04-12 23:26:25 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Position of Sustain in FM editor: " ) ;
if ( ImGui : : RadioButton ( " Between Decay and Sustain Rate##susp0 " , settings . susPosition = = 0 ) ) {
settings . susPosition = 0 ;
}
if ( ImGui : : RadioButton ( " After Release Rate##susp1 " , settings . susPosition = = 1 ) ) {
settings . susPosition = 1 ;
}
2022-02-18 03:59:11 +00:00
2022-11-11 00:21:01 +00:00
ImGui : : Text ( " Macro editor layout: " ) ;
if ( ImGui : : RadioButton ( " Unified##mel0 " , settings . macroLayout = = 0 ) ) {
settings . macroLayout = 0 ;
}
if ( ImGui : : RadioButton ( " Mobile##mel1 " , settings . macroLayout = = 1 ) ) {
settings . macroLayout = 1 ;
}
if ( ImGui : : RadioButton ( " Grid##mel2 " , settings . macroLayout = = 2 ) ) {
settings . macroLayout = 2 ;
}
if ( ImGui : : RadioButton ( " Single (with list)##mel3 " , settings . macroLayout = = 3 ) ) {
settings . macroLayout = 3 ;
}
if ( ImGui : : RadioButton ( " Single (combo box)##mel4 " , settings . macroLayout = = 4 ) ) {
settings . macroLayout = 4 ;
}
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-03-14 04:37:25 +00:00
2022-08-09 19:53:31 +00:00
ImGui : : Text ( " Namco 163 chip name " ) ;
2022-07-21 20:21:29 +00:00
ImGui : : SameLine ( ) ;
2022-07-26 23:23:01 +00:00
ImGui : : InputTextWithHint ( " ##C163Name " , DIV_C163_DEFAULT_NAME , & settings . c163Name ) ;
2022-07-21 20:21:29 +00:00
ImGui : : Separator ( ) ;
2022-08-16 18:53:51 +00:00
ImGui : : Text ( " Channel colors: " ) ;
if ( ImGui : : RadioButton ( " Single##CHC0 " , settings . channelColors = = 0 ) ) {
settings . channelColors = 0 ;
}
if ( ImGui : : RadioButton ( " Channel type##CHC1 " , settings . channelColors = = 1 ) ) {
settings . channelColors = 1 ;
}
if ( ImGui : : RadioButton ( " Instrument type##CHC2 " , settings . channelColors = = 2 ) ) {
settings . channelColors = 2 ;
}
ImGui : : Text ( " Channel name colors: " ) ;
2022-09-18 08:51:10 +00:00
if ( ImGui : : RadioButton ( " Single##CTC0 " , settings . channelTextColors = = 0 ) ) {
settings . channelTextColors = 0 ;
2022-08-16 18:53:51 +00:00
}
2022-09-18 08:51:10 +00:00
if ( ImGui : : RadioButton ( " Channel type##CTC1 " , settings . channelTextColors = = 1 ) ) {
settings . channelTextColors = 1 ;
2022-08-16 18:53:51 +00:00
}
2022-09-18 08:51:10 +00:00
if ( ImGui : : RadioButton ( " Instrument type##CTC2 " , settings . channelTextColors = = 2 ) ) {
settings . channelTextColors = 2 ;
2022-08-16 18:53:51 +00:00
}
ImGui : : Text ( " Channel style: " ) ;
if ( ImGui : : RadioButton ( " Classic##CHS0 " , settings . channelStyle = = 0 ) ) {
settings . channelStyle = 0 ;
}
if ( ImGui : : RadioButton ( " Line##CHS1 " , settings . channelStyle = = 1 ) ) {
settings . channelStyle = 1 ;
}
if ( ImGui : : RadioButton ( " Round##CHS2 " , settings . channelStyle = = 2 ) ) {
settings . channelStyle = 2 ;
}
if ( ImGui : : RadioButton ( " Split button##CHS3 " , settings . channelStyle = = 3 ) ) {
settings . channelStyle = 3 ;
}
if ( ImGui : : RadioButton ( " Square border##CH42 " , settings . channelStyle = = 4 ) ) {
settings . channelStyle = 4 ;
}
if ( ImGui : : RadioButton ( " Round border##CHS5 " , settings . channelStyle = = 5 ) ) {
settings . channelStyle = 5 ;
}
ImGui : : Text ( " Channel volume bar: " ) ;
if ( ImGui : : RadioButton ( " None##CHV0 " , settings . channelVolStyle = = 0 ) ) {
settings . channelVolStyle = 0 ;
}
if ( ImGui : : RadioButton ( " Simple##CHV1 " , settings . channelVolStyle = = 1 ) ) {
settings . channelVolStyle = 1 ;
}
if ( ImGui : : RadioButton ( " Stereo##CHV2 " , settings . channelVolStyle = = 2 ) ) {
settings . channelVolStyle = 2 ;
}
if ( ImGui : : RadioButton ( " Real##CHV3 " , settings . channelVolStyle = = 3 ) ) {
settings . channelVolStyle = 3 ;
}
2022-09-20 07:32:23 +00:00
if ( ImGui : : RadioButton ( " Real (stereo)##CHV4 " , settings . channelVolStyle = = 4 ) ) {
settings . channelVolStyle = 4 ;
}
2022-08-16 18:53:51 +00:00
ImGui : : Text ( " Channel feedback style: " ) ;
if ( ImGui : : RadioButton ( " Off##CHF0 " , settings . channelFeedbackStyle = = 0 ) ) {
settings . channelFeedbackStyle = 0 ;
}
if ( ImGui : : RadioButton ( " Note##CHF1 " , settings . channelFeedbackStyle = = 1 ) ) {
settings . channelFeedbackStyle = 1 ;
}
if ( ImGui : : RadioButton ( " Volume##CHF2 " , settings . channelFeedbackStyle = = 2 ) ) {
settings . channelFeedbackStyle = 2 ;
}
if ( ImGui : : RadioButton ( " Active##CHF3 " , settings . channelFeedbackStyle = = 3 ) ) {
settings . channelFeedbackStyle = 3 ;
}
2022-09-18 09:20:08 +00:00
ImGui : : Text ( " Channel font: " ) ;
if ( ImGui : : RadioButton ( " Regular##CHFont0 " , settings . channelFont = = 0 ) ) {
settings . channelFont = 0 ;
}
if ( ImGui : : RadioButton ( " Monospace##CHFont1 " , settings . channelFont = = 1 ) ) {
settings . channelFont = 1 ;
}
2022-09-21 00:07:17 +00:00
bool channelTextCenterB = settings . channelTextCenter ;
if ( ImGui : : Checkbox ( " Center channel name " , & channelTextCenterB ) ) {
settings . channelTextCenter = channelTextCenterB ;
}
2022-08-16 18:53:51 +00:00
ImGui : : Separator ( ) ;
2022-05-03 06:48:57 +00:00
bool insEditColorizeB = settings . insEditColorize ;
if ( ImGui : : Checkbox ( " Colorize instrument editor using instrument type " , & insEditColorizeB ) ) {
settings . insEditColorize = insEditColorizeB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool separateFMColorsB = settings . separateFMColors ;
if ( ImGui : : Checkbox ( " Use separate colors for carriers/modulators in FM editor " , & separateFMColorsB ) ) {
settings . separateFMColors = separateFMColorsB ;
}
2022-04-15 02:57:39 +00:00
2022-05-03 06:48:57 +00:00
bool unifiedDataViewB = settings . unifiedDataView ;
if ( ImGui : : Checkbox ( " Unified instrument/wavetable/sample list " , & unifiedDataViewB ) ) {
settings . unifiedDataView = unifiedDataViewB ;
}
2022-05-05 05:52:15 +00:00
if ( settings . unifiedDataView ) {
settings . horizontalDataView = 0 ;
}
ImGui : : BeginDisabled ( settings . unifiedDataView ) ;
bool horizontalDataViewB = settings . horizontalDataView ;
if ( ImGui : : Checkbox ( " Horizontal instrument list " , & horizontalDataViewB ) ) {
settings . horizontalDataView = horizontalDataViewB ;
}
ImGui : : EndDisabled ( ) ;
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool oplStandardWaveNamesB = settings . oplStandardWaveNames ;
if ( ImGui : : Checkbox ( " Use standard OPL waveform names " , & oplStandardWaveNamesB ) ) {
settings . oplStandardWaveNames = oplStandardWaveNamesB ;
}
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
bool overflowHighlightB = settings . overflowHighlight ;
if ( ImGui : : Checkbox ( " Overflow pattern highlights " , & overflowHighlightB ) ) {
settings . overflowHighlight = overflowHighlightB ;
}
2022-04-17 00:47:40 +00:00
2022-05-03 06:48:57 +00:00
bool viewPrevPatternB = settings . viewPrevPattern ;
if ( ImGui : : Checkbox ( " Display previous/next pattern " , & viewPrevPatternB ) ) {
settings . viewPrevPattern = viewPrevPatternB ;
}
2022-04-12 01:27:23 +00:00
2022-05-03 06:48:57 +00:00
bool germanNotationB = settings . germanNotation ;
if ( ImGui : : Checkbox ( " Use German notation " , & germanNotationB ) ) {
settings . germanNotation = germanNotationB ;
}
2022-06-28 20:06:22 +00:00
2023-01-17 07:07:29 +00:00
bool oneDigitEffectsB = settings . oneDigitEffects ;
if ( ImGui : : Checkbox ( " Single-digit effects for 00-0F " , & oneDigitEffectsB ) ) {
settings . oneDigitEffects = oneDigitEffectsB ;
}
2022-10-04 00:22:24 +00:00
bool centerPatternB = settings . centerPattern ;
if ( ImGui : : Checkbox ( " Center pattern view " , & centerPatternB ) ) {
settings . centerPattern = centerPatternB ;
}
2022-06-28 20:06:22 +00:00
bool unsignedDetuneB = settings . unsignedDetune ;
if ( ImGui : : Checkbox ( " Unsigned FM detune values " , & unsignedDetuneB ) ) {
settings . unsignedDetune = unsignedDetuneB ;
}
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
// sorry. temporarily disabled until ImGui has a way to add separators in tables arbitrarily.
/*bool sysSeparatorsB=settings.sysSeparators;
if ( ImGui : : Checkbox ( " Add separators between systems in Orders " , & sysSeparatorsB ) ) {
settings . sysSeparators = sysSeparatorsB ;
} */
2022-11-05 21:22:15 +00:00
bool ordersCursorB = settings . ordersCursor ;
if ( ImGui : : Checkbox ( " Highlight channel at cursor in Orders " , & ordersCursorB ) ) {
settings . ordersCursor = ordersCursorB ;
}
2022-05-03 06:48:57 +00:00
bool partyTimeB = settings . partyTime ;
if ( ImGui : : Checkbox ( " About screen party time " , & partyTimeB ) ) {
settings . partyTime = partyTimeB ;
}
if ( ImGui : : IsItemHovered ( ) ) {
ImGui : : SetTooltip ( " Warning: may cause epileptic seizures. " ) ;
}
2022-03-21 05:52:38 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-03-21 05:52:38 +00:00
2022-05-03 06:48:57 +00:00
bool waveLayoutB = settings . waveLayout ;
if ( ImGui : : Checkbox ( " Use compact wave editor " , & waveLayoutB ) ) {
settings . waveLayout = waveLayoutB ;
}
2022-03-21 05:52:38 +00:00
2022-05-12 08:29:34 +00:00
bool oldMacroVSliderB = settings . oldMacroVSlider ;
if ( ImGui : : Checkbox ( " Use classic macro editor vertical slider " , & oldMacroVSliderB ) ) {
settings . oldMacroVSlider = oldMacroVSliderB ;
}
2022-05-03 06:48:57 +00:00
bool roundedWindowsB = settings . roundedWindows ;
if ( ImGui : : Checkbox ( " Rounded window corners " , & roundedWindowsB ) ) {
settings . roundedWindows = roundedWindowsB ;
}
2022-03-21 05:52:38 +00:00
2022-05-03 06:48:57 +00:00
bool roundedButtonsB = settings . roundedButtons ;
if ( ImGui : : Checkbox ( " Rounded buttons " , & roundedButtonsB ) ) {
settings . roundedButtons = roundedButtonsB ;
}
2022-04-11 08:34:38 +00:00
2022-05-03 06:48:57 +00:00
bool roundedMenusB = settings . roundedMenus ;
if ( ImGui : : Checkbox ( " Rounded menu corners " , & roundedMenusB ) ) {
settings . roundedMenus = roundedMenusB ;
}
2022-04-11 08:34:38 +00:00
2022-05-03 06:48:57 +00:00
bool frameBordersB = settings . frameBorders ;
if ( ImGui : : Checkbox ( " Borders around widgets " , & frameBordersB ) ) {
settings . frameBorders = frameBordersB ;
}
2022-04-11 08:34:38 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-04-11 08:34:38 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Oscilloscope settings: " ) ;
2022-04-11 08:34:38 +00:00
2022-05-03 06:48:57 +00:00
bool oscRoundedCornersB = settings . oscRoundedCorners ;
if ( ImGui : : Checkbox ( " Rounded corners " , & oscRoundedCornersB ) ) {
settings . oscRoundedCorners = oscRoundedCornersB ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
bool oscTakesEntireWindowB = settings . oscTakesEntireWindow ;
if ( ImGui : : Checkbox ( " Fill entire window " , & oscTakesEntireWindowB ) ) {
settings . oscTakesEntireWindow = oscTakesEntireWindowB ;
2022-04-02 05:41:52 +00:00
}
2022-04-17 04:58:29 +00:00
2022-05-23 22:42:25 +00:00
bool oscEscapesBoundaryB = settings . oscEscapesBoundary ;
if ( ImGui : : Checkbox ( " Waveform goes out of bounds " , & oscEscapesBoundaryB ) ) {
settings . oscEscapesBoundary = oscEscapesBoundaryB ;
}
2022-05-03 06:48:57 +00:00
bool oscBorderB = settings . oscBorder ;
if ( ImGui : : Checkbox ( " Border " , & oscBorderB ) ) {
settings . oscBorder = oscBorderB ;
2022-04-17 04:58:29 +00:00
}
2022-04-12 23:26:25 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : Separator ( ) ;
2022-04-12 23:26:25 +00:00
2022-05-27 03:26:44 +00:00
ImGui : : Text ( " Pattern view spacing after: " ) ;
if ( CWSliderInt ( " Note " , & settings . noteCellSpacing , 0 , 32 ) ) {
if ( settings . noteCellSpacing < 0 ) settings . noteCellSpacing = 0 ;
if ( settings . noteCellSpacing > 32 ) settings . noteCellSpacing = 32 ;
}
if ( CWSliderInt ( " Instrument " , & settings . insCellSpacing , 0 , 32 ) ) {
if ( settings . insCellSpacing < 0 ) settings . insCellSpacing = 0 ;
if ( settings . insCellSpacing > 32 ) settings . insCellSpacing = 32 ;
}
if ( CWSliderInt ( " Volume " , & settings . volCellSpacing , 0 , 32 ) ) {
if ( settings . volCellSpacing < 0 ) settings . volCellSpacing = 0 ;
if ( settings . volCellSpacing > 32 ) settings . volCellSpacing = 32 ;
}
if ( CWSliderInt ( " Effect " , & settings . effectCellSpacing , 0 , 32 ) ) {
if ( settings . effectCellSpacing < 0 ) settings . effectCellSpacing = 0 ;
if ( settings . effectCellSpacing > 32 ) settings . effectCellSpacing = 32 ;
}
if ( CWSliderInt ( " Effect value " , & settings . effectValCellSpacing , 0 , 32 ) ) {
if ( settings . effectValCellSpacing < 0 ) settings . effectValCellSpacing = 0 ;
if ( settings . effectValCellSpacing > 32 ) settings . effectValCellSpacing = 32 ;
}
ImGui : : Separator ( ) ;
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Color scheme " ) ) {
if ( ImGui : : Button ( " Import " ) ) {
openFileDialog ( GUI_FILE_IMPORT_COLORS ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Export " ) ) {
openFileDialog ( GUI_FILE_EXPORT_COLORS ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Reset defaults " ) ) {
showWarning ( " Are you sure you want to reset the color scheme? " , GUI_WARN_RESET_COLORS ) ;
}
if ( ImGui : : TreeNode ( " General " ) ) {
ImGui : : Text ( " Color scheme type: " ) ;
if ( ImGui : : RadioButton ( " Dark##gcb0 " , settings . guiColorsBase = = 0 ) ) {
settings . guiColorsBase = 0 ;
2022-05-24 08:49:52 +00:00
applyUISettings ( false ) ;
2022-05-03 06:48:57 +00:00
}
if ( ImGui : : RadioButton ( " Light##gcb1 " , settings . guiColorsBase = = 1 ) ) {
settings . guiColorsBase = 1 ;
2022-05-24 08:49:52 +00:00
applyUISettings ( false ) ;
}
if ( ImGui : : SliderInt ( " Frame shading " , & settings . guiColorsShading , 0 , 100 , " %d%% " ) ) {
if ( settings . guiColorsShading < 0 ) settings . guiColorsShading = 0 ;
if ( settings . guiColorsShading > 100 ) settings . guiColorsShading = 100 ;
applyUISettings ( false ) ;
2022-05-03 06:48:57 +00:00
}
UI_COLOR_CONFIG ( GUI_COLOR_BACKGROUND , " Background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FRAME_BACKGROUND , " Window background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_MODAL_BACKDROP , " Modal backdrop " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_HEADER , " Header " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_TEXT , " Text " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_ACCENT_PRIMARY , " Primary " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_ACCENT_SECONDARY , " Secondary " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_BORDER , " Border " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_BORDER_SHADOW , " Border shadow " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_TOGGLE_ON , " Toggle on " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_TOGGLE_OFF , " Toggle off " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_EDITING , " Editing " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SONG_LOOP , " Song loop " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PLAYBACK_STAT , " Playback status " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " File Picker (built-in) " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_FILE_DIR , " Directory " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_SONG_NATIVE , " Song (native) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_SONG_IMPORT , " Song (import) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_INSTR , " Instrument " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_AUDIO , " Audio " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_WAVE , " Wavetable " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_VGM , " VGM " ) ;
2022-05-26 05:24:21 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_FILE_ZSM , " ZSM " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_FILE_FONT , " Font " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FILE_OTHER , " Other " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Oscilloscope " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_OSC_BORDER , " Border " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_BG1 , " Background (top-left) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_BG2 , " Background (top-right) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_BG3 , " Background (bottom-left) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_BG4 , " Background (bottom-right) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_WAVE , " Waveform " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_WAVE_PEAK , " Waveform (clip) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_REF , " Reference " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_OSC_GUIDE , " Guide " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Volume Meter " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_VOLMETER_LOW , " Low " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_VOLMETER_HIGH , " High " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_VOLMETER_PEAK , " Clip " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Orders " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_ORDER_ROW_INDEX , " Order number " ) ;
2023-02-05 23:50:17 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_ORDER_ACTIVE , " Playing order background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_ORDER_SELECTED , " Selected order " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_ORDER_SIMILAR , " Similar patterns " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_ORDER_INACTIVE , " Inactive patterns " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Envelope View " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_FM_ENVELOPE , " Envelope " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_ENVELOPE_SUS_GUIDE , " Sustain guide " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_ENVELOPE_RELEASE , " Release " ) ;
2022-04-12 23:26:25 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " FM Editor " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_FM_ALG_BG , " Algorithm background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_ALG_LINE , " Algorithm lines " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_MOD , " Modulator " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_CAR , " Carrier " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_SSG , " SSG-EG " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_WAVE , " Waveform " ) ;
ImGui : : TextWrapped ( " (the following colors only apply when \" Use separate colors for carriers/modulators in FM editor \" is on!) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_PRIMARY_MOD , " Mod. accent (primary) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_SECONDARY_MOD , " Mod. accent (secondary) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_BORDER_MOD , " Mod. border " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_BORDER_SHADOW_MOD , " Mod. border shadow " ) ;
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_FM_PRIMARY_CAR , " Car. accent (primary " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_SECONDARY_CAR , " Car. accent (secondary) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_BORDER_CAR , " Car. border " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_FM_BORDER_SHADOW_CAR , " Car. border shadow " ) ;
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Macro Editor " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_MACRO_VOLUME , " Volume " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_MACRO_PITCH , " Pitch " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_MACRO_WAVE , " Wave " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_MACRO_OTHER , " Other " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Instrument Types " ) ) {
2022-09-23 08:41:38 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_FM , " FM (OPN) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_STD , " SN76489/Sega PSG " ) ;
2022-10-12 05:46:33 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_T6W28 , " T6W28 " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_GB , " Game Boy " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_C64 , " C64 " ) ;
Prepare for split sample chip instrument
(MSM6258, MSM6295, QSound, Sega PCM, ADPCM-A, ADPCM-B, YMZ280B, RF5C68)
Instrument color and icons are placeholder.
different volume range, hard panned/soft panned and/or independent volume per output, chip-dependent features (global volume, echo, etc)
Allow use sample in instrument tab for chip with sample support
Prepare to support X1-010 Seta 2 style bankswitch behavior
Prepare to support AY89x0 PCM DAC
Support volume for PCE sample (DAC)
Fix Lynx, Y8950 sample pitch matches to sample preview
Support PCM DAC with backward and pingpong loop mode
Reduce some codes
Add Sega PCM, AY89x0, QSound, PCM DAC, Lynx per-channel debug support
2022-08-27 07:27:36 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_AMIGA , " Amiga/Generic Sample " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_PCE , " PC Engine " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_AY , " AY-3-8910/SSG " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_AY8930 , " AY8930 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_TIA , " TIA " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SAA1099 , " SAA1099 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_VIC , " VIC " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_PET , " PET " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_VRC6 , " VRC6 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_VRC6_SAW , " VRC6 (saw) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_OPLL , " FM (OPLL) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_OPL , " FM (OPL) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_FDS , " FDS " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_VBOY , " Virtual Boy " ) ;
2022-07-21 20:21:29 +00:00
// special case
String c163Label = fmt : : sprintf ( " %s##CC_GUI_COLOR_INSTR_N163 " , settings . c163Name ) ;
if ( ImGui : : ColorEdit4 ( c163Label . c_str ( ) , ( float * ) & uiColors [ GUI_COLOR_INSTR_N163 ] ) ) {
applyUISettings ( false ) ;
}
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SCC , " Konami SCC " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_OPZ , " FM (OPZ) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_POKEY , " POKEY " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_BEEPER , " PC Beeper " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SWAN , " WonderSwan " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_MIKEY , " Lynx " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_VERA , " VERA " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_X1_010 , " X1-010 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_ES5506 , " ES5506 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_MULTIPCM , " MultiPCM " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SNES , " SNES " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SU , " Sound Unit " ) ;
2022-05-20 07:43:39 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_NAMCO , " Namco WSG " ) ;
Prepare for split sample chip instrument
(MSM6258, MSM6295, QSound, Sega PCM, ADPCM-A, ADPCM-B, YMZ280B, RF5C68)
Instrument color and icons are placeholder.
different volume range, hard panned/soft panned and/or independent volume per output, chip-dependent features (global volume, echo, etc)
Allow use sample in instrument tab for chip with sample support
Prepare to support X1-010 Seta 2 style bankswitch behavior
Prepare to support AY89x0 PCM DAC
Support volume for PCE sample (DAC)
Fix Lynx, Y8950 sample pitch matches to sample preview
Support PCM DAC with backward and pingpong loop mode
Reduce some codes
Add Sega PCM, AY89x0, QSound, PCM DAC, Lynx per-channel debug support
2022-08-27 07:27:36 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_OPL_DRUMS , " FM (OPL Drums) " ) ;
2022-09-23 08:41:38 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_OPM , " FM (OPM) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_NES , " NES " ) ;
Prepare for split sample chip instrument
(MSM6258, MSM6295, QSound, Sega PCM, ADPCM-A, ADPCM-B, YMZ280B, RF5C68)
Instrument color and icons are placeholder.
different volume range, hard panned/soft panned and/or independent volume per output, chip-dependent features (global volume, echo, etc)
Allow use sample in instrument tab for chip with sample support
Prepare to support X1-010 Seta 2 style bankswitch behavior
Prepare to support AY89x0 PCM DAC
Support volume for PCE sample (DAC)
Fix Lynx, Y8950 sample pitch matches to sample preview
Support PCM DAC with backward and pingpong loop mode
Reduce some codes
Add Sega PCM, AY89x0, QSound, PCM DAC, Lynx per-channel debug support
2022-08-27 07:27:36 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_MSM6258 , " MSM6258 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_MSM6295 , " MSM6295 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_ADPCMA , " ADPCM-A " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_ADPCMB , " ADPCM-B " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_SEGAPCM , " Sega PCM " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_QSOUND , " QSound " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_YMZ280B , " YMZ280B " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_RF5C68 , " RF5C68 " ) ;
2022-12-15 05:47:46 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_MSM5232 , " MSM5232 " ) ;
2022-12-08 05:18:22 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_K007232 , " K007232 " ) ;
2022-12-15 05:47:46 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_GA20 , " GA20 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_POKEMINI , " Pokémon Mini " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_INSTR_UNKNOWN , " Other/Unknown " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Channel " ) ) {
2022-09-18 08:51:10 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_BG , " Single color (background) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_FG , " Single color (text) " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_FM , " FM " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_PULSE , " Pulse " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_NOISE , " Noise " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_PCM , " PCM " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_WAVE , " Wave " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_OP , " FM operator " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CHANNEL_MUTED , " Muted " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Pattern " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_PLAY_HEAD , " Playhead " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_CURSOR , " Cursor " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_CURSOR_HOVER , " Cursor (hovered) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_CURSOR_ACTIVE , " Cursor (clicked) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_SELECTION , " Selection " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_SELECTION_HOVER , " Selection (hovered) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_SELECTION_ACTIVE , " Selection (clicked) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_HI_1 , " Highlight 1 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_HI_2 , " Highlight 2 " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ROW_INDEX , " Row number " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ROW_INDEX_HI1 , " Row number (highlight 1) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ROW_INDEX_HI2 , " Row number (highlight 2) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ACTIVE , " Note " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ACTIVE_HI1 , " Note (highlight 1) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_ACTIVE_HI2 , " Note (highlight 2) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INACTIVE , " Blank " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INACTIVE_HI1 , " Blank (highlight 1) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INACTIVE_HI2 , " Blank (highlight 2) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INS , " Instrument " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INS_WARN , " Instrument (invalid type) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_INS_ERROR , " Instrument (out of range) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_VOLUME_MIN , " Volume (0%) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_VOLUME_HALF , " Volume (50%) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_VOLUME_MAX , " Volume (100%) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_INVALID , " Invalid effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_PITCH , " Pitch effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_VOLUME , " Volume effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_PANNING , " Panning effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_SONG , " Song effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_TIME , " Time effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_SPEED , " Speed effect " ) ;
2022-08-11 10:38:31 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY , " Primary specific effect " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY , " Secondary specific effect " ) ;
2022-05-03 06:48:57 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_PATTERN_EFFECT_MISC , " Miscellaneous " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_EE_VALUE , " External command output " ) ;
ImGui : : TreePop ( ) ;
}
2022-09-30 23:24:20 +00:00
if ( ImGui : : TreeNode ( " Sample Editor " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_BG , " Background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_FG , " Waveform " ) ;
2022-11-26 23:44:04 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_TIME_BG , " Time background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_TIME_FG , " Time text " ) ;
2022-09-30 23:24:20 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_LOOP , " Loop region " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_CENTER , " Center guide " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_GRID , " Grid " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_SEL , " Selection " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_SEL_POINT , " Selection points " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_NEEDLE , " Preview needle " ) ;
2022-11-26 23:44:04 +00:00
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_NEEDLE_PLAYING , " Playing needles " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_LOOP_POINT , " Loop markers " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_CHIP_DISABLED , " Chip select: disabled " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_CHIP_ENABLED , " Chip select: enabled " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_SAMPLE_CHIP_WARNING , " Chip select: enabled (failure) " ) ;
2022-09-30 23:24:20 +00:00
ImGui : : TreePop ( ) ;
}
2022-08-16 09:19:00 +00:00
if ( ImGui : : TreeNode ( " Pattern Manager " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_NULL , " Unallocated " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_UNUSED , " Unused " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_USED , " Used " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_OVERUSED , " Overused " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_EXTREMELY_OVERUSED , " Really overused " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PAT_MANAGER_COMBO_BREAKER , " Combo Breaker " ) ;
ImGui : : TreePop ( ) ;
}
2022-05-17 20:20:56 +00:00
if ( ImGui : : TreeNode ( " Piano " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_BACKGROUND , " Background " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_TOP , " Upper key " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_TOP_HIT , " Upper key (feedback) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_TOP_ACTIVE , " Upper key (pressed) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_BOTTOM , " Lower key " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_BOTTOM_HIT , " Lower key (feedback) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE , " Lower key (pressed) " ) ;
ImGui : : TreePop ( ) ;
}
2023-01-11 18:37:26 +00:00
if ( ImGui : : TreeNode ( " Clock " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_CLOCK_TEXT , " Clock text " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CLOCK_BEAT_LOW , " Beat (off) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_CLOCK_BEAT_HIGH , " Beat (on) " ) ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Patchbay " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_PATCHBAY_PORTSET , " PortSet " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATCHBAY_PORT , " Port " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATCHBAY_PORT_HIDDEN , " Port (hidden/unavailable) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATCHBAY_CONNECTION , " Connection (selected) " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_PATCHBAY_CONNECTION_BG , " Connection (other) " ) ;
ImGui : : TreePop ( ) ;
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Log Viewer " ) ) {
UI_COLOR_CONFIG ( GUI_COLOR_LOGLEVEL_ERROR , " Log level: Error " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_LOGLEVEL_WARNING , " Log level: Warning " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_LOGLEVEL_INFO , " Log level: Info " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_LOGLEVEL_DEBUG , " Log level: Debug " ) ;
UI_COLOR_CONFIG ( GUI_COLOR_LOGLEVEL_TRACE , " Log level: Trace/Verbose " ) ;
ImGui : : TreePop ( ) ;
}
2022-04-12 23:26:25 +00:00
ImGui : : TreePop ( ) ;
}
2022-05-03 06:48:57 +00:00
}
ImGui : : EndChild ( ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Keyboard " ) ) {
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
if ( ImGui : : Button ( " Import " ) ) {
openFileDialog ( GUI_FILE_IMPORT_KEYBINDS ) ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Export " ) ) {
openFileDialog ( GUI_FILE_EXPORT_KEYBINDS ) ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Reset defaults " ) ) {
showWarning ( " Are you sure you want to reset the keyboard settings? " , GUI_WARN_RESET_KEYBINDS ) ;
2022-02-18 03:59:11 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Global hotkeys " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysGlobal " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_OPEN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_OPEN_BACKUP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAVE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAVE_AS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_UNDO ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_REDO ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PLAY_TOGGLE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PLAY ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_STOP ) ;
2022-06-06 06:28:46 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_PLAY_START ) ;
2022-05-03 06:48:57 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_PLAY_REPEAT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PLAY_CURSOR ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_STEP_ONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_OCTAVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_OCTAVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_STEP_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_STEP_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_TOGGLE_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_METRONOME ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_REPEAT_PATTERN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_FOLLOW_ORDERS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_FOLLOW_PATTERN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_FULLSCREEN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PANIC ) ;
KEYBIND_CONFIG_END ;
2022-02-18 03:59:11 +00:00
ImGui : : TreePop ( ) ;
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Window activation " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysWindow " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_EDIT_CONTROLS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_ORDERS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_INS_LIST ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_INS_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_SONG_INFO ) ;
2022-05-15 06:42:49 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_SUBSONGS ) ;
2022-05-03 06:48:57 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_PATTERN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_WAVE_LIST ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_WAVE_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_SAMPLE_LIST ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_SAMPLE_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_ABOUT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_SETTINGS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_MIXER ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_DEBUG ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_OSCILLOSCOPE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_CHAN_OSC ) ;
2022-07-24 00:08:39 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_EFFECT_LIST ) ;
2022-05-03 06:48:57 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_VOL_METER ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_STATS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_COMPAT_FLAGS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_PIANO ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_NOTES ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_CHANNELS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_REGISTER_VIEW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WINDOW_LOG ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_COLLAPSE_WINDOW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_CLOSE_WINDOW ) ;
KEYBIND_CONFIG_END ;
2022-04-11 03:12:02 +00:00
ImGui : : TreePop ( ) ;
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Note input " ) ) {
std : : vector < MappedInput > sorted ;
if ( ImGui : : BeginTable ( " keysNoteInput " , 4 ) ) {
for ( std : : map < int , int > : : value_type & i : noteKeys ) {
std : : vector < MappedInput > : : iterator j ;
for ( j = sorted . begin ( ) ; j ! = sorted . end ( ) ; j + + ) {
if ( j - > val > i . second ) {
break ;
}
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
sorted . insert ( j , MappedInput ( i . first , i . second ) ) ;
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
static char id [ 4096 ] ;
2022-02-21 23:01:41 +00:00
2022-05-03 06:48:57 +00:00
ImGui : : TableNextRow ( ImGuiTableRowFlags_Headers ) ;
2022-02-21 23:01:41 +00:00
ImGui : : TableNextColumn ( ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Key " ) ;
2022-02-21 23:01:41 +00:00
ImGui : : TableNextColumn ( ) ;
2022-05-03 06:48:57 +00:00
ImGui : : Text ( " Type " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Value " ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " Remove " ) ;
for ( MappedInput & i : sorted ) {
ImGui : : TableNextRow ( ) ;
ImGui : : TableNextColumn ( ) ;
ImGui : : Text ( " %s " , SDL_GetScancodeName ( ( SDL_Scancode ) i . scan ) ) ;
ImGui : : TableNextColumn ( ) ;
if ( i . val = = 102 ) {
2022-08-02 03:51:13 +00:00
snprintf ( id , 4095 , " Macro release##SNType_%d " , i . scan ) ;
2022-05-03 06:48:57 +00:00
if ( ImGui : : Button ( id ) ) {
noteKeys [ i . scan ] = 0 ;
}
} else if ( i . val = = 101 ) {
snprintf ( id , 4095 , " Note release##SNType_%d " , i . scan ) ;
if ( ImGui : : Button ( id ) ) {
noteKeys [ i . scan ] = 102 ;
}
} else if ( i . val = = 100 ) {
snprintf ( id , 4095 , " Note off##SNType_%d " , i . scan ) ;
if ( ImGui : : Button ( id ) ) {
noteKeys [ i . scan ] = 101 ;
}
} else {
snprintf ( id , 4095 , " Note##SNType_%d " , i . scan ) ;
if ( ImGui : : Button ( id ) ) {
noteKeys [ i . scan ] = 100 ;
}
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
if ( i . val < 100 ) {
snprintf ( id , 4095 , " ##SNValue_%d " , i . scan ) ;
if ( ImGui : : InputInt ( id , & i . val , 1 , 1 ) ) {
if ( i . val < 0 ) i . val = 0 ;
if ( i . val > 96 ) i . val = 96 ;
noteKeys [ i . scan ] = i . val ;
}
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : TableNextColumn ( ) ;
snprintf ( id , 4095 , ICON_FA_TIMES " ##SNRemove_%d " , i . scan ) ;
2022-02-21 23:01:41 +00:00
if ( ImGui : : Button ( id ) ) {
2022-05-03 06:48:57 +00:00
noteKeys . erase ( i . scan ) ;
2022-02-21 23:01:41 +00:00
}
}
2022-05-03 06:48:57 +00:00
ImGui : : EndTable ( ) ;
if ( ImGui : : BeginCombo ( " ##SNAddNew " , " Add... " ) ) {
for ( int i = 0 ; i < SDL_NUM_SCANCODES ; i + + ) {
const char * sName = SDL_GetScancodeName ( ( SDL_Scancode ) i ) ;
if ( sName = = NULL ) continue ;
if ( sName [ 0 ] = = 0 ) continue ;
snprintf ( id , 4095 , " %s##SNNewKey_%d " , sName , i ) ;
if ( ImGui : : Selectable ( id ) ) {
noteKeys [ ( SDL_Scancode ) i ] = 0 ;
}
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndCombo ( ) ;
2022-02-21 23:01:41 +00:00
}
}
2022-05-03 06:48:57 +00:00
ImGui : : TreePop ( ) ;
2022-02-21 23:01:41 +00:00
}
2022-05-03 06:48:57 +00:00
if ( ImGui : : TreeNode ( " Pattern " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysPattern " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_NOTE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_NOTE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_OCTAVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_OCTAVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_VALUE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_VALUE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_VALUE_UP_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_VALUE_DOWN_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECT_ALL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CUT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_COPY ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PASTE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PASTE_MIX ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PASTE_MIX_BG ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PASTE_FLOOD ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PASTE_OVERFLOW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_LEFT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_RIGHT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_UP_ONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_DOWN_ONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_LEFT_CHANNEL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_RIGHT_CHANNEL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_PREVIOUS_CHANNEL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_NEXT_CHANNEL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_BEGIN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_END ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_UP_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_CURSOR_DOWN_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_LEFT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_RIGHT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_UP_ONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_DOWN_ONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_BEGIN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_END ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_UP_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SELECTION_DOWN_COARSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PULL_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_INSERT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_MUTE_CURSOR ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_SOLO_CURSOR ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_UNMUTE_ALL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_NEXT_ORDER ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_PREV_ORDER ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_COLLAPSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_INCREASE_COLUMNS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_DECREASE_COLUMNS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_INTERPOLATE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_FADE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_INVERT_VALUES ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_FLIP_SELECTION ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_COLLAPSE_ROWS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_EXPAND_ROWS ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_PAT_LATCH ) ;
2022-08-22 19:17:19 +00:00
2022-05-03 06:48:57 +00:00
// TODO: collapse/expand pattern and song
2022-02-18 03:59:11 +00:00
2022-05-03 06:48:57 +00:00
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Instrument list " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysInsList " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_ADD ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_DUPLICATE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_OPEN ) ;
2022-05-05 03:55:11 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_OPEN_REPLACE ) ;
2022-05-03 06:48:57 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_SAVE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_MOVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_MOVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_INS_LIST_DOWN ) ;
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Wavetable list " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysWaveList " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_ADD ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_DUPLICATE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_OPEN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_SAVE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_MOVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_MOVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_WAVE_LIST_DOWN ) ;
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Sample list " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysSampleList " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_ADD ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_DUPLICATE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_OPEN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_SAVE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_MOVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_MOVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_EDIT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_PREVIEW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW ) ;
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Orders " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysOrders " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_LEFT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_RIGHT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_INCREASE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DECREASE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_EDIT_MODE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_LINK ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_ADD ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DUPLICATE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DEEP_CLONE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DUPLICATE_END ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_DEEP_CLONE_END ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_REMOVE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_MOVE_UP ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_MOVE_DOWN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_ORDERS_REPLAY ) ;
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
if ( ImGui : : TreeNode ( " Sample editor " ) ) {
KEYBIND_CONFIG_BEGIN ( " keysSampleEdit " ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_SELECT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_DRAW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_CUT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_COPY ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_PASTE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_PASTE_REPLACE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_PASTE_MIX ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_SELECT_ALL ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_RESIZE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_RESAMPLE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_AMPLIFY ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_NORMALIZE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_FADE_IN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_FADE_OUT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_INSERT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_SILENCE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_DELETE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_TRIM ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_REVERSE ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_INVERT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_SIGN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_FILTER ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_PREVIEW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_STOP_PREVIEW ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_ZOOM_IN ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_ZOOM_OUT ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_ZOOM_AUTO ) ;
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_MAKE_INS ) ;
2022-05-28 23:37:49 +00:00
UI_KEYBIND_CONFIG ( GUI_ACTION_SAMPLE_SET_LOOP ) ;
2022-05-03 06:48:57 +00:00
KEYBIND_CONFIG_END ;
ImGui : : TreePop ( ) ;
}
2022-03-22 09:54:01 +00:00
}
2022-05-03 06:48:57 +00:00
ImGui : : EndChild ( ) ;
2022-02-18 03:59:11 +00:00
ImGui : : EndTabItem ( ) ;
}
2022-05-18 23:42:59 +00:00
if ( nonLatchNibble ) {
// ok, so you decided to read the code.
// these are the cheat codes:
// "Debug" - toggles mobile UI
// "Nice Amiga cover of the song!" - enables hidden systems (YMU759/SoundUnit/Dummy)
2022-05-20 07:43:39 +00:00
// "42 63" - enables all instrument types
2022-05-18 23:42:59 +00:00
if ( ImGui : : BeginTabItem ( " Cheat Codes " ) ) {
ImVec2 settingsViewSize = ImGui : : GetContentRegionAvail ( ) ;
settingsViewSize . y - = ImGui : : GetFrameHeight ( ) + ImGui : : GetStyle ( ) . WindowPadding . y ;
if ( ImGui : : BeginChild ( " SettingsView " , settingsViewSize ) ) {
ImGui : : Text ( " Enter code: " ) ;
ImGui : : InputText ( " ##CheatCode " , & mmlString [ 31 ] ) ;
if ( ImGui : : Button ( " Submit " ) ) {
unsigned int checker = 0x11111111 ;
unsigned int checker1 = 0 ;
int index = 0 ;
mmlString [ 30 ] = " invalid code " ;
for ( char & i : mmlString [ 31 ] ) {
checker ^ = ( ( unsigned int ) i ) < < index ;
checker1 + = i ;
checker = ( checker > > 1 | ( ( ( checker ) ^ ( checker > > 2 ) ^ ( checker > > 3 ) ^ ( checker > > 5 ) ) & 1 ) < < 31 ) ;
checker1 < < = 1 ;
index = ( index + 1 ) & 31 ;
}
if ( checker = = 0x90888b65 & & checker1 = = 0x1482 ) {
mmlString [ 30 ] = " toggled alternate UI " ;
toggleMobileUI ( ! mobileUI ) ;
}
if ( checker = = 0x5a42a113 & & checker1 = = 0xe4ef451e ) {
mmlString [ 30 ] = " :smile: :star_struck: :sunglasses: :ok_hand: " ;
settings . hiddenSystems = ! settings . hiddenSystems ;
}
2022-05-20 07:43:39 +00:00
if ( checker = = 0xe888896b & & checker1 = = 0xbde ) {
mmlString [ 30 ] = " enabled all instrument types " ;
settings . displayAllInsTypes = ! settings . displayAllInsTypes ;
}
2022-05-18 23:42:59 +00:00
mmlString [ 31 ] = " " ;
}
ImGui : : Text ( " %s " , mmlString [ 30 ] . c_str ( ) ) ;
}
ImGui : : EndChild ( ) ;
ImGui : : EndTabItem ( ) ;
}
}
2022-02-18 03:59:11 +00:00
ImGui : : EndTabBar ( ) ;
}
ImGui : : Separator ( ) ;
if ( ImGui : : Button ( " OK##SettingsOK " ) ) {
settingsOpen = false ;
willCommit = true ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : Button ( " Cancel##SettingsCancel " ) ) {
settingsOpen = false ;
syncSettings ( ) ;
}
}
if ( ImGui : : IsWindowFocused ( ImGuiFocusedFlags_ChildWindows ) ) curWindow = GUI_WINDOW_SETTINGS ;
ImGui : : End ( ) ;
}
2022-03-05 09:49:11 +00:00
# define clampSetting(x,minV,maxV) \
if ( x < minV ) { \
x = minV ; \
} \
if ( x > maxV ) { \
x = maxV ; \
}
2022-02-18 03:59:11 +00:00
void FurnaceGUI : : syncSettings ( ) {
settings . mainFontSize = e - > getConfInt ( " mainFontSize " , 18 ) ;
settings . patFontSize = e - > getConfInt ( " patFontSize " , 18 ) ;
settings . iconSize = e - > getConfInt ( " iconSize " , 16 ) ;
settings . audioEngine = ( e - > getConfString ( " audioEngine " , " SDL " ) = = " SDL " ) ? 1 : 0 ;
settings . audioDevice = e - > getConfString ( " audioDevice " , " " ) ;
2023-01-05 07:40:17 +00:00
settings . audioChans = e - > getConfInt ( " audioChans " , 2 ) ;
2022-03-28 08:46:50 +00:00
settings . midiInDevice = e - > getConfString ( " midiInDevice " , " " ) ;
settings . midiOutDevice = e - > getConfString ( " midiOutDevice " , " " ) ;
2022-07-26 23:23:01 +00:00
settings . c163Name = e - > getConfString ( " c163Name " , DIV_C163_DEFAULT_NAME ) ;
2023-02-05 20:24:11 +00:00
settings . renderDriver = e - > getConfString ( " renderDriver " , " " ) ;
2022-02-18 03:59:11 +00:00
settings . audioQuality = e - > getConfInt ( " audioQuality " , 0 ) ;
settings . audioBufSize = e - > getConfInt ( " audioBufSize " , 1024 ) ;
settings . audioRate = e - > getConfInt ( " audioRate " , 44100 ) ;
settings . arcadeCore = e - > getConfInt ( " arcadeCore " , 0 ) ;
settings . ym2612Core = e - > getConfInt ( " ym2612Core " , 0 ) ;
2022-05-26 23:46:20 +00:00
settings . snCore = e - > getConfInt ( " snCore " , 0 ) ;
2022-05-02 04:20:20 +00:00
settings . nesCore = e - > getConfInt ( " nesCore " , 0 ) ;
2022-05-02 21:53:55 +00:00
settings . fdsCore = e - > getConfInt ( " fdsCore " , 0 ) ;
2022-08-28 20:10:16 +00:00
settings . c64Core = e - > getConfInt ( " c64Core " , 1 ) ;
2022-12-23 00:47:13 +00:00
settings . pokeyCore = e - > getConfInt ( " pokeyCore " , 1 ) ;
2022-12-24 07:29:37 +00:00
settings . opnCore = e - > getConfInt ( " opnCore " , 1 ) ;
2022-06-03 06:18:32 +00:00
settings . pcSpeakerOutMethod = e - > getConfInt ( " pcSpeakerOutMethod " , 0 ) ;
2022-05-11 21:39:36 +00:00
settings . yrw801Path = e - > getConfString ( " yrw801Path " , " " ) ;
settings . tg100Path = e - > getConfString ( " tg100Path " , " " ) ;
settings . mu5Path = e - > getConfString ( " mu5Path " , " " ) ;
2022-02-18 03:59:11 +00:00
settings . mainFont = e - > getConfInt ( " mainFont " , 0 ) ;
settings . patFont = e - > getConfInt ( " patFont " , 0 ) ;
settings . mainFontPath = e - > getConfString ( " mainFontPath " , " " ) ;
settings . patFontPath = e - > getConfString ( " patFontPath " , " " ) ;
settings . patRowsBase = e - > getConfInt ( " patRowsBase " , 0 ) ;
settings . orderRowsBase = e - > getConfInt ( " orderRowsBase " , 1 ) ;
settings . soloAction = e - > getConfInt ( " soloAction " , 0 ) ;
settings . pullDeleteBehavior = e - > getConfInt ( " pullDeleteBehavior " , 1 ) ;
settings . wrapHorizontal = e - > getConfInt ( " wrapHorizontal " , 0 ) ;
settings . wrapVertical = e - > getConfInt ( " wrapVertical " , 0 ) ;
settings . macroView = e - > getConfInt ( " macroView " , 0 ) ;
settings . fmNames = e - > getConfInt ( " fmNames " , 0 ) ;
2022-11-06 18:26:50 +00:00
settings . allowEditDocking = e - > getConfInt ( " allowEditDocking " , 1 ) ;
2022-02-18 03:59:11 +00:00
settings . chipNames = e - > getConfInt ( " chipNames " , 0 ) ;
settings . overflowHighlight = e - > getConfInt ( " overflowHighlight " , 0 ) ;
settings . partyTime = e - > getConfInt ( " partyTime " , 0 ) ;
settings . germanNotation = e - > getConfInt ( " germanNotation " , 0 ) ;
settings . stepOnDelete = e - > getConfInt ( " stepOnDelete " , 0 ) ;
settings . scrollStep = e - > getConfInt ( " scrollStep " , 0 ) ;
settings . sysSeparators = e - > getConfInt ( " sysSeparators " , 1 ) ;
settings . forceMono = e - > getConfInt ( " forceMono " , 0 ) ;
2022-03-14 22:40:22 +00:00
settings . controlLayout = e - > getConfInt ( " controlLayout " , 3 ) ;
2022-02-18 03:59:11 +00:00
settings . restartOnFlagChange = e - > getConfInt ( " restartOnFlagChange " , 1 ) ;
settings . statusDisplay = e - > getConfInt ( " statusDisplay " , 0 ) ;
settings . dpiScale = e - > getConfFloat ( " dpiScale " , 0.0f ) ;
settings . viewPrevPattern = e - > getConfInt ( " viewPrevPattern " , 1 ) ;
2022-03-03 17:44:29 +00:00
settings . guiColorsBase = e - > getConfInt ( " guiColorsBase " , 0 ) ;
2022-05-24 08:49:52 +00:00
settings . guiColorsShading = e - > getConfInt ( " guiColorsShading " , 0 ) ;
2022-03-04 07:40:42 +00:00
settings . avoidRaisingPattern = e - > getConfInt ( " avoidRaisingPattern " , 0 ) ;
2022-03-05 07:13:15 +00:00
settings . insFocusesPattern = e - > getConfInt ( " insFocusesPattern " , 1 ) ;
2022-03-12 07:32:02 +00:00
settings . stepOnInsert = e - > getConfInt ( " stepOnInsert " , 0 ) ;
2022-03-13 23:32:35 +00:00
settings . unifiedDataView = e - > getConfInt ( " unifiedDataView " , 0 ) ;
2022-07-24 03:11:30 +00:00
settings . sysFileDialog = e - > getConfInt ( " sysFileDialog " , SYS_FILE_DIALOG_DEFAULT ) ;
2022-03-21 05:52:38 +00:00
settings . roundedWindows = e - > getConfInt ( " roundedWindows " , 1 ) ;
settings . roundedButtons = e - > getConfInt ( " roundedButtons " , 1 ) ;
settings . roundedMenus = e - > getConfInt ( " roundedMenus " , 0 ) ;
2022-03-22 04:36:17 +00:00
settings . loadJapanese = e - > getConfInt ( " loadJapanese " , 0 ) ;
2022-05-14 01:52:33 +00:00
settings . loadChinese = e - > getConfInt ( " loadChinese " , 0 ) ;
2022-08-25 23:49:08 +00:00
settings . loadChineseTraditional = e - > getConfInt ( " loadChineseTraditional " , 0 ) ;
settings . loadKorean = e - > getConfInt ( " loadKorean " , 0 ) ;
2022-03-25 23:16:47 +00:00
settings . fmLayout = e - > getConfInt ( " fmLayout " , 0 ) ;
2022-04-12 01:27:23 +00:00
settings . sampleLayout = e - > getConfInt ( " sampleLayout " , 0 ) ;
2022-04-17 00:47:40 +00:00
settings . waveLayout = e - > getConfInt ( " waveLayout " , 0 ) ;
2022-03-27 08:38:04 +00:00
settings . susPosition = e - > getConfInt ( " susPosition " , 0 ) ;
2022-04-04 00:20:30 +00:00
settings . effectCursorDir = e - > getConfInt ( " effectCursorDir " , 1 ) ;
settings . cursorPastePos = e - > getConfInt ( " cursorPastePos " , 1 ) ;
2022-04-04 18:25:38 +00:00
settings . titleBarInfo = e - > getConfInt ( " titleBarInfo " , 1 ) ;
settings . titleBarSys = e - > getConfInt ( " titleBarSys " , 1 ) ;
2022-04-06 05:34:26 +00:00
settings . frameBorders = e - > getConfInt ( " frameBorders " , 0 ) ;
2022-04-07 07:02:52 +00:00
settings . effectDeletionAltersValue = e - > getConfInt ( " effectDeletionAltersValue " , 1 ) ;
2022-04-11 08:34:38 +00:00
settings . oscRoundedCorners = e - > getConfInt ( " oscRoundedCorners " , 1 ) ;
settings . oscTakesEntireWindow = e - > getConfInt ( " oscTakesEntireWindow " , 0 ) ;
settings . oscBorder = e - > getConfInt ( " oscBorder " , 1 ) ;
2022-05-23 22:42:25 +00:00
settings . oscEscapesBoundary = e - > getConfInt ( " oscEscapesBoundary " , 0 ) ;
2022-04-12 23:26:25 +00:00
settings . separateFMColors = e - > getConfInt ( " separateFMColors " , 0 ) ;
2022-04-13 02:30:12 +00:00
settings . insEditColorize = e - > getConfInt ( " insEditColorize " , 0 ) ;
2022-04-13 07:29:07 +00:00
settings . metroVol = e - > getConfInt ( " metroVol " , 100 ) ;
2022-04-13 22:42:55 +00:00
settings . pushNibble = e - > getConfInt ( " pushNibble " , 0 ) ;
2022-04-14 06:25:21 +00:00
settings . scrollChangesOrder = e - > getConfInt ( " scrollChangesOrder " , 0 ) ;
2022-04-15 02:57:39 +00:00
settings . oplStandardWaveNames = e - > getConfInt ( " oplStandardWaveNames " , 0 ) ;
settings . cursorMoveNoScroll = e - > getConfInt ( " cursorMoveNoScroll " , 0 ) ;
2022-04-15 10:37:23 +00:00
settings . lowLatency = e - > getConfInt ( " lowLatency " , 0 ) ;
2022-04-16 18:13:19 +00:00
settings . notePreviewBehavior = e - > getConfInt ( " notePreviewBehavior " , 1 ) ;
2022-04-16 23:35:25 +00:00
settings . powerSave = e - > getConfInt ( " powerSave " , POWER_SAVE_DEFAULT ) ;
2022-04-21 07:35:50 +00:00
settings . absorbInsInput = e - > getConfInt ( " absorbInsInput " , 0 ) ;
2022-04-25 21:46:38 +00:00
settings . eventDelay = e - > getConfInt ( " eventDelay " , 0 ) ;
2022-05-10 21:19:49 +00:00
settings . moveWindowTitle = e - > getConfInt ( " moveWindowTitle " , 1 ) ;
2022-04-26 20:24:45 +00:00
settings . hiddenSystems = e - > getConfInt ( " hiddenSystems " , 0 ) ;
2022-05-05 05:52:15 +00:00
settings . horizontalDataView = e - > getConfInt ( " horizontalDataView " , 0 ) ;
settings . noMultiSystem = e - > getConfInt ( " noMultiSystem " , 0 ) ;
2022-05-12 08:29:34 +00:00
settings . oldMacroVSlider = e - > getConfInt ( " oldMacroVSlider " , 0 ) ;
2022-05-20 07:43:39 +00:00
settings . displayAllInsTypes = e - > getConfInt ( " displayAllInsTypes " , 0 ) ;
2022-05-27 03:26:44 +00:00
settings . noteCellSpacing = e - > getConfInt ( " noteCellSpacing " , 0 ) ;
settings . insCellSpacing = e - > getConfInt ( " insCellSpacing " , 0 ) ;
settings . volCellSpacing = e - > getConfInt ( " volCellSpacing " , 0 ) ;
settings . effectCellSpacing = e - > getConfInt ( " effectCellSpacing " , 0 ) ;
2022-06-07 04:46:15 +00:00
settings . effectValCellSpacing = e - > getConfInt ( " effectValCellSpacing " , 0 ) ;
2022-06-03 23:30:40 +00:00
settings . doubleClickColumn = e - > getConfInt ( " doubleClickColumn " , 1 ) ;
settings . blankIns = e - > getConfInt ( " blankIns " , 0 ) ;
2022-06-20 21:24:14 +00:00
settings . dragMovesSelection = e - > getConfInt ( " dragMovesSelection " , 2 ) ;
2022-06-28 20:06:22 +00:00
settings . unsignedDetune = e - > getConfInt ( " unsignedDetune " , 0 ) ;
2022-07-20 05:32:06 +00:00
settings . noThreadedInput = e - > getConfInt ( " noThreadedInput " , 0 ) ;
2022-08-22 19:17:19 +00:00
settings . saveWindowPos = e - > getConfInt ( " saveWindowPos " , 1 ) ;
2022-07-23 23:22:42 +00:00
settings . initialSysName = e - > getConfString ( " initialSysName " , " " ) ;
2022-07-25 23:41:47 +00:00
settings . clampSamples = e - > getConfInt ( " clampSamples " , 0 ) ;
2022-08-13 23:00:29 +00:00
settings . noteOffLabel = e - > getConfString ( " noteOffLabel " , " OFF " ) ;
settings . noteRelLabel = e - > getConfString ( " noteRelLabel " , " === " ) ;
settings . macroRelLabel = e - > getConfString ( " macroRelLabel " , " REL " ) ;
settings . emptyLabel = e - > getConfString ( " emptyLabel " , " ... " ) ;
settings . emptyLabel2 = e - > getConfString ( " emptyLabel2 " , " .. " ) ;
2022-08-16 08:42:17 +00:00
settings . saveUnusedPatterns = e - > getConfInt ( " saveUnusedPatterns " , 0 ) ;
2022-08-16 18:53:51 +00:00
settings . channelColors = e - > getConfInt ( " channelColors " , 1 ) ;
settings . channelTextColors = e - > getConfInt ( " channelTextColors " , 0 ) ;
2022-09-21 00:07:17 +00:00
settings . channelStyle = e - > getConfInt ( " channelStyle " , 1 ) ;
2022-08-16 18:53:51 +00:00
settings . channelVolStyle = e - > getConfInt ( " channelVolStyle " , 0 ) ;
settings . channelFeedbackStyle = e - > getConfInt ( " channelFeedbackStyle " , 1 ) ;
2022-09-18 09:20:08 +00:00
settings . channelFont = e - > getConfInt ( " channelFont " , 1 ) ;
2022-09-21 00:07:17 +00:00
settings . channelTextCenter = e - > getConfInt ( " channelTextCenter " , 1 ) ;
2022-09-10 23:53:27 +00:00
settings . maxRecentFile = e - > getConfInt ( " maxRecentFile " , 10 ) ;
2022-09-26 06:27:36 +00:00
settings . midiOutClock = e - > getConfInt ( " midiOutClock " , 0 ) ;
settings . midiOutMode = e - > getConfInt ( " midiOutMode " , 1 ) ;
2022-10-04 00:22:24 +00:00
settings . centerPattern = e - > getConfInt ( " centerPattern " , 0 ) ;
2022-11-05 21:22:15 +00:00
settings . ordersCursor = e - > getConfInt ( " ordersCursor " , 1 ) ;
2022-11-06 05:37:57 +00:00
settings . persistFadeOut = e - > getConfInt ( " persistFadeOut " , 1 ) ;
settings . exportLoops = e - > getConfInt ( " exportLoops " , 0 ) ;
settings . exportFadeOut = e - > getConfDouble ( " exportFadeOut " , 0.0 ) ;
2022-11-11 00:21:01 +00:00
settings . macroLayout = e - > getConfInt ( " macroLayout " , 0 ) ;
2023-01-14 19:07:50 +00:00
settings . doubleClickTime = e - > getConfFloat ( " doubleClickTime " , 0.3f ) ;
2023-01-17 07:07:29 +00:00
settings . oneDigitEffects = e - > getConfInt ( " oneDigitEffects " , 0 ) ;
2022-02-18 03:59:11 +00:00
2022-03-05 09:49:11 +00:00
clampSetting ( settings . mainFontSize , 2 , 96 ) ;
clampSetting ( settings . patFontSize , 2 , 96 ) ;
clampSetting ( settings . iconSize , 2 , 48 ) ;
clampSetting ( settings . audioEngine , 0 , 1 ) ;
clampSetting ( settings . audioQuality , 0 , 1 ) ;
clampSetting ( settings . audioBufSize , 32 , 4096 ) ;
clampSetting ( settings . audioRate , 8000 , 384000 ) ;
2023-01-05 07:40:17 +00:00
clampSetting ( settings . audioChans , 1 , 16 ) ;
2022-03-05 09:49:11 +00:00
clampSetting ( settings . arcadeCore , 0 , 1 ) ;
clampSetting ( settings . ym2612Core , 0 , 1 ) ;
2022-05-26 23:46:20 +00:00
clampSetting ( settings . snCore , 0 , 1 ) ;
2022-05-02 04:20:20 +00:00
clampSetting ( settings . nesCore , 0 , 1 ) ;
2022-05-02 21:53:55 +00:00
clampSetting ( settings . fdsCore , 0 , 1 ) ;
2022-08-28 20:10:16 +00:00
clampSetting ( settings . c64Core , 0 , 1 ) ;
2022-12-22 21:40:29 +00:00
clampSetting ( settings . pokeyCore , 0 , 1 ) ;
2022-12-24 07:29:37 +00:00
clampSetting ( settings . opnCore , 0 , 1 ) ;
2022-06-03 06:18:32 +00:00
clampSetting ( settings . pcSpeakerOutMethod , 0 , 4 ) ;
2022-03-05 09:49:11 +00:00
clampSetting ( settings . mainFont , 0 , 6 ) ;
clampSetting ( settings . patFont , 0 , 6 ) ;
clampSetting ( settings . patRowsBase , 0 , 1 ) ;
clampSetting ( settings . orderRowsBase , 0 , 1 ) ;
clampSetting ( settings . soloAction , 0 , 2 ) ;
clampSetting ( settings . pullDeleteBehavior , 0 , 1 ) ;
clampSetting ( settings . wrapHorizontal , 0 , 2 ) ;
clampSetting ( settings . wrapVertical , 0 , 2 ) ;
clampSetting ( settings . macroView , 0 , 1 ) ;
clampSetting ( settings . fmNames , 0 , 2 ) ;
clampSetting ( settings . allowEditDocking , 0 , 1 ) ;
clampSetting ( settings . chipNames , 0 , 1 ) ;
clampSetting ( settings . overflowHighlight , 0 , 1 ) ;
clampSetting ( settings . partyTime , 0 , 1 ) ;
clampSetting ( settings . germanNotation , 0 , 1 ) ;
clampSetting ( settings . stepOnDelete , 0 , 1 ) ;
clampSetting ( settings . scrollStep , 0 , 1 ) ;
clampSetting ( settings . sysSeparators , 0 , 1 ) ;
clampSetting ( settings . forceMono , 0 , 1 ) ;
clampSetting ( settings . controlLayout , 0 , 3 ) ;
clampSetting ( settings . statusDisplay , 0 , 3 ) ;
clampSetting ( settings . dpiScale , 0.0f , 4.0f ) ;
clampSetting ( settings . viewPrevPattern , 0 , 1 ) ;
clampSetting ( settings . guiColorsBase , 0 , 1 ) ;
2022-05-24 08:49:52 +00:00
clampSetting ( settings . guiColorsShading , 0 , 100 ) ;
2022-03-05 09:49:11 +00:00
clampSetting ( settings . avoidRaisingPattern , 0 , 1 ) ;
clampSetting ( settings . insFocusesPattern , 0 , 1 ) ;
2022-03-12 07:32:02 +00:00
clampSetting ( settings . stepOnInsert , 0 , 1 ) ;
2022-03-13 23:32:35 +00:00
clampSetting ( settings . unifiedDataView , 0 , 1 ) ;
clampSetting ( settings . sysFileDialog , 0 , 1 ) ;
2022-03-21 05:52:38 +00:00
clampSetting ( settings . roundedWindows , 0 , 1 ) ;
clampSetting ( settings . roundedButtons , 0 , 1 ) ;
clampSetting ( settings . roundedMenus , 0 , 1 ) ;
2022-03-22 04:36:17 +00:00
clampSetting ( settings . loadJapanese , 0 , 1 ) ;
2022-05-14 01:52:33 +00:00
clampSetting ( settings . loadChinese , 0 , 1 ) ;
2022-08-25 23:49:08 +00:00
clampSetting ( settings . loadChineseTraditional , 0 , 1 ) ;
clampSetting ( settings . loadKorean , 0 , 1 ) ;
2022-06-13 08:54:42 +00:00
clampSetting ( settings . fmLayout , 0 , 6 ) ;
2022-03-27 08:38:04 +00:00
clampSetting ( settings . susPosition , 0 , 1 ) ;
2022-04-08 07:16:57 +00:00
clampSetting ( settings . effectCursorDir , 0 , 2 ) ;
2022-04-04 00:20:30 +00:00
clampSetting ( settings . cursorPastePos , 0 , 1 ) ;
2022-04-04 18:25:38 +00:00
clampSetting ( settings . titleBarInfo , 0 , 3 ) ;
clampSetting ( settings . titleBarSys , 0 , 1 ) ;
2022-04-06 05:34:26 +00:00
clampSetting ( settings . frameBorders , 0 , 1 ) ;
2022-04-07 07:02:52 +00:00
clampSetting ( settings . effectDeletionAltersValue , 0 , 1 ) ;
2022-04-12 07:24:42 +00:00
clampSetting ( settings . sampleLayout , 0 , 1 ) ;
2022-04-17 00:47:40 +00:00
clampSetting ( settings . waveLayout , 0 , 1 ) ;
2022-04-12 23:26:25 +00:00
clampSetting ( settings . separateFMColors , 0 , 1 ) ;
2022-04-13 02:30:12 +00:00
clampSetting ( settings . insEditColorize , 0 , 1 ) ;
2022-04-13 07:29:07 +00:00
clampSetting ( settings . metroVol , 0 , 200 ) ;
2022-04-13 22:42:55 +00:00
clampSetting ( settings . pushNibble , 0 , 1 ) ;
2022-04-14 06:25:21 +00:00
clampSetting ( settings . scrollChangesOrder , 0 , 1 ) ;
2022-04-15 02:57:39 +00:00
clampSetting ( settings . oplStandardWaveNames , 0 , 1 ) ;
clampSetting ( settings . cursorMoveNoScroll , 0 , 1 ) ;
2022-04-15 10:37:23 +00:00
clampSetting ( settings . lowLatency , 0 , 1 ) ;
2022-04-16 18:13:19 +00:00
clampSetting ( settings . notePreviewBehavior , 0 , 3 ) ;
2022-04-16 23:35:25 +00:00
clampSetting ( settings . powerSave , 0 , 1 ) ;
2022-04-21 07:35:50 +00:00
clampSetting ( settings . absorbInsInput , 0 , 1 ) ;
2022-04-25 21:46:38 +00:00
clampSetting ( settings . eventDelay , 0 , 1 ) ;
clampSetting ( settings . moveWindowTitle , 0 , 1 ) ;
2022-04-26 20:24:45 +00:00
clampSetting ( settings . hiddenSystems , 0 , 1 ) ;
2022-05-05 05:52:15 +00:00
clampSetting ( settings . horizontalDataView , 0 , 1 ) ;
2022-05-12 08:29:34 +00:00
clampSetting ( settings . noMultiSystem , 0 , 1 ) ;
clampSetting ( settings . oldMacroVSlider , 0 , 1 ) ;
2022-05-20 07:43:39 +00:00
clampSetting ( settings . displayAllInsTypes , 0 , 1 ) ;
2022-05-27 03:26:44 +00:00
clampSetting ( settings . noteCellSpacing , 0 , 32 ) ;
clampSetting ( settings . insCellSpacing , 0 , 32 ) ;
clampSetting ( settings . volCellSpacing , 0 , 32 ) ;
clampSetting ( settings . effectCellSpacing , 0 , 32 ) ;
clampSetting ( settings . effectValCellSpacing , 0 , 32 ) ;
2022-05-31 00:02:24 +00:00
clampSetting ( settings . doubleClickColumn , 0 , 1 ) ;
2022-06-03 23:30:40 +00:00
clampSetting ( settings . blankIns , 0 , 1 ) ;
2022-06-20 21:24:14 +00:00
clampSetting ( settings . dragMovesSelection , 0 , 2 ) ;
2022-06-28 20:06:22 +00:00
clampSetting ( settings . unsignedDetune , 0 , 1 ) ;
2022-07-20 05:32:06 +00:00
clampSetting ( settings . noThreadedInput , 0 , 1 ) ;
2022-08-22 19:17:19 +00:00
clampSetting ( settings . saveWindowPos , 0 , 1 ) ;
2022-07-25 23:41:47 +00:00
clampSetting ( settings . clampSamples , 0 , 1 ) ;
2022-08-16 08:42:17 +00:00
clampSetting ( settings . saveUnusedPatterns , 0 , 1 ) ;
2022-08-16 18:53:51 +00:00
clampSetting ( settings . channelColors , 0 , 2 ) ;
clampSetting ( settings . channelTextColors , 0 , 2 ) ;
clampSetting ( settings . channelStyle , 0 , 5 ) ;
2022-09-20 07:32:23 +00:00
clampSetting ( settings . channelVolStyle , 0 , 4 ) ;
2022-08-16 18:53:51 +00:00
clampSetting ( settings . channelFeedbackStyle , 0 , 3 ) ;
2022-09-18 09:20:08 +00:00
clampSetting ( settings . channelFont , 0 , 1 ) ;
2022-09-21 00:07:17 +00:00
clampSetting ( settings . channelTextCenter , 0 , 1 ) ;
2022-09-10 23:53:27 +00:00
clampSetting ( settings . maxRecentFile , 0 , 30 ) ;
2022-09-26 06:27:36 +00:00
clampSetting ( settings . midiOutClock , 0 , 1 ) ;
clampSetting ( settings . midiOutMode , 0 , 2 ) ;
2022-10-04 00:22:24 +00:00
clampSetting ( settings . centerPattern , 0 , 1 ) ;
2022-11-05 21:22:15 +00:00
clampSetting ( settings . ordersCursor , 0 , 1 ) ;
2022-11-06 05:37:57 +00:00
clampSetting ( settings . persistFadeOut , 0 , 1 ) ;
2022-11-11 00:21:01 +00:00
clampSetting ( settings . macroLayout , 0 , 4 ) ;
2023-01-14 19:07:50 +00:00
clampSetting ( settings . doubleClickTime , 0.02 , 1.0 ) ;
2023-01-17 07:07:29 +00:00
clampSetting ( settings . oneDigitEffects , 0 , 1 ) ;
2022-11-06 05:37:57 +00:00
if ( settings . exportLoops < 0.0 ) settings . exportLoops = 0.0 ;
if ( settings . exportFadeOut < 0.0 ) settings . exportFadeOut = 0.0 ;
2022-03-05 09:49:11 +00:00
2022-09-30 05:26:54 +00:00
String initialSys2 = e - > getConfString ( " initialSys2 " , " " ) ;
2023-01-06 22:43:08 +00:00
bool oldVol = e - > getConfInt ( " configVersion " , DIV_ENGINE_VERSION ) < 135 ;
2022-09-30 05:26:54 +00:00
if ( initialSys2 . empty ( ) ) {
initialSys2 = e - > decodeSysDesc ( e - > getConfString ( " initialSys " , " " ) ) ;
2023-01-06 22:43:08 +00:00
oldVol = false ;
2022-09-30 05:26:54 +00:00
}
settings . initialSys . clear ( ) ;
settings . initialSys . loadFromBase64 ( initialSys2 . c_str ( ) ) ;
if ( settings . initialSys . getInt ( " id0 " , 0 ) = = 0 ) {
2022-04-30 06:37:37 +00:00
settings . initialSys . clear ( ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " id0 " , e - > systemToFileFur ( DIV_SYSTEM_YM2612 ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " vol0 " , 1.0f ) ;
settings . initialSys . set ( " pan0 " , 0.0f ) ;
settings . initialSys . set ( " fr0 " , 0.0f ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( " flags0 " , " " ) ;
2022-09-30 07:14:54 +00:00
settings . initialSys . set ( " id1 " , e - > systemToFileFur ( DIV_SYSTEM_SMS ) ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " vol1 " , 0.5f ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( " pan1 " , 0 ) ;
2023-01-06 22:43:08 +00:00
settings . initialSys . set ( " fr1 " , 0 ) ;
2022-09-30 05:26:54 +00:00
settings . initialSys . set ( " flags1 " , " " ) ;
2023-01-06 22:43:08 +00:00
} else {
if ( oldVol ) {
for ( int i = 0 ; settings . initialSys . getInt ( fmt : : sprintf ( " id%d " , i ) , 0 ) ; i + + ) {
float newVol = settings . initialSys . getInt ( fmt : : sprintf ( " vol%d " , i ) , 64 ) ;
float newPan = settings . initialSys . getInt ( fmt : : sprintf ( " pan%d " , i ) , 0 ) ;
newVol / = 64.0f ;
newPan / = 127.0f ;
settings . initialSys . set ( fmt : : sprintf ( " vol%d " , i ) , newVol ) ;
settings . initialSys . set ( fmt : : sprintf ( " pan%d " , i ) , newPan ) ;
}
2023-01-07 09:09:01 +00:00
e - > setConf ( " initialSys2 " , settings . initialSys . toBase64 ( ) ) ;
2023-01-06 22:43:08 +00:00
}
2022-04-30 06:37:37 +00:00
}
2022-02-18 03:59:11 +00:00
// keybinds
2022-04-06 06:52:58 +00:00
for ( int i = 0 ; i < GUI_ACTION_MAX ; i + + ) {
if ( guiActions [ i ] . defaultBind = = - 1 ) continue ; // not a bind
actionKeys [ i ] = e - > getConfInt ( String ( " keybind_GUI_ACTION_ " ) + String ( guiActions [ i ] . name ) , guiActions [ i ] . defaultBind ) ;
}
2022-02-18 03:59:11 +00:00
2022-02-21 23:01:41 +00:00
decodeKeyMap ( noteKeys , e - > getConfString ( " noteKeys " , DEFAULT_NOTE_KEYS ) ) ;
2022-02-18 03:59:11 +00:00
parseKeybinds ( ) ;
2022-03-29 22:38:30 +00:00
2022-08-22 19:17:19 +00:00
midiMap . read ( e - > getConfigPath ( ) + DIR_SEPARATOR_STR + " midiIn_ " + stripName ( settings . midiInDevice ) + " .cfg " ) ;
2022-03-29 22:38:30 +00:00
midiMap . compile ( ) ;
2022-04-01 07:21:10 +00:00
e - > setMidiDirect ( midiMap . directChannel ) ;
2022-04-13 07:29:07 +00:00
e - > setMetronomeVol ( ( ( float ) settings . metroVol ) / 100.0f ) ;
2022-02-18 03:59:11 +00:00
}
void FurnaceGUI : : commitSettings ( ) {
2022-09-10 23:53:27 +00:00
bool sampleROMsChanged = settings . yrw801Path ! = e - > getConfString ( " yrw801Path " , " " ) | |
2022-05-11 21:39:36 +00:00
settings . tg100Path ! = e - > getConfString ( " tg100Path " , " " ) | |
settings . mu5Path ! = e - > getConfString ( " mu5Path " , " " ) ;
2022-12-14 22:18:19 +00:00
bool coresChanged = (
settings . arcadeCore ! = e - > getConfInt ( " arcadeCore " , 0 ) | |
settings . ym2612Core ! = e - > getConfInt ( " ym2612Core " , 0 ) | |
settings . snCore ! = e - > getConfInt ( " snCore " , 0 ) | |
settings . nesCore ! = e - > getConfInt ( " nesCore " , 0 ) | |
settings . fdsCore ! = e - > getConfInt ( " fdsCore " , 0 ) | |
2022-12-22 21:40:29 +00:00
settings . c64Core ! = e - > getConfInt ( " c64Core " , 1 ) | |
2022-12-24 07:29:37 +00:00
settings . pokeyCore ! = e - > getConfInt ( " pokeyCore " , 1 ) | |
settings . opnCore ! = e - > getConfInt ( " opnCore " , 1 )
2022-12-14 22:18:19 +00:00
) ;
2022-02-18 03:59:11 +00:00
e - > setConf ( " mainFontSize " , settings . mainFontSize ) ;
e - > setConf ( " patFontSize " , settings . patFontSize ) ;
e - > setConf ( " iconSize " , settings . iconSize ) ;
e - > setConf ( " audioEngine " , String ( audioBackends [ settings . audioEngine ] ) ) ;
e - > setConf ( " audioDevice " , settings . audioDevice ) ;
2022-03-28 08:46:50 +00:00
e - > setConf ( " midiInDevice " , settings . midiInDevice ) ;
e - > setConf ( " midiOutDevice " , settings . midiOutDevice ) ;
2022-07-21 20:21:29 +00:00
e - > setConf ( " c163Name " , settings . c163Name ) ;
2023-02-05 20:24:11 +00:00
e - > setConf ( " renderDriver " , settings . renderDriver ) ;
2022-02-18 03:59:11 +00:00
e - > setConf ( " audioQuality " , settings . audioQuality ) ;
e - > setConf ( " audioBufSize " , settings . audioBufSize ) ;
e - > setConf ( " audioRate " , settings . audioRate ) ;
2023-01-05 07:40:17 +00:00
e - > setConf ( " audioChans " , settings . audioChans ) ;
2022-02-18 03:59:11 +00:00
e - > setConf ( " arcadeCore " , settings . arcadeCore ) ;
e - > setConf ( " ym2612Core " , settings . ym2612Core ) ;
2022-05-26 23:46:20 +00:00
e - > setConf ( " snCore " , settings . snCore ) ;
2022-05-02 04:20:20 +00:00
e - > setConf ( " nesCore " , settings . nesCore ) ;
2022-05-02 21:53:55 +00:00
e - > setConf ( " fdsCore " , settings . fdsCore ) ;
2022-08-28 20:10:16 +00:00
e - > setConf ( " c64Core " , settings . c64Core ) ;
2022-12-22 21:40:29 +00:00
e - > setConf ( " pokeyCore " , settings . pokeyCore ) ;
2022-12-24 07:29:37 +00:00
e - > setConf ( " opnCore " , settings . opnCore ) ;
2022-06-03 06:18:32 +00:00
e - > setConf ( " pcSpeakerOutMethod " , settings . pcSpeakerOutMethod ) ;
2022-05-11 21:39:36 +00:00
e - > setConf ( " yrw801Path " , settings . yrw801Path ) ;
e - > setConf ( " tg100Path " , settings . tg100Path ) ;
e - > setConf ( " mu5Path " , settings . mu5Path ) ;
2022-02-18 03:59:11 +00:00
e - > setConf ( " mainFont " , settings . mainFont ) ;
e - > setConf ( " patFont " , settings . patFont ) ;
e - > setConf ( " mainFontPath " , settings . mainFontPath ) ;
e - > setConf ( " patFontPath " , settings . patFontPath ) ;
e - > setConf ( " patRowsBase " , settings . patRowsBase ) ;
e - > setConf ( " orderRowsBase " , settings . orderRowsBase ) ;
e - > setConf ( " soloAction " , settings . soloAction ) ;
e - > setConf ( " pullDeleteBehavior " , settings . pullDeleteBehavior ) ;
e - > setConf ( " wrapHorizontal " , settings . wrapHorizontal ) ;
e - > setConf ( " wrapVertical " , settings . wrapVertical ) ;
e - > setConf ( " macroView " , settings . macroView ) ;
e - > setConf ( " fmNames " , settings . fmNames ) ;
e - > setConf ( " allowEditDocking " , settings . allowEditDocking ) ;
e - > setConf ( " chipNames " , settings . chipNames ) ;
e - > setConf ( " overflowHighlight " , settings . overflowHighlight ) ;
e - > setConf ( " partyTime " , settings . partyTime ) ;
e - > setConf ( " germanNotation " , settings . germanNotation ) ;
e - > setConf ( " stepOnDelete " , settings . stepOnDelete ) ;
e - > setConf ( " scrollStep " , settings . scrollStep ) ;
e - > setConf ( " sysSeparators " , settings . sysSeparators ) ;
e - > setConf ( " forceMono " , settings . forceMono ) ;
e - > setConf ( " controlLayout " , settings . controlLayout ) ;
e - > setConf ( " restartOnFlagChange " , settings . restartOnFlagChange ) ;
e - > setConf ( " statusDisplay " , settings . statusDisplay ) ;
e - > setConf ( " dpiScale " , settings . dpiScale ) ;
e - > setConf ( " viewPrevPattern " , settings . viewPrevPattern ) ;
2022-03-03 17:44:29 +00:00
e - > setConf ( " guiColorsBase " , settings . guiColorsBase ) ;
2022-05-24 08:49:52 +00:00
e - > setConf ( " guiColorsShading " , settings . guiColorsShading ) ;
2022-03-04 07:40:42 +00:00
e - > setConf ( " avoidRaisingPattern " , settings . avoidRaisingPattern ) ;
2022-03-05 07:13:15 +00:00
e - > setConf ( " insFocusesPattern " , settings . insFocusesPattern ) ;
2022-03-12 07:32:02 +00:00
e - > setConf ( " stepOnInsert " , settings . stepOnInsert ) ;
2022-03-13 23:32:35 +00:00
e - > setConf ( " unifiedDataView " , settings . unifiedDataView ) ;
e - > setConf ( " sysFileDialog " , settings . sysFileDialog ) ;
2022-03-21 05:52:38 +00:00
e - > setConf ( " roundedWindows " , settings . roundedWindows ) ;
e - > setConf ( " roundedButtons " , settings . roundedButtons ) ;
e - > setConf ( " roundedMenus " , settings . roundedMenus ) ;
2022-03-22 04:36:17 +00:00
e - > setConf ( " loadJapanese " , settings . loadJapanese ) ;
2022-05-14 01:52:33 +00:00
e - > setConf ( " loadChinese " , settings . loadChinese ) ;
2022-08-25 23:49:08 +00:00
e - > setConf ( " loadChineseTraditional " , settings . loadChineseTraditional ) ;
e - > setConf ( " loadKorean " , settings . loadKorean ) ;
2022-03-25 23:16:47 +00:00
e - > setConf ( " fmLayout " , settings . fmLayout ) ;
2022-04-12 01:27:23 +00:00
e - > setConf ( " sampleLayout " , settings . sampleLayout ) ;
2022-04-17 00:47:40 +00:00
e - > setConf ( " waveLayout " , settings . waveLayout ) ;
2022-03-27 08:38:04 +00:00
e - > setConf ( " susPosition " , settings . susPosition ) ;
2022-04-04 00:20:30 +00:00
e - > setConf ( " effectCursorDir " , settings . effectCursorDir ) ;
e - > setConf ( " cursorPastePos " , settings . cursorPastePos ) ;
2022-04-04 18:25:38 +00:00
e - > setConf ( " titleBarInfo " , settings . titleBarInfo ) ;
e - > setConf ( " titleBarSys " , settings . titleBarSys ) ;
2022-04-06 05:34:26 +00:00
e - > setConf ( " frameBorders " , settings . frameBorders ) ;
2022-04-07 07:02:52 +00:00
e - > setConf ( " effectDeletionAltersValue " , settings . effectDeletionAltersValue ) ;
2022-04-11 08:34:38 +00:00
e - > setConf ( " oscRoundedCorners " , settings . oscRoundedCorners ) ;
e - > setConf ( " oscTakesEntireWindow " , settings . oscTakesEntireWindow ) ;
e - > setConf ( " oscBorder " , settings . oscBorder ) ;
2022-05-23 22:42:25 +00:00
e - > setConf ( " oscEscapesBoundary " , settings . oscEscapesBoundary ) ;
2022-04-12 23:26:25 +00:00
e - > setConf ( " separateFMColors " , settings . separateFMColors ) ;
2022-04-13 02:30:12 +00:00
e - > setConf ( " insEditColorize " , settings . insEditColorize ) ;
2022-04-13 07:29:07 +00:00
e - > setConf ( " metroVol " , settings . metroVol ) ;
2022-04-13 22:42:55 +00:00
e - > setConf ( " pushNibble " , settings . pushNibble ) ;
2022-04-14 06:25:21 +00:00
e - > setConf ( " scrollChangesOrder " , settings . scrollChangesOrder ) ;
2022-04-15 02:57:39 +00:00
e - > setConf ( " oplStandardWaveNames " , settings . oplStandardWaveNames ) ;
e - > setConf ( " cursorMoveNoScroll " , settings . cursorMoveNoScroll ) ;
2022-04-15 10:37:23 +00:00
e - > setConf ( " lowLatency " , settings . lowLatency ) ;
2022-04-16 18:13:19 +00:00
e - > setConf ( " notePreviewBehavior " , settings . notePreviewBehavior ) ;
2022-04-16 23:35:25 +00:00
e - > setConf ( " powerSave " , settings . powerSave ) ;
2022-04-21 07:35:50 +00:00
e - > setConf ( " absorbInsInput " , settings . absorbInsInput ) ;
2022-04-25 21:46:38 +00:00
e - > setConf ( " eventDelay " , settings . eventDelay ) ;
e - > setConf ( " moveWindowTitle " , settings . moveWindowTitle ) ;
2022-04-26 20:24:45 +00:00
e - > setConf ( " hiddenSystems " , settings . hiddenSystems ) ;
2022-09-30 05:26:54 +00:00
e - > setConf ( " initialSys2 " , settings . initialSys . toBase64 ( ) ) ;
2022-07-23 23:22:42 +00:00
e - > setConf ( " initialSysName " , settings . initialSysName ) ;
2022-05-05 05:52:15 +00:00
e - > setConf ( " horizontalDataView " , settings . horizontalDataView ) ;
e - > setConf ( " noMultiSystem " , settings . noMultiSystem ) ;
2022-05-12 08:29:34 +00:00
e - > setConf ( " oldMacroVSlider " , settings . oldMacroVSlider ) ;
2022-05-20 07:43:39 +00:00
e - > setConf ( " displayAllInsTypes " , settings . displayAllInsTypes ) ;
2022-05-27 03:26:44 +00:00
e - > setConf ( " noteCellSpacing " , settings . noteCellSpacing ) ;
e - > setConf ( " insCellSpacing " , settings . insCellSpacing ) ;
e - > setConf ( " volCellSpacing " , settings . volCellSpacing ) ;
e - > setConf ( " effectCellSpacing " , settings . effectCellSpacing ) ;
e - > setConf ( " effectValCellSpacing " , settings . effectValCellSpacing ) ;
2022-05-31 00:02:24 +00:00
e - > setConf ( " doubleClickColumn " , settings . doubleClickColumn ) ;
2022-06-03 23:30:40 +00:00
e - > setConf ( " blankIns " , settings . blankIns ) ;
2022-06-18 08:52:03 +00:00
e - > setConf ( " dragMovesSelection " , settings . dragMovesSelection ) ;
2022-06-28 20:06:22 +00:00
e - > setConf ( " unsignedDetune " , settings . unsignedDetune ) ;
2022-07-20 05:32:06 +00:00
e - > setConf ( " noThreadedInput " , settings . noThreadedInput ) ;
2022-08-22 19:17:19 +00:00
e - > setConf ( " saveWindowPos " , settings . saveWindowPos ) ;
2022-07-25 23:41:47 +00:00
e - > setConf ( " clampSamples " , settings . clampSamples ) ;
2022-08-13 23:00:29 +00:00
e - > setConf ( " noteOffLabel " , settings . noteOffLabel ) ;
e - > setConf ( " noteRelLabel " , settings . noteRelLabel ) ;
e - > setConf ( " macroRelLabel " , settings . macroRelLabel ) ;
e - > setConf ( " emptyLabel " , settings . emptyLabel ) ;
e - > setConf ( " emptyLabel2 " , settings . emptyLabel2 ) ;
2022-08-16 08:42:17 +00:00
e - > setConf ( " saveUnusedPatterns " , settings . saveUnusedPatterns ) ;
2022-08-16 18:53:51 +00:00
e - > setConf ( " channelColors " , settings . channelColors ) ;
e - > setConf ( " channelTextColors " , settings . channelTextColors ) ;
e - > setConf ( " channelStyle " , settings . channelStyle ) ;
e - > setConf ( " channelVolStyle " , settings . channelVolStyle ) ;
e - > setConf ( " channelFeedbackStyle " , settings . channelFeedbackStyle ) ;
2022-09-18 09:20:08 +00:00
e - > setConf ( " channelFont " , settings . channelFont ) ;
2022-09-21 00:07:17 +00:00
e - > setConf ( " channelTextCenter " , settings . channelTextCenter ) ;
2022-09-10 23:53:27 +00:00
e - > setConf ( " maxRecentFile " , settings . maxRecentFile ) ;
2022-09-26 06:27:36 +00:00
e - > setConf ( " midiOutClock " , settings . midiOutClock ) ;
e - > setConf ( " midiOutMode " , settings . midiOutMode ) ;
2022-10-04 00:22:24 +00:00
e - > setConf ( " centerPattern " , settings . centerPattern ) ;
2022-11-05 21:22:15 +00:00
e - > setConf ( " ordersCursor " , settings . ordersCursor ) ;
2022-11-06 05:37:57 +00:00
e - > setConf ( " persistFadeOut " , settings . persistFadeOut ) ;
e - > setConf ( " exportLoops " , settings . exportLoops ) ;
e - > setConf ( " exportFadeOut " , settings . exportFadeOut ) ;
2022-11-11 00:21:01 +00:00
e - > setConf ( " macroLayout " , settings . macroLayout ) ;
2023-01-14 19:07:50 +00:00
e - > setConf ( " doubleClickTime " , settings . doubleClickTime ) ;
2023-01-17 07:07:29 +00:00
e - > setConf ( " oneDigitEffects " , settings . oneDigitEffects ) ;
2022-02-18 03:59:11 +00:00
2022-04-06 07:30:12 +00:00
// colors
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
2022-04-06 18:53:39 +00:00
e - > setConf ( guiColors [ i ] . name , ( int ) ImGui : : ColorConvertFloat4ToU32 ( uiColors [ i ] ) ) ;
2022-04-06 07:30:12 +00:00
}
2022-02-18 03:59:11 +00:00
2022-04-06 06:52:58 +00:00
// keybinds
for ( int i = 0 ; i < GUI_ACTION_MAX ; i + + ) {
if ( guiActions [ i ] . defaultBind = = - 1 ) continue ; // not a bind
e - > setConf ( String ( " keybind_GUI_ACTION_ " ) + String ( guiActions [ i ] . name ) , actionKeys [ i ] ) ;
}
2022-02-18 03:59:11 +00:00
2022-04-04 00:23:02 +00:00
parseKeybinds ( ) ;
2022-02-21 23:01:41 +00:00
e - > setConf ( " noteKeys " , encodeKeyMap ( noteKeys ) ) ;
2022-03-29 22:38:30 +00:00
midiMap . compile ( ) ;
midiMap . write ( e - > getConfigPath ( ) + DIR_SEPARATOR_STR + " midiIn_ " + stripName ( settings . midiInDevice ) + " .cfg " ) ;
2022-02-18 03:59:11 +00:00
e - > saveConf ( ) ;
2022-09-10 23:53:27 +00:00
while ( ! recentFile . empty ( ) & & ( int ) recentFile . size ( ) > settings . maxRecentFile ) {
recentFile . pop_back ( ) ;
}
2022-05-13 03:15:03 +00:00
if ( sampleROMsChanged ) {
if ( e - > loadSampleROMs ( ) ) {
2022-05-11 21:39:36 +00:00
showError ( e - > getLastError ( ) ) ;
}
}
2022-12-14 22:18:19 +00:00
if ( ! e - > switchMaster ( coresChanged ) ) {
2022-02-18 03:59:11 +00:00
showError ( " could not initialize audio! " ) ;
}
ImGui : : GetIO ( ) . Fonts - > Clear ( ) ;
applyUISettings ( ) ;
ImGui_ImplSDLRenderer_DestroyFontsTexture ( ) ;
if ( ! ImGui : : GetIO ( ) . Fonts - > Build ( ) ) {
2022-04-11 03:12:02 +00:00
logE ( " error while building font atlas! " ) ;
2022-02-18 03:59:11 +00:00
showError ( " error while loading fonts! please check your settings. " ) ;
ImGui : : GetIO ( ) . Fonts - > Clear ( ) ;
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
patFont = mainFont ;
ImGui_ImplSDLRenderer_DestroyFontsTexture ( ) ;
if ( ! ImGui : : GetIO ( ) . Fonts - > Build ( ) ) {
2022-04-11 03:12:02 +00:00
logE ( " error again while building font atlas! " ) ;
2022-02-18 03:59:11 +00:00
}
}
}
2022-03-21 22:34:43 +00:00
2022-04-06 18:53:39 +00:00
bool FurnaceGUI : : importColors ( String path ) {
FILE * f = ps_fopen ( path . c_str ( ) , " rb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening color file for import: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
resetColors ( ) ;
char line [ 4096 ] ;
while ( ! feof ( f ) ) {
String key = " " ;
String value = " " ;
bool keyOrValue = false ;
if ( fgets ( line , 4095 , f ) = = NULL ) {
break ;
}
for ( char * i = line ; * i ; i + + ) {
if ( * i = = ' \n ' ) continue ;
if ( keyOrValue ) {
value + = * i ;
} else {
if ( * i = = ' = ' ) {
keyOrValue = true ;
} else {
key + = * i ;
}
}
}
if ( keyOrValue ) {
// unoptimal
const char * cs = key . c_str ( ) ;
bool found = false ;
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
try {
if ( strcmp ( cs , guiColors [ i ] . name ) = = 0 ) {
uiColors [ i ] = ImGui : : ColorConvertU32ToFloat4 ( std : : stoi ( value ) ) ;
found = true ;
break ;
}
} catch ( std : : out_of_range & e ) {
break ;
} catch ( std : : invalid_argument & e ) {
break ;
}
}
2022-04-11 03:12:02 +00:00
if ( ! found ) logW ( " line invalid: %s " , line ) ;
2022-04-06 18:53:39 +00:00
}
}
fclose ( f ) ;
2022-04-11 07:53:21 +00:00
applyUISettings ( false ) ;
2022-04-06 18:53:39 +00:00
return true ;
}
bool FurnaceGUI : : exportColors ( String path ) {
FILE * f = ps_fopen ( path . c_str ( ) , " wb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening color file for export: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
if ( fprintf ( f , " %s=%d \n " , guiColors [ i ] . name , ImGui : : ColorConvertFloat4ToU32 ( uiColors [ i ] ) ) < 0 ) {
2022-04-11 03:12:02 +00:00
logW ( " error while exporting colors: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
break ;
}
}
fclose ( f ) ;
return true ;
}
bool FurnaceGUI : : importKeybinds ( String path ) {
FILE * f = ps_fopen ( path . c_str ( ) , " rb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening keybind file for import: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
resetKeybinds ( ) ;
char line [ 4096 ] ;
while ( ! feof ( f ) ) {
String key = " " ;
String value = " " ;
bool keyOrValue = false ;
if ( fgets ( line , 4095 , f ) = = NULL ) {
break ;
}
for ( char * i = line ; * i ; i + + ) {
if ( * i = = ' \n ' ) continue ;
if ( keyOrValue ) {
value + = * i ;
} else {
if ( * i = = ' = ' ) {
keyOrValue = true ;
} else {
key + = * i ;
}
}
}
if ( keyOrValue ) {
// unoptimal
const char * cs = key . c_str ( ) ;
bool found = false ;
for ( int i = 0 ; i < GUI_ACTION_MAX ; i + + ) {
try {
if ( strcmp ( cs , guiActions [ i ] . name ) = = 0 ) {
actionKeys [ i ] = std : : stoi ( value ) ;
found = true ;
break ;
}
} catch ( std : : out_of_range & e ) {
break ;
} catch ( std : : invalid_argument & e ) {
break ;
}
}
2022-04-11 03:12:02 +00:00
if ( ! found ) logW ( " line invalid: %s " , line ) ;
2022-04-06 18:53:39 +00:00
}
}
fclose ( f ) ;
return true ;
}
bool FurnaceGUI : : exportKeybinds ( String path ) {
FILE * f = ps_fopen ( path . c_str ( ) , " wb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening keybind file for export: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
for ( int i = 0 ; i < GUI_ACTION_MAX ; i + + ) {
if ( guiActions [ i ] . defaultBind = = - 1 ) continue ;
if ( fprintf ( f , " %s=%d \n " , guiActions [ i ] . name , actionKeys [ i ] ) < 0 ) {
2022-04-11 03:12:02 +00:00
logW ( " error while exporting keybinds: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
break ;
}
}
fclose ( f ) ;
return true ;
}
bool FurnaceGUI : : importLayout ( String path ) {
2022-05-18 23:42:59 +00:00
if ( mobileUI ) {
logW ( " but you are on the mobile UI! " ) ;
return false ;
}
2022-04-06 18:53:39 +00:00
FILE * f = ps_fopen ( path . c_str ( ) , " rb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening keybind file for import: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
if ( fseek ( f , 0 , SEEK_END ) < 0 ) {
fclose ( f ) ;
return false ;
}
ssize_t len = ftell ( f ) ;
if ( len = = ( SIZE_MAX > > 1 ) ) {
fclose ( f ) ;
return false ;
}
if ( len < 1 ) {
if ( len = = 0 ) {
2022-04-11 03:12:02 +00:00
logE ( " that file is empty! " ) ;
2022-04-06 18:53:39 +00:00
lastError = " file is empty " ;
} else {
perror ( " tell error " ) ;
}
fclose ( f ) ;
return false ;
}
if ( fseek ( f , 0 , SEEK_SET ) < 0 ) {
perror ( " size error " ) ;
lastError = fmt : : sprintf ( " on get size: %s " , strerror ( errno ) ) ;
fclose ( f ) ;
return false ;
}
2022-04-15 04:22:11 +00:00
unsigned char * file = new unsigned char [ len ] ;
2022-04-06 18:53:39 +00:00
if ( fread ( file , 1 , ( size_t ) len , f ) ! = ( size_t ) len ) {
perror ( " read error " ) ;
lastError = fmt : : sprintf ( " on read: %s " , strerror ( errno ) ) ;
fclose ( f ) ;
delete [ ] file ;
return false ;
}
fclose ( f ) ;
ImGui : : LoadIniSettingsFromMemory ( ( const char * ) file , len ) ;
delete [ ] file ;
return true ;
}
bool FurnaceGUI : : exportLayout ( String path ) {
2022-05-18 23:42:59 +00:00
if ( mobileUI ) {
logW ( " but you are on the mobile UI! " ) ;
return false ;
}
2022-04-06 18:53:39 +00:00
FILE * f = ps_fopen ( path . c_str ( ) , " wb " ) ;
if ( f = = NULL ) {
2022-04-11 03:12:02 +00:00
logW ( " error while opening layout file for export: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
return false ;
}
size_t dataSize = 0 ;
const char * data = ImGui : : SaveIniSettingsToMemory ( & dataSize ) ;
if ( fwrite ( data , 1 , dataSize , f ) ! = dataSize ) {
2022-04-11 03:12:02 +00:00
logW ( " error while exporting layout: %s " , strerror ( errno ) ) ;
2022-04-06 18:53:39 +00:00
}
fclose ( f ) ;
return true ;
}
void FurnaceGUI : : resetColors ( ) {
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
uiColors [ i ] = ImGui : : ColorConvertU32ToFloat4 ( guiColors [ i ] . defaultColor ) ;
}
}
void FurnaceGUI : : resetKeybinds ( ) {
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
if ( guiActions [ i ] . defaultBind = = - 1 ) continue ;
actionKeys [ i ] = guiActions [ i ] . defaultBind ;
}
parseKeybinds ( ) ;
}
2022-03-21 22:34:43 +00:00
void FurnaceGUI : : parseKeybinds ( ) {
actionMapGlobal . clear ( ) ;
actionMapPat . clear ( ) ;
actionMapInsList . clear ( ) ;
actionMapWaveList . clear ( ) ;
actionMapSampleList . clear ( ) ;
2022-03-22 09:54:01 +00:00
actionMapSample . clear ( ) ;
2022-03-21 22:34:43 +00:00
actionMapOrders . clear ( ) ;
for ( int i = GUI_ACTION_GLOBAL_MIN + 1 ; i < GUI_ACTION_GLOBAL_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapGlobal [ actionKeys [ i ] ] = i ;
}
}
for ( int i = GUI_ACTION_PAT_MIN + 1 ; i < GUI_ACTION_PAT_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapPat [ actionKeys [ i ] ] = i ;
}
}
for ( int i = GUI_ACTION_INS_LIST_MIN + 1 ; i < GUI_ACTION_INS_LIST_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapInsList [ actionKeys [ i ] ] = i ;
}
}
for ( int i = GUI_ACTION_WAVE_LIST_MIN + 1 ; i < GUI_ACTION_WAVE_LIST_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapWaveList [ actionKeys [ i ] ] = i ;
}
}
for ( int i = GUI_ACTION_SAMPLE_LIST_MIN + 1 ; i < GUI_ACTION_SAMPLE_LIST_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapSampleList [ actionKeys [ i ] ] = i ;
}
}
2022-03-22 09:54:01 +00:00
for ( int i = GUI_ACTION_SAMPLE_MIN + 1 ; i < GUI_ACTION_SAMPLE_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapSample [ actionKeys [ i ] ] = i ;
}
}
2022-03-21 22:34:43 +00:00
for ( int i = GUI_ACTION_ORDERS_MIN + 1 ; i < GUI_ACTION_ORDERS_MAX ; i + + ) {
if ( actionKeys [ i ] & FURK_MASK ) {
actionMapOrders [ actionKeys [ i ] ] = i ;
}
}
}
2022-04-12 23:26:25 +00:00
void FurnaceGUI : : pushAccentColors ( const ImVec4 & one , const ImVec4 & two , const ImVec4 & border , const ImVec4 & borderShadow ) {
float hue , sat , val ;
ImVec4 primaryActive = one ;
ImVec4 primaryHover , primary ;
primaryHover . w = primaryActive . w ;
primary . w = primaryActive . w ;
ImGui : : ColorConvertRGBtoHSV ( primaryActive . x , primaryActive . y , primaryActive . z , hue , sat , val ) ;
if ( settings . guiColorsBase ) {
primary = primaryActive ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.9 , primaryHover . x , primaryHover . y , primaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat , val * 0.5 , primaryActive . x , primaryActive . y , primaryActive . z ) ;
} else {
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.5 , primaryHover . x , primaryHover . y , primaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.8 , val * 0.35 , primary . x , primary . y , primary . z ) ;
}
ImVec4 secondaryActive = two ;
ImVec4 secondaryHover , secondary , secondarySemiActive ;
secondarySemiActive . w = secondaryActive . w ;
secondaryHover . w = secondaryActive . w ;
secondary . w = secondaryActive . w ;
ImGui : : ColorConvertRGBtoHSV ( secondaryActive . x , secondaryActive . y , secondaryActive . z , hue , sat , val ) ;
if ( settings . guiColorsBase ) {
secondary = secondaryActive ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.7 , secondarySemiActive . x , secondarySemiActive . y , secondarySemiActive . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.9 , secondaryHover . x , secondaryHover . y , secondaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat , val * 0.5 , secondaryActive . x , secondaryActive . y , secondaryActive . z ) ;
} else {
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.75 , secondarySemiActive . x , secondarySemiActive . y , secondarySemiActive . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.5 , secondaryHover . x , secondaryHover . y , secondaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.25 , secondary . x , secondary . y , secondary . z ) ;
}
ImGui : : PushStyleColor ( ImGuiCol_Button , primary ) ;
ImGui : : PushStyleColor ( ImGuiCol_ButtonHovered , primaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_ButtonActive , primaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_Tab , primary ) ;
ImGui : : PushStyleColor ( ImGuiCol_TabHovered , secondaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_TabActive , secondarySemiActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_TabUnfocused , primary ) ;
ImGui : : PushStyleColor ( ImGuiCol_TabUnfocusedActive , primaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_Header , secondary ) ;
ImGui : : PushStyleColor ( ImGuiCol_HeaderHovered , secondaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_HeaderActive , secondaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_ResizeGrip , secondary ) ;
ImGui : : PushStyleColor ( ImGuiCol_ResizeGripHovered , secondaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_ResizeGripActive , secondaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_FrameBg , secondary ) ;
ImGui : : PushStyleColor ( ImGuiCol_FrameBgHovered , secondaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_FrameBgActive , secondaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_SliderGrab , primaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_SliderGrabActive , primaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_TitleBgActive , primary ) ;
ImGui : : PushStyleColor ( ImGuiCol_CheckMark , primaryActive ) ;
ImGui : : PushStyleColor ( ImGuiCol_TextSelectedBg , secondaryHover ) ;
ImGui : : PushStyleColor ( ImGuiCol_Border , border ) ;
ImGui : : PushStyleColor ( ImGuiCol_BorderShadow , borderShadow ) ;
}
void FurnaceGUI : : popAccentColors ( ) {
ImGui : : PopStyleColor ( 24 ) ;
}
2022-03-21 22:34:43 +00:00
# define IGFD_FileStyleByExtension IGFD_FileStyleByExtention
# ifdef _WIN32
# define SYSTEM_FONT_PATH_1 "C:\\Windows\\Fonts\\segoeui.ttf"
# define SYSTEM_FONT_PATH_2 "C:\\Windows\\Fonts\\tahoma.ttf"
// TODO!
# define SYSTEM_FONT_PATH_3 "C:\\Windows\\Fonts\\tahoma.ttf"
// TODO!
# define SYSTEM_PAT_FONT_PATH_1 "C:\\Windows\\Fonts\\consola.ttf"
# define SYSTEM_PAT_FONT_PATH_2 "C:\\Windows\\Fonts\\cour.ttf"
// GOOD LUCK WITH THIS ONE - UNTESTED
# define SYSTEM_PAT_FONT_PATH_3 "C:\\Windows\\Fonts\\vgasys.fon"
# elif defined(__APPLE__)
# define SYSTEM_FONT_PATH_1 " / System / Library / Fonts / SFAANS.ttf"
# define SYSTEM_FONT_PATH_2 " / System / Library / Fonts / Helvetica.ttc"
# define SYSTEM_FONT_PATH_3 " / System / Library / Fonts / Helvetica.dfont"
# define SYSTEM_PAT_FONT_PATH_1 " / System / Library / Fonts / SFNSMono.ttf"
# define SYSTEM_PAT_FONT_PATH_2 " / System / Library / Fonts / Courier New.ttf"
# define SYSTEM_PAT_FONT_PATH_3 " / System / Library / Fonts / Courier New.ttf"
2022-11-07 21:46:01 +00:00
# elif defined(ANDROID)
# define SYSTEM_FONT_PATH_1 " / system / fonts / Roboto-Regular.ttf"
# define SYSTEM_FONT_PATH_2 " / system / fonts / DroidSans.ttf"
# define SYSTEM_FONT_PATH_3 " / system / fonts / DroidSans.ttf"
// ???
# define SYSTEM_PAT_FONT_PATH_1 " / system / fonts / RobotoMono-Regular.ttf"
# define SYSTEM_PAT_FONT_PATH_2 " / system / fonts / DroidSansMono.ttf"
# define SYSTEM_PAT_FONT_PATH_3 " / system / fonts / CutiveMono.ttf"
2022-03-21 22:34:43 +00:00
# else
# define SYSTEM_FONT_PATH_1 " / usr / share / fonts / truetype / dejavu / DejaVuSans.ttf"
# define SYSTEM_FONT_PATH_2 " / usr / share / fonts / TTF / DejaVuSans.ttf"
# define SYSTEM_FONT_PATH_3 " / usr / share / fonts / ubuntu / Ubuntu-R.ttf"
# define SYSTEM_PAT_FONT_PATH_1 " / usr / share / fonts / truetype / dejavu / DejaVuSansMono.ttf"
# define SYSTEM_PAT_FONT_PATH_2 " / usr / share / fonts / TTF / DejaVuSansMono.ttf"
# define SYSTEM_PAT_FONT_PATH_3 " / usr / share / fonts / ubuntu / UbuntuMono-R.ttf"
# endif
2022-08-13 23:00:29 +00:00
void setupLabel ( const char * lStr , char * label , int len ) {
memset ( label , 0 , 32 ) ;
for ( int i = 0 , p = 0 ; i < len ; i + + ) {
signed char cl ;
2022-08-13 23:16:24 +00:00
if ( lStr [ p ] = = 0 ) {
2022-08-13 23:00:29 +00:00
strncat ( label , " " , 32 ) ;
} else {
decodeUTF8 ( ( const unsigned char * ) & lStr [ p ] , cl ) ;
memcpy ( label + p , lStr + p , cl ) ;
p + = cl ;
}
}
}
2022-04-11 07:53:21 +00:00
void FurnaceGUI : : applyUISettings ( bool updateFonts ) {
2022-03-21 22:34:43 +00:00
ImGuiStyle sty ;
if ( settings . guiColorsBase ) {
ImGui : : StyleColorsLight ( & sty ) ;
} else {
ImGui : : StyleColorsDark ( & sty ) ;
}
2023-02-03 20:31:02 +00:00
if ( dpiScale < 0.1 ) dpiScale = 0.1 ;
2022-08-13 23:00:29 +00:00
setupLabel ( settings . noteOffLabel . c_str ( ) , noteOffLabel , 3 ) ;
setupLabel ( settings . noteRelLabel . c_str ( ) , noteRelLabel , 3 ) ;
setupLabel ( settings . macroRelLabel . c_str ( ) , macroRelLabel , 3 ) ;
setupLabel ( settings . emptyLabel . c_str ( ) , emptyLabel , 3 ) ;
setupLabel ( settings . emptyLabel2 . c_str ( ) , emptyLabel2 , 2 ) ;
2022-03-21 22:34:43 +00:00
if ( settings . dpiScale > = 0.5f ) dpiScale = settings . dpiScale ;
2022-04-06 07:30:12 +00:00
// colors
2022-04-11 07:53:21 +00:00
if ( updateFonts ) {
for ( int i = 0 ; i < GUI_COLOR_MAX ; i + + ) {
uiColors [ i ] = ImGui : : ColorConvertU32ToFloat4 ( e - > getConfInt ( guiColors [ i ] . name , guiColors [ i ] . defaultColor ) ) ;
}
2022-04-06 07:30:12 +00:00
}
2022-03-21 22:34:43 +00:00
for ( int i = 0 ; i < 64 ; i + + ) {
ImVec4 col1 = uiColors [ GUI_COLOR_PATTERN_VOLUME_MIN ] ;
ImVec4 col2 = uiColors [ GUI_COLOR_PATTERN_VOLUME_HALF ] ;
ImVec4 col3 = uiColors [ GUI_COLOR_PATTERN_VOLUME_MAX ] ;
volColors [ i ] = ImVec4 ( col1 . x + ( ( col2 . x - col1 . x ) * float ( i ) / 64.0f ) ,
col1 . y + ( ( col2 . y - col1 . y ) * float ( i ) / 64.0f ) ,
col1 . z + ( ( col2 . z - col1 . z ) * float ( i ) / 64.0f ) ,
1.0f ) ;
volColors [ i + 64 ] = ImVec4 ( col2 . x + ( ( col3 . x - col2 . x ) * float ( i ) / 64.0f ) ,
col2 . y + ( ( col3 . y - col2 . y ) * float ( i ) / 64.0f ) ,
col2 . z + ( ( col3 . z - col2 . z ) * float ( i ) / 64.0f ) ,
1.0f ) ;
}
float hue , sat , val ;
ImVec4 primaryActive = uiColors [ GUI_COLOR_ACCENT_PRIMARY ] ;
ImVec4 primaryHover , primary ;
primaryHover . w = primaryActive . w ;
primary . w = primaryActive . w ;
ImGui : : ColorConvertRGBtoHSV ( primaryActive . x , primaryActive . y , primaryActive . z , hue , sat , val ) ;
if ( settings . guiColorsBase ) {
primary = primaryActive ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.9 , primaryHover . x , primaryHover . y , primaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat , val * 0.5 , primaryActive . x , primaryActive . y , primaryActive . z ) ;
} else {
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.5 , primaryHover . x , primaryHover . y , primaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.8 , val * 0.35 , primary . x , primary . y , primary . z ) ;
}
ImVec4 secondaryActive = uiColors [ GUI_COLOR_ACCENT_SECONDARY ] ;
2022-12-03 05:51:57 +00:00
ImVec4 secondaryHoverActual , secondaryHover , secondary , secondarySemiActive ;
2022-03-21 22:34:43 +00:00
secondarySemiActive . w = secondaryActive . w ;
secondaryHover . w = secondaryActive . w ;
secondary . w = secondaryActive . w ;
ImGui : : ColorConvertRGBtoHSV ( secondaryActive . x , secondaryActive . y , secondaryActive . z , hue , sat , val ) ;
if ( settings . guiColorsBase ) {
secondary = secondaryActive ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.7 , secondarySemiActive . x , secondarySemiActive . y , secondarySemiActive . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.9 , secondaryHover . x , secondaryHover . y , secondaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat , val * 0.5 , secondaryActive . x , secondaryActive . y , secondaryActive . z ) ;
} else {
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.75 , secondarySemiActive . x , secondarySemiActive . y , secondarySemiActive . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.5 , secondaryHover . x , secondaryHover . y , secondaryHover . z ) ;
ImGui : : ColorConvertHSVtoRGB ( hue , sat * 0.9 , val * 0.25 , secondary . x , secondary . y , secondary . z ) ;
}
2022-12-03 05:51:57 +00:00
secondaryHoverActual = secondaryHover ;
2022-12-01 23:34:08 +00:00
if ( mobileUI ) { // disable all hovered colors
primaryHover = primary ;
secondaryHover = secondary ;
}
2022-03-21 22:34:43 +00:00
sty . Colors [ ImGuiCol_WindowBg ] = uiColors [ GUI_COLOR_FRAME_BACKGROUND ] ;
sty . Colors [ ImGuiCol_ModalWindowDimBg ] = uiColors [ GUI_COLOR_MODAL_BACKDROP ] ;
sty . Colors [ ImGuiCol_Text ] = uiColors [ GUI_COLOR_TEXT ] ;
sty . Colors [ ImGuiCol_Button ] = primary ;
sty . Colors [ ImGuiCol_ButtonHovered ] = primaryHover ;
sty . Colors [ ImGuiCol_ButtonActive ] = primaryActive ;
sty . Colors [ ImGuiCol_Tab ] = primary ;
sty . Colors [ ImGuiCol_TabHovered ] = secondaryHover ;
sty . Colors [ ImGuiCol_TabActive ] = secondarySemiActive ;
sty . Colors [ ImGuiCol_TabUnfocused ] = primary ;
sty . Colors [ ImGuiCol_TabUnfocusedActive ] = primaryHover ;
sty . Colors [ ImGuiCol_Header ] = secondary ;
sty . Colors [ ImGuiCol_HeaderHovered ] = secondaryHover ;
sty . Colors [ ImGuiCol_HeaderActive ] = secondaryActive ;
sty . Colors [ ImGuiCol_ResizeGrip ] = secondary ;
sty . Colors [ ImGuiCol_ResizeGripHovered ] = secondaryHover ;
sty . Colors [ ImGuiCol_ResizeGripActive ] = secondaryActive ;
sty . Colors [ ImGuiCol_FrameBg ] = secondary ;
sty . Colors [ ImGuiCol_FrameBgHovered ] = secondaryHover ;
sty . Colors [ ImGuiCol_FrameBgActive ] = secondaryActive ;
sty . Colors [ ImGuiCol_SliderGrab ] = primaryActive ;
sty . Colors [ ImGuiCol_SliderGrabActive ] = primaryActive ;
sty . Colors [ ImGuiCol_TitleBgActive ] = primary ;
sty . Colors [ ImGuiCol_CheckMark ] = primaryActive ;
2022-12-03 05:51:57 +00:00
sty . Colors [ ImGuiCol_TextSelectedBg ] = secondaryHoverActual ;
2022-03-21 22:34:43 +00:00
sty . Colors [ ImGuiCol_PlotHistogram ] = uiColors [ GUI_COLOR_MACRO_OTHER ] ;
sty . Colors [ ImGuiCol_PlotHistogramHovered ] = uiColors [ GUI_COLOR_MACRO_OTHER ] ;
2022-04-06 05:34:26 +00:00
sty . Colors [ ImGuiCol_Border ] = uiColors [ GUI_COLOR_BORDER ] ;
sty . Colors [ ImGuiCol_BorderShadow ] = uiColors [ GUI_COLOR_BORDER_SHADOW ] ;
2022-03-21 22:34:43 +00:00
if ( settings . roundedWindows ) sty . WindowRounding = 8.0f ;
if ( settings . roundedButtons ) {
sty . FrameRounding = 6.0f ;
sty . GrabRounding = 6.0f ;
}
if ( settings . roundedMenus ) sty . PopupRounding = 8.0f ;
2022-04-06 05:34:26 +00:00
if ( settings . frameBorders ) {
sty . FrameBorderSize = 1.0f ;
} else {
sty . FrameBorderSize = 0.0f ;
}
2022-05-24 08:49:52 +00:00
if ( settings . guiColorsShading > 0 ) {
sty . FrameShading = ( float ) settings . guiColorsShading / 100.0f ;
}
2022-12-03 00:09:43 +00:00
if ( mobileUI ) {
sty . FramePadding = ImVec2 ( 8.0f , 6.0f ) ;
}
2022-03-21 22:34:43 +00:00
sty . ScaleAllSizes ( dpiScale ) ;
ImGui : : GetStyle ( ) = sty ;
2022-04-25 21:46:38 +00:00
ImGui : : GetIO ( ) . ConfigInputTrickleEventQueue = settings . eventDelay ;
ImGui : : GetIO ( ) . ConfigWindowsMoveFromTitleBarOnly = settings . moveWindowTitle ;
2022-12-02 21:52:47 +00:00
ImGui : : GetIO ( ) . ConfigInertialScrollToleranceSqr = pow ( dpiScale * 4.0f , 2.0f ) ;
2023-01-14 19:07:50 +00:00
ImGui : : GetIO ( ) . MouseDoubleClickTime = settings . doubleClickTime ;
2022-04-25 21:46:38 +00:00
2022-03-21 22:34:43 +00:00
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_EFFECT_PITCH ] ;
pitchGrad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_ACTIVE ] ;
noteGrad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_EFFECT_PANNING ] ;
panGrad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_INS ] ;
insGrad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = volColors [ i / 2 ] ;
volGrad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY ] ;
sysCmd1Grad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
for ( int i = 0 ; i < 256 ; i + + ) {
ImVec4 & base = uiColors [ GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY ] ;
sysCmd2Grad [ i ] = ImGui : : GetColorU32 ( ImVec4 ( base . x , base . y , base . z , ( ( float ) i / 255.0f ) * base . w ) ) ;
}
2022-04-11 07:53:21 +00:00
if ( updateFonts ) {
// set to 800 for now due to problems with unifont
static const ImWchar upTo800 [ ] = { 0x20 , 0x7e , 0xa0 , 0x800 , 0 } ;
ImFontGlyphRangesBuilder range ;
ImVector < ImWchar > outRange ;
2022-03-21 22:34:43 +00:00
2022-04-11 07:53:21 +00:00
range . AddRanges ( upTo800 ) ;
if ( settings . loadJapanese ) {
range . AddRanges ( ImGui : : GetIO ( ) . Fonts - > GetGlyphRangesJapanese ( ) ) ;
}
2022-05-14 01:52:33 +00:00
if ( settings . loadChinese ) {
range . AddRanges ( ImGui : : GetIO ( ) . Fonts - > GetGlyphRangesChineseSimplifiedCommon ( ) ) ;
}
2022-08-25 23:49:08 +00:00
if ( settings . loadChineseTraditional ) {
range . AddRanges ( ImGui : : GetIO ( ) . Fonts - > GetGlyphRangesChineseFull ( ) ) ;
}
if ( settings . loadKorean ) {
range . AddRanges ( ImGui : : GetIO ( ) . Fonts - > GetGlyphRangesKorean ( ) ) ;
}
2022-04-11 07:53:21 +00:00
// I'm terribly sorry
range . UsedChars [ 0x80 > > 5 ] = 0 ;
range . BuildRanges ( & outRange ) ;
if ( fontRange ! = NULL ) delete [ ] fontRange ;
fontRange = new ImWchar [ outRange . size ( ) ] ;
int index = 0 ;
for ( ImWchar & i : outRange ) {
fontRange [ index + + ] = i ;
}
2022-03-21 22:34:43 +00:00
2022-04-11 07:53:21 +00:00
if ( settings . mainFont < 0 | | settings . mainFont > 6 ) settings . mainFont = 0 ;
if ( settings . patFont < 0 | | settings . patFont > 6 ) settings . patFont = 0 ;
2022-03-22 04:36:17 +00:00
2022-04-11 07:53:21 +00:00
if ( settings . mainFont = = 6 & & settings . mainFontPath . empty ( ) ) {
logW ( " UI font path is empty! reverting to default font " ) ;
2022-03-21 22:34:43 +00:00
settings . mainFont = 0 ;
}
2022-04-11 07:53:21 +00:00
if ( settings . patFont = = 6 & & settings . patFontPath . empty ( ) ) {
logW ( " pattern font path is empty! reverting to default font " ) ;
settings . patFont = 0 ;
2022-03-21 22:34:43 +00:00
}
2022-04-11 07:53:21 +00:00
ImFontConfig fc1 ;
fc1 . MergeMode = true ;
2022-03-22 04:36:17 +00:00
2022-04-11 07:53:21 +00:00
if ( settings . mainFont = = 6 ) { // custom font
2023-02-03 20:31:02 +00:00
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( settings . mainFontPath . c_str ( ) , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logW ( " could not load UI font! reverting to default font " ) ;
settings . mainFont = 0 ;
2023-02-03 20:31:02 +00:00
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFont [ settings . mainFont ] , builtinFontLen [ settings . mainFont ] , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load UI font! falling back to Proggy Clean. " ) ;
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
2022-03-21 22:34:43 +00:00
}
}
2022-04-11 07:53:21 +00:00
} else if ( settings . mainFont = = 5 ) { // system font
2023-02-03 20:31:02 +00:00
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_FONT_PATH_1 , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_FONT_PATH_2 , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_FONT_PATH_3 , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logW ( " could not load UI font! reverting to default font " ) ;
settings . mainFont = 0 ;
2023-02-03 20:31:02 +00:00
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFont [ settings . mainFont ] , builtinFontLen [ settings . mainFont ] , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load UI font! falling back to Proggy Clean. " ) ;
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
2022-03-21 22:34:43 +00:00
}
}
}
}
} else {
2023-02-03 20:31:02 +00:00
if ( ( mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFont [ settings . mainFont ] , builtinFontLen [ settings . mainFont ] , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , NULL , fontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load UI font! falling back to Proggy Clean. " ) ;
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
2022-03-21 22:34:43 +00:00
}
2022-04-11 07:53:21 +00:00
}
2022-03-21 22:34:43 +00:00
2022-04-11 07:53:21 +00:00
// two fallback fonts
2023-02-03 20:31:02 +00:00
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( font_liberationSans_compressed_data , font_liberationSans_compressed_size , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , & fc1 , fontRange ) ;
mainFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( font_unifont_compressed_data , font_unifont_compressed_size , MAX ( 1 , e - > getConfInt ( " mainFontSize " , 18 ) * dpiScale ) , & fc1 , fontRange ) ;
2022-04-11 07:53:21 +00:00
ImFontConfig fc ;
fc . MergeMode = true ;
fc . GlyphMinAdvanceX = e - > getConfInt ( " iconSize " , 16 ) * dpiScale ;
static const ImWchar fontRangeIcon [ ] = { ICON_MIN_FA , ICON_MAX_FA , 0 } ;
2023-02-03 20:31:02 +00:00
if ( ( iconFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( iconFont_compressed_data , iconFont_compressed_size , MAX ( 1 , e - > getConfInt ( " iconSize " , 16 ) * dpiScale ) , & fc , fontRangeIcon ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load icon font! " ) ;
}
2022-08-22 19:17:19 +00:00
2022-04-11 07:53:21 +00:00
if ( settings . mainFontSize = = settings . patFontSize & & settings . patFont < 5 & & builtinFontM [ settings . patFont ] = = builtinFont [ settings . mainFont ] ) {
logD ( " using main font for pat font. " ) ;
patFont = mainFont ;
} else {
if ( settings . patFont = = 6 ) { // custom font
2023-02-03 20:31:02 +00:00
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( settings . patFontPath . c_str ( ) , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logW ( " could not load pattern font! reverting to default font " ) ;
settings . patFont = 0 ;
2023-02-03 20:31:02 +00:00
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFontM [ settings . patFont ] , builtinFontMLen [ settings . patFont ] , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load pattern font! falling back to Proggy Clean. " ) ;
patFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
}
}
} else if ( settings . patFont = = 5 ) { // system font
2023-02-03 20:31:02 +00:00
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_PAT_FONT_PATH_1 , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_PAT_FONT_PATH_2 , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromFileTTF ( SYSTEM_PAT_FONT_PATH_3 , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logW ( " could not load pattern font! reverting to default font " ) ;
settings . patFont = 0 ;
2023-02-03 20:31:02 +00:00
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFontM [ settings . patFont ] , builtinFontMLen [ settings . patFont ] , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load pattern font! falling back to Proggy Clean. " ) ;
patFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
}
}
}
}
} else {
2023-02-03 20:31:02 +00:00
if ( ( patFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( builtinFontM [ settings . patFont ] , builtinFontMLen [ settings . patFont ] , MAX ( 1 , e - > getConfInt ( " patFontSize " , 18 ) * dpiScale ) , NULL , upTo800 ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load pattern font! " ) ;
patFont = ImGui : : GetIO ( ) . Fonts - > AddFontDefault ( ) ;
}
2022-05-05 03:01:19 +00:00
}
2022-04-11 07:53:21 +00:00
}
2022-08-22 19:17:19 +00:00
2022-11-02 09:01:25 +00:00
// 0x39B = Λ
static const ImWchar bigFontRange [ ] = { 0x20 , 0xFF , 0x39b , 0x39b , 0 } ;
2023-02-03 20:31:02 +00:00
if ( ( bigFont = ImGui : : GetIO ( ) . Fonts - > AddFontFromMemoryCompressedTTF ( font_plexSans_compressed_data , font_plexSans_compressed_size , MAX ( 1 , 40 * dpiScale ) , NULL , bigFontRange ) ) = = NULL ) {
2022-04-11 07:53:21 +00:00
logE ( " could not load big UI font! " ) ;
}
mainFont - > FallbackChar = ' ? ' ;
mainFont - > DotChar = ' . ' ;
}
2022-03-22 04:36:17 +00:00
2022-03-21 22:34:43 +00:00
// TODO: allow changing these colors.
2022-03-24 03:32:36 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByTypeDir , " " , uiColors [ GUI_COLOR_FILE_DIR ] , ICON_FA_FOLDER_O ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByTypeFile , " " , uiColors [ GUI_COLOR_FILE_OTHER ] , ICON_FA_FILE_O ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .fur " , uiColors [ GUI_COLOR_FILE_SONG_NATIVE ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .fui " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .fuw " , uiColors [ GUI_COLOR_FILE_WAVE ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .dmf " , uiColors [ GUI_COLOR_FILE_SONG_NATIVE ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .dmp " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .dmw " , uiColors [ GUI_COLOR_FILE_WAVE ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .wav " , uiColors [ GUI_COLOR_FILE_AUDIO ] , ICON_FA_FILE_AUDIO_O ) ;
2022-04-12 08:34:53 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .dmc " , uiColors [ GUI_COLOR_FILE_AUDIO ] , ICON_FA_FILE_AUDIO_O ) ;
2022-09-25 06:20:08 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .brr " , uiColors [ GUI_COLOR_FILE_AUDIO ] , ICON_FA_FILE_AUDIO_O ) ;
2022-03-24 03:32:36 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .vgm " , uiColors [ GUI_COLOR_FILE_VGM ] , ICON_FA_FILE_AUDIO_O ) ;
2022-05-26 05:24:21 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .zsm " , uiColors [ GUI_COLOR_FILE_ZSM ] , ICON_FA_FILE_AUDIO_O ) ;
2022-03-24 03:32:36 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .ttf " , uiColors [ GUI_COLOR_FILE_FONT ] , ICON_FA_FONT ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .otf " , uiColors [ GUI_COLOR_FILE_FONT ] , ICON_FA_FONT ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .ttc " , uiColors [ GUI_COLOR_FILE_FONT ] , ICON_FA_FONT ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .mod " , uiColors [ GUI_COLOR_FILE_SONG_IMPORT ] , ICON_FA_FILE ) ;
2022-05-04 19:10:28 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .ftm " , uiColors [ GUI_COLOR_FILE_SONG_IMPORT ] , ICON_FA_FILE ) ;
2022-03-24 03:32:36 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .tfi " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .vgi " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .s3i " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .sbi " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-04-23 16:37:25 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .opli " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .opni " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-04-23 14:45:19 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .y12 " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-04-14 14:46:26 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .bnk " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-03-24 03:32:36 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .fti " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .bti " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-04-10 12:16:33 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .ff " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-04-23 10:20:29 +00:00
ImGuiFileDialog : : Instance ( ) - > SetFileStyle ( IGFD_FileStyleByExtension , " .opm " , uiColors [ GUI_COLOR_FILE_INSTR ] , ICON_FA_FILE ) ;
2022-03-21 22:34:43 +00:00
2022-04-11 07:53:21 +00:00
if ( updateFonts ) {
if ( fileDialog ! = NULL ) delete fileDialog ;
fileDialog = new FurnaceGUIFileDialog ( settings . sysFileDialog ) ;
2022-12-03 05:51:57 +00:00
fileDialog - > mobileUI = mobileUI ;
2022-04-11 07:53:21 +00:00
}
2022-03-29 21:09:15 +00:00
}