mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-26 14:33:01 +00:00
Merge branch 'locale'
thanks everyone involved! also special thanks to LTVA for pioneering language support in Furnace
This commit is contained in:
commit
e8d34143cb
127 changed files with 509168 additions and 17328 deletions
|
@ -93,11 +93,22 @@ else()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# until ready
|
||||||
|
set(WITH_LOCALE_DEFAULT ON)
|
||||||
|
|
||||||
|
if (APPLE OR MSVC OR ANDROID)
|
||||||
|
set(USE_MOMO_DEFAULT ON)
|
||||||
|
else()
|
||||||
|
set(USE_MOMO_DEFAULT OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
option(BUILD_GUI "Build the tracker (disable to build only a headless player)" ${BUILD_GUI_DEFAULT})
|
option(BUILD_GUI "Build the tracker (disable to build only a headless player)" ${BUILD_GUI_DEFAULT})
|
||||||
|
option(WITH_LOCALE "Use libintl for language support" ${WITH_LOCALE_DEFAULT})
|
||||||
option(USE_RTMIDI "Build with MIDI support using RtMidi." ${USE_RTMIDI_DEFAULT})
|
option(USE_RTMIDI "Build with MIDI support using RtMidi." ${USE_RTMIDI_DEFAULT})
|
||||||
option(USE_SDL2 "Build with SDL2. Required to build with GUI." ${USE_SDL2_DEFAULT})
|
option(USE_SDL2 "Build with SDL2. Required to build with GUI." ${USE_SDL2_DEFAULT})
|
||||||
option(USE_SNDFILE "Build with libsndfile. Required in order to work with audio files." ${USE_SNDFILE_DEFAULT})
|
option(USE_SNDFILE "Build with libsndfile. Required in order to work with audio files." ${USE_SNDFILE_DEFAULT})
|
||||||
option(USE_BACKWARD "Use backward-cpp to print a backtrace on crash/abort." ${USE_BACKWARD_DEFAULT})
|
option(USE_BACKWARD "Use backward-cpp to print a backtrace on crash/abort." ${USE_BACKWARD_DEFAULT})
|
||||||
|
option(USE_MOMO "Build a libintl implementation instead of using the system one." ${USE_MOMO_DEFAULT})
|
||||||
option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is available" ${WITH_JACK_DEFAULT})
|
option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is available" ${WITH_JACK_DEFAULT})
|
||||||
option(WITH_PORTAUDIO "Whether to build with PortAudio for audio output." ${WITH_PORTAUDIO_DEFAULT})
|
option(WITH_PORTAUDIO "Whether to build with PortAudio for audio output." ${WITH_PORTAUDIO_DEFAULT})
|
||||||
option(WITH_RENDER_SDL "Whether to build with the SDL_Renderer render backend." ${WITH_RENDER_SDL_DEFAULT})
|
option(WITH_RENDER_SDL "Whether to build with the SDL_Renderer render backend." ${WITH_RENDER_SDL_DEFAULT})
|
||||||
|
@ -815,6 +826,8 @@ src/gui/font_liberationSans.cpp
|
||||||
src/gui/font_mononoki.cpp
|
src/gui/font_mononoki.cpp
|
||||||
src/gui/font_plexMono.cpp
|
src/gui/font_plexMono.cpp
|
||||||
src/gui/font_plexSans.cpp
|
src/gui/font_plexSans.cpp
|
||||||
|
src/gui/font_plexSansJP.cpp
|
||||||
|
src/gui/font_plexSansKR.cpp
|
||||||
src/gui/font_proggyClean.cpp
|
src/gui/font_proggyClean.cpp
|
||||||
src/gui/font_ptMono.cpp
|
src/gui/font_ptMono.cpp
|
||||||
src/gui/font_unifont.cpp
|
src/gui/font_unifont.cpp
|
||||||
|
@ -1027,6 +1040,40 @@ if (NOT WIN32)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WITH_LOCALE)
|
||||||
|
try_compile(HAVE_SETLOCALE ${CMAKE_BINARY_DIR}/check SOURCES ${CMAKE_SOURCE_DIR}/src/check/check_setlocale.c)
|
||||||
|
if (HAVE_SETLOCALE)
|
||||||
|
list(APPEND DEPENDENCIES_DEFINES HAVE_SETLOCALE)
|
||||||
|
message(STATUS "setlocale() found")
|
||||||
|
else()
|
||||||
|
if (NOT USE_MOMO)
|
||||||
|
message(FATAL_ERROR "setlocale() is not defined! This means the C library in your system does not support locale at all. Try enabling USE_MOMO.")
|
||||||
|
else()
|
||||||
|
message(STATUS "setlocale() is not defined")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if (USE_MOMO)
|
||||||
|
list(APPEND ENGINE_SOURCES src/momo/momo.c)
|
||||||
|
list(APPEND DEPENDENCIES_DEFINES HAVE_LOCALE)
|
||||||
|
list(APPEND DEPENDENCIES_DEFINES HAVE_MOMO)
|
||||||
|
list(APPEND DEPENDENCIES_INCLUDE_DIRS src/momo)
|
||||||
|
message(STATUS "Using libintl (Momo)")
|
||||||
|
else()
|
||||||
|
if ("${CMAKE_VERSION}" VERSION_LESS "3.2")
|
||||||
|
message(FATAL_ERROR "CMake 3.2 or later required for locale support.")
|
||||||
|
else()
|
||||||
|
include(FindIntl)
|
||||||
|
if (NOT Intl_FOUND)
|
||||||
|
message(FATAL_ERROR "Could not find libintl! Try enabling USE_MOMO.")
|
||||||
|
endif()
|
||||||
|
list(APPEND DEPENDENCIES_DEFINES HAVE_LOCALE)
|
||||||
|
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${Intl_INCLUDE_DIRS})
|
||||||
|
list(APPEND DEPENDENCIES_LIBRARIES ${Intl_LIBRARIES})
|
||||||
|
message(STATUS "Using libintl (system)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(USED_SOURCES ${ENGINE_SOURCES} ${AUDIO_SOURCES} ${CLI_SOURCES} src/main.cpp)
|
set(USED_SOURCES ${ENGINE_SOURCES} ${AUDIO_SOURCES} ${CLI_SOURCES} src/main.cpp)
|
||||||
|
|
||||||
if (USE_BACKWARD)
|
if (USE_BACKWARD)
|
||||||
|
|
|
@ -19,7 +19,7 @@ android {
|
||||||
versionName "0.6.3"
|
versionName "0.6.3"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON"
|
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON", "-DWITH_LOCALE=ON", "-DUSE_MOMO=ON"
|
||||||
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
abiFilters 'arm64-v8a'
|
abiFilters 'arm64-v8a'
|
||||||
}
|
}
|
||||||
|
|
1
android/app/src/main/assets/locale
Symbolic link
1
android/app/src/main/assets/locale
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../../../../po/locale
|
BIN
demos/ay8930/Obscure_Temptation.fur
Normal file
BIN
demos/ay8930/Obscure_Temptation.fur
Normal file
Binary file not shown.
BIN
demos/misc/Slam_the_Door_TIA.fur
Normal file
BIN
demos/misc/Slam_the_Door_TIA.fur
Normal file
Binary file not shown.
BIN
demos/snes/wonders_of_synthia.fur
Normal file
BIN
demos/snes/wonders_of_synthia.fur
Normal file
Binary file not shown.
118
extern/igfd/ImGuiFileDialog.cpp
vendored
118
extern/igfd/ImGuiFileDialog.cpp
vendored
|
@ -113,12 +113,6 @@ namespace IGFD
|
||||||
#ifndef createDirButtonString
|
#ifndef createDirButtonString
|
||||||
#define createDirButtonString ICON_FA_PLUS
|
#define createDirButtonString ICON_FA_PLUS
|
||||||
#endif // createDirButtonString
|
#endif // createDirButtonString
|
||||||
#ifndef okButtonString
|
|
||||||
#define okButtonString "OK"
|
|
||||||
#endif // okButtonString
|
|
||||||
#ifndef cancelButtonString
|
|
||||||
#define cancelButtonString "Cancel"
|
|
||||||
#endif // cancelButtonString
|
|
||||||
#ifndef resetButtonString
|
#ifndef resetButtonString
|
||||||
#define resetButtonString ICON_FA_REPEAT
|
#define resetButtonString ICON_FA_REPEAT
|
||||||
#endif // resetButtonString
|
#endif // resetButtonString
|
||||||
|
@ -134,76 +128,6 @@ namespace IGFD
|
||||||
#ifndef editPathButtonString
|
#ifndef editPathButtonString
|
||||||
#define editPathButtonString ICON_FA_PENCIL
|
#define editPathButtonString ICON_FA_PENCIL
|
||||||
#endif // editPathButtonString
|
#endif // editPathButtonString
|
||||||
#ifndef searchString
|
|
||||||
#define searchString "Search"
|
|
||||||
#endif // searchString
|
|
||||||
#ifndef dirEntryString
|
|
||||||
#define dirEntryString "[Dir]"
|
|
||||||
#endif // dirEntryString
|
|
||||||
#ifndef linkEntryString
|
|
||||||
#define linkEntryString "[Link]"
|
|
||||||
#endif // linkEntryString
|
|
||||||
#ifndef fileEntryString
|
|
||||||
#define fileEntryString "[File]"
|
|
||||||
#endif // fileEntryString
|
|
||||||
#ifndef fileNameString
|
|
||||||
#define fileNameString "Name:"
|
|
||||||
#endif // fileNameString
|
|
||||||
#ifndef dirNameString
|
|
||||||
#define dirNameString "Path:"
|
|
||||||
#endif // dirNameString
|
|
||||||
#ifndef buttonResetSearchString
|
|
||||||
#define buttonResetSearchString "Reset search"
|
|
||||||
#endif // buttonResetSearchString
|
|
||||||
#ifndef buttonDriveString
|
|
||||||
#define buttonDriveString "Drives"
|
|
||||||
#endif // buttonDriveString
|
|
||||||
#ifndef buttonEditPathString
|
|
||||||
#define buttonEditPathString "Edit path\nYou can also right click on path buttons"
|
|
||||||
#endif // buttonEditPathString
|
|
||||||
#ifndef buttonResetPathString
|
|
||||||
#define buttonResetPathString "Go to home directory"
|
|
||||||
#endif // buttonResetPathString
|
|
||||||
#ifndef buttonParentDirString
|
|
||||||
#define buttonParentDirString "Go to parent directory"
|
|
||||||
#endif
|
|
||||||
#ifndef buttonCreateDirString
|
|
||||||
#define buttonCreateDirString "Create Directory"
|
|
||||||
#endif // buttonCreateDirString
|
|
||||||
#ifndef tableHeaderAscendingIcon
|
|
||||||
#define tableHeaderAscendingIcon "A|"
|
|
||||||
#endif // tableHeaderAscendingIcon
|
|
||||||
#ifndef tableHeaderDescendingIcon
|
|
||||||
#define tableHeaderDescendingIcon "D|"
|
|
||||||
#endif // tableHeaderDescendingIcon
|
|
||||||
#ifndef tableHeaderFileNameString
|
|
||||||
#define tableHeaderFileNameString "File name"
|
|
||||||
#endif // tableHeaderFileNameString
|
|
||||||
#ifndef tableHeaderFileTypeString
|
|
||||||
#define tableHeaderFileTypeString "Type"
|
|
||||||
#endif // tableHeaderFileTypeString
|
|
||||||
#ifndef tableHeaderFileSizeString
|
|
||||||
#define tableHeaderFileSizeString "Size"
|
|
||||||
#endif // tableHeaderFileSizeString
|
|
||||||
#ifndef tableHeaderFileDateString
|
|
||||||
#define tableHeaderFileDateString "Date"
|
|
||||||
#endif // tableHeaderFileDateString
|
|
||||||
#ifndef OverWriteDialogTitleString
|
|
||||||
#define OverWriteDialogTitleString "Warning"
|
|
||||||
#endif // OverWriteDialogTitleString
|
|
||||||
#ifndef OverWriteDialogMessageString
|
|
||||||
#define OverWriteDialogMessageString "The file you selected already exists! Would you like to overwrite it?"
|
|
||||||
#endif // OverWriteDialogMessageString
|
|
||||||
#ifndef OverWriteDialogConfirmButtonString
|
|
||||||
#define OverWriteDialogConfirmButtonString "Yes"
|
|
||||||
#endif // OverWriteDialogConfirmButtonString
|
|
||||||
#ifndef OverWriteDialogCancelButtonString
|
|
||||||
#define OverWriteDialogCancelButtonString "No"
|
|
||||||
#endif // OverWriteDialogCancelButtonString
|
|
||||||
// see strftime functionin <ctime> for customize
|
|
||||||
#ifndef DateTimeFormat
|
|
||||||
#define DateTimeFormat "%Y/%m/%d %H:%M"
|
|
||||||
#endif // DateTimeFormat
|
|
||||||
#ifdef USE_THUMBNAILS
|
#ifdef USE_THUMBNAILS
|
||||||
#ifndef tableHeaderFileThumbnailsString
|
#ifndef tableHeaderFileThumbnailsString
|
||||||
#define tableHeaderFileThumbnailsString "Thumbnails"
|
#define tableHeaderFileThumbnailsString "Thumbnails"
|
||||||
|
@ -649,10 +573,10 @@ namespace IGFD
|
||||||
vFileDialogInternal.puFileManager.ApplyFilteringOnFileList(vFileDialogInternal);
|
vFileDialogInternal.puFileManager.ApplyFilteringOnFileList(vFileDialogInternal);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonResetSearchString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonResetSearchString);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
bool edited = ImGui::InputTextWithHint("##InputImGuiFileDialogSearchField", searchString, puSearchBuffer, MAX_FILE_DIALOG_NAME_BUFFER);
|
bool edited = ImGui::InputTextWithHint("##InputImGuiFileDialogSearchField", FileDialog::Instance()->searchString, puSearchBuffer, MAX_FILE_DIALOG_NAME_BUFFER);
|
||||||
if (ImGui::GetItemID() == ImGui::GetActiveID())
|
if (ImGui::GetItemID() == ImGui::GetActiveID())
|
||||||
puSearchInputIsActive = true;
|
puSearchInputIsActive = true;
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
@ -1164,10 +1088,10 @@ namespace IGFD
|
||||||
logV("IGFD: SortFields()");
|
logV("IGFD: SortFields()");
|
||||||
if (vSortingField != SortingFieldEnum::FIELD_NONE)
|
if (vSortingField != SortingFieldEnum::FIELD_NONE)
|
||||||
{
|
{
|
||||||
puHeaderFileName = tableHeaderFileNameString;
|
puHeaderFileName = FileDialog::Instance()->tableHeaderFileNameString;
|
||||||
puHeaderFileType = tableHeaderFileTypeString;
|
puHeaderFileType = FileDialog::Instance()->tableHeaderFileTypeString;
|
||||||
puHeaderFileSize = tableHeaderFileSizeString;
|
puHeaderFileSize = FileDialog::Instance()->tableHeaderFileSizeString;
|
||||||
puHeaderFileDate = tableHeaderFileDateString;
|
puHeaderFileDate = FileDialog::Instance()->tableHeaderFileDateString;
|
||||||
#ifdef USE_THUMBNAILS
|
#ifdef USE_THUMBNAILS
|
||||||
puHeaderFileThumbnails = tableHeaderFileThumbnailsString;
|
puHeaderFileThumbnails = tableHeaderFileThumbnailsString;
|
||||||
#endif // #ifdef USE_THUMBNAILS
|
#endif // #ifdef USE_THUMBNAILS
|
||||||
|
@ -1756,10 +1680,10 @@ namespace IGFD
|
||||||
#ifdef MSVC
|
#ifdef MSVC
|
||||||
struct tm _tm;
|
struct tm _tm;
|
||||||
errno_t err = localtime_s(&_tm, &statInfos.st_mtime);
|
errno_t err = localtime_s(&_tm, &statInfos.st_mtime);
|
||||||
if (!err) len = strftime(timebuf, 99, DateTimeFormat, &_tm);
|
if (!err) len = strftime(timebuf, 99, FileDialog::Instance()->DateTimeFormat, &_tm);
|
||||||
#else // MSVC
|
#else // MSVC
|
||||||
struct tm* _tm = localtime(&statInfos.st_mtime);
|
struct tm* _tm = localtime(&statInfos.st_mtime);
|
||||||
if (_tm) len = strftime(timebuf, 99, DateTimeFormat, _tm);
|
if (_tm) len = strftime(timebuf, 99, FileDialog::Instance()->DateTimeFormat, _tm);
|
||||||
#endif // MSVC
|
#endif // MSVC
|
||||||
if (len)
|
if (len)
|
||||||
{
|
{
|
||||||
|
@ -2120,7 +2044,7 @@ namespace IGFD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonCreateDirString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonCreateDirString);
|
||||||
|
|
||||||
if (prCreateDirectoryMode)
|
if (prCreateDirectoryMode)
|
||||||
{
|
{
|
||||||
|
@ -2132,7 +2056,7 @@ namespace IGFD
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
if (IMGUI_BUTTON(okButtonString))
|
if (IMGUI_BUTTON(FileDialog::Instance()->okButtonString))
|
||||||
{
|
{
|
||||||
std::string newDir = std::string(puDirectoryNameBuffer);
|
std::string newDir = std::string(puDirectoryNameBuffer);
|
||||||
if (CreateDir(newDir))
|
if (CreateDir(newDir))
|
||||||
|
@ -2146,7 +2070,7 @@ namespace IGFD
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
if (IMGUI_BUTTON(cancelButtonString))
|
if (IMGUI_BUTTON(FileDialog::Instance()->cancelButtonString))
|
||||||
{
|
{
|
||||||
prCreateDirectoryMode = false;
|
prCreateDirectoryMode = false;
|
||||||
}
|
}
|
||||||
|
@ -2161,7 +2085,7 @@ namespace IGFD
|
||||||
OpenCurrentPath(vFileDialogInternal);
|
OpenCurrentPath(vFileDialogInternal);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonResetPathString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonResetPathString);
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (IMGUI_BUTTON(parentDirString))
|
if (IMGUI_BUTTON(parentDirString))
|
||||||
|
@ -2171,7 +2095,7 @@ namespace IGFD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonParentDirString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonParentDirString);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -2181,7 +2105,7 @@ namespace IGFD
|
||||||
puDrivesClicked = true;
|
puDrivesClicked = true;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonDriveString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonDriveString);
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -2191,7 +2115,7 @@ namespace IGFD
|
||||||
puInputPathActivated = true;
|
puInputPathActivated = true;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::SetTooltip(buttonEditPathString);
|
ImGui::SetTooltip("%s",FileDialog::Instance()->buttonEditPathString);
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
@ -3892,9 +3816,9 @@ namespace IGFD
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
if (!fdFile.puDLGDirectoryMode)
|
if (!fdFile.puDLGDirectoryMode)
|
||||||
ImGui::Text(fileNameString);
|
ImGui::Text("%s",FileDialog::Instance()->fileNameString);
|
||||||
else // directory chooser
|
else // directory chooser
|
||||||
ImGui::Text(dirNameString);
|
ImGui::Text("%s",FileDialog::Instance()->dirNameString);
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
|
@ -3919,7 +3843,8 @@ namespace IGFD
|
||||||
int fileValid=isFileNameValid(fdFile.puFileNameBuffer);
|
int fileValid=isFileNameValid(fdFile.puFileNameBuffer);
|
||||||
if (!(prFileDialogInternal.puDLGflags&ImGuiFileDialogFlags_ConfirmOverwrite)) fileValid=0;
|
if (!(prFileDialogInternal.puDLGflags&ImGuiFileDialogFlags_ConfirmOverwrite)) fileValid=0;
|
||||||
ImGui::BeginDisabled(!(prFileDialogInternal.puCanWeContinue && notEmpty && fileValid==0));
|
ImGui::BeginDisabled(!(prFileDialogInternal.puCanWeContinue && notEmpty && fileValid==0));
|
||||||
if (IMGUI_BUTTON(okButtonString "##validationdialog"))
|
std::string okbs=std::string(FileDialog::Instance()->okButtonString)+"##validationdialog";
|
||||||
|
if (IMGUI_BUTTON(okbs.c_str()))
|
||||||
{
|
{
|
||||||
prFileDialogInternal.puIsOk = true;
|
prFileDialogInternal.puIsOk = true;
|
||||||
res = true;
|
res = true;
|
||||||
|
@ -3959,7 +3884,8 @@ namespace IGFD
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
// Cancel Button
|
// Cancel Button
|
||||||
if (IMGUI_BUTTON(cancelButtonString "##validationdialog") ||
|
std::string cbs=std::string(cancelButtonString)+"##validationdialog";
|
||||||
|
if (IMGUI_BUTTON(cbs.c_str()) ||
|
||||||
prFileDialogInternal.puNeedToExitDialog) // dialog exit asked
|
prFileDialogInternal.puNeedToExitDialog) // dialog exit asked
|
||||||
{
|
{
|
||||||
prFileDialogInternal.puIsOk = false;
|
prFileDialogInternal.puIsOk = false;
|
||||||
|
@ -4585,7 +4511,7 @@ namespace IGFD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name = OverWriteDialogTitleString "##" + prFileDialogInternal.puDLGtitle + prFileDialogInternal.puDLGkey + "OverWriteDialog";
|
std::string name = std::string(OverWriteDialogTitleString) + "##" + prFileDialogInternal.puDLGtitle + prFileDialogInternal.puDLGkey + "OverWriteDialog";
|
||||||
|
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
|
||||||
|
|
23
extern/igfd/ImGuiFileDialog.h
vendored
23
extern/igfd/ImGuiFileDialog.h
vendored
|
@ -1140,6 +1140,29 @@ namespace IGFD
|
||||||
bool singleClickSel;
|
bool singleClickSel;
|
||||||
bool mobileMode;
|
bool mobileMode;
|
||||||
std::string homePath;
|
std::string homePath;
|
||||||
|
const char* okButtonString="OK";
|
||||||
|
const char* cancelButtonString="Cancel";
|
||||||
|
const char* searchString="Search";
|
||||||
|
const char* dirEntryString="[Dir]";
|
||||||
|
const char* linkEntryString="[Link]";
|
||||||
|
const char* fileEntryString="[File]";
|
||||||
|
const char* fileNameString="Name:";
|
||||||
|
const char* dirNameString="Path:";
|
||||||
|
const char* buttonResetSearchString="Reset search";
|
||||||
|
const char* buttonDriveString="Drives";
|
||||||
|
const char* buttonEditPathString="Edit path\nYou can also right click on path buttons";
|
||||||
|
const char* buttonResetPathString="Go to home directory";
|
||||||
|
const char* buttonParentDirString="Go to parent directory";
|
||||||
|
const char* buttonCreateDirString="Create Directory";
|
||||||
|
const char* tableHeaderFileNameString="File name";
|
||||||
|
const char* tableHeaderFileTypeString="Type";
|
||||||
|
const char* tableHeaderFileSizeString="Size";
|
||||||
|
const char* tableHeaderFileDateString="Date";
|
||||||
|
const char* OverWriteDialogTitleString="Warning";
|
||||||
|
const char* OverWriteDialogMessageString="The file you selected already exists! Would you like to overwrite it?";
|
||||||
|
const char* OverWriteDialogConfirmButtonString="Yes";
|
||||||
|
const char* OverWriteDialogCancelButtonString="No";
|
||||||
|
const char* DateTimeFormat="%Y/%m/%d %H:%M";
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static FileDialog* Instance() // Singleton for easier accces form anywhere but only one dialog at a time
|
static FileDialog* Instance() // Singleton for easier accces form anywhere but only one dialog at a time
|
||||||
|
|
112
extern/imgui_patched/imgui.cpp
vendored
112
extern/imgui_patched/imgui.cpp
vendored
|
@ -1046,7 +1046,7 @@ static const float DOCKING_TRANSPARENT_PAYLOAD_ALPHA = 0.50f; // For u
|
||||||
|
|
||||||
static void SetCurrentWindow(ImGuiWindow* window);
|
static void SetCurrentWindow(ImGuiWindow* window);
|
||||||
static void FindHoveredWindow();
|
static void FindHoveredWindow();
|
||||||
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags);
|
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags, const char* displayedName = NULL);
|
||||||
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);
|
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);
|
||||||
|
|
||||||
static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window);
|
static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window);
|
||||||
|
@ -1219,6 +1219,8 @@ ImGuiStyle::ImGuiStyle()
|
||||||
CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
|
CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
|
||||||
CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
|
CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
|
||||||
|
|
||||||
|
DoFrameShadingForMultilineText = false;
|
||||||
|
|
||||||
// Behaviors
|
// Behaviors
|
||||||
HoverStationaryDelay = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
|
HoverStationaryDelay = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
|
||||||
HoverDelayShort = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay.
|
HoverDelayShort = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay.
|
||||||
|
@ -3341,6 +3343,17 @@ const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end)
|
||||||
return text_display_end;
|
return text_display_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* FindRenderedTextEndNoHashHide(const char* text, const char* text_end)
|
||||||
|
{
|
||||||
|
const char* text_display_end = text;
|
||||||
|
if (!text_end)
|
||||||
|
text_end = (const char*)-1;
|
||||||
|
|
||||||
|
while (text_display_end < text_end && *text_display_end != '\0')
|
||||||
|
text_display_end++;
|
||||||
|
return text_display_end;
|
||||||
|
}
|
||||||
|
|
||||||
// Internal ImGui functions to render text
|
// Internal ImGui functions to render text
|
||||||
// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText()
|
// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText()
|
||||||
void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash)
|
void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash)
|
||||||
|
@ -3363,7 +3376,14 @@ void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool
|
||||||
|
|
||||||
if (text != text_display_end)
|
if (text != text_display_end)
|
||||||
{
|
{
|
||||||
window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end);
|
if (hide_text_after_hash)
|
||||||
|
{
|
||||||
|
window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
window->DrawList->AddTextNoHashHide(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end);
|
||||||
|
}
|
||||||
if (g.LogEnabled)
|
if (g.LogEnabled)
|
||||||
LogRenderedText(&pos, text, text_display_end);
|
LogRenderedText(&pos, text, text_display_end);
|
||||||
}
|
}
|
||||||
|
@ -3385,6 +3405,22 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::RenderTextWrappedNoHashHide(ImVec2 pos, const char* text, const char* text_end, float wrap_width)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
|
||||||
|
if (!text_end)
|
||||||
|
text_end = text + strlen(text); // FIXME-OPT
|
||||||
|
|
||||||
|
if (text != text_end)
|
||||||
|
{
|
||||||
|
window->DrawList->AddTextNoHashHide(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width);
|
||||||
|
if (g.LogEnabled)
|
||||||
|
LogRenderedText(&pos, text, text_end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Default clip_rect uses (pos_min,pos_max)
|
// Default clip_rect uses (pos_min,pos_max)
|
||||||
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
|
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
|
||||||
// FIXME-OPT: Since we have or calculate text_size we could coarse clip whole block immediately, especally for text above draw_list->DrawList.
|
// FIXME-OPT: Since we have or calculate text_size we could coarse clip whole block immediately, especally for text above draw_list->DrawList.
|
||||||
|
@ -3433,6 +3469,21 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
|
||||||
LogRenderedText(&pos_min, text, text_display_end);
|
LogRenderedText(&pos_min, text, text_display_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::RenderTextClippedNoHashHide(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
|
||||||
|
{
|
||||||
|
// Do not hide anything after a '##' string
|
||||||
|
const char* text_display_end = text_end;
|
||||||
|
const int text_len = (int)(text_display_end - text);
|
||||||
|
if (text_len == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
RenderTextClippedEx(window->DrawList, pos_min, pos_max, text, text_display_end, text_size_if_known, align, clip_rect);
|
||||||
|
if (g.LogEnabled)
|
||||||
|
LogRenderedText(&pos_min, text, text_display_end);
|
||||||
|
}
|
||||||
|
|
||||||
// Another overly complex function until we reorganize everything into a nice all-in-one helper.
|
// Another overly complex function until we reorganize everything into a nice all-in-one helper.
|
||||||
// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display.
|
// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display.
|
||||||
// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move.
|
// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move.
|
||||||
|
@ -3843,12 +3894,23 @@ void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods
|
// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods
|
||||||
ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name) : DrawListInst(NULL)
|
ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name, const char* displayedName) : DrawListInst(NULL)
|
||||||
{
|
{
|
||||||
memset(this, 0, sizeof(*this));
|
memset(this, 0, sizeof(*this));
|
||||||
Ctx = ctx;
|
Ctx = ctx;
|
||||||
Name = ImStrdup(name);
|
Name = ImStrdup(name);
|
||||||
NameBufLen = (int)strlen(name) + 1;
|
NameBufLen = (int)strlen(name) + 1;
|
||||||
|
|
||||||
|
if(displayedName != NULL)
|
||||||
|
{
|
||||||
|
DisplayedName = ImStrdup(displayedName);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DisplayedName = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ID = ImHashStr(name);
|
ID = ImHashStr(name);
|
||||||
IDStack.push_back(ID);
|
IDStack.push_back(ID);
|
||||||
ViewportAllowPlatformMonitorExtend = -1;
|
ViewportAllowPlatformMonitorExtend = -1;
|
||||||
|
@ -3879,6 +3941,7 @@ ImGuiWindow::~ImGuiWindow()
|
||||||
{
|
{
|
||||||
IM_ASSERT(DrawList == &DrawListInst);
|
IM_ASSERT(DrawList == &DrawListInst);
|
||||||
IM_DELETE(Name);
|
IM_DELETE(Name);
|
||||||
|
IM_DELETE(DisplayedName);
|
||||||
ColumnsStorage.clear_destruct();
|
ColumnsStorage.clear_destruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5731,6 +5794,7 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b
|
||||||
if (!border)
|
if (!border)
|
||||||
g.Style.ChildBorderSize = 0.0f;
|
g.Style.ChildBorderSize = 0.0f;
|
||||||
bool ret = Begin(temp_window_name, NULL, flags);
|
bool ret = Begin(temp_window_name, NULL, flags);
|
||||||
|
|
||||||
g.Style.ChildBorderSize = backup_border_size;
|
g.Style.ChildBorderSize = backup_border_size;
|
||||||
|
|
||||||
ImGuiWindow* child_window = g.CurrentWindow;
|
ImGuiWindow* child_window = g.CurrentWindow;
|
||||||
|
@ -5930,12 +5994,12 @@ static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags)
|
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags, const char* displayedName)
|
||||||
{
|
{
|
||||||
// Create window the first time
|
// Create window the first time
|
||||||
//IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
|
//IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name);
|
ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name, displayedName);
|
||||||
window->Flags = flags;
|
window->Flags = flags;
|
||||||
g.WindowsById.SetVoidPtr(window->ID, window);
|
g.WindowsById.SetVoidPtr(window->ID, window);
|
||||||
|
|
||||||
|
@ -6651,7 +6715,7 @@ ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window)
|
||||||
// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file.
|
// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file.
|
||||||
// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned.
|
// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned.
|
||||||
// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed.
|
// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed.
|
||||||
bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags, const char* displayedName)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
const ImGuiStyle& style = g.Style;
|
const ImGuiStyle& style = g.Style;
|
||||||
|
@ -6663,7 +6727,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
ImGuiWindow* window = FindWindowByName(name);
|
ImGuiWindow* window = FindWindowByName(name);
|
||||||
const bool window_just_created = (window == NULL);
|
const bool window_just_created = (window == NULL);
|
||||||
if (window_just_created)
|
if (window_just_created)
|
||||||
window = CreateNewWindow(name, flags);
|
window = CreateNewWindow(name, flags, displayedName);
|
||||||
|
|
||||||
// Automatically disable manual moving/resizing when NoInputs is set
|
// Automatically disable manual moving/resizing when NoInputs is set
|
||||||
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
|
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
|
||||||
|
@ -6869,6 +6933,22 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
window->NameBufLen = (int)buf_len;
|
window->NameBufLen = (int)buf_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(window->DisplayedName)
|
||||||
|
{
|
||||||
|
if(strcmp(displayedName, window->DisplayedName) != 0)
|
||||||
|
{
|
||||||
|
// WAHAHAHAHA
|
||||||
|
// you wrote free() instead of IM_DELETE() and broke portability HAHAHA
|
||||||
|
IM_DELETE(window->DisplayedName);
|
||||||
|
window->DisplayedName = ImStrdup(displayedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(window->DisplayedName == NULL && displayedName != NULL)
|
||||||
|
{
|
||||||
|
window->DisplayedName = ImStrdup(displayedName);
|
||||||
|
}
|
||||||
|
|
||||||
// UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS
|
// UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS
|
||||||
|
|
||||||
// Update contents size from last frame for auto-fitting (or use explicit size)
|
// Update contents size from last frame for auto-fitting (or use explicit size)
|
||||||
|
@ -7420,7 +7500,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
|
|
||||||
// Title bar
|
// Title bar
|
||||||
if (!(flags & ImGuiWindowFlags_NoTitleBar) && !window->DockIsActive)
|
if (!(flags & ImGuiWindowFlags_NoTitleBar) && !window->DockIsActive)
|
||||||
RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), name, p_open);
|
RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), displayedName == NULL ? name : displayedName, p_open);
|
||||||
|
|
||||||
// Clear hit test shape every frame
|
// Clear hit test shape every frame
|
||||||
window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0;
|
window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0;
|
||||||
|
@ -14183,8 +14263,14 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl
|
||||||
void ImGui::LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count)
|
void ImGui::LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
for (int n = 0; n < count; n++)
|
|
||||||
g.LocalizationTable[entries[n].Key] = entries[n].Text;
|
if (GImGui != NULL)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < count; n++)
|
||||||
|
{
|
||||||
|
g.LocalizationTable[entries[n].Key] = entries[n].Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16891,7 +16977,7 @@ bool ImGui::DockNodeBeginAmendTabBar(ImGuiDockNode* node)
|
||||||
return false;
|
return false;
|
||||||
if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
if (node->MergedFlags & ImGuiDockNodeFlags_KeepAliveOnly)
|
||||||
return false;
|
return false;
|
||||||
Begin(node->HostWindow->Name);
|
Begin(node->HostWindow->Name); //this is to be edited
|
||||||
PushOverrideID(node->ID);
|
PushOverrideID(node->ID);
|
||||||
bool ret = BeginTabBarEx(node->TabBar, node->TabBar->BarRect, node->TabBar->Flags, node);
|
bool ret = BeginTabBarEx(node->TabBar, node->TabBar->BarRect, node->TabBar->Flags, node);
|
||||||
IM_UNUSED(ret);
|
IM_UNUSED(ret);
|
||||||
|
@ -17094,7 +17180,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
|
||||||
|
|
||||||
// Note that TabItemEx() calls TabBarCalcTabID() so our tab item ID will ignore the current ID stack (rightly so)
|
// Note that TabItemEx() calls TabBarCalcTabID() so our tab item ID will ignore the current ID stack (rightly so)
|
||||||
bool tab_open = true;
|
bool tab_open = true;
|
||||||
TabItemEx(tab_bar, window->Name, window->HasCloseButton ? &tab_open : NULL, tab_item_flags, window);
|
TabItemEx(tab_bar, window->DisplayedName == NULL ? window->Name : window->DisplayedName, window->HasCloseButton ? &tab_open : NULL, tab_item_flags, window);
|
||||||
if (!tab_open)
|
if (!tab_open)
|
||||||
node->WantCloseTabId = window->TabId;
|
node->WantCloseTabId = window->TabId;
|
||||||
if (tab_bar->VisibleTabId == window->TabId)
|
if (tab_bar->VisibleTabId == window->TabId)
|
||||||
|
@ -17551,7 +17637,7 @@ static void ImGui::DockNodePreviewDockRender(ImGuiWindow* host_window, ImGuiDock
|
||||||
if (!tab_bar_rect.Contains(tab_bb))
|
if (!tab_bar_rect.Contains(tab_bb))
|
||||||
overlay_draw_lists[overlay_n]->PushClipRect(tab_bar_rect.Min, tab_bar_rect.Max);
|
overlay_draw_lists[overlay_n]->PushClipRect(tab_bar_rect.Min, tab_bar_rect.Max);
|
||||||
TabItemBackground(overlay_draw_lists[overlay_n], tab_bb, tab_flags, overlay_col_tabs);
|
TabItemBackground(overlay_draw_lists[overlay_n], tab_bb, tab_flags, overlay_col_tabs);
|
||||||
TabItemLabelAndCloseButton(overlay_draw_lists[overlay_n], tab_bb, tab_flags, g.Style.FramePadding, payload_window->Name, 0, 0, false, NULL, NULL);
|
TabItemLabelAndCloseButton(overlay_draw_lists[overlay_n], tab_bb, tab_flags, g.Style.FramePadding, payload_window->DisplayedName == NULL ? payload_window->Name : payload_window->DisplayedName, 0, 0, false, NULL, NULL);
|
||||||
if (!tab_bar_rect.Contains(tab_bb))
|
if (!tab_bar_rect.Contains(tab_bb))
|
||||||
overlay_draw_lists[overlay_n]->PopClipRect();
|
overlay_draw_lists[overlay_n]->PopClipRect();
|
||||||
}
|
}
|
||||||
|
|
11
extern/imgui_patched/imgui.h
vendored
11
extern/imgui_patched/imgui.h
vendored
|
@ -338,7 +338,7 @@ namespace ImGui
|
||||||
// BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
|
// BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
|
||||||
// returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
|
// returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
|
||||||
// - Note that the bottom of window stack always contains a window called "Debug".
|
// - Note that the bottom of window stack always contains a window called "Debug".
|
||||||
IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
|
IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0, const char* displayedName = NULL);
|
||||||
IMGUI_API void End();
|
IMGUI_API void End();
|
||||||
|
|
||||||
// Child Windows
|
// Child Windows
|
||||||
|
@ -496,6 +496,7 @@ namespace ImGui
|
||||||
// Widgets: Text
|
// Widgets: Text
|
||||||
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
|
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
|
||||||
IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text
|
IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text
|
||||||
|
IMGUI_API void TextNoHashHide(const char* fmt, ...) IM_FMTARGS(1); // formatted text
|
||||||
IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1);
|
IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1);
|
||||||
IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
|
IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
|
||||||
IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2);
|
IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2);
|
||||||
|
@ -1080,6 +1081,8 @@ enum ImGuiInputTextFlags_
|
||||||
ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
|
ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active)
|
||||||
ImGuiInputTextFlags_EscapeClearsAll = 1 << 20, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert)
|
ImGuiInputTextFlags_EscapeClearsAll = 1 << 20, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert)
|
||||||
|
|
||||||
|
ImGuiInputTextFlags_WordWrapping = 1 << 21, //https://github.com/MladoniSzabi/QuestSystem/commit/2c1f8bba6ecaa53a642ea469d49f19e94adc0029
|
||||||
|
|
||||||
// Obsolete names
|
// Obsolete names
|
||||||
//ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior
|
//ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior
|
||||||
};
|
};
|
||||||
|
@ -1143,6 +1146,8 @@ enum ImGuiSelectableFlags_
|
||||||
ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text
|
ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text
|
||||||
ImGuiSelectableFlags_AllowOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one
|
ImGuiSelectableFlags_AllowOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one
|
||||||
|
|
||||||
|
ImGuiSelectableFlags_NoHashTextHide = 1 << 5, // do not hide text after `##`
|
||||||
|
|
||||||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
ImGuiSelectableFlags_AllowItemOverlap = ImGuiSelectableFlags_AllowOverlap, // Renamed in 1.89.7
|
ImGuiSelectableFlags_AllowItemOverlap = ImGuiSelectableFlags_AllowOverlap, // Renamed in 1.89.7
|
||||||
#endif
|
#endif
|
||||||
|
@ -2020,6 +2025,8 @@ struct ImGuiStyle
|
||||||
float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
|
float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
|
||||||
ImVec4 Colors[ImGuiCol_COUNT];
|
ImVec4 Colors[ImGuiCol_COUNT];
|
||||||
|
|
||||||
|
bool DoFrameShadingForMultilineText; // Toggle FrameShading for multiline text input field
|
||||||
|
|
||||||
// Behaviors
|
// Behaviors
|
||||||
// (It is possible to modify those fields mid-frame if specific behavior need it, unlike e.g. configuration fields in ImGuiIO)
|
// (It is possible to modify those fields mid-frame if specific behavior need it, unlike e.g. configuration fields in ImGuiIO)
|
||||||
float HoverStationaryDelay; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
|
float HoverStationaryDelay; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary.
|
||||||
|
@ -2808,6 +2815,8 @@ struct ImDrawList
|
||||||
IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
|
IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
|
||||||
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
||||||
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
||||||
|
IMGUI_API void AddTextNoHashHide(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
||||||
|
IMGUI_API void AddTextNoHashHide(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
||||||
IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
|
IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness);
|
||||||
IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
|
IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col);
|
||||||
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
|
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
|
||||||
|
|
49
extern/imgui_patched/imgui_draw.cpp
vendored
49
extern/imgui_patched/imgui_draw.cpp
vendored
|
@ -1620,6 +1620,17 @@ void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const Im
|
||||||
PathStroke(col, 0, thickness);
|
PathStroke(col, 0, thickness);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* FindTextEnd(const char* text, const char* text_end)
|
||||||
|
{
|
||||||
|
const char* text_display_end = text;
|
||||||
|
if (!text_end)
|
||||||
|
text_end = (const char*)-1;
|
||||||
|
|
||||||
|
while (text_display_end < text_end && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#'))
|
||||||
|
text_display_end++;
|
||||||
|
return text_display_end;
|
||||||
|
}
|
||||||
|
|
||||||
void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
|
void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
|
||||||
{
|
{
|
||||||
if ((col & IM_COL32_A_MASK) == 0)
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
|
@ -1630,6 +1641,8 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
|
||||||
if (text_begin == text_end)
|
if (text_begin == text_end)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
text_end = FindTextEnd(text_begin, text_end); //hides everything after ##
|
||||||
|
|
||||||
// Pull default font/size from the shared ImDrawListSharedData instance
|
// Pull default font/size from the shared ImDrawListSharedData instance
|
||||||
if (font == NULL)
|
if (font == NULL)
|
||||||
font = _Data->Font;
|
font = _Data->Font;
|
||||||
|
@ -1654,6 +1667,42 @@ void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, c
|
||||||
AddText(NULL, 0.0f, pos, col, text_begin, text_end);
|
AddText(NULL, 0.0f, pos, col, text_begin, text_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImDrawList::AddTextNoHashHide(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
|
||||||
|
{
|
||||||
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (text_end == NULL)
|
||||||
|
text_end = text_begin + strlen(text_begin);
|
||||||
|
if (text_begin == text_end)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//text_end = FindTextEnd(text_begin, text_end); //hides everything after ##
|
||||||
|
|
||||||
|
// Pull default font/size from the shared ImDrawListSharedData instance
|
||||||
|
if (font == NULL)
|
||||||
|
font = _Data->Font;
|
||||||
|
if (font_size == 0.0f)
|
||||||
|
font_size = _Data->FontSize;
|
||||||
|
|
||||||
|
IM_ASSERT(font->ContainerAtlas->TexID == _CmdHeader.TextureId); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font.
|
||||||
|
|
||||||
|
ImVec4 clip_rect = _CmdHeader.ClipRect;
|
||||||
|
if (cpu_fine_clip_rect)
|
||||||
|
{
|
||||||
|
clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x);
|
||||||
|
clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y);
|
||||||
|
clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z);
|
||||||
|
clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w);
|
||||||
|
}
|
||||||
|
font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImDrawList::AddTextNoHashHide(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)
|
||||||
|
{
|
||||||
|
AddTextNoHashHide(NULL, 0.0f, pos, col, text_begin, text_end);
|
||||||
|
}
|
||||||
|
|
||||||
void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col)
|
void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col)
|
||||||
{
|
{
|
||||||
if ((col & IM_COL32_A_MASK) == 0)
|
if ((col & IM_COL32_A_MASK) == 0)
|
||||||
|
|
13
extern/imgui_patched/imgui_internal.h
vendored
13
extern/imgui_patched/imgui_internal.h
vendored
|
@ -941,6 +941,8 @@ enum ImGuiTextFlags_
|
||||||
{
|
{
|
||||||
ImGuiTextFlags_None = 0,
|
ImGuiTextFlags_None = 0,
|
||||||
ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,
|
ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,
|
||||||
|
|
||||||
|
ImGuiTextFlags_HideID = 1 << 1, //hide things after ##
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ImGuiTooltipFlags_
|
enum ImGuiTooltipFlags_
|
||||||
|
@ -1109,6 +1111,7 @@ struct IMGUI_API ImGuiInputTextState
|
||||||
bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
|
bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
|
||||||
bool Edited; // edited this frame
|
bool Edited; // edited this frame
|
||||||
ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
|
ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
|
||||||
|
float WordWrapWidth;
|
||||||
|
|
||||||
ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
|
ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
|
||||||
void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
|
void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
|
||||||
|
@ -1117,6 +1120,8 @@ struct IMGUI_API ImGuiInputTextState
|
||||||
int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
|
int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
|
||||||
void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
|
void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
|
||||||
|
|
||||||
|
bool HasWordWrap() const { return WordWrapWidth > 0.0; }
|
||||||
|
|
||||||
// Cursor & Selection
|
// Cursor & Selection
|
||||||
void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
|
void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
|
||||||
void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
|
void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
|
||||||
|
@ -2513,6 +2518,9 @@ struct IMGUI_API ImGuiWindow
|
||||||
{
|
{
|
||||||
ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
|
ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
|
||||||
char* Name; // Window name, owned by the window.
|
char* Name; // Window name, owned by the window.
|
||||||
|
|
||||||
|
char* DisplayedName; // Window name, displayed in docked mode.
|
||||||
|
|
||||||
ImGuiID ID; // == ImHashStr(Name)
|
ImGuiID ID; // == ImHashStr(Name)
|
||||||
ImGuiWindowFlags Flags, FlagsPreviousFrame; // See enum ImGuiWindowFlags_
|
ImGuiWindowFlags Flags, FlagsPreviousFrame; // See enum ImGuiWindowFlags_
|
||||||
ImGuiWindowClass WindowClass; // Advanced users only. Set with SetNextWindowClass()
|
ImGuiWindowClass WindowClass; // Advanced users only. Set with SetNextWindowClass()
|
||||||
|
@ -2638,7 +2646,7 @@ struct IMGUI_API ImGuiWindow
|
||||||
ImRect DockTabItemRect;
|
ImRect DockTabItemRect;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ImGuiWindow(ImGuiContext* context, const char* name);
|
ImGuiWindow(ImGuiContext* context, const char* name, const char* displayedName = NULL);
|
||||||
~ImGuiWindow();
|
~ImGuiWindow();
|
||||||
|
|
||||||
ImGuiID GetID(const char* str, const char* str_end = NULL);
|
ImGuiID GetID(const char* str, const char* str_end = NULL);
|
||||||
|
@ -3445,7 +3453,9 @@ namespace ImGui
|
||||||
// NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
|
// NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
|
||||||
IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
|
IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
|
||||||
IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
|
IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
|
||||||
|
IMGUI_API void RenderTextWrappedNoHashHide(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
|
||||||
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
|
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
|
||||||
|
IMGUI_API void RenderTextClippedNoHashHide(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
|
||||||
IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
|
IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
|
||||||
IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
|
IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
|
||||||
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
||||||
|
@ -3468,6 +3478,7 @@ namespace ImGui
|
||||||
|
|
||||||
// Widgets
|
// Widgets
|
||||||
IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
|
IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
|
||||||
|
IMGUI_API void TextExNoHashHide(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
|
||||||
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
|
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
|
||||||
IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
|
IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
|
||||||
IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
|
IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
|
||||||
|
|
471
extern/imgui_patched/imgui_widgets.cpp
vendored
471
extern/imgui_patched/imgui_widgets.cpp
vendored
|
@ -122,7 +122,9 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
|
||||||
// For InputTextEx()
|
// For InputTextEx()
|
||||||
static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
|
static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
|
||||||
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
||||||
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, const bool stop_on_new_line = false, const float wrap_width = 0.0f, const bool keep_trailing_blanks = false);
|
||||||
|
static ImVec2 FindCharPosition(const ImWchar* text_begin, const ImWchar* char_position, const ImWchar* text_end, const float wrap_width);
|
||||||
|
static const ImWchar* CalcWordWrapPositionW(const ImFont* font, float scale, const ImWchar* text, const ImWchar* text_end, float wrap_width);
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
// [SECTION] Widgets: Text, etc.
|
// [SECTION] Widgets: Text, etc.
|
||||||
|
@ -159,6 +161,8 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
|
||||||
if (text_end == NULL)
|
if (text_end == NULL)
|
||||||
text_end = text + strlen(text); // FIXME-OPT
|
text_end = text + strlen(text); // FIXME-OPT
|
||||||
|
|
||||||
|
text_end = FindRenderedTextEnd(text, text_end); //hides everything after ##
|
||||||
|
|
||||||
const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
|
const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
|
||||||
const float wrap_pos_x = window->DC.TextWrapPos;
|
const float wrap_pos_x = window->DC.TextWrapPos;
|
||||||
const bool wrap_enabled = (wrap_pos_x >= 0.0f);
|
const bool wrap_enabled = (wrap_pos_x >= 0.0f);
|
||||||
|
@ -251,6 +255,116 @@ void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::TextExNoHashHide(const char* text, const char* text_end, ImGuiTextFlags flags)
|
||||||
|
{
|
||||||
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
if (window->SkipItems)
|
||||||
|
return;
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
|
||||||
|
// Accept null ranges
|
||||||
|
if (text == text_end)
|
||||||
|
text = text_end = "";
|
||||||
|
|
||||||
|
// Calculate length
|
||||||
|
const char* text_begin = text;
|
||||||
|
if (text_end == NULL)
|
||||||
|
text_end = text + strlen(text); // FIXME-OPT
|
||||||
|
|
||||||
|
//text_end = FindRenderedTextEnd(text, text_end); //hides everything after ##
|
||||||
|
|
||||||
|
const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
|
||||||
|
const float wrap_pos_x = window->DC.TextWrapPos;
|
||||||
|
const bool wrap_enabled = (wrap_pos_x >= 0.0f);
|
||||||
|
if (text_end - text <= 2000 || wrap_enabled)
|
||||||
|
{
|
||||||
|
// Common case
|
||||||
|
const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f;
|
||||||
|
const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width);
|
||||||
|
|
||||||
|
ImRect bb(text_pos, text_pos + text_size);
|
||||||
|
ItemSize(text_size, 0.0f);
|
||||||
|
if (!ItemAdd(bb, 0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Render (we don't hide text after ## in this end-user function)
|
||||||
|
RenderTextWrappedNoHashHide(bb.Min, text_begin, text_end, wrap_width);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Long text!
|
||||||
|
// Perform manual coarse clipping to optimize for long multi-line text
|
||||||
|
// - From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled.
|
||||||
|
// - We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line.
|
||||||
|
// - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop.
|
||||||
|
const char* line = text;
|
||||||
|
const float line_height = GetTextLineHeight();
|
||||||
|
ImVec2 text_size(0, 0);
|
||||||
|
|
||||||
|
// Lines to skip (can't skip when logging text)
|
||||||
|
ImVec2 pos = text_pos;
|
||||||
|
if (!g.LogEnabled)
|
||||||
|
{
|
||||||
|
int lines_skippable = (int)((window->ClipRect.Min.y - text_pos.y) / line_height);
|
||||||
|
if (lines_skippable > 0)
|
||||||
|
{
|
||||||
|
int lines_skipped = 0;
|
||||||
|
while (line < text_end && lines_skipped < lines_skippable)
|
||||||
|
{
|
||||||
|
const char* line_end = (const char*)memchr(line, '\n', text_end - line);
|
||||||
|
if (!line_end)
|
||||||
|
line_end = text_end;
|
||||||
|
if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
|
||||||
|
text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end, false).x);
|
||||||
|
line = line_end + 1;
|
||||||
|
lines_skipped++;
|
||||||
|
}
|
||||||
|
pos.y += lines_skipped * line_height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lines to render
|
||||||
|
if (line < text_end)
|
||||||
|
{
|
||||||
|
ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height));
|
||||||
|
while (line < text_end)
|
||||||
|
{
|
||||||
|
if (IsClippedEx(line_rect, 0))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const char* line_end = (const char*)memchr(line, '\n', text_end - line);
|
||||||
|
if (!line_end)
|
||||||
|
line_end = text_end;
|
||||||
|
text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end, false).x);
|
||||||
|
RenderText(pos, line, line_end, false);
|
||||||
|
line = line_end + 1;
|
||||||
|
line_rect.Min.y += line_height;
|
||||||
|
line_rect.Max.y += line_height;
|
||||||
|
pos.y += line_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count remaining lines
|
||||||
|
int lines_skipped = 0;
|
||||||
|
while (line < text_end)
|
||||||
|
{
|
||||||
|
const char* line_end = (const char*)memchr(line, '\n', text_end - line);
|
||||||
|
if (!line_end)
|
||||||
|
line_end = text_end;
|
||||||
|
if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
|
||||||
|
text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end, false).x);
|
||||||
|
line = line_end + 1;
|
||||||
|
lines_skipped++;
|
||||||
|
}
|
||||||
|
pos.y += lines_skipped * line_height;
|
||||||
|
}
|
||||||
|
text_size.y = (pos - text_pos).y;
|
||||||
|
|
||||||
|
ImRect bb(text_pos, text_pos + text_size);
|
||||||
|
ItemSize(text_size, 0.0f);
|
||||||
|
ItemAdd(bb, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui::TextUnformatted(const char* text, const char* text_end)
|
void ImGui::TextUnformatted(const char* text, const char* text_end)
|
||||||
{
|
{
|
||||||
TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
|
TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
|
||||||
|
@ -264,6 +378,22 @@ void ImGui::Text(const char* fmt, ...)
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::TextNoHashHide(const char* fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
if (window->SkipItems)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const char* text, *text_end;
|
||||||
|
ImFormatStringToTempBufferV(&text, &text_end, fmt, args);
|
||||||
|
TextExNoHashHide(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui::TextV(const char* fmt, va_list args)
|
void ImGui::TextV(const char* fmt, va_list args)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
@ -3668,7 +3798,188 @@ static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char**
|
||||||
return line_count;
|
return line_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line)
|
static const ImWchar* CalcWordWrapPositionW(const ImFont* font, float scale, const ImWchar* text, const ImWchar* text_end, float wrap_width)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Simple word-wrapping for English, not full-featured. Please submit failing cases!
|
||||||
|
// FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.)
|
||||||
|
|
||||||
|
// For references, possible wrap point marked with ^
|
||||||
|
// "aaa bbb, ccc,ddd. eee fff. ggg!"
|
||||||
|
// ^ ^ ^ ^ ^__ ^ ^
|
||||||
|
|
||||||
|
// List of hardcoded separators: .,;!?'"
|
||||||
|
|
||||||
|
// Skip extra blanks after a line returns (that includes not counting them in width computation)
|
||||||
|
// e.g. "Hello world" --> "Hello" "World"
|
||||||
|
|
||||||
|
// Cut words that cannot possibly fit within one line.
|
||||||
|
// e.g.: "The tropical fish" with ~5 characters worth of width --> "The tr" "opical" "fish"
|
||||||
|
|
||||||
|
float line_width = 0.0f;
|
||||||
|
float word_width = 0.0f;
|
||||||
|
float blank_width = 0.0f;
|
||||||
|
wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters
|
||||||
|
|
||||||
|
const ImWchar* word_end = text;
|
||||||
|
const ImWchar* prev_word_end = NULL;
|
||||||
|
bool inside_word = true;
|
||||||
|
|
||||||
|
const ImWchar* s = text;
|
||||||
|
while (s < text_end)
|
||||||
|
{
|
||||||
|
ImWchar c = (unsigned int)*s++;
|
||||||
|
if (c == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (c < 32)
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
line_width = word_width = blank_width = 0.0f;
|
||||||
|
inside_word = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c == '\r')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const float char_width = font->GetCharAdvance(c) * scale;
|
||||||
|
if (ImCharIsBlankW(c))
|
||||||
|
{
|
||||||
|
if (inside_word)
|
||||||
|
{
|
||||||
|
line_width += blank_width;
|
||||||
|
blank_width = 0.0f;
|
||||||
|
word_end = s - 1;
|
||||||
|
}
|
||||||
|
blank_width += char_width;
|
||||||
|
inside_word = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
word_width += char_width;
|
||||||
|
if (inside_word)
|
||||||
|
{
|
||||||
|
word_end = s;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev_word_end = word_end;
|
||||||
|
line_width += word_width + blank_width;
|
||||||
|
word_width = blank_width = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow wrapping after punctuation.
|
||||||
|
inside_word = (c != '.' && c != ',' && c != ';' && c != '!' && c != '?' && c != '\"');
|
||||||
|
}
|
||||||
|
|
||||||
|
// We ignore blank width at the end of the line (they can be skipped)
|
||||||
|
if (line_width + word_width > wrap_width)
|
||||||
|
{
|
||||||
|
// Words that cannot possibly fit within an entire line will be cut anywhere.
|
||||||
|
if (word_width < wrap_width)
|
||||||
|
s = prev_word_end ? prev_word_end : word_end;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ImVec2 FindCharPosition(const ImWchar* text_begin, const ImWchar* char_position, const ImWchar* text_end, const float wrap_width)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
ImFont* font = g.Font;
|
||||||
|
const float line_height = g.FontSize;
|
||||||
|
const float scale = line_height / font->FontSize;
|
||||||
|
|
||||||
|
ImVec2 text_size = ImVec2(0, 0);
|
||||||
|
float line_width = 0.0f;
|
||||||
|
|
||||||
|
const bool word_wrap_enabled = (wrap_width > 0.0f);
|
||||||
|
const ImWchar* word_wrap_eol = NULL;
|
||||||
|
|
||||||
|
bool stop_on_new_line = false;
|
||||||
|
|
||||||
|
const ImWchar* s = text_begin;
|
||||||
|
while (s < text_end)
|
||||||
|
{
|
||||||
|
if (word_wrap_enabled)
|
||||||
|
{
|
||||||
|
if (!word_wrap_eol)
|
||||||
|
{
|
||||||
|
word_wrap_eol = CalcWordWrapPositionW(font, scale, s, text_end, wrap_width - line_width);
|
||||||
|
if (word_wrap_eol == s)
|
||||||
|
{
|
||||||
|
word_wrap_eol++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s >= word_wrap_eol)
|
||||||
|
{
|
||||||
|
text_size.x = ImMax(text_size.x, line_width);
|
||||||
|
text_size.y += line_height;
|
||||||
|
line_width = 0.0f;
|
||||||
|
word_wrap_eol = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
while (s < text_end)
|
||||||
|
{
|
||||||
|
unsigned int c = (unsigned int)(*s);
|
||||||
|
|
||||||
|
if(ImCharIsBlankW(c)) {
|
||||||
|
s++;
|
||||||
|
} else if(c == '\n'){
|
||||||
|
s++;
|
||||||
|
break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if(s >= char_position)
|
||||||
|
{
|
||||||
|
stop_on_new_line = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stop_on_new_line)
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(s == char_position)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int c = (unsigned int)(*s++);
|
||||||
|
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
text_size.x = ImMax(text_size.x, line_width);
|
||||||
|
text_size.y += line_height;
|
||||||
|
line_width = 0.0f;
|
||||||
|
if (stop_on_new_line)
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c == '\r')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const float char_width = font->GetCharAdvance((ImWchar)c) * scale;
|
||||||
|
line_width += char_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text_size.x < line_width)
|
||||||
|
text_size.x = line_width;
|
||||||
|
|
||||||
|
return ImVec2(line_width, text_size.y + line_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset,const bool stop_on_new_line, const float word_wrap_width, const bool keep_trailing_blanks)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *ctx;
|
ImGuiContext& g = *ctx;
|
||||||
ImFont* font = g.Font;
|
ImFont* font = g.Font;
|
||||||
|
@ -3678,9 +3989,52 @@ static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begi
|
||||||
ImVec2 text_size = ImVec2(0, 0);
|
ImVec2 text_size = ImVec2(0, 0);
|
||||||
float line_width = 0.0f;
|
float line_width = 0.0f;
|
||||||
|
|
||||||
|
const float wrap_width = word_wrap_width;
|
||||||
|
const bool word_wrap_enabled = (wrap_width > 0.0f);
|
||||||
|
const ImWchar* word_wrap_eol = NULL;
|
||||||
|
|
||||||
const ImWchar* s = text_begin;
|
const ImWchar* s = text_begin;
|
||||||
while (s < text_end)
|
while (s < text_end)
|
||||||
{
|
{
|
||||||
|
if (word_wrap_enabled)
|
||||||
|
{
|
||||||
|
if (!word_wrap_eol)
|
||||||
|
{
|
||||||
|
word_wrap_eol = CalcWordWrapPositionW(font, scale, s, text_end, wrap_width - line_width);
|
||||||
|
if (word_wrap_eol == s)
|
||||||
|
{
|
||||||
|
word_wrap_eol++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s >= word_wrap_eol)
|
||||||
|
{
|
||||||
|
text_size.x = ImMax(text_size.x, line_width);
|
||||||
|
text_size.y += line_height;
|
||||||
|
line_width = 0.0f;
|
||||||
|
word_wrap_eol = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if(!keep_trailing_blanks)
|
||||||
|
{
|
||||||
|
while (s < text_end)
|
||||||
|
{
|
||||||
|
unsigned int c = (unsigned int)(*s);
|
||||||
|
if(ImCharIsBlankW(c)) {
|
||||||
|
s++;
|
||||||
|
} else if(c == '\n'){
|
||||||
|
s++;
|
||||||
|
break;
|
||||||
|
} else { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stop_on_new_line)
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int c = (unsigned int)(*s++);
|
unsigned int c = (unsigned int)(*s++);
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
{
|
{
|
||||||
|
@ -3726,7 +4080,7 @@ static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* ob
|
||||||
{
|
{
|
||||||
const ImWchar* text = obj->TextW.Data;
|
const ImWchar* text = obj->TextW.Data;
|
||||||
const ImWchar* text_remaining = NULL;
|
const ImWchar* text_remaining = NULL;
|
||||||
const ImVec2 size = InputTextCalcTextSizeW(obj->Ctx, text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true);
|
const ImVec2 size = InputTextCalcTextSizeW(obj->Ctx, text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true, obj->WordWrapWidth);
|
||||||
r->x0 = 0.0f;
|
r->x0 = 0.0f;
|
||||||
r->x1 = size.x;
|
r->x1 = size.x;
|
||||||
r->baseline_y_delta = size.y;
|
r->baseline_y_delta = size.y;
|
||||||
|
@ -4136,6 +4490,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
|
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
|
||||||
const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size);
|
const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size);
|
||||||
|
|
||||||
|
const bool has_word_wrap = is_multiline && (flags & ImGuiInputTextFlags_WordWrapping) != 0;
|
||||||
|
const float word_wrap_width = has_word_wrap ? frame_size.x - style.FramePadding.x * 2.0f : 0.0f;
|
||||||
|
|
||||||
ImGuiWindow* draw_window = window;
|
ImGuiWindow* draw_window = window;
|
||||||
ImVec2 inner_size = frame_size;
|
ImVec2 inner_size = frame_size;
|
||||||
ImGuiItemStatusFlags item_status_flags = 0;
|
ImGuiItemStatusFlags item_status_flags = 0;
|
||||||
|
@ -4155,13 +4512,22 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
|
|
||||||
// We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug.
|
// We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug.
|
||||||
// FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre.
|
// FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre.
|
||||||
PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
|
if(!style.DoFrameShadingForMultilineText)
|
||||||
|
{
|
||||||
|
PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
|
||||||
|
}
|
||||||
|
|
||||||
PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
|
PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
|
||||||
PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
|
PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
|
||||||
PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges
|
PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges
|
||||||
bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove);
|
bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove);
|
||||||
PopStyleVar(3);
|
PopStyleVar(3);
|
||||||
PopStyleColor();
|
|
||||||
|
if(!style.DoFrameShadingForMultilineText)
|
||||||
|
{
|
||||||
|
PopStyleColor();
|
||||||
|
}
|
||||||
|
|
||||||
if (!child_visible)
|
if (!child_visible)
|
||||||
{
|
{
|
||||||
EndChild();
|
EndChild();
|
||||||
|
@ -4259,6 +4625,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863)
|
state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(state)
|
||||||
|
{
|
||||||
|
state->WordWrapWidth = word_wrap_width;
|
||||||
|
}
|
||||||
|
|
||||||
const bool is_osx = io.ConfigMacOSXBehaviors;
|
const bool is_osx = io.ConfigMacOSXBehaviors;
|
||||||
if (g.ActiveId != id && init_make_active)
|
if (g.ActiveId != id && init_make_active)
|
||||||
{
|
{
|
||||||
|
@ -4822,7 +5193,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
g.WantTextInputNextFrame = 1;
|
g.WantTextInputNextFrame = 1;
|
||||||
|
|
||||||
// Render frame
|
// Render frame
|
||||||
if (!is_multiline)
|
if (!is_multiline || (is_multiline && style.DoFrameShadingForMultilineText))
|
||||||
{
|
{
|
||||||
RenderNavHighlight(frame_bb, id);
|
RenderNavHighlight(frame_bb, id);
|
||||||
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
||||||
|
@ -4860,63 +5231,35 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
// We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)
|
// We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)
|
||||||
// FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8.
|
// FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8.
|
||||||
const ImWchar* text_begin = state->TextW.Data;
|
const ImWchar* text_begin = state->TextW.Data;
|
||||||
|
const ImWchar* text_end = state->TextW.Data + ImStrlenW(state->TextW.Data);
|
||||||
ImVec2 cursor_offset, select_start_offset;
|
ImVec2 cursor_offset, select_start_offset;
|
||||||
|
|
||||||
{
|
{
|
||||||
// Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions.
|
// Find input local positions of 'cursor' (slot 0) and 'select_start' (slot 1) positions.
|
||||||
const ImWchar* searches_input_ptr[2] = { NULL, NULL };
|
if(render_cursor) {
|
||||||
int searches_result_line_no[2] = { -1000, -1000 };
|
const ImWchar* cursor_ptr = text_begin + state->Stb.cursor;
|
||||||
int searches_remaining = 0;
|
ImVec2 cursor_pos = FindCharPosition(text_begin, cursor_ptr, text_end, word_wrap_width);
|
||||||
if (render_cursor)
|
cursor_offset.x = cursor_pos.x;
|
||||||
{
|
cursor_offset.y = cursor_pos.y;
|
||||||
searches_input_ptr[0] = text_begin + state->Stb.cursor;
|
|
||||||
searches_result_line_no[0] = -1;
|
|
||||||
searches_remaining++;
|
|
||||||
}
|
}
|
||||||
if (render_selection)
|
if (render_selection)
|
||||||
{
|
{
|
||||||
searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
|
const ImWchar* selection_ptr = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
|
||||||
searches_result_line_no[1] = -1;
|
ImVec2 selection_pos = FindCharPosition(text_begin, selection_ptr, text_end, word_wrap_width);
|
||||||
searches_remaining++;
|
select_start_offset.x = selection_pos.x;
|
||||||
}
|
select_start_offset.y = selection_pos.y;
|
||||||
|
|
||||||
// Iterate all lines to find our line numbers
|
|
||||||
// In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter.
|
|
||||||
searches_remaining += is_multiline ? 1 : 0;
|
|
||||||
int line_count = 0;
|
|
||||||
//for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit
|
|
||||||
for (const ImWchar* s = text_begin; *s != 0; s++)
|
|
||||||
if (*s == '\n')
|
|
||||||
{
|
|
||||||
line_count++;
|
|
||||||
if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; }
|
|
||||||
if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; }
|
|
||||||
}
|
|
||||||
line_count++;
|
|
||||||
if (searches_result_line_no[0] == -1)
|
|
||||||
searches_result_line_no[0] = line_count;
|
|
||||||
if (searches_result_line_no[1] == -1)
|
|
||||||
searches_result_line_no[1] = line_count;
|
|
||||||
|
|
||||||
// Calculate 2d position by finding the beginning of the line and measuring distance
|
|
||||||
cursor_offset.x = InputTextCalcTextSizeW(&g, ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x;
|
|
||||||
cursor_offset.y = searches_result_line_no[0] * g.FontSize;
|
|
||||||
if (searches_result_line_no[1] >= 0)
|
|
||||||
{
|
|
||||||
select_start_offset.x = InputTextCalcTextSizeW(&g, ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x;
|
|
||||||
select_start_offset.y = searches_result_line_no[1] * g.FontSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224)
|
// Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224)
|
||||||
if (is_multiline)
|
if (is_multiline)
|
||||||
text_size = ImVec2(inner_size.x, line_count * g.FontSize);
|
text_size = InputTextCalcTextSizeW(GImGui, text_begin, text_end, NULL, NULL, false, word_wrap_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scroll
|
// Scroll
|
||||||
if (render_cursor && state->CursorFollow)
|
if (render_cursor && state->CursorFollow)
|
||||||
{
|
{
|
||||||
// Horizontal scroll in chunks of quarter width
|
// Horizontal scroll in chunks of quarter width
|
||||||
if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll))
|
if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll) && !has_word_wrap)
|
||||||
{
|
{
|
||||||
const float scroll_increment_x = inner_size.x * 0.25f;
|
const float scroll_increment_x = inner_size.x * 0.25f;
|
||||||
const float visible_width = inner_size.x - style.FramePadding.x;
|
const float visible_width = inner_size.x - style.FramePadding.x;
|
||||||
|
@ -4962,7 +5305,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
{
|
{
|
||||||
if (rect_pos.y > clip_rect.w + g.FontSize)
|
if (rect_pos.y > clip_rect.w + g.FontSize)
|
||||||
break;
|
break;
|
||||||
if (rect_pos.y < clip_rect.y)
|
if (!has_word_wrap && rect_pos.y < clip_rect.y)
|
||||||
{
|
{
|
||||||
//p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit
|
//p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit
|
||||||
//p = p ? p + 1 : text_selected_end;
|
//p = p ? p + 1 : text_selected_end;
|
||||||
|
@ -4972,7 +5315,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ImVec2 rect_size = InputTextCalcTextSizeW(&g, p, text_selected_end, &p, NULL, true);
|
float selection_word_wrap = has_word_wrap ? (word_wrap_width - ImMax(0.0f, rect_pos.x - draw_pos.x)) : 0.0f;
|
||||||
|
ImVec2 rect_size = InputTextCalcTextSizeW(&g, p, text_selected_end, &p, NULL, true, selection_word_wrap, false);
|
||||||
if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
|
if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
|
||||||
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn));
|
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn));
|
||||||
rect.ClipWith(clip_rect);
|
rect.ClipWith(clip_rect);
|
||||||
|
@ -4988,7 +5332,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
||||||
{
|
{
|
||||||
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
||||||
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
|
draw_window->DrawList->AddTextNoHashHide(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, word_wrap_width, is_multiline ? NULL : &clip_rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw blinking cursor
|
// Draw blinking cursor
|
||||||
|
@ -5024,7 +5368,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
||||||
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
|
||||||
{
|
{
|
||||||
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
|
||||||
draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
|
draw_window->DrawList->AddTextNoHashHide(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, word_wrap_width, is_multiline ? NULL : &clip_rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6495,7 +6839,17 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||||
|
|
||||||
// Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle.
|
// Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle.
|
||||||
ImGuiID id = window->GetID(label);
|
ImGuiID id = window->GetID(label);
|
||||||
ImVec2 label_size = CalcTextSize(label, NULL, true);
|
ImVec2 label_size;
|
||||||
|
|
||||||
|
if(flags & ImGuiSelectableFlags_NoHashTextHide)
|
||||||
|
{
|
||||||
|
label_size = CalcTextSize(label, NULL, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
label_size = CalcTextSize(label, NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);
|
ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);
|
||||||
ImVec2 pos = window->DC.CursorPos;
|
ImVec2 pos = window->DC.CursorPos;
|
||||||
pos.y += window->DC.CurrLineTextBaseOffset;
|
pos.y += window->DC.CurrLineTextBaseOffset;
|
||||||
|
@ -6612,7 +6966,14 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||||
else if (span_all_columns && g.CurrentTable)
|
else if (span_all_columns && g.CurrentTable)
|
||||||
TablePopBackgroundChannel();
|
TablePopBackgroundChannel();
|
||||||
|
|
||||||
RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
|
if(flags & ImGuiSelectableFlags_NoHashTextHide)
|
||||||
|
{
|
||||||
|
RenderTextClippedNoHashHide(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
|
||||||
|
}
|
||||||
|
|
||||||
// Automatically close popups
|
// Automatically close popups
|
||||||
if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup))
|
if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup))
|
||||||
|
@ -8023,7 +8384,7 @@ ImGuiTabItem* ImGui::TabBarGetCurrentTab(ImGuiTabBar* tab_bar)
|
||||||
const char* ImGui::TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
|
const char* ImGui::TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
|
||||||
{
|
{
|
||||||
if (tab->Window)
|
if (tab->Window)
|
||||||
return tab->Window->Name;
|
return (tab->Window->DisplayedName ? tab->Window->DisplayedName : tab->Window->Name);
|
||||||
if (tab->NameOffset == -1)
|
if (tab->NameOffset == -1)
|
||||||
return "N/A";
|
return "N/A";
|
||||||
IM_ASSERT(tab->NameOffset < tab_bar->TabsNames.Buf.Size);
|
IM_ASSERT(tab->NameOffset < tab_bar->TabsNames.Buf.Size);
|
||||||
|
@ -8702,7 +9063,7 @@ ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button_or_unsave
|
||||||
|
|
||||||
ImVec2 ImGui::TabItemCalcSize(ImGuiWindow* window)
|
ImVec2 ImGui::TabItemCalcSize(ImGuiWindow* window)
|
||||||
{
|
{
|
||||||
return TabItemCalcSize(window->Name, window->HasCloseButton || (window->Flags & ImGuiWindowFlags_UnsavedDocument));
|
return TabItemCalcSize((window->DisplayedName == NULL ? window->Name : window->DisplayedName), window->HasCloseButton || (window->Flags & ImGuiWindowFlags_UnsavedDocument));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col)
|
void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col)
|
||||||
|
|
2
extern/imgui_patched/imstb_textedit.h
vendored
2
extern/imgui_patched/imstb_textedit.h
vendored
|
@ -889,7 +889,7 @@ retry:
|
||||||
|
|
||||||
// [DEAR IMGUI]
|
// [DEAR IMGUI]
|
||||||
// going down while being on the last line shouldn't bring us to that line end
|
// going down while being on the last line shouldn't bring us to that line end
|
||||||
if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE)
|
if (!str->HasWordWrap() && STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// now find character position down a row
|
// now find character position down a row
|
||||||
|
|
116
po/README.md
Normal file
116
po/README.md
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
# po
|
||||||
|
|
||||||
|
these are language translation files for Furnace.
|
||||||
|
|
||||||
|
if you want to help translating Furnace to your language, read below.
|
||||||
|
|
||||||
|
# getting started
|
||||||
|
|
||||||
|
Furnace uses GNU gettext for language support.
|
||||||
|
it was chosen over other solutions due to notable advantages such as ease of use.
|
||||||
|
|
||||||
|
text strings in the source code are marked for translation with special delimiters.
|
||||||
|
afterwards, xgettext is used to extract these and generate a "template" file (furnace.pot) which contains all translatable strings.
|
||||||
|
some other tools are then used to generate new translation files (e.g. es.po for Spanish) or update them.
|
||||||
|
during build time, these translation files are converted into binary translation data which is then distributed in releases.
|
||||||
|
|
||||||
|
Furnace ships a script to help with the string extraction and translation file updating process.
|
||||||
|
|
||||||
|
# preparing
|
||||||
|
|
||||||
|
read the following instructions before you start working with translation files.
|
||||||
|
|
||||||
|
## preparing the environment
|
||||||
|
|
||||||
|
while you may edit translation files regardless of the employed method, setting them up (adding new languages, updating translation files or compiling these) is best done on a Linux environment with the GNU gettext tools installed.
|
||||||
|
|
||||||
|
if you use Windows, you may be able to perform setup through the Unix-like MSYS2 environment. see https://www.msys2.org/ for more information.
|
||||||
|
|
||||||
|
if you cannot/aren't willing to go through the process of preparing the environment, you may contact me so I can perform setup on my side and provide you with ready-to-edit translation files.
|
||||||
|
|
||||||
|
for the testing stage, Linux or Windows with MinGW (installed through the MSYS2 environment) is necessary. Visual Studio/MSVC is not supported yet.
|
||||||
|
|
||||||
|
## adding a new language
|
||||||
|
|
||||||
|
in order to add a new language, edit the setup script located in `scripts/update-po.sh`.
|
||||||
|
add a language code to the `EXPORT_LANGS` list (see `https://en.wikipedia.org/wiki/IETF_language_tag` for a list of common language codes).
|
||||||
|
then run the script in your environment:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd path/to/Furnace/repo
|
||||||
|
./scripts/update-po.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
if successful, a new file will be created in the `po` directory that you can edit using a text editor.
|
||||||
|
|
||||||
|
be sure to edit CMakeLists.txt as well, to make sure the translation file is compiled. add the language code to `FURNACE_LANGUAGES`.
|
||||||
|
|
||||||
|
## editing an existing translation
|
||||||
|
|
||||||
|
just open the translation file in your text editor.
|
||||||
|
|
||||||
|
# translating
|
||||||
|
|
||||||
|
once you've opened the translation file, you'll see a bunch of strings that may be translated.
|
||||||
|
|
||||||
|
"msgid" is the original string in English, whereas "msgstr" is the translation. fill this in with a translated version of the English string.
|
||||||
|
|
||||||
|
the `#:` line at the top points to the source code file(s) where the string appears. you may use this if you need to understand which context is the string being used in.
|
||||||
|
|
||||||
|
if a string is marked with "c-format", it means the string contains C format codes. these codes consist of a percent sign (`%`) and a type (but don't worry too much about it).
|
||||||
|
make sure to place these format codes in the translated string appropriately, as if they were objects or subjects in a sentence.
|
||||||
|
|
||||||
|
sometimes you will see a string marked as "fuzzy" after running the setup script. if this appears, it means that it is a new string that looks like another. the translation is filled in automatically, but don't trust it as it's almost guaranteed to be wrong.
|
||||||
|
|
||||||
|
a `\n` means a line break.
|
||||||
|
|
||||||
|
# testing
|
||||||
|
|
||||||
|
you may skip this step if you don't feel like building Furnace, or are unable to.
|
||||||
|
|
||||||
|
compile Furnace (see the project's README.md file (the developer info section) for information), but in the CMake stage, be sure to pass the CMake flag `-DWITH_LOCALE=ON` before the two dots (`..`) to enable language support in Furnace and therefore compile translation files.
|
||||||
|
|
||||||
|
if you did this correctly, you will see a directory called `locale` in the build directory, containing compiled translation files (with `.mo` extension).
|
||||||
|
|
||||||
|
run Furnace from the build directory like so:
|
||||||
|
|
||||||
|
```
|
||||||
|
LANG=language-code ./furnace
|
||||||
|
```
|
||||||
|
|
||||||
|
replace `language-code` with the language code to use.
|
||||||
|
|
||||||
|
you should see Furnace start up in the language you specified. if it doesn't, check out the logs.
|
||||||
|
|
||||||
|
# submitting
|
||||||
|
|
||||||
|
after doing some work, be sure to submit it so you see it in the next version.
|
||||||
|
|
||||||
|
you can contact me via email or Discord (be sure to send the translation file), or alternatively send a pull request on GitHub. the latter is preferred if you're going to work frequently.
|
||||||
|
|
||||||
|
if sending a pull request, be sure to target the `locale` branch until I merge it into master.
|
||||||
|
|
||||||
|
that's all for now. thank you for helping translate Furnace, and good luck!
|
||||||
|
|
||||||
|
- tildearrow
|
||||||
|
|
||||||
|
# footnotes
|
||||||
|
|
||||||
|
## note 1
|
||||||
|
|
||||||
|
three languages are "special":
|
||||||
|
|
||||||
|
- Polish (`pl`)
|
||||||
|
- Portuguese (Brazil) (`pt_BR`)
|
||||||
|
- Russian (`ru`)
|
||||||
|
|
||||||
|
LTVA and some other people have done translation work on a fork of Furnace to these three languages, but instead of using gettext, they have deployed a custom gettext-like solution.
|
||||||
|
|
||||||
|
I will be porting these translations from the fork to upstream Furnace, but if you want to help, here are the translation files for these languages: `https://github.com/LTVA1/furnace/tree/master/src/locale`
|
||||||
|
|
||||||
|
thanks LTVA and everyone else for pioneering language support in Furnace!
|
||||||
|
|
||||||
|
## note 2
|
||||||
|
|
||||||
|
I also speak Spanish, which means I will be working on the Spanish translation.
|
||||||
|
however, you can work on it too in order to get it done faster. let me know though.
|
16021
po/furnace.pot
Normal file
16021
po/furnace.pot
Normal file
File diff suppressed because it is too large
Load diff
BIN
po/locale/de/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/de/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/es/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/es/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/fi/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/fi/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/fr/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/fr/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/hy/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/hy/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/ko/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/ko/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/nl/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/nl/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/pl/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/pl/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/pt_BR/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/pt_BR/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/ru/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/ru/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/sk/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/sk/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/sv/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/sv/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/th/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/th/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/tr/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/tr/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
BIN
po/locale/uk/LC_MESSAGES/furnace.mo
Normal file
BIN
po/locale/uk/LC_MESSAGES/furnace.mo
Normal file
Binary file not shown.
20169
po/pt_BR.po
Normal file
20169
po/pt_BR.po
Normal file
File diff suppressed because it is too large
Load diff
20083
po/staging/pt_BR-after.po
Normal file
20083
po/staging/pt_BR-after.po
Normal file
File diff suppressed because it is too large
Load diff
912
po/staging/pt_BR-diggo.diff
Normal file
912
po/staging/pt_BR-diggo.diff
Normal file
|
@ -0,0 +1,912 @@
|
||||||
|
--- ../pt_BR.po 2024-05-29 20:54:03.941335781 -0500
|
||||||
|
+++ pt_BR-after.po 2024-05-29 21:22:24.102893128 -0500
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: furnace 0.6.3\n"
|
||||||
|
-"Last-Translator: Automatically generated\n"
|
||||||
|
+"Last-Translator: Diggo\n"
|
||||||
|
"Language-Team: none\n"
|
||||||
|
"Language: pt_BR\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
@@ -13,52 +13,51 @@
|
||||||
|
#: src/engine/sysDef.cpp:428 src/engine/sysDef.cpp:441
|
||||||
|
msgid "20xx: Set channel mode (bit 0: square; bit 1: noise; bit 2: envelope)"
|
||||||
|
msgstr ""
|
||||||
|
-"20xx: Definir modo do canal (bit 0: onda quadrada; bit 1: ruído; bit 2: "
|
||||||
|
-"envelope)"
|
||||||
|
+"20xx: Definir modo de canal (bit 0: quadrado; bit 1: ruído; bit 2: envelope)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:429
|
||||||
|
msgid "21xx: Set noise frequency (0 to 1F)"
|
||||||
|
-msgstr "21xx: Definir frequência do ruído (0 a 1F)"
|
||||||
|
+msgstr "21xx: Definir frequência de ruído (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:430 src/engine/sysDef.cpp:443
|
||||||
|
msgid "22xy: Set envelope mode (x: shape, y: enable for this channel)"
|
||||||
|
msgstr ""
|
||||||
|
-"22xy: Definir modo do envelope (x: formato, y: habilitar para este canal)"
|
||||||
|
+"22xy: Definir modo de envelope (x: forma, y: habilitar para este canal)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:431 src/engine/sysDef.cpp:444
|
||||||
|
msgid "23xx: Set envelope period low byte"
|
||||||
|
-msgstr "23xx: Definir byte inferior do período do envelope"
|
||||||
|
+msgstr "23xx: Definir byte baixo do período de envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:432 src/engine/sysDef.cpp:445
|
||||||
|
msgid "24xx: Set envelope period high byte"
|
||||||
|
-msgstr "24xx: Definir byte superior do período do envelope"
|
||||||
|
+msgstr "24xx: Definir byte alto do período de envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:433 src/engine/sysDef.cpp:446
|
||||||
|
#: src/engine/sysDef.cpp:1599
|
||||||
|
msgid "25xx: Envelope slide up"
|
||||||
|
-msgstr "25xx: Slide de envelope para cima"
|
||||||
|
+msgstr "25xx: Deslizar envelope para cima"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:434 src/engine/sysDef.cpp:447
|
||||||
|
#: src/engine/sysDef.cpp:1600
|
||||||
|
msgid "26xx: Envelope slide down"
|
||||||
|
-msgstr "26xx: Slide de envelope para baixo"
|
||||||
|
+msgstr "26xx: Deslizar envelope para baixo"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:435 src/engine/sysDef.cpp:448
|
||||||
|
#: src/engine/sysDef.cpp:1601
|
||||||
|
msgid "29xy: Set auto-envelope (x: numerator; y: denominator)"
|
||||||
|
-msgstr "29xy: Definir envelope automático (x: numerador; y: denominador)"
|
||||||
|
+msgstr "29xy: Definir auto-envelope (x: numerador; y: denominador)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:436 src/engine/sysDef.cpp:449
|
||||||
|
msgid "2Exx: Write to I/O port A"
|
||||||
|
-msgstr "2Exx: Escrever na porta E/S A"
|
||||||
|
+msgstr "2Exx: Escrever no porto de E/S A"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:437 src/engine/sysDef.cpp:450
|
||||||
|
msgid "2Fxx: Write to I/O port B"
|
||||||
|
-msgstr "2Fxx: Escrever na porta E/S B"
|
||||||
|
+msgstr "2Fxx: Escrever no porto de E/S B"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:442
|
||||||
|
msgid "21xx: Set noise frequency (0 to FF)"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "21xx: Definir frequência de ruído (0 a FF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:451
|
||||||
|
msgid "12xx: Set duty cycle (0 to 8)"
|
||||||
|
@@ -66,11 +65,11 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:453
|
||||||
|
msgid "27xx: Set noise AND mask"
|
||||||
|
-msgstr "27xx: Definir máscara AND do ruído"
|
||||||
|
+msgstr "27xx: Definir máscara AND de ruído"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:454
|
||||||
|
msgid "28xx: Set noise OR mask"
|
||||||
|
-msgstr "28xx: Definir máscara OR do ruído"
|
||||||
|
+msgstr "28xx: Definir máscara OR de ruído"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:455
|
||||||
|
msgid ""
|
||||||
|
@@ -80,15 +79,15 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:456
|
||||||
|
msgid "2Dxx: NOT TO BE EMPLOYED BY THE COMPOSER"
|
||||||
|
-msgstr "2Dxx: NÃO É PARA SER USADO PELO COMPOSITOR"
|
||||||
|
+msgstr "2Dxx: NÃO DEVE SER UTILIZADO PELO COMPOSITOR"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:460
|
||||||
|
msgid "30xx: Toggle hard envelope reset on new notes"
|
||||||
|
-msgstr "30xx: Alternar reinício brusco do envelope em novas notas"
|
||||||
|
+msgstr "30xx: Alternar reinício rígido de envelope em novas notas"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:465
|
||||||
|
msgid "18xx: Toggle extended channel 3 mode"
|
||||||
|
-msgstr "18xx: Alternar modo de canal 3 estendido"
|
||||||
|
+msgstr "18xx: Alternar modo de canal estendido 3"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:470 src/engine/sysDef.cpp:766
|
||||||
|
#: src/engine/sysDef.cpp:1025 src/engine/sysDef.cpp:1272
|
||||||
|
@@ -99,11 +98,11 @@
|
||||||
|
#: src/engine/sysDef.cpp:471 src/engine/sysDef.cpp:1653
|
||||||
|
#: src/engine/sysDef.cpp:1963
|
||||||
|
msgid "DFxx: Set sample playback direction (0: normal; 1: reverse)"
|
||||||
|
-msgstr "DFxx: Definir direção da reprodução de samples (0: normal; 1: reversa)"
|
||||||
|
+msgstr "DFxx: Definir direção de reprodução da amostra (0: normal; 1: reverso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:476
|
||||||
|
msgid "18xx: Toggle drums mode (1: enabled; 0: disabled)"
|
||||||
|
-msgstr "18xx: Alternar modo bateria (1: habilitado; 0: desabilitado)"
|
||||||
|
+msgstr "18xx: Alternar modo de bateria (1: habilitado; 0: desabilitado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:480 src/engine/sysDef.cpp:554
|
||||||
|
#: src/engine/sysDef.cpp:575
|
||||||
|
@@ -112,19 +111,19 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:481
|
||||||
|
msgid "12xx: Set level of operator 1 (0 highest, 7F lowest)"
|
||||||
|
-msgstr "12xx: Definir nível do operador 1 (0 é o mais alto, 7F o mais baixo)"
|
||||||
|
+msgstr "12xx: Definir nível do operador 1 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:482
|
||||||
|
msgid "13xx: Set level of operator 2 (0 highest, 7F lowest)"
|
||||||
|
-msgstr "13xx: Definir nível do operador 2 (0 é o mais alto, 7F o mais baixo)"
|
||||||
|
+msgstr "13xx: Definir nível do operador 2 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:483
|
||||||
|
msgid "14xx: Set level of operator 3 (0 highest, 7F lowest)"
|
||||||
|
-msgstr "14xx: Definir nível do operador 3 (0 é o mais alto, 7F o mais baixo)"
|
||||||
|
+msgstr "14xx: Definir nível do operador 3 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:484
|
||||||
|
msgid "15xx: Set level of operator 4 (0 highest, 7F lowest)"
|
||||||
|
-msgstr "15xx: Definir nível do operador 4 (0 é o mais alto, 7F o mais baixo)"
|
||||||
|
+msgstr "15xx: Definir nível do operador 4 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:485 src/engine/sysDef.cpp:580
|
||||||
|
#: src/engine/sysDef.cpp:635
|
||||||
|
@@ -156,30 +155,30 @@
|
||||||
|
#: src/engine/sysDef.cpp:491 src/engine/sysDef.cpp:588
|
||||||
|
#: src/engine/sysDef.cpp:656
|
||||||
|
msgid "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)"
|
||||||
|
-msgstr "50xy: Definir AM (x: operador de 1 a 4 (0 para todos os ops.); y: AM)"
|
||||||
|
+msgstr "50xy: Definir AM (x: operador de 1 a 4 (0 para todos os ops); y: AM)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:492 src/engine/sysDef.cpp:589
|
||||||
|
#: src/engine/sysDef.cpp:657
|
||||||
|
msgid ""
|
||||||
|
"51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)"
|
||||||
|
msgstr ""
|
||||||
|
-"51xy: Definir nível de sustentação (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
-"ops.); y: sustentação)"
|
||||||
|
+"51xy: Definir nível de sustain (x: operador de 1 a 4 (0 para todos os ops); "
|
||||||
|
+"y: sustain)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:493 src/engine/sysDef.cpp:590
|
||||||
|
#: src/engine/sysDef.cpp:658
|
||||||
|
msgid "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)"
|
||||||
|
msgstr ""
|
||||||
|
-"52xy: Definir repouso (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
-"repouso)"
|
||||||
|
+"52xy: Definir release (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
+"release)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:494
|
||||||
|
msgid ""
|
||||||
|
"53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 "
|
||||||
|
"is center)"
|
||||||
|
msgstr ""
|
||||||
|
-"53xy: Definir desafinação (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
-"desafinação, onde 3 é o centro)"
|
||||||
|
+"53xy: Definir detune (x: operador de 1 a 4 (0 para todos os ops); y: detune "
|
||||||
|
+"onde 3 é o centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:495 src/engine/sysDef.cpp:592
|
||||||
|
#: src/engine/sysDef.cpp:660
|
||||||
|
@@ -187,52 +186,52 @@
|
||||||
|
"54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale "
|
||||||
|
"from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
-"54xy: Definir escalonamento do envelope (x: operador de 1 a 4 (0 para todos "
|
||||||
|
-"os ops.); y: escala de 0 a 3)"
|
||||||
|
+"54xy: Definir escala de envelope (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
+"ops); y: escala de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:496
|
||||||
|
msgid "56xx: Set decay of all operators (0 to 1F)"
|
||||||
|
-msgstr "56xx: Definir decaimento de todos os operadores (0 a 1F)"
|
||||||
|
+msgstr "56xx: Definir decay de todos os operadores (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:497
|
||||||
|
msgid "57xx: Set decay of operator 1 (0 to 1F)"
|
||||||
|
-msgstr "57xx: Definir decaimento do operador 1 (0 a 1F)"
|
||||||
|
+msgstr "57xx: Definir decay do operador 1 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:498
|
||||||
|
msgid "58xx: Set decay of operator 2 (0 to 1F)"
|
||||||
|
-msgstr "58xx: Definir decaimento do operador 2 (0 a 1F)"
|
||||||
|
+msgstr "58xx: Definir decay do operador 2 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:499
|
||||||
|
msgid "59xx: Set decay of operator 3 (0 to 1F)"
|
||||||
|
-msgstr "59xx: Definir decaimento do operador 3 (0 a 1F)"
|
||||||
|
+msgstr "59xx: Definir decay do operador 3 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:500
|
||||||
|
msgid "5Axx: Set decay of operator 4 (0 to 1F)"
|
||||||
|
-msgstr "5Axx: Definir decaimento do operador 4 (0 a 1F)"
|
||||||
|
+msgstr "5Axx: Definir decay do operador 4 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:501
|
||||||
|
msgid "5Bxx: Set decay 2 of all operators (0 to 1F)"
|
||||||
|
-msgstr "5Bxx: Definir decaimento 2 de todos os operadores (0 a 1F)"
|
||||||
|
+msgstr "5Bxx: Definir decay 2 de todos os operadores (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:502
|
||||||
|
msgid "5Cxx: Set decay 2 of operator 1 (0 to 1F)"
|
||||||
|
-msgstr "5Cxx: Definir decaimento 2 do operador 1 (0 a 1F)"
|
||||||
|
+msgstr "5Cxx: Definir decay 2 do operador 1 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:503
|
||||||
|
msgid "5Dxx: Set decay 2 of operator 2 (0 to 1F)"
|
||||||
|
-msgstr "5Dxx: Definir decaimento 2 do operador 2 (0 a 1F)"
|
||||||
|
+msgstr "5Dxx: Definir decay 2 do operador 2 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:504
|
||||||
|
msgid "5Exx: Set decay 2 of operator 3 (0 to 1F)"
|
||||||
|
-msgstr "5Exx: Definir decaimento 2 do operador 3 (0 a 1F)"
|
||||||
|
+msgstr "5Exx: Definir decay 2 do operador 3 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:505
|
||||||
|
msgid "5Fxx: Set decay 2 of operator 4 (0 to 1F)"
|
||||||
|
-msgstr "5Fxx: Definir decaimento 2 do operador 4 (0 a 1F)"
|
||||||
|
+msgstr "5Fxx: Definir decay 2 do operador 4 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:510
|
||||||
|
msgid "10xx: Set noise frequency (xx: value; 0 disables noise)"
|
||||||
|
-msgstr "10xx: Definir frequência do ruído (xx: valor; 0 desabilita o ruído)"
|
||||||
|
+msgstr "10xx: Definir frequência de ruído (xx: valor; 0 desabilita o ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:511
|
||||||
|
msgid "17xx: Set LFO speed"
|
||||||
|
@@ -241,24 +240,24 @@
|
||||||
|
#: src/engine/sysDef.cpp:512
|
||||||
|
msgid "18xx: Set LFO waveform (0 saw, 1 square, 2 triangle, 3 noise)"
|
||||||
|
msgstr ""
|
||||||
|
-"18xx: Definir forma de onda do LFO (0 serra, 1 quadrada, 2 triângulo, 3 "
|
||||||
|
+"18xx: Definir forma de onda do LFO (0 serra, 1 quadrada, 2 triangular, 3 "
|
||||||
|
"ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:513
|
||||||
|
msgid "1Exx: Set AM depth (0 to 7F)"
|
||||||
|
-msgstr "1Exx: Definir profundidade do AM (0 a 7F)"
|
||||||
|
+msgstr "1Exx: Definir profundidade de AM (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:514
|
||||||
|
msgid "1Fxx: Set PM depth (0 to 7F)"
|
||||||
|
-msgstr "1Fxx: Definir profundidade do PM (0 a 7F)"
|
||||||
|
+msgstr "1Fxx: Definir profundidade de PM (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:515
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set detune 2 (x: operator from 1 to 4 (0 for all ops); y: detune from "
|
||||||
|
"0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
-"55xy: Definir desafinação 2 (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
-"desafinação de 0 a 3)"
|
||||||
|
+"55xy: Definir detune 2 (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
+"detune de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:520
|
||||||
|
msgid "24xx: Set LFO 2 speed"
|
||||||
|
@@ -267,23 +266,23 @@
|
||||||
|
#: src/engine/sysDef.cpp:521
|
||||||
|
msgid "25xx: Set LFO 2 waveform (0 saw, 1 square, 2 triangle, 3 noise)"
|
||||||
|
msgstr ""
|
||||||
|
-"25xx: Definir forma de onda do LFO 2 (0 serra, 1 quadrada, 2 triângulo, 3 "
|
||||||
|
+"25xx: Definir forma de onda do LFO 2 (0 serra, 1 quadrada, 2 triangular, 3 "
|
||||||
|
"ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:522
|
||||||
|
msgid "26xx: Set AM 2 depth (0 to 7F)"
|
||||||
|
-msgstr "26xx: Definir profundidade do AM 2 (0 ta 7F)"
|
||||||
|
+msgstr "26xx: Definir profundidade de AM 2 (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:523
|
||||||
|
msgid "27xx: Set PM 2 depth (0 to 7F)"
|
||||||
|
-msgstr "27xx: Definir profundidade do PM 2 (0 ta 7F)"
|
||||||
|
+msgstr "27xx: Definir profundidade de PM 2 (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:524
|
||||||
|
msgid ""
|
||||||
|
"28xy: Set reverb (x: operator from 1 to 4 (0 for all ops); y: reverb from 0 "
|
||||||
|
"to 7)"
|
||||||
|
msgstr ""
|
||||||
|
-"28xy: Definir reverb (x: operador de 1 a 4 (0 para todos os ops.); y: reverb "
|
||||||
|
+"28xy: Definir reverb (x: operador de 1 a 4 (0 para todos os ops); y: reverb "
|
||||||
|
"de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:525 src/engine/sysDef.cpp:650
|
||||||
|
@@ -291,7 +290,7 @@
|
||||||
|
"2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform "
|
||||||
|
"from 0 to 7)"
|
||||||
|
msgstr ""
|
||||||
|
-"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
+"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
"forma de onda de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:526
|
||||||
|
@@ -299,15 +298,15 @@
|
||||||
|
"2Bxy: Set envelope generator shift (x: operator from 1 to 4 (0 for all ops); "
|
||||||
|
"y: shift from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
-"2Bxy: Definir deslocamento do gerador de envelope x: operador de 1 a 4 (0 "
|
||||||
|
-"para todos os ops.); y: deslocamento de 0 a 3)"
|
||||||
|
+"2Bxy: Definir deslocamento do gerador de envelope (x: operador de 1 a 4 (0 "
|
||||||
|
+"para todos os ops); y: deslocamento de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:527
|
||||||
|
msgid ""
|
||||||
|
"2Cxy: Set fine multiplier (x: operator from 1 to 4 (0 for all ops); y: fine)"
|
||||||
|
msgstr ""
|
||||||
|
"2Cxy: Definir multiplicador fino (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
-"ops.); y: multiplicador fino)"
|
||||||
|
+"ops); y: fino)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:530
|
||||||
|
msgid ""
|
||||||
|
@@ -346,31 +345,31 @@
|
||||||
|
"55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, "
|
||||||
|
"8 off)"
|
||||||
|
msgstr ""
|
||||||
|
-"55xy: Definir envelope SSG (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
+"55xy: Definir envelope SSG (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
"0-7 ligado, 8 desligado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:549
|
||||||
|
msgid "1Fxx: Set ADPCM-A global volume (0 to 3F)"
|
||||||
|
-msgstr "1Fxx: Definir volume global do ADPCM-A (0 a 3F)"
|
||||||
|
+msgstr "1Fxx: Definir volume global ADPCM-A (0 a 3F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:553
|
||||||
|
msgid "10xx: Set patch (0 to F)"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "10xx: Definir patch (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:555 src/engine/sysDef.cpp:576
|
||||||
|
#: src/engine/sysDef.cpp:631
|
||||||
|
msgid "12xx: Set level of operator 1 (0 highest, 3F lowest)"
|
||||||
|
-msgstr "12xx: Definir nível do operador 1 (0 é o mais alto, 3F o mais baixo)"
|
||||||
|
+msgstr "12xx: Definir nível do operador 1 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:556 src/engine/sysDef.cpp:577
|
||||||
|
#: src/engine/sysDef.cpp:632
|
||||||
|
msgid "13xx: Set level of operator 2 (0 highest, 3F lowest)"
|
||||||
|
-msgstr "13xx: Definir nível do operador 2 (0 é o mais alto, 3F o mais baixo)"
|
||||||
|
+msgstr "13xx: Definir nível do operador 2 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:557
|
||||||
|
msgid "16xy: Set operator multiplier (x: operator from 1 to 2; y: multiplier)"
|
||||||
|
msgstr ""
|
||||||
|
-"16xy: Definir multiplicador do operador (x: operator de 1 a 2; y: "
|
||||||
|
+"16xy: Definir multiplicador do operador (x: operador de 1 a 2; y: "
|
||||||
|
"multiplicador)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:558 src/engine/sysDef.cpp:582
|
||||||
|
@@ -390,81 +389,81 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:561
|
||||||
|
msgid "50xy: Set AM (x: operator from 1 to 2 (0 for all ops); y: AM)"
|
||||||
|
-msgstr "50xy: Definir AM (x: operador de 1 a 2 (0 para todos os ops.); y: AM)"
|
||||||
|
+msgstr "50xy: Definir AM (x: operador de 1 a 2 (0 para todos os ops); y: AM)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:562
|
||||||
|
msgid ""
|
||||||
|
"51xy: Set sustain level (x: operator from 1 to 2 (0 for all ops); y: sustain)"
|
||||||
|
msgstr ""
|
||||||
|
-"51xy: Definir nível de sustentação (x: operador de 1 a 2 (0 para todos os "
|
||||||
|
-"ops.); y: sustentação)"
|
||||||
|
+"51xy: Definir nível de sustain (x: operador de 1 a 2 (0 para todos os ops); "
|
||||||
|
+"y: sustain)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:563
|
||||||
|
msgid "52xy: Set release (x: operator from 1 to 2 (0 for all ops); y: release)"
|
||||||
|
msgstr ""
|
||||||
|
-"52xy: Definir repouso (x: operador de 1 a 2 (0 para todos os ops.); y: "
|
||||||
|
-"repouso)"
|
||||||
|
+"52xy: Definir release (x: operador de 1 a 2 (0 para todos os ops); y: "
|
||||||
|
+"release)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:564
|
||||||
|
msgid "53xy: Set vibrato (x: operator from 1 to 2 (0 for all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"53xy: Definir vibrato (x: operador de 1 a 2 (0 para todos os ops.); y: "
|
||||||
|
-"habilitado)"
|
||||||
|
+"53xy: Definir vibrato (x: operador de 1 a 2 (0 para todos os ops); y: "
|
||||||
|
+"ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:565
|
||||||
|
msgid ""
|
||||||
|
"54xy: Set envelope scale (x: operator from 1 to 2 (0 for all ops); y: scale "
|
||||||
|
"from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
-"54xy: Definir escalonamento de envelope (x: operador de 1 a 2 (0 para todos "
|
||||||
|
-"os ops.); y: escala de 0 a 3)"
|
||||||
|
+"54xy: Definir escala de envelope (x: operador de 1 a 2 (0 para todos os "
|
||||||
|
+"ops); y: escala de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:566
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set envelope sustain (x: operator from 1 to 2 (0 for all ops); y: "
|
||||||
|
"enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"55xy: Definir modo de sustentação de envelope (x: operador de 1 a 2 (0 para "
|
||||||
|
-"todos os ops.); y: habilitado)"
|
||||||
|
+"55xy: Definir sustain de envelope (x: operador de 1 a 2 (0 para todos os "
|
||||||
|
+"ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:567 src/engine/sysDef.cpp:594
|
||||||
|
#: src/engine/sysDef.cpp:662
|
||||||
|
msgid "56xx: Set decay of all operators (0 to F)"
|
||||||
|
-msgstr "56xx: Definir decaimento de todos os operadores (0 a F)"
|
||||||
|
+msgstr "56xx: Definir decay de todos os operadores (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:568 src/engine/sysDef.cpp:595
|
||||||
|
#: src/engine/sysDef.cpp:663
|
||||||
|
msgid "57xx: Set decay of operator 1 (0 to F)"
|
||||||
|
-msgstr "57xx: Definir decaimento do operador 1 (0 a F)"
|
||||||
|
+msgstr "57xx: Definir decay do operador 1 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:569 src/engine/sysDef.cpp:596
|
||||||
|
#: src/engine/sysDef.cpp:664
|
||||||
|
msgid "58xx: Set decay of operator 2 (0 to F)"
|
||||||
|
-msgstr "58xx: Definir decaimento do operador 2 (0 a F)"
|
||||||
|
+msgstr "58xx: Definir decay do operador 2 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:570
|
||||||
|
msgid ""
|
||||||
|
"5Bxy: Set whether key will scale envelope (x: operator from 1 to 2 (0 for "
|
||||||
|
"all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"5Bxy: Definir se a nota irá escalonar a taxa do envelope (x: operador de 1 a "
|
||||||
|
-"2 (0 para todos os ops.); y: habilitado)"
|
||||||
|
+"5Bxy: Definir se a tecla irá escalar o envelope (x: operador de 1 a 2 (0 "
|
||||||
|
+"para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:574
|
||||||
|
msgid "10xx: Set global AM depth (0: 1dB, 1: 4.8dB)"
|
||||||
|
-msgstr "10xx: Definir profundidade de AM global (0: 1dB, 1: 4.8dB)"
|
||||||
|
+msgstr "10xx: Definir profundidade global de AM (0: 1dB, 1: 4.8dB)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:578 src/engine/sysDef.cpp:633
|
||||||
|
msgid "14xx: Set level of operator 3 (0 highest, 3F lowest)"
|
||||||
|
-msgstr "14xx: Definir nível do operador 3 (0 é o mais alto, 3F o mais baixo)"
|
||||||
|
+msgstr "14xx: Definir nível do operador 3 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:579 src/engine/sysDef.cpp:634
|
||||||
|
msgid "15xx: Set level of operator 4 (0 highest, 3F lowest)"
|
||||||
|
-msgstr "15xx: Definir nível do operador 4 (0 é o mais alto, 3F o mais baixo)"
|
||||||
|
+msgstr "15xx: Definir nível do operador 4 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:581
|
||||||
|
msgid "17xx: Set global vibrato depth (0: normal, 1: double)"
|
||||||
|
-msgstr "17xx: Definir profundidade de vibrato global (0: normal, 1: dobro)"
|
||||||
|
+msgstr "17xx: Definir profundidade global de vibrato (0: normal, 1: dobrado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:585 src/engine/sysDef.cpp:640
|
||||||
|
msgid "1Cxx: Set attack of operator 3 (0 to F)"
|
||||||
|
@@ -479,57 +478,54 @@
|
||||||
|
"2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform "
|
||||||
|
"from 0 to 3 in OPL2 and 0 to 7 in OPL3)"
|
||||||
|
msgstr ""
|
||||||
|
-"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
-"forma de onda de 0 a 3 no OPL2 e 0 a 7 no OPL3)"
|
||||||
|
+"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
+"forma de onda de 0 a 3 no OPL2 e de 0 a 7 no OPL3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:591 src/engine/sysDef.cpp:659
|
||||||
|
msgid "53xy: Set vibrato (x: operator from 1 to 4 (0 for all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"53xy: Definir vibrato (x: operador de 1 a 4 (0 para todos os ops.); y: "
|
||||||
|
-"habilitado)"
|
||||||
|
+"53xy: Definir vibrato (x: operador de 1 a 4 (0 para todos os ops); y: "
|
||||||
|
+"ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:593 src/engine/sysDef.cpp:661
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set envelope sustain (x: operator from 1 to 4 (0 for all ops); y: "
|
||||||
|
"enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"55xy: Definir modo de sustentação de envelope (x: operador de 1 a 4 (0 para "
|
||||||
|
-"todos os ops.); y: habilitado)"
|
||||||
|
+"55xy: Definir sustain de envelope (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
+"ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:597 src/engine/sysDef.cpp:665
|
||||||
|
msgid "59xx: Set decay of operator 3 (0 to F)"
|
||||||
|
-msgstr "59xx: Definir decaimento do operador 3 (0 a F)"
|
||||||
|
+msgstr "59xx: Definir decay do operador 3 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:598 src/engine/sysDef.cpp:666
|
||||||
|
msgid "5Axx: Set decay of operator 4 (0 to F)"
|
||||||
|
-msgstr "5Axx: Definir decaimento do operador 4 (0 a F)"
|
||||||
|
+msgstr "5Axx: Definir decay do operador 4 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:599 src/engine/sysDef.cpp:667
|
||||||
|
msgid ""
|
||||||
|
"5Bxy: Set whether key will scale envelope (x: operator from 1 to 4 (0 for "
|
||||||
|
"all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
-"5Bxy: Definir se a nota irá escalonar a taxa do envelope (x: operador de 1 a "
|
||||||
|
-"4 (0 para todos os ops.); y: habilitado)"
|
||||||
|
+"5Bxy: Definir se a tecla irá escalar o envelope (x: operador de 1 a 4 (0 "
|
||||||
|
+"para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:603 src/engine/sysDef.cpp:680
|
||||||
|
msgid ""
|
||||||
|
"10xx: Set waveform (bit 0: triangle; bit 1: saw; bit 2: pulse; bit 3: noise)"
|
||||||
|
msgstr ""
|
||||||
|
-"10xx: Definir forma de onda (bit 0: triângulo; bit 1: serra; bit 2: pulso; "
|
||||||
|
-"bit 3: ruído)"
|
||||||
|
+"10xx: Definir forma de onda (bit 0: triângulo; bit 1: dente de serra; bit 2: "
|
||||||
|
+"pulso; bit 3: ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:604
|
||||||
|
msgid "11xx: Set coarse cutoff (not recommended; use 4xxx instead)"
|
||||||
|
-msgstr ""
|
||||||
|
-"11xx: Definir ponto de corte grosso (não recomendado; use o 4xxx ao invés "
|
||||||
|
-"desse)"
|
||||||
|
+msgstr "11xx: Definir corte de agudos (não recomendado; use 4xxx em vez disso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:605
|
||||||
|
msgid "12xx: Set coarse pulse width (not recommended; use 3xxx instead)"
|
||||||
|
msgstr ""
|
||||||
|
-"12xx: Definir largura de pulso grossa (não recomendado, use o 3xxx ao invés "
|
||||||
|
-"desse)"
|
||||||
|
+"12xx: Definir largura de pulso (não recomendado; use 3xxx em vez disso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:606
|
||||||
|
msgid "13xx: Set resonance (0 to F)"
|
||||||
|
@@ -539,30 +535,29 @@
|
||||||
|
msgid ""
|
||||||
|
"14xx: Set filter mode (bit 0: low pass; bit 1: band pass; bit 2: high pass)"
|
||||||
|
msgstr ""
|
||||||
|
-"14xx: Definir modo de filtro (bit 0: passa baixa; bit 1: passa banda; bit 2: "
|
||||||
|
-"passa alta)"
|
||||||
|
+"14xx: Definir modo de filtro (bit 0: low pass; bit 1: band pass; bit 2: high "
|
||||||
|
+"pass)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:608
|
||||||
|
msgid "15xx: Set envelope reset time"
|
||||||
|
-msgstr "15xx: Definir tempo de reinício do envelope"
|
||||||
|
+msgstr "15xx: Definir tempo de reset do envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:609
|
||||||
|
msgid "1Axx: Disable envelope reset for this channel (1 disables; 0 enables)"
|
||||||
|
msgstr ""
|
||||||
|
-"1Axx: Desabilitar reinício do envelope para este canal (1 desabilita; 0 "
|
||||||
|
-"habilita)"
|
||||||
|
+"1Axx: Desativar reset do envelope para este canal (1 desabilita; 0 habilita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:610
|
||||||
|
msgid "1Bxy: Reset cutoff (x: on new note; y: now)"
|
||||||
|
-msgstr "1Bxy: Redefinir ponto de corte (x: em nova nota; y: agora)"
|
||||||
|
+msgstr "1Bxy: Resetar corte (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:611
|
||||||
|
msgid "1Cxy: Reset pulse width (x: on new note; y: now)"
|
||||||
|
-msgstr "1Cxy: Redefinir largura de pulso (x: em nova nota; y: agora)"
|
||||||
|
+msgstr "1Cxy: Resetar largura de pulso (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:612
|
||||||
|
msgid "1Exy: Change other parameters (LEGACY)"
|
||||||
|
-msgstr "1Exy: Alterar outros parâmetros (LEGADO)"
|
||||||
|
+msgstr "1Exy: Mudar outros parâmetros (LEGACY)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:613
|
||||||
|
msgid "20xy: Set attack/decay (x: attack; y: decay)"
|
||||||
|
@@ -570,7 +565,7 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:614
|
||||||
|
msgid "21xy: Set sustain/release (x: sustain; y: release)"
|
||||||
|
-msgstr "21xy: Definir sustentação/repouso (x: sustentação; y: repouso)"
|
||||||
|
+msgstr "21xy: Definir sustentação/liberação (x: sustentação; y: liberação)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:616 src/engine/sysDef.cpp:688
|
||||||
|
msgid "3xxx: Set pulse width (0 to FFF)"
|
||||||
|
@@ -578,7 +573,7 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:617
|
||||||
|
msgid "4xxx: Set cutoff (0 to 7FF)"
|
||||||
|
-msgstr "4xxx: Definir ponto de corte (0 to 7FF)"
|
||||||
|
+msgstr "4xxx: Definir corte (0 a 7FF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:622 src/engine/sysDef.cpp:745
|
||||||
|
#: src/engine/sysDef.cpp:762 src/engine/sysDef.cpp:1000
|
||||||
|
@@ -588,7 +583,7 @@
|
||||||
|
#: src/engine/sysDef.cpp:1893 src/engine/sysDef.cpp:2063
|
||||||
|
#: src/engine/sysDef.cpp:2077
|
||||||
|
msgid "10xx: Set waveform"
|
||||||
|
-msgstr "10xx: Definir forma de onda"
|
||||||
|
+msgstr "10xx: Definir onda"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:626
|
||||||
|
msgid "20xx: Set PCM frequency"
|
||||||
|
@@ -599,40 +594,40 @@
|
||||||
|
"10xy: Set AM depth (x: operator from 1 to 4 (0 for all ops); y: depth (0: "
|
||||||
|
"1dB, 1: 4.8dB))"
|
||||||
|
msgstr ""
|
||||||
|
-"10xy: Definir profundidade do AM (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
-"ops.); y: profundidade (0: 1dB, 1: 4.8dB))"
|
||||||
|
+"10xy: Definir AM depth (x: operator do 1 para o 4 (0 para todos ops); y: "
|
||||||
|
+"depth (0: 1dB, 1: 4.8dB))"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:636
|
||||||
|
msgid ""
|
||||||
|
"17xy: Set vibrato depth (x: operator from 1 to 4 (0 for all ops); y: depth "
|
||||||
|
"(0: normal, 1: double))"
|
||||||
|
msgstr ""
|
||||||
|
-"17xy: Definir profundidade do vibrato (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
-"ops.); y: profundidade (0: normal, 1: dobro))"
|
||||||
|
+"17xy: Definir vibrato depth (x: operator do 1 para o 4 (0 para todos ops); "
|
||||||
|
+"y: depth (0: normal, 1: dobrado))"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:642
|
||||||
|
msgid "20xy: Set panning of operator 1 (x: left; y: right)"
|
||||||
|
-msgstr "20xy: Definir balanço do operador 1 (x: esquerda; y: direita)"
|
||||||
|
+msgstr "20xy: Definir panorama do operador 1 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:643
|
||||||
|
msgid "21xy: Set panning of operator 2 (x: left; y: right)"
|
||||||
|
-msgstr "21xy: Definir balanço do operador 2 (x: esquerda; y: direita)"
|
||||||
|
+msgstr "21xy: Definir panorama do operador 2 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:644
|
||||||
|
msgid "22xy: Set panning of operator 3 (x: left; y: right)"
|
||||||
|
-msgstr "22xy: Definir balanço do operador 3 (x: esquerda; y: direita)"
|
||||||
|
+msgstr "22xy: Definir panorama do operador 3 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:645
|
||||||
|
msgid "23xy: Set panning of operator 4 (x: left; y: right)"
|
||||||
|
-msgstr "23xy: Definir balanço do operador 4 (x: esquerda; y: direita)"
|
||||||
|
+msgstr "23xy: Definir panorama do operador 4 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:646
|
||||||
|
msgid ""
|
||||||
|
"24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: "
|
||||||
|
"level from 0 to 7)"
|
||||||
|
msgstr ""
|
||||||
|
-"24xy: Definir registrador de nível de saída (x: operador de 1 a 4 (0 para "
|
||||||
|
-"todos os ops.); y: nível de 0 a 7)"
|
||||||
|
+"24xy: Definir registro de nível de saída (x: operador de 1 a 4 (0 para todas "
|
||||||
|
+"as operações); y: nível de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:647
|
||||||
|
msgid ""
|
||||||
|
@@ -640,26 +635,26 @@
|
||||||
|
"y: level from 0 to 7)"
|
||||||
|
msgstr ""
|
||||||
|
"25xy: Definir nível de entrada de modulação (x: operador de 1 a 4 (0 para "
|
||||||
|
-"todos os ops.); y: nível de 0 a 7)"
|
||||||
|
+"todas as operações); y: nível de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:648
|
||||||
|
msgid ""
|
||||||
|
"26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay "
|
||||||
|
"from 0 to 7)"
|
||||||
|
msgstr ""
|
||||||
|
-"26xy: Definir atraso de envelope (x: operador de 1 a 4 (0 para todos os "
|
||||||
|
-"ops.); y: atraso de 0 a 7)"
|
||||||
|
+"26xy: Definir atraso de envelope (x: operador de 1 a 4 (0 para todas as "
|
||||||
|
+"operações); y: atraso de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:649
|
||||||
|
msgid "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)"
|
||||||
|
-msgstr "27xx: Definir modo de ruído do operador 4 (x: modo de 0 a 3)"
|
||||||
|
+msgstr "27xx: Definir modo de ruído para o operador 4 (x: modo de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:651
|
||||||
|
msgid ""
|
||||||
|
"2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 "
|
||||||
|
"to 7)"
|
||||||
|
msgstr ""
|
||||||
|
-"2Fxy: Definir bloco da frequência fixa (x: operador de 1 a 4; y: oitava de 0 "
|
||||||
|
+"2Fxy: Definir bloco de frequência fixa (x: operador de 1 a 4; y: oitava de 0 "
|
||||||
|
"a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:652
|
||||||
|
@@ -683,32 +678,32 @@
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 1 (x: high 2 bits from 0 to 3; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr ""
|
||||||
|
-"3xyy: Definir Número-Frequência da frequência fixa do operador 1 (x: 2 bits "
|
||||||
|
-"superiores de 0 a 3; y: 8 bits inferiores)"
|
||||||
|
+"3xyy: Definir F-num fixo de frequência do operador 1 (x: bits altos 2 de 0 a "
|
||||||
|
+"3; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:671
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 2 (x: high 2 bits from 4 to 7; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr ""
|
||||||
|
-"3xyy: Definir Número-Frequência da frequência fixa do operador 2 (x: 2 bits "
|
||||||
|
-"superiores de 4 a 7; y: 8 bits inferiores)"
|
||||||
|
+"3xyy: Definir F-num fixo de frequência do operador 2 (x: bits altos 2 de 4 a "
|
||||||
|
+"7; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:672
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 3 (x: high 2 bits from 8 to B; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr ""
|
||||||
|
-"3xyy: Definir Número-Frequência da frequência fixa do operador 3 (x: 2 bits "
|
||||||
|
-"superiores de 8 a B; y: 8 bits inferiores)"
|
||||||
|
+"3xyy: Definir F-num fixo de frequência do operador 3 (x: bits altos 2 de 8 a "
|
||||||
|
+"B; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:673
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 4 (x: high 2 bits from C to F; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr ""
|
||||||
|
-"3xyy: Definir Número-Frequência da frequência fixa do operador 4 (x: 2 bits "
|
||||||
|
-"superiores de C a F; y: 8 bits inferiores)"
|
||||||
|
+"3xyy: Definir F-num fixo de frequência do operador 4 (x: bits altos 2 de C a "
|
||||||
|
+"F; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:681
|
||||||
|
msgid "11xx: Set resonance (0 to FF)"
|
||||||
|
@@ -718,34 +713,33 @@
|
||||||
|
msgid ""
|
||||||
|
"12xx: Set filter mode (bit 0: low pass; bit 1: band pass; bit 2: high pass)"
|
||||||
|
msgstr ""
|
||||||
|
-"12xx: Definir modo de filtro (bit 0: passa baixa; bit 1: passa banda; bit 2: "
|
||||||
|
-"passa alta)"
|
||||||
|
+"12xx: Definir modo de filtro (bit 0: passa-baixa; bit 1: passa-banda; bit 2: "
|
||||||
|
+"passa-alta)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:683
|
||||||
|
msgid "13xx: Disable envelope reset for this channel (1 disables; 0 enables)"
|
||||||
|
msgstr ""
|
||||||
|
-"13xx: Desabilitar reinício do envelope para este canal (1 desabilita; 0 "
|
||||||
|
-"habilita)"
|
||||||
|
+"13xx: Desativar reset de envelope para este canal (1 desativa; 0 habilita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:684
|
||||||
|
msgid "14xy: Reset cutoff (x: on new note; y: now)"
|
||||||
|
-msgstr "14xy: Redefinir ponto de corte (x: em nova nota; y: agora)"
|
||||||
|
+msgstr "14xy: Resetar corte (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:685
|
||||||
|
msgid "15xy: Reset pulse width (x: on new note; y: now)"
|
||||||
|
-msgstr "15xy: Redefinir largura de pulso (x: em nova nota; y: agora)"
|
||||||
|
+msgstr "15xy: Resetar largura de pulso (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:686
|
||||||
|
msgid "16xy: Change other parameters"
|
||||||
|
-msgstr "16xy: Alterar outros parâmetros"
|
||||||
|
+msgstr "16xy: Mudar outros parâmetros"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:689 src/engine/sysDef.cpp:1733
|
||||||
|
msgid "4xxx: Set cutoff (0 to FFF)"
|
||||||
|
-msgstr "4xxx: Definir ponto de corte (0 a FFF)"
|
||||||
|
+msgstr "4xxx: Definir corte (0 a FFF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:697
|
||||||
|
msgid "Yamaha YMU759 (MA-2)"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "Yamaha YMU759 (MA-2)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:698
|
||||||
|
msgid ""
|
||||||
|
@@ -753,8 +747,9 @@
|
||||||
|
"as proprietary as it is, it passed away after losing to MP3 in the mobile "
|
||||||
|
"hardware battle."
|
||||||
|
msgstr ""
|
||||||
|
-"um chip que encontrou seu lugar dentro de celulares nos anos 2000.\n"
|
||||||
|
-"proprietário como era, ele faleceu após perder para o MP3 na batalha de "
|
||||||
|
+"um chip que encontrou seu caminho dentro de telefones celulares nos anos "
|
||||||
|
+"2000.\n"
|
||||||
|
+"tão proprietário quanto é, ele faleceu após perder para o MP3 na batalha de "
|
||||||
|
"hardware móvel."
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
@@ -972,15 +967,15 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:706
|
||||||
|
msgid "Sega Genesis/Mega Drive"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "Sega Genesis/Mega Drive"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:712
|
||||||
|
msgid "Sega Genesis Extended Channel 3"
|
||||||
|
-msgstr "Sega Mega Drive com Canal 3 Estendido"
|
||||||
|
+msgstr "Sega Genesis Canal 3 Extendido"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:718 src/gui/sysConf.cpp:158
|
||||||
|
msgid "TI SN76489"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "TI SN76489"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:719
|
||||||
|
msgid ""
|
||||||
|
@@ -994,19 +989,19 @@
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 1"
|
||||||
|
-msgstr "Quadrado 1"
|
||||||
|
+msgstr "Quadrada 1"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:1135
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 2"
|
||||||
|
-msgstr "Quadrado 2"
|
||||||
|
+msgstr "Quadrada 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:1135
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 3"
|
||||||
|
-msgstr "Quadrado 3"
|
||||||
|
+msgstr "Quadrada 3"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:739
|
||||||
|
#: src/engine/sysDef.cpp:773 src/engine/sysDef.cpp:955
|
||||||
|
@@ -1026,7 +1021,7 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:731
|
||||||
|
msgid "Sega Master System + FM Expansion"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "Sega Master System + FM Expansion"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:737 src/gui/settings.cpp:3972
|
||||||
|
msgid "Game Boy"
|
||||||
|
@@ -1034,17 +1029,17 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:738
|
||||||
|
msgid "the most popular portable game console of the era."
|
||||||
|
-msgstr "o console de games portátil mais popular da sua época."
|
||||||
|
+msgstr "o console de jogos portátil mais popular da época"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/engine/sysDef.cpp:773
|
||||||
|
#: src/engine/sysDef.cpp:1062 src/engine/sysDef.cpp:2100
|
||||||
|
msgid "Pulse 1"
|
||||||
|
-msgstr "Pulso 1"
|
||||||
|
+msgstr "Pulse 1"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/engine/sysDef.cpp:773
|
||||||
|
#: src/engine/sysDef.cpp:1062 src/engine/sysDef.cpp:2100
|
||||||
|
msgid "Pulse 2"
|
||||||
|
-msgstr "Pulso 2"
|
||||||
|
+msgstr "Pulse 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/gui/settings.cpp:3877
|
||||||
|
#: src/gui/guiConst.cpp:1395 src/gui/insEdit.cpp:6652
|
||||||
|
@@ -1061,21 +1056,20 @@
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:748
|
||||||
|
msgid "13xy: Setup sweep (x: time; y: shift)"
|
||||||
|
-msgstr "13xy: Configurar sweep (x: tempo; y: deslocamento)"
|
||||||
|
+msgstr "13xy: Configurar varredura (x: tempo; y: deslocamento)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:749
|
||||||
|
msgid "14xx: Set sweep direction (0: up; 1: down)"
|
||||||
|
-msgstr "14xx: Definir direção do sweep (0: para cima; 1: para baixo)"
|
||||||
|
+msgstr "14xx: Definir direção de varredura (0: para cima; 1: para baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:754
|
||||||
|
msgid "PC Engine/TurboGrafx-16"
|
||||||
|
-msgstr ""
|
||||||
|
+msgstr "PC Engine/TurboGrafx-16"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:755
|
||||||
|
msgid "an '80s game console with a wavetable sound chip, popular in Japan."
|
||||||
|
msgstr ""
|
||||||
|
-"um console de games dos anos 80 com um chip de som wavetable, popular no "
|
||||||
|
-"Japão."
|
||||||
|
+"um console de jogos dos anos 80 com chip de som wavetable, popular no Japão."
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:763 src/engine/sysDef.cpp:1001
|
||||||
|
#: src/engine/sysDef.cpp:1793
|
||||||
|
@@ -2350,8 +2344,8 @@
|
||||||
|
"12xy: Setup envelope (x: enabled/loop (1: enable, 3: enable+loop); y: speed/"
|
||||||
|
"direction (0-7: down, 8-F: up))"
|
||||||
|
msgstr ""
|
||||||
|
-"12xy: Definir envelope (x: habilitado/repetir (1: habilitado, 3: habilitado"
|
||||||
|
-"+repetir); y: velocidade/direção (0-7: para baixo, 8-F: para cima))"
|
||||||
|
+"12xy: Definir envelope (x: habilitado/repetir (1: habilitado, 3: "
|
||||||
|
+"habilitado+repetir); y: velocidade/direção (0-7: para baixo, 8-F: para cima))"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:1323
|
||||||
|
msgid "13xy: Setup sweep (x: speed; y: shift; channel 5 only)"
|
||||||
|
@@ -20080,3 +20074,10 @@
|
||||||
|
|
||||||
|
#~ msgid "WA"
|
||||||
|
#~ msgstr "ON"
|
||||||
|
+
|
||||||
|
+#~ msgid ""
|
||||||
|
+#~ "2Cxy: Automatic noise frequency (x: mode (0: disable, 1: freq, 2: freq + "
|
||||||
|
+#~ "OR mask); y: offset"
|
||||||
|
+#~ msgstr ""
|
||||||
|
+#~ "2Cxy: Frequência de ruído automática (x: modo (0: desativar, 1: freq, 2: "
|
||||||
|
+#~ "freq + máscara OR); y: compensação"
|
984
po/staging/pt_BR-diggo.po
Normal file
984
po/staging/pt_BR-diggo.po
Normal file
|
@ -0,0 +1,984 @@
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: furnace 0.6.3\n"
|
||||||
|
"Last-Translator: Diggo\n"
|
||||||
|
"Language-Team: none\n"
|
||||||
|
"Language: pt_BR\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:428 src/engine/sysDef.cpp:441
|
||||||
|
msgid "20xx: Set channel mode (bit 0: square; bit 1: noise; bit 2: envelope)"
|
||||||
|
msgstr "20xx: Definir modo de canal (bit 0: quadrado; bit 1: ruído; bit 2: envelope)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:429
|
||||||
|
msgid "21xx: Set noise frequency (0 to 1F)"
|
||||||
|
msgstr "21xx: Definir frequência de ruído (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:430 src/engine/sysDef.cpp:443
|
||||||
|
msgid "22xy: Set envelope mode (x: shape, y: enable for this channel)"
|
||||||
|
msgstr "22xy: Definir modo de envelope (x: forma, y: habilitar para este canal)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:431 src/engine/sysDef.cpp:444
|
||||||
|
msgid "23xx: Set envelope period low byte"
|
||||||
|
msgstr "23xx: Definir byte baixo do período de envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:432 src/engine/sysDef.cpp:445
|
||||||
|
msgid "24xx: Set envelope period high byte"
|
||||||
|
msgstr "24xx: Definir byte alto do período de envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:433 src/engine/sysDef.cpp:446
|
||||||
|
#: src/engine/sysDef.cpp:1599
|
||||||
|
msgid "25xx: Envelope slide up"
|
||||||
|
msgstr "25xx: Deslizar envelope para cima"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:434 src/engine/sysDef.cpp:447
|
||||||
|
#: src/engine/sysDef.cpp:1600
|
||||||
|
msgid "26xx: Envelope slide down"
|
||||||
|
msgstr "26xx: Deslizar envelope para baixo"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:435 src/engine/sysDef.cpp:448
|
||||||
|
#: src/engine/sysDef.cpp:1601
|
||||||
|
msgid "29xy: Set auto-envelope (x: numerator; y: denominator)"
|
||||||
|
msgstr "29xy: Definir auto-envelope (x: numerador; y: denominador)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:436 src/engine/sysDef.cpp:449
|
||||||
|
msgid "2Exx: Write to I/O port A"
|
||||||
|
msgstr "2Exx: Escrever no porto de E/S A"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:437 src/engine/sysDef.cpp:450
|
||||||
|
msgid "2Fxx: Write to I/O port B"
|
||||||
|
msgstr "2Fxx: Escrever no porto de E/S B"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:442
|
||||||
|
msgid "21xx: Set noise frequency (0 to FF)"
|
||||||
|
msgstr "21xx: Definir frequência de ruído (0 a FF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:451
|
||||||
|
msgid "12xx: Set duty cycle (0 to 8)"
|
||||||
|
msgstr "12xx: Definir ciclo de trabalho (0 a 8)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:453
|
||||||
|
msgid "27xx: Set noise AND mask"
|
||||||
|
msgstr "27xx: Definir máscara AND de ruído"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:454
|
||||||
|
msgid "28xx: Set noise OR mask"
|
||||||
|
msgstr "28xx: Definir máscara OR de ruído"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:455
|
||||||
|
msgid ""
|
||||||
|
"2Cxy: Automatic noise frequency (x: mode (0: disable, 1: freq, 2: freq + OR "
|
||||||
|
"mask); y: offset"
|
||||||
|
msgstr ""
|
||||||
|
"2Cxy: Frequência de ruído automática (x: modo (0: desativar, 1: freq, 2: freq + máscara OR); y: compensação"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:456
|
||||||
|
msgid "2Dxx: NOT TO BE EMPLOYED BY THE COMPOSER"
|
||||||
|
msgstr "2Dxx: NÃO DEVE SER UTILIZADO PELO COMPOSITOR"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:460
|
||||||
|
msgid "30xx: Toggle hard envelope reset on new notes"
|
||||||
|
msgstr "30xx: Alternar reinício rígido de envelope em novas notas"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:465
|
||||||
|
msgid "18xx: Toggle extended channel 3 mode"
|
||||||
|
msgstr "18xx: Alternar modo de canal estendido 3"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:470 src/engine/sysDef.cpp:766
|
||||||
|
#: src/engine/sysDef.cpp:1025 src/engine/sysDef.cpp:1272
|
||||||
|
#: src/engine/sysDef.cpp:1593
|
||||||
|
msgid "17xx: Toggle PCM mode (LEGACY)"
|
||||||
|
msgstr "17xx: Alternar modo PCM (LEGADO)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:471 src/engine/sysDef.cpp:1653
|
||||||
|
#: src/engine/sysDef.cpp:1963
|
||||||
|
msgid "DFxx: Set sample playback direction (0: normal; 1: reverse)"
|
||||||
|
msgstr "DFxx: Definir direção de reprodução da amostra (0: normal; 1: reverso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:476
|
||||||
|
msgid "18xx: Toggle drums mode (1: enabled; 0: disabled)"
|
||||||
|
msgstr "18xx: Alternar modo de bateria (1: habilitado; 0: desabilitado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:480 src/engine/sysDef.cpp:554
|
||||||
|
#: src/engine/sysDef.cpp:575
|
||||||
|
msgid "11xx: Set feedback (0 to 7)"
|
||||||
|
msgstr "11xx: Definir feedback (0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:481
|
||||||
|
msgid "12xx: Set level of operator 1 (0 highest, 7F lowest)"
|
||||||
|
msgstr "12xx: Definir nível do operador 1 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:482
|
||||||
|
msgid "13xx: Set level of operator 2 (0 highest, 7F lowest)"
|
||||||
|
msgstr "13xx: Definir nível do operador 2 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:483
|
||||||
|
msgid "14xx: Set level of operator 3 (0 highest, 7F lowest)"
|
||||||
|
msgstr "14xx: Definir nível do operador 3 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:484
|
||||||
|
msgid "15xx: Set level of operator 4 (0 highest, 7F lowest)"
|
||||||
|
msgstr "15xx: Definir nível do operador 4 (0 mais alto, 7F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:485 src/engine/sysDef.cpp:580
|
||||||
|
#: src/engine/sysDef.cpp:635
|
||||||
|
msgid "16xy: Set operator multiplier (x: operator from 1 to 4; y: multiplier)"
|
||||||
|
msgstr "16xy: Definir multiplicador do operador (x: operador de 1 a 4; y: multiplicador)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:486
|
||||||
|
msgid "19xx: Set attack of all operators (0 to 1F)"
|
||||||
|
msgstr "19xx: Definir ataque de todos os operadores (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:487
|
||||||
|
msgid "1Axx: Set attack of operator 1 (0 to 1F)"
|
||||||
|
msgstr "1Axx: Definir ataque do operador 1 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:488
|
||||||
|
msgid "1Bxx: Set attack of operator 2 (0 to 1F)"
|
||||||
|
msgstr "1Bxx: Definir ataque do operador 2 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:489
|
||||||
|
msgid "1Cxx: Set attack of operator 3 (0 to 1F)"
|
||||||
|
msgstr "1Cxx: Definir ataque do operador 3 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:490
|
||||||
|
msgid "1Dxx: Set attack of operator 4 (0 to 1F)"
|
||||||
|
msgstr "1Dxx: Definir ataque do operador 4 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:491 src/engine/sysDef.cpp:588
|
||||||
|
#: src/engine/sysDef.cpp:656
|
||||||
|
msgid "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)"
|
||||||
|
msgstr "50xy: Definir AM (x: operador de 1 a 4 (0 para todos os ops); y: AM)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:492 src/engine/sysDef.cpp:589
|
||||||
|
#: src/engine/sysDef.cpp:657
|
||||||
|
msgid ""
|
||||||
|
"51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)"
|
||||||
|
msgstr ""
|
||||||
|
"51xy: Definir nível de sustain (x: operador de 1 a 4 (0 para todos os ops); y: sustain)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:493 src/engine/sysDef.cpp:590
|
||||||
|
#: src/engine/sysDef.cpp:658
|
||||||
|
msgid "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)"
|
||||||
|
msgstr "52xy: Definir release (x: operador de 1 a 4 (0 para todos os ops); y: release)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:494
|
||||||
|
msgid ""
|
||||||
|
"53xy: Set detune (x: operator from 1 to 4 (0 for all ops); y: detune where 3 "
|
||||||
|
"is center)"
|
||||||
|
msgstr ""
|
||||||
|
"53xy: Definir detune (x: operador de 1 a 4 (0 para todos os ops); y: detune onde 3 é o centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:495 src/engine/sysDef.cpp:592
|
||||||
|
#: src/engine/sysDef.cpp:660
|
||||||
|
msgid ""
|
||||||
|
"54xy: Set envelope scale (x: operator from 1 to 4 (0 for all ops); y: scale "
|
||||||
|
"from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
"54xy: Definir escala de envelope (x: operador de 1 a 4 (0 para todos os ops); y: escala de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:496
|
||||||
|
msgid "56xx: Set decay of all operators (0 to 1F)"
|
||||||
|
msgstr "56xx: Definir decay de todos os operadores (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:497
|
||||||
|
msgid "57xx: Set decay of operator 1 (0 to 1F)"
|
||||||
|
msgstr "57xx: Definir decay do operador 1 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:498
|
||||||
|
msgid "58xx: Set decay of operator 2 (0 to 1F)"
|
||||||
|
msgstr "58xx: Definir decay do operador 2 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:499
|
||||||
|
msgid "59xx: Set decay of operator 3 (0 to 1F)"
|
||||||
|
msgstr "59xx: Definir decay do operador 3 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:500
|
||||||
|
msgid "5Axx: Set decay of operator 4 (0 to 1F)"
|
||||||
|
msgstr "5Axx: Definir decay do operador 4 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:501
|
||||||
|
msgid "5Bxx: Set decay 2 of all operators (0 to 1F)"
|
||||||
|
msgstr "5Bxx: Definir decay 2 de todos os operadores (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:502
|
||||||
|
msgid "5Cxx: Set decay 2 of operator 1 (0 to 1F)"
|
||||||
|
msgstr "5Cxx: Definir decay 2 do operador 1 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:503
|
||||||
|
msgid "5Dxx: Set decay 2 of operator 2 (0 to 1F)"
|
||||||
|
msgstr "5Dxx: Definir decay 2 do operador 2 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:504
|
||||||
|
msgid "5Exx: Set decay 2 of operator 3 (0 to 1F)"
|
||||||
|
msgstr "5Exx: Definir decay 2 do operador 3 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:505
|
||||||
|
msgid "5Fxx: Set decay 2 of operator 4 (0 to 1F)"
|
||||||
|
msgstr "5Fxx: Definir decay 2 do operador 4 (0 a 1F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:510
|
||||||
|
msgid "10xx: Set noise frequency (xx: value; 0 disables noise)"
|
||||||
|
msgstr "10xx: Definir frequência de ruído (xx: valor; 0 desabilita o ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:511
|
||||||
|
msgid "17xx: Set LFO speed"
|
||||||
|
msgstr "17xx: Definir velocidade do LFO"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:512
|
||||||
|
msgid "18xx: Set LFO waveform (0 saw, 1 square, 2 triangle, 3 noise)"
|
||||||
|
msgstr "18xx: Definir forma de onda do LFO (0 serra, 1 quadrada, 2 triangular, 3 ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:513
|
||||||
|
msgid "1Exx: Set AM depth (0 to 7F)"
|
||||||
|
msgstr "1Exx: Definir profundidade de AM (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:514
|
||||||
|
msgid "1Fxx: Set PM depth (0 to 7F)"
|
||||||
|
msgstr "1Fxx: Definir profundidade de PM (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:515
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set detune 2 (x: operator from 1 to 4 (0 for all ops); y: detune from "
|
||||||
|
"0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
"55xy: Definir detune 2 (x: operador de 1 a 4 (0 para todos os ops); y: detune de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:520
|
||||||
|
msgid "24xx: Set LFO 2 speed"
|
||||||
|
msgstr "24xx: Definir velocidade do LFO 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:521
|
||||||
|
msgid "25xx: Set LFO 2 waveform (0 saw, 1 square, 2 triangle, 3 noise)"
|
||||||
|
msgstr "25xx: Definir forma de onda do LFO 2 (0 serra, 1 quadrada, 2 triangular, 3 ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:522
|
||||||
|
msgid "26xx: Set AM 2 depth (0 to 7F)"
|
||||||
|
msgstr "26xx: Definir profundidade de AM 2 (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:523
|
||||||
|
msgid "27xx: Set PM 2 depth (0 to 7F)"
|
||||||
|
msgstr "27xx: Definir profundidade de PM 2 (0 a 7F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:524
|
||||||
|
msgid ""
|
||||||
|
"28xy: Set reverb (x: operator from 1 to 4 (0 for all ops); y: reverb from 0 "
|
||||||
|
"to 7)"
|
||||||
|
msgstr ""
|
||||||
|
"28xy: Definir reverb (x: operador de 1 a 4 (0 para todos os ops); y: reverb de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:525 src/engine/sysDef.cpp:650
|
||||||
|
msgid ""
|
||||||
|
"2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform "
|
||||||
|
"from 0 to 7)"
|
||||||
|
msgstr ""
|
||||||
|
"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops); y: forma de onda de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:526
|
||||||
|
msgid ""
|
||||||
|
"2Bxy: Set envelope generator shift (x: operator from 1 to 4 (0 for all ops); "
|
||||||
|
"y: shift from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
"2Bxy: Definir deslocamento do gerador de envelope (x: operador de 1 a 4 (0 para todos os ops); y: deslocamento de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:527
|
||||||
|
msgid ""
|
||||||
|
"2Cxy: Set fine multiplier (x: operator from 1 to 4 (0 for all ops); y: fine)"
|
||||||
|
msgstr ""
|
||||||
|
"2Cxy: Definir multiplicador fino (x: operador de 1 a 4 (0 para todos os ops); y: fino)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:530
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency of operator 1 (x: octave from 0 to 7; y: frequency)"
|
||||||
|
msgstr ""
|
||||||
|
"3xyy: Definir frequência fixa do operador 1 (x: oitava de 0 a 7; y: frequência)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:531
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency of operator 2 (x: octave from 8 to F; y: frequency)"
|
||||||
|
msgstr ""
|
||||||
|
"3xyy: Definir frequência fixa do operador 2 (x: oitava de 8 a F; y: frequência)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:532
|
||||||
|
msgid ""
|
||||||
|
"4xyy: Set fixed frequency of operator 3 (x: octave from 0 to 7; y: frequency)"
|
||||||
|
msgstr ""
|
||||||
|
"4xyy: Definir frequência fixa do operador 3 (x: oitava de 0 a 7; y: frequência)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:533
|
||||||
|
msgid ""
|
||||||
|
"4xyy: Set fixed frequency of operator 4 (x: octave from 8 to F; y: frequency)"
|
||||||
|
msgstr ""
|
||||||
|
"4xyy: Definir frequência fixa do operador 4 (x: oitava de 8 a F; y: frequência)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:540
|
||||||
|
msgid "10xy: Setup LFO (x: enable; y: speed)"
|
||||||
|
msgstr "10xy: Configurar LFO (x: habilitar; y: velocidade)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:541
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set SSG envelope (x: operator from 1 to 4 (0 for all ops); y: 0-7 on, "
|
||||||
|
"8 off)"
|
||||||
|
msgstr ""
|
||||||
|
"55xy: Definir envelope SSG (x: operador de 1 a 4 (0 para todos os ops); y: 0-7 ligado, 8 desligado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:549
|
||||||
|
msgid "1Fxx: Set ADPCM-A global volume (0 to 3F)"
|
||||||
|
msgstr "1Fxx: Definir volume global ADPCM-A (0 a 3F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:553
|
||||||
|
msgid "10xx: Set patch (0 to F)"
|
||||||
|
msgstr "10xx: Definir patch (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:555 src/engine/sysDef.cpp:576
|
||||||
|
#: src/engine/sysDef.cpp:631
|
||||||
|
msgid "12xx: Set level of operator 1 (0 highest, 3F lowest)"
|
||||||
|
msgstr "12xx: Definir nível do operador 1 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:556 src/engine/sysDef.cpp:577
|
||||||
|
#: src/engine/sysDef.cpp:632
|
||||||
|
msgid "13xx: Set level of operator 2 (0 highest, 3F lowest)"
|
||||||
|
msgstr "13xx: Definir nível do operador 2 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:557
|
||||||
|
msgid "16xy: Set operator multiplier (x: operator from 1 to 2; y: multiplier)"
|
||||||
|
msgstr "16xy: Definir multiplicador do operador (x: operador de 1 a 2; y: multiplicador)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:558 src/engine/sysDef.cpp:582
|
||||||
|
#: src/engine/sysDef.cpp:637
|
||||||
|
msgid "19xx: Set attack of all operators (0 to F)"
|
||||||
|
msgstr "19xx: Definir ataque de todos os operadores (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:559 src/engine/sysDef.cpp:583
|
||||||
|
#: src/engine/sysDef.cpp:638
|
||||||
|
msgid "1Axx: Set attack of operator 1 (0 to F)"
|
||||||
|
msgstr "1Axx: Definir ataque do operador 1 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:560 src/engine/sysDef.cpp:584
|
||||||
|
#: src/engine/sysDef.cpp:639
|
||||||
|
msgid "1Bxx: Set attack of operator 2 (0 to F)"
|
||||||
|
msgstr "1Bxx: Definir ataque do operador 2 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:561
|
||||||
|
msgid "50xy: Set AM (x: operator from 1 to 2 (0 for all ops); y: AM)"
|
||||||
|
msgstr "50xy: Definir AM (x: operador de 1 a 2 (0 para todos os ops); y: AM)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:562
|
||||||
|
msgid ""
|
||||||
|
"51xy: Set sustain level (x: operator from 1 to 2 (0 for all ops); y: sustain)"
|
||||||
|
msgstr ""
|
||||||
|
"51xy: Definir nível de sustain (x: operador de 1 a 2 (0 para todos os ops); y: sustain)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:563
|
||||||
|
msgid "52xy: Set release (x: operator from 1 to 2 (0 for all ops); y: release)"
|
||||||
|
msgstr "52xy: Definir release (x: operador de 1 a 2 (0 para todos os ops); y: release)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:564
|
||||||
|
msgid "53xy: Set vibrato (x: operator from 1 to 2 (0 for all ops); y: enabled)"
|
||||||
|
msgstr "53xy: Definir vibrato (x: operador de 1 a 2 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:565
|
||||||
|
msgid ""
|
||||||
|
"54xy: Set envelope scale (x: operator from 1 to 2 (0 for all ops); y: scale "
|
||||||
|
"from 0 to 3)"
|
||||||
|
msgstr ""
|
||||||
|
"54xy: Definir escala de envelope (x: operador de 1 a 2 (0 para todos os ops); y: escala de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:566
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set envelope sustain (x: operator from 1 to 2 (0 for all ops); y: "
|
||||||
|
"enabled)"
|
||||||
|
msgstr ""
|
||||||
|
"55xy: Definir sustain de envelope (x: operador de 1 a 2 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:567 src/engine/sysDef.cpp:594
|
||||||
|
#: src/engine/sysDef.cpp:662
|
||||||
|
msgid "56xx: Set decay of all operators (0 to F)"
|
||||||
|
msgstr "56xx: Definir decay de todos os operadores (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:568 src/engine/sysDef.cpp:595
|
||||||
|
#: src/engine/sysDef.cpp:663
|
||||||
|
msgid "57xx: Set decay of operator 1 (0 to F)"
|
||||||
|
msgstr "57xx: Definir decay do operador 1 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:569 src/engine/sysDef.cpp:596
|
||||||
|
#: src/engine/sysDef.cpp:664
|
||||||
|
msgid "58xx: Set decay of operator 2 (0 to F)"
|
||||||
|
msgstr "58xx: Definir decay do operador 2 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:570
|
||||||
|
msgid ""
|
||||||
|
"5Bxy: Set whether key will scale envelope (x: operator from 1 to 2 (0 for "
|
||||||
|
"all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
"5Bxy: Definir se a tecla irá escalar o envelope (x: operador de 1 a 2 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:574
|
||||||
|
msgid "10xx: Set global AM depth (0: 1dB, 1: 4.8dB)"
|
||||||
|
msgstr "10xx: Definir profundidade global de AM (0: 1dB, 1: 4.8dB)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:578 src/engine/sysDef.cpp:633
|
||||||
|
msgid "14xx: Set level of operator 3 (0 highest, 3F lowest)"
|
||||||
|
msgstr "14xx: Definir nível do operador 3 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:579 src/engine/sysDef.cpp:634
|
||||||
|
msgid "15xx: Set level of operator 4 (0 highest, 3F lowest)"
|
||||||
|
msgstr "15xx: Definir nível do operador 4 (0 mais alto, 3F mais baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:581
|
||||||
|
msgid "17xx: Set global vibrato depth (0: normal, 1: double)"
|
||||||
|
msgstr "17xx: Definir profundidade global de vibrato (0: normal, 1: dobrado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:585 src/engine/sysDef.cpp:640
|
||||||
|
msgid "1Cxx: Set attack of operator 3 (0 to F)"
|
||||||
|
msgstr "1Cxx: Definir ataque do operador 3 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:586 src/engine/sysDef.cpp:641
|
||||||
|
msgid "1Dxx: Set attack of operator 4 (0 to F)"
|
||||||
|
msgstr "1Dxx: Definir ataque do operador 4 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:587
|
||||||
|
msgid ""
|
||||||
|
"2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform "
|
||||||
|
"from 0 to 3 in OPL2 and 0 to 7 in OPL3)"
|
||||||
|
msgstr ""
|
||||||
|
"2Axy: Definir forma de onda (x: operador de 1 a 4 (0 para todos os ops); y: forma de onda de 0 a 3 no OPL2 e de 0 a 7 no OPL3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:591 src/engine/sysDef.cpp:659
|
||||||
|
msgid "53xy: Set vibrato (x: operator from 1 to 4 (0 for all ops); y: enabled)"
|
||||||
|
msgstr "53xy: Definir vibrato (x: operador de 1 a 4 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:593 src/engine/sysDef.cpp:661
|
||||||
|
msgid ""
|
||||||
|
"55xy: Set envelope sustain (x: operator from 1 to 4 (0 for all ops); y: "
|
||||||
|
"enabled)"
|
||||||
|
msgstr ""
|
||||||
|
"55xy: Definir sustain de envelope (x: operador de 1 a 4 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:597 src/engine/sysDef.cpp:665
|
||||||
|
msgid "59xx: Set decay of operator 3 (0 to F)"
|
||||||
|
msgstr "59xx: Definir decay do operador 3 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:598 src/engine/sysDef.cpp:666
|
||||||
|
msgid "5Axx: Set decay of operator 4 (0 to F)"
|
||||||
|
msgstr "5Axx: Definir decay do operador 4 (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:599 src/engine/sysDef.cpp:667
|
||||||
|
msgid ""
|
||||||
|
"5Bxy: Set whether key will scale envelope (x: operator from 1 to 4 (0 for "
|
||||||
|
"all ops); y: enabled)"
|
||||||
|
msgstr ""
|
||||||
|
"5Bxy: Definir se a tecla irá escalar o envelope (x: operador de 1 a 4 (0 para todos os ops); y: ativado)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:603 src/engine/sysDef.cpp:680
|
||||||
|
msgid ""
|
||||||
|
"10xx: Set waveform (bit 0: triangle; bit 1: saw; bit 2: pulse; bit 3: noise)"
|
||||||
|
msgstr "10xx: Definir forma de onda (bit 0: triângulo; bit 1: dente de serra; bit 2: pulso; bit 3: ruído)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:604
|
||||||
|
msgid "11xx: Set coarse cutoff (not recommended; use 4xxx instead)"
|
||||||
|
msgstr "11xx: Definir corte de agudos (não recomendado; use 4xxx em vez disso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:605
|
||||||
|
msgid "12xx: Set coarse pulse width (not recommended; use 3xxx instead)"
|
||||||
|
msgstr "12xx: Definir largura de pulso (não recomendado; use 3xxx em vez disso)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:606
|
||||||
|
msgid "13xx: Set resonance (0 to F)"
|
||||||
|
msgstr "13xx: Definir ressonância (0 a F)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:607
|
||||||
|
msgid ""
|
||||||
|
"14xx: Set filter mode (bit 0: low pass; bit 1: band pass; bit 2: high pass)"
|
||||||
|
msgstr "14xx: Definir modo de filtro (bit 0: low pass; bit 1: band pass; bit 2: high pass)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:608
|
||||||
|
msgid "15xx: Set envelope reset time"
|
||||||
|
msgstr "15xx: Definir tempo de reset do envelope"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:609
|
||||||
|
msgid "1Axx: Disable envelope reset for this channel (1 disables; 0 enables)"
|
||||||
|
msgstr "1Axx: Desativar reset do envelope para este canal (1 desabilita; 0 habilita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:610
|
||||||
|
msgid "1Bxy: Reset cutoff (x: on new note; y: now)"
|
||||||
|
msgstr "1Bxy: Resetar corte (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:611
|
||||||
|
msgid "1Cxy: Reset pulse width (x: on new note; y: now)"
|
||||||
|
msgstr "1Cxy: Resetar largura de pulso (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:612
|
||||||
|
msgid "1Exy: Change other parameters (LEGACY)"
|
||||||
|
msgstr "1Exy: Mudar outros parâmetros (LEGACY)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:613
|
||||||
|
msgid "20xy: Set attack/decay (x: attack; y: decay)"
|
||||||
|
msgstr "20xy: Definir ataque/decaimento (x: ataque; y: decaimento)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:614
|
||||||
|
msgid "21xy: Set sustain/release (x: sustain; y: release)"
|
||||||
|
msgstr "21xy: Definir sustentação/liberação (x: sustentação; y: liberação)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:616 src/engine/sysDef.cpp:688
|
||||||
|
msgid "3xxx: Set pulse width (0 to FFF)"
|
||||||
|
msgstr "3xxx: Definir largura de pulso (0 a FFF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:617
|
||||||
|
msgid "4xxx: Set cutoff (0 to 7FF)"
|
||||||
|
msgstr "4xxx: Definir corte (0 a 7FF)"
|
||||||
|
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:622 src/engine/sysDef.cpp:745
|
||||||
|
#: src/engine/sysDef.cpp:762 src/engine/sysDef.cpp:1000
|
||||||
|
#: src/engine/sysDef.cpp:1050 src/engine/sysDef.cpp:1268
|
||||||
|
#: src/engine/sysDef.cpp:1320 src/engine/sysDef.cpp:1590
|
||||||
|
#: src/engine/sysDef.cpp:1788 src/engine/sysDef.cpp:1792
|
||||||
|
#: src/engine/sysDef.cpp:1893 src/engine/sysDef.cpp:2063
|
||||||
|
#: src/engine/sysDef.cpp:2077
|
||||||
|
msgid "10xx: Set waveform"
|
||||||
|
msgstr "10xx: Definir onda"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:626
|
||||||
|
msgid "20xx: Set PCM frequency"
|
||||||
|
msgstr "20xx: Definir frequência do PCM"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:630
|
||||||
|
msgid ""
|
||||||
|
"10xy: Set AM depth (x: operator from 1 to 4 (0 for all ops); y: depth (0: "
|
||||||
|
"1dB, 1: 4.8dB))"
|
||||||
|
msgstr "10xy: Definir AM depth (x: operator do 1 para o 4 (0 para todos ops); y: depth (0: "
|
||||||
|
"1dB, 1: 4.8dB))"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:636
|
||||||
|
msgid ""
|
||||||
|
"17xy: Set vibrato depth (x: operator from 1 to 4 (0 for all ops); y: depth "
|
||||||
|
"(0: normal, 1: double))"
|
||||||
|
msgstr "17xy: Definir vibrato depth (x: operator do 1 para o 4 (0 para todos ops); y: depth "
|
||||||
|
"(0: normal, 1: dobrado))"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:642
|
||||||
|
msgid "20xy: Set panning of operator 1 (x: left; y: right)"
|
||||||
|
msgstr "20xy: Definir panorama do operador 1 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:643
|
||||||
|
msgid "21xy: Set panning of operator 2 (x: left; y: right)"
|
||||||
|
msgstr "21xy: Definir panorama do operador 2 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:644
|
||||||
|
msgid "22xy: Set panning of operator 3 (x: left; y: right)"
|
||||||
|
msgstr "22xy: Definir panorama do operador 3 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:645
|
||||||
|
msgid "23xy: Set panning of operator 4 (x: left; y: right)"
|
||||||
|
msgstr "23xy: Definir panorama do operador 4 (x: esquerda; y: direita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:646
|
||||||
|
msgid ""
|
||||||
|
"24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: "
|
||||||
|
"level from 0 to 7)"
|
||||||
|
msgstr "24xy: Definir registro de nível de saída (x: operador de 1 a 4 (0 para todas as operações); y: nível de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:647
|
||||||
|
msgid ""
|
||||||
|
"25xy: Set modulation input level (x: operator from 1 to 4 (0 for all ops); "
|
||||||
|
"y: level from 0 to 7)"
|
||||||
|
msgstr "25xy: Definir nível de entrada de modulação (x: operador de 1 a 4 (0 para todas as operações); y: nível de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:648
|
||||||
|
msgid ""
|
||||||
|
"26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay "
|
||||||
|
"from 0 to 7)"
|
||||||
|
msgstr "26xy: Definir atraso de envelope (x: operador de 1 a 4 (0 para todas as operações); y: atraso de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:649
|
||||||
|
msgid "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)"
|
||||||
|
msgstr "27xx: Definir modo de ruído para o operador 4 (x: modo de 0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:651
|
||||||
|
msgid ""
|
||||||
|
"2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 "
|
||||||
|
"to 7)"
|
||||||
|
msgstr "2Fxy: Definir bloco de frequência fixa (x: operador de 1 a 4; y: oitava de 0 a 7)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:652
|
||||||
|
msgid "40xx: Set detune of operator 1 (80: center)"
|
||||||
|
msgstr "40xx: Definir desafinação do operador 1 (80: centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:653
|
||||||
|
msgid "41xx: Set detune of operator 2 (80: center)"
|
||||||
|
msgstr "41xx: Definir desafinação do operador 2 (80: centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:654
|
||||||
|
msgid "42xx: Set detune of operator 3 (80: center)"
|
||||||
|
msgstr "42xx: Definir desafinação do operador 3 (80: centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:655
|
||||||
|
msgid "43xx: Set detune of operator 4 (80: center)"
|
||||||
|
msgstr "43xx: Definir desafinação do operador 4 (80: centro)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:670
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 1 (x: high 2 bits from 0 to 3; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr "3xyy: Definir F-num fixo de frequência do operador 1 (x: bits altos 2 de 0 a 3; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:671
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 2 (x: high 2 bits from 4 to 7; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr "3xyy: Definir F-num fixo de frequência do operador 2 (x: bits altos 2 de 4 a 7; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:672
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 3 (x: high 2 bits from 8 to B; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr "3xyy: Definir F-num fixo de frequência do operador 3 (x: bits altos 2 de 8 a B; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:673
|
||||||
|
msgid ""
|
||||||
|
"3xyy: Set fixed frequency F-num of operator 4 (x: high 2 bits from C to F; "
|
||||||
|
"y: low 8 bits of F-num)"
|
||||||
|
msgstr "3xyy: Definir F-num fixo de frequência do operador 4 (x: bits altos 2 de C a F; y: bits baixos 8 do F-num)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:681
|
||||||
|
msgid "11xx: Set resonance (0 to FF)"
|
||||||
|
msgstr "11xx: Definir ressonância (0 a FF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:682
|
||||||
|
msgid ""
|
||||||
|
"12xx: Set filter mode (bit 0: low pass; bit 1: band pass; bit 2: high pass)"
|
||||||
|
msgstr "12xx: Definir modo de filtro (bit 0: passa-baixa; bit 1: passa-banda; bit 2: passa-alta)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:683
|
||||||
|
msgid "13xx: Disable envelope reset for this channel (1 disables; 0 enables)"
|
||||||
|
msgstr "13xx: Desativar reset de envelope para este canal (1 desativa; 0 habilita)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:684
|
||||||
|
msgid "14xy: Reset cutoff (x: on new note; y: now)"
|
||||||
|
msgstr "14xy: Resetar corte (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:685
|
||||||
|
msgid "15xy: Reset pulse width (x: on new note; y: now)"
|
||||||
|
msgstr "15xy: Resetar largura de pulso (x: na nova nota; y: agora)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:686
|
||||||
|
msgid "16xy: Change other parameters"
|
||||||
|
msgstr "16xy: Mudar outros parâmetros"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:689 src/engine/sysDef.cpp:1733
|
||||||
|
msgid "4xxx: Set cutoff (0 to FFF)"
|
||||||
|
msgstr "4xxx: Definir corte (0 a FFF)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:697
|
||||||
|
msgid "Yamaha YMU759 (MA-2)"
|
||||||
|
msgstr "Yamaha YMU759 (MA-2)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:698
|
||||||
|
msgid ""
|
||||||
|
"a chip which found its way inside mobile phones in the 2000's.\n"
|
||||||
|
"as proprietary as it is, it passed away after losing to MP3 in the mobile "
|
||||||
|
"hardware battle."
|
||||||
|
msgstr ""
|
||||||
|
"um chip que encontrou seu caminho dentro de telefones celulares nos anos 2000.\n"
|
||||||
|
"tão proprietário quanto é, ele faleceu após perder para o MP3 na batalha de hardware móvel."
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:807 src/engine/sysDef.cpp:819
|
||||||
|
#: src/engine/sysDef.cpp:874 src/engine/sysDef.cpp:915
|
||||||
|
#: src/engine/sysDef.cpp:977 src/engine/sysDef.cpp:1075
|
||||||
|
#: src/engine/sysDef.cpp:1210 src/engine/sysDef.cpp:1237
|
||||||
|
#: src/engine/sysDef.cpp:1252 src/engine/sysDef.cpp:1302
|
||||||
|
#: src/engine/sysDef.cpp:1314 src/engine/sysDef.cpp:1356
|
||||||
|
#: src/engine/sysDef.cpp:1396 src/engine/sysDef.cpp:1499
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1572
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1608
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1705
|
||||||
|
#: src/engine/sysDef.cpp:1741 src/engine/sysDef.cpp:1753
|
||||||
|
#: src/engine/sysDef.cpp:1799 src/engine/sysDef.cpp:1810
|
||||||
|
#: src/engine/sysDef.cpp:1821 src/engine/sysDef.cpp:1832
|
||||||
|
#: src/engine/sysDef.cpp:1900 src/engine/sysDef.cpp:1910
|
||||||
|
#: src/engine/sysDef.cpp:1920 src/engine/sysDef.cpp:1944
|
||||||
|
#: src/engine/sysDef.cpp:1957 src/engine/sysDef.cpp:1970
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2037 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2122
|
||||||
|
#: src/engine/sysDef.cpp:2138 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 1"
|
||||||
|
msgstr "Canal 1"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:807 src/engine/sysDef.cpp:819
|
||||||
|
#: src/engine/sysDef.cpp:874 src/engine/sysDef.cpp:915
|
||||||
|
#: src/engine/sysDef.cpp:977 src/engine/sysDef.cpp:1075
|
||||||
|
#: src/engine/sysDef.cpp:1210 src/engine/sysDef.cpp:1237
|
||||||
|
#: src/engine/sysDef.cpp:1252 src/engine/sysDef.cpp:1302
|
||||||
|
#: src/engine/sysDef.cpp:1314 src/engine/sysDef.cpp:1356
|
||||||
|
#: src/engine/sysDef.cpp:1396 src/engine/sysDef.cpp:1499
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1572
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1608
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1705
|
||||||
|
#: src/engine/sysDef.cpp:1741 src/engine/sysDef.cpp:1753
|
||||||
|
#: src/engine/sysDef.cpp:1799 src/engine/sysDef.cpp:1810
|
||||||
|
#: src/engine/sysDef.cpp:1821 src/engine/sysDef.cpp:1832
|
||||||
|
#: src/engine/sysDef.cpp:1900 src/engine/sysDef.cpp:1910
|
||||||
|
#: src/engine/sysDef.cpp:1920 src/engine/sysDef.cpp:1944
|
||||||
|
#: src/engine/sysDef.cpp:1957 src/engine/sysDef.cpp:1970
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2037 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2122
|
||||||
|
#: src/engine/sysDef.cpp:2138 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 2"
|
||||||
|
msgstr "Canal 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:807 src/engine/sysDef.cpp:819
|
||||||
|
#: src/engine/sysDef.cpp:874 src/engine/sysDef.cpp:977
|
||||||
|
#: src/engine/sysDef.cpp:1075 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1237 src/engine/sysDef.cpp:1252
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1314
|
||||||
|
#: src/engine/sysDef.cpp:1356 src/engine/sysDef.cpp:1396
|
||||||
|
#: src/engine/sysDef.cpp:1499 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1572 src/engine/sysDef.cpp:1584
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1705
|
||||||
|
#: src/engine/sysDef.cpp:1741 src/engine/sysDef.cpp:1753
|
||||||
|
#: src/engine/sysDef.cpp:1799 src/engine/sysDef.cpp:1810
|
||||||
|
#: src/engine/sysDef.cpp:1821 src/engine/sysDef.cpp:1832
|
||||||
|
#: src/engine/sysDef.cpp:1910 src/engine/sysDef.cpp:1944
|
||||||
|
#: src/engine/sysDef.cpp:1957 src/engine/sysDef.cpp:1980
|
||||||
|
#: src/engine/sysDef.cpp:1991 src/engine/sysDef.cpp:2037
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
#: src/engine/sysDef.cpp:2122 src/engine/sysDef.cpp:2138
|
||||||
|
#: src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 3"
|
||||||
|
msgstr "Canal 3"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:874 src/engine/sysDef.cpp:977
|
||||||
|
#: src/engine/sysDef.cpp:1075 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1237 src/engine/sysDef.cpp:1252
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1314
|
||||||
|
#: src/engine/sysDef.cpp:1356 src/engine/sysDef.cpp:1396
|
||||||
|
#: src/engine/sysDef.cpp:1499 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1572 src/engine/sysDef.cpp:1584
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1705
|
||||||
|
#: src/engine/sysDef.cpp:1741 src/engine/sysDef.cpp:1753
|
||||||
|
#: src/engine/sysDef.cpp:1810 src/engine/sysDef.cpp:1821
|
||||||
|
#: src/engine/sysDef.cpp:1832 src/engine/sysDef.cpp:1910
|
||||||
|
#: src/engine/sysDef.cpp:1944 src/engine/sysDef.cpp:1957
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
#: src/engine/sysDef.cpp:2122 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 4"
|
||||||
|
msgstr "Canal 4"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:977 src/engine/sysDef.cpp:1075
|
||||||
|
#: src/engine/sysDef.cpp:1210 src/engine/sysDef.cpp:1252
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1314
|
||||||
|
#: src/engine/sysDef.cpp:1356 src/engine/sysDef.cpp:1396
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1572
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1705 src/engine/sysDef.cpp:1741
|
||||||
|
#: src/engine/sysDef.cpp:1810 src/engine/sysDef.cpp:1821
|
||||||
|
#: src/engine/sysDef.cpp:1832 src/engine/sysDef.cpp:1980
|
||||||
|
#: src/engine/sysDef.cpp:1991 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 5"
|
||||||
|
msgstr "Canal 5"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:756
|
||||||
|
#: src/engine/sysDef.cpp:977 src/engine/sysDef.cpp:1075
|
||||||
|
#: src/engine/sysDef.cpp:1210 src/engine/sysDef.cpp:1252
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1356
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1584
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1741
|
||||||
|
#: src/engine/sysDef.cpp:1810 src/engine/sysDef.cpp:1821
|
||||||
|
#: src/engine/sysDef.cpp:1832 src/engine/sysDef.cpp:1980
|
||||||
|
#: src/engine/sysDef.cpp:1991 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 6"
|
||||||
|
msgstr "Canal 6"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:977
|
||||||
|
#: src/engine/sysDef.cpp:1075 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1252 src/engine/sysDef.cpp:1302
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1584
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1741
|
||||||
|
#: src/engine/sysDef.cpp:1810 src/engine/sysDef.cpp:1821
|
||||||
|
#: src/engine/sysDef.cpp:1832 src/engine/sysDef.cpp:1980
|
||||||
|
#: src/engine/sysDef.cpp:1991 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 7"
|
||||||
|
msgstr "Canal 7"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:977
|
||||||
|
#: src/engine/sysDef.cpp:1075 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1252 src/engine/sysDef.cpp:1302
|
||||||
|
#: src/engine/sysDef.cpp:1532 src/engine/sysDef.cpp:1584
|
||||||
|
#: src/engine/sysDef.cpp:1669 src/engine/sysDef.cpp:1741
|
||||||
|
#: src/engine/sysDef.cpp:1810 src/engine/sysDef.cpp:1821
|
||||||
|
#: src/engine/sysDef.cpp:1832 src/engine/sysDef.cpp:1980
|
||||||
|
#: src/engine/sysDef.cpp:1991 src/engine/sysDef.cpp:2070
|
||||||
|
#: src/engine/sysDef.cpp:2086 src/engine/sysDef.cpp:2150
|
||||||
|
msgid "Channel 8"
|
||||||
|
msgstr "Canal 8"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 9"
|
||||||
|
msgstr "Canal 9"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 10"
|
||||||
|
msgstr "Canal 10"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 11"
|
||||||
|
msgstr "Canal 11"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 13"
|
||||||
|
msgstr "Canal 13"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 14"
|
||||||
|
msgstr "Canal 14"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 15"
|
||||||
|
msgstr "Canal 15"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:1210
|
||||||
|
#: src/engine/sysDef.cpp:1302 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1584 src/engine/sysDef.cpp:1669
|
||||||
|
#: src/engine/sysDef.cpp:1980 src/engine/sysDef.cpp:1991
|
||||||
|
#: src/engine/sysDef.cpp:2070 src/engine/sysDef.cpp:2086
|
||||||
|
msgid "Channel 16"
|
||||||
|
msgstr "Canal 16"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:699 src/engine/sysDef.cpp:700
|
||||||
|
#: src/engine/sysDef.cpp:1062 src/engine/sysDef.cpp:1532
|
||||||
|
#: src/engine/sysDef.cpp:1767 src/engine/sysDef.cpp:1888
|
||||||
|
#: src/engine/sysDef.cpp:1944 src/engine/sysDef.cpp:1945
|
||||||
|
#: src/gui/settings.cpp:4041
|
||||||
|
msgid "PCM"
|
||||||
|
msgstr "PCM"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:706
|
||||||
|
msgid "Sega Genesis/Mega Drive"
|
||||||
|
msgstr "Sega Genesis/Mega Drive"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:712
|
||||||
|
msgid "Sega Genesis Extended Channel 3"
|
||||||
|
msgstr "Sega Genesis Canal 3 Extendido"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:718 src/gui/sysConf.cpp:158
|
||||||
|
msgid "TI SN76489"
|
||||||
|
msgstr "TI SN76489"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:1135
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 1"
|
||||||
|
msgstr "Quadrada 1"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:1135
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 2"
|
||||||
|
msgstr "Quadrada 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:1135
|
||||||
|
#: src/engine/sysDef.cpp:1147 src/engine/sysDef.cpp:1160
|
||||||
|
#: src/engine/sysDef.cpp:1874 src/engine/sysDef.cpp:1931
|
||||||
|
msgid "Square 3"
|
||||||
|
msgstr "Quadrada 3"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:720 src/engine/sysDef.cpp:739
|
||||||
|
#: src/engine/sysDef.cpp:773 src/engine/sysDef.cpp:955
|
||||||
|
#: src/engine/sysDef.cpp:1314 src/engine/sysDef.cpp:1874
|
||||||
|
#: src/engine/sysDef.cpp:1920 src/engine/sysDef.cpp:2037
|
||||||
|
#: src/engine/sysDef.cpp:2100 src/gui/settings.cpp:4040
|
||||||
|
#: src/gui/insEdit.cpp:6978 src/gui/insEdit.cpp:7129 src/gui/insEdit.cpp:7223
|
||||||
|
#: src/gui/insEdit.cpp:7315
|
||||||
|
msgid "Noise"
|
||||||
|
msgstr "Ruído"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:731
|
||||||
|
msgid "Sega Master System + FM Expansion"
|
||||||
|
msgstr "Sega Master System + FM Expansion"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:737 src/gui/settings.cpp:3972
|
||||||
|
msgid "Game Boy"
|
||||||
|
msgstr "Game Boy"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:738
|
||||||
|
msgid "the most popular portable game console of the era."
|
||||||
|
msgstr "o console de jogos portátil mais popular da época"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/engine/sysDef.cpp:773
|
||||||
|
#: src/engine/sysDef.cpp:1062 src/engine/sysDef.cpp:2100
|
||||||
|
msgid "Pulse 1"
|
||||||
|
msgstr "Pulse 1"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/engine/sysDef.cpp:773
|
||||||
|
#: src/engine/sysDef.cpp:1062 src/engine/sysDef.cpp:2100
|
||||||
|
msgid "Pulse 2"
|
||||||
|
msgstr "Pulse 2"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:739 src/gui/settings.cpp:3877
|
||||||
|
#: src/gui/guiConst.cpp:1395 src/gui/insEdit.cpp:6652
|
||||||
|
msgid "Wavetable"
|
||||||
|
msgstr "Wavetable"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:746
|
||||||
|
msgid "11xx: Set noise length (0: long; 1: short)"
|
||||||
|
msgstr "11xx: Definir comprimento do ruído (0: longo; 1: curto)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:747
|
||||||
|
msgid "12xx: Set duty cycle (0 to 3)"
|
||||||
|
msgstr "12xx: Definir ciclo de trabalho (0 a 3)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:748
|
||||||
|
msgid "13xy: Setup sweep (x: time; y: shift)"
|
||||||
|
msgstr "13xy: Configurar varredura (x: tempo; y: deslocamento)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:749
|
||||||
|
msgid "14xx: Set sweep direction (0: up; 1: down)"
|
||||||
|
msgstr "14xx: Definir direção de varredura (0: para cima; 1: para baixo)"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:754
|
||||||
|
msgid "PC Engine/TurboGrafx-16"
|
||||||
|
msgstr "PC Engine/TurboGrafx-16"
|
||||||
|
|
||||||
|
#: src/engine/sysDef.cpp:755
|
||||||
|
msgid "an '80s game console with a wavetable sound chip, popular in Japan."
|
||||||
|
msgstr "um console de jogos dos anos 80 com chip de som wavetable, popular no Japão."
|
BIN
res/fonts/IBMPlexMono-Regular.otf
Normal file
BIN
res/fonts/IBMPlexMono-Regular.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
res/fonts/IBMPlexSans-Regular.otf
Normal file
BIN
res/fonts/IBMPlexSans-Regular.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
res/fonts/IBMPlexSansJP-Regular.otf
Normal file
BIN
res/fonts/IBMPlexSansJP-Regular.otf
Normal file
Binary file not shown.
BIN
res/fonts/IBMPlexSansKR-Regular.otf
Normal file
BIN
res/fonts/IBMPlexSansKR-Regular.otf
Normal file
Binary file not shown.
|
@ -4,8 +4,10 @@
|
||||||
fonts=(
|
fonts=(
|
||||||
"Exo-Medium.ttf" "font_exo" "papers/exo-license.txt" "font_exo.cpp"
|
"Exo-Medium.ttf" "font_exo" "papers/exo-license.txt" "font_exo.cpp"
|
||||||
"FontAwesome.otf" "iconFont" "Font Awesome by Dave Gandy - http://fontawesome.io" "font_icon.cpp"
|
"FontAwesome.otf" "iconFont" "Font Awesome by Dave Gandy - http://fontawesome.io" "font_icon.cpp"
|
||||||
"IBMPlexMono-Regular.ttf" "font_plexMono" "papers/ibm-plex-license.txt" "font_plexMono.cpp"
|
"IBMPlexMono-Regular.otf" "font_plexMono" "papers/ibm-plex-license.txt" "font_plexMono.cpp"
|
||||||
"IBMPlexSans-Regular.ttf" "font_plexSans" "papers/ibm-plex-license.txt" "font_plexSans.cpp"
|
"IBMPlexSans-Regular.otf" "font_plexSans" "papers/ibm-plex-license.txt" "font_plexSans.cpp"
|
||||||
|
"IBMPlexSansJP-Regular.otf" "font_plexSansJP" "papers/ibm-plex-license.txt" "font_plexSansJP.cpp"
|
||||||
|
"IBMPlexSansKR-Regular.otf" "font_plexSansKR" "papers/ibm-plex-license.txt" "font_plexSansKR.cpp"
|
||||||
"LiberationSans-Regular.ttf" "font_liberationSans" "papers/liberation-license.txt" "font_liberationSans.cpp"
|
"LiberationSans-Regular.ttf" "font_liberationSans" "papers/liberation-license.txt" "font_liberationSans.cpp"
|
||||||
"mononoki-Regular.ttf" "font_mononoki" "papers/mononoki-license.txt" "font_mononoki.cpp"
|
"mononoki-Regular.ttf" "font_mononoki" "papers/mononoki-license.txt" "font_mononoki.cpp"
|
||||||
"ProggyClean.ttf" "font_proggyClean" "papers/proggy-license.txt" "font_proggyClean.cpp"
|
"ProggyClean.ttf" "font_proggyClean" "papers/proggy-license.txt" "font_proggyClean.cpp"
|
||||||
|
|
BIN
res/tile.gif
BIN
res/tile.gif
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 21 KiB |
7
scripts/build-po.sh
Executable file
7
scripts/build-po.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
EXPORT_LANGS=("de" "es" "fr" "fi" "hy" "ko" "nl" "pl" "pt_BR" "ru" "sk" "sv" "th" "tr" "uk")
|
||||||
|
|
||||||
|
for i in ${EXPORT_LANGS[@]}; do
|
||||||
|
echo "compiling $i.po..."
|
||||||
|
mkdir -p "po/locale/$i/LC_MESSAGES/" && msgfmt "po/$i.po" -o "po/locale/$i/LC_MESSAGES/furnace.mo"
|
||||||
|
done
|
27
scripts/update-po.sh
Executable file
27
scripts/update-po.sh
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
FUR_VERSION="0.6.3"
|
||||||
|
|
||||||
|
EXPORT_LANGS=("de" "es" "fr" "fi" "hy" "ja" "ko" "nl" "pl" "pt_BR" "ru" "sk" "sv" "th" "tr" "uk")
|
||||||
|
|
||||||
|
echo '#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""' > po/furnace.pot
|
||||||
|
echo '"Project-Id-Version: furnace '"$FUR_VERSION"'\n"' >> po/furnace.pot
|
||||||
|
echo '"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
' >> po/furnace.pot
|
||||||
|
|
||||||
|
find src/ -type f -regex ".*\(cpp\|h\)$" | xargs xgettext --omit-header -k_ -k_N -L C++ --from-code=UTF-8 -j -o po/furnace.pot || exit 1
|
||||||
|
|
||||||
|
cd po
|
||||||
|
for i in ${EXPORT_LANGS[@]}; do
|
||||||
|
if [ -e "$i".po ]; then
|
||||||
|
echo "merging $i"".po..."
|
||||||
|
msgmerge --backup=none -U "$i".po furnace.pot
|
||||||
|
else
|
||||||
|
echo "creating $i"".po..."
|
||||||
|
msginit -i furnace.pot -l "$i".UTF-8 --no-translator
|
||||||
|
fi
|
||||||
|
done
|
|
@ -1,6 +1,6 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
int main(int, char**) {
|
int main(int argc, char** argv) {
|
||||||
struct dirent deTest = { };
|
struct dirent deTest = { };
|
||||||
unsigned char deType = deTest.d_type;
|
unsigned char deType = deTest.d_type;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
7
src/check/check_setlocale.c
Normal file
7
src/check/check_setlocale.c
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
setlocale(LC_CTYPE,"");
|
||||||
|
setlocale(LC_MESSAGES,"");
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
#include <sys/io.h>
|
#include <sys/io.h>
|
||||||
|
|
||||||
int main(int, char**) {
|
int main(int argc, char** argv) {
|
||||||
inb(0x61);
|
inb(0x61);
|
||||||
outb(0x00,0x61);
|
outb(0x00,0x61);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,124 +48,124 @@ void process(void* u, float** in, float** out, int inChans, int outChans, unsign
|
||||||
const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNull) {
|
const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNull) {
|
||||||
switch (effect) {
|
switch (effect) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
return "00xy: Arpeggio";
|
return _("00xy: Arpeggio");
|
||||||
case 0x01:
|
case 0x01:
|
||||||
return "01xx: Pitch slide up";
|
return _("01xx: Pitch slide up");
|
||||||
case 0x02:
|
case 0x02:
|
||||||
return "02xx: Pitch slide down";
|
return _("02xx: Pitch slide down");
|
||||||
case 0x03:
|
case 0x03:
|
||||||
return "03xx: Portamento";
|
return _("03xx: Portamento");
|
||||||
case 0x04:
|
case 0x04:
|
||||||
return "04xy: Vibrato (x: speed; y: depth)";
|
return _("04xy: Vibrato (x: speed; y: depth)");
|
||||||
case 0x05:
|
case 0x05:
|
||||||
return "05xy: Volume slide + vibrato (compatibility only!)";
|
return _("05xy: Volume slide + vibrato (compatibility only!)");
|
||||||
case 0x06:
|
case 0x06:
|
||||||
return "06xy: Volume slide + portamento (compatibility only!)";
|
return _("06xy: Volume slide + portamento (compatibility only!)");
|
||||||
case 0x07:
|
case 0x07:
|
||||||
return "07xy: Tremolo (x: speed; y: depth)";
|
return _("07xy: Tremolo (x: speed; y: depth)");
|
||||||
case 0x08:
|
case 0x08:
|
||||||
return "08xy: Set panning (x: left; y: right)";
|
return _("08xy: Set panning (x: left; y: right)");
|
||||||
case 0x09:
|
case 0x09:
|
||||||
return "09xx: Set groove pattern (speed 1 if no grooves exist)";
|
return _("09xx: Set groove pattern (speed 1 if no grooves exist)");
|
||||||
case 0x0a:
|
case 0x0a:
|
||||||
return "0Axy: Volume slide (0y: down; x0: up)";
|
return _("0Axy: Volume slide (0y: down; x0: up)");
|
||||||
case 0x0b:
|
case 0x0b:
|
||||||
return "0Bxx: Jump to pattern";
|
return _("0Bxx: Jump to pattern");
|
||||||
case 0x0c:
|
case 0x0c:
|
||||||
return "0Cxx: Retrigger";
|
return _("0Cxx: Retrigger");
|
||||||
case 0x0d:
|
case 0x0d:
|
||||||
return "0Dxx: Jump to next pattern";
|
return _("0Dxx: Jump to next pattern");
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
return "0Fxx: Set speed (speed 2 if no grooves exist)";
|
return _("0Fxx: Set speed (speed 2 if no grooves exist)");
|
||||||
case 0x80:
|
case 0x80:
|
||||||
return "80xx: Set panning (00: left; 80: center; FF: right)";
|
return _("80xx: Set panning (00: left; 80: center; FF: right)");
|
||||||
case 0x81:
|
case 0x81:
|
||||||
return "81xx: Set panning (left channel)";
|
return _("81xx: Set panning (left channel)");
|
||||||
case 0x82:
|
case 0x82:
|
||||||
return "82xx: Set panning (right channel)";
|
return _("82xx: Set panning (right channel)");
|
||||||
case 0x88:
|
case 0x88:
|
||||||
return "88xy: Set panning (rear channels; x: left; y: right)";
|
return _("88xy: Set panning (rear channels; x: left; y: right)");
|
||||||
break;
|
break;
|
||||||
case 0x89:
|
case 0x89:
|
||||||
return "89xx: Set panning (rear left channel)";
|
return _("89xx: Set panning (rear left channel)");
|
||||||
break;
|
break;
|
||||||
case 0x8a:
|
case 0x8a:
|
||||||
return "8Axx: Set panning (rear right channel)";
|
return _("8Axx: Set panning (rear right channel)");
|
||||||
break;
|
break;
|
||||||
case 0xc0: case 0xc1: case 0xc2: case 0xc3:
|
case 0xc0: case 0xc1: case 0xc2: case 0xc3:
|
||||||
return "Cxxx: Set tick rate (hz)";
|
return _("Cxxx: Set tick rate (hz)");
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
return "E0xx: Set arp speed";
|
return _("E0xx: Set arp speed");
|
||||||
case 0xe1:
|
case 0xe1:
|
||||||
return "E1xy: Note slide up (x: speed; y: semitones)";
|
return _("E1xy: Note slide up (x: speed; y: semitones)");
|
||||||
case 0xe2:
|
case 0xe2:
|
||||||
return "E2xy: Note slide down (x: speed; y: semitones)";
|
return _("E2xy: Note slide down (x: speed; y: semitones)");
|
||||||
case 0xe3:
|
case 0xe3:
|
||||||
return "E3xx: Set vibrato shape (0: up/down; 1: up only; 2: down only)";
|
return _("E3xx: Set vibrato shape (0: up/down; 1: up only; 2: down only)");
|
||||||
case 0xe4:
|
case 0xe4:
|
||||||
return "E4xx: Set vibrato range";
|
return _("E4xx: Set vibrato range");
|
||||||
case 0xe5:
|
case 0xe5:
|
||||||
return "E5xx: Set pitch (80: center)";
|
return _("E5xx: Set pitch (80: center)");
|
||||||
case 0xe6:
|
case 0xe6:
|
||||||
return "E6xy: Quick legato (x: time (0-7 up; 8-F down); y: semitones)";
|
return _("E6xy: Quick legato (x: time (0-7 up; 8-F down); y: semitones)");
|
||||||
case 0xe7:
|
case 0xe7:
|
||||||
return "E7xx: Macro release";
|
return _("E7xx: Macro release");
|
||||||
case 0xe8:
|
case 0xe8:
|
||||||
return "E8xy: Quick legato up (x: time; y: semitones)";
|
return _("E8xy: Quick legato up (x: time; y: semitones)");
|
||||||
case 0xe9:
|
case 0xe9:
|
||||||
return "E9xy: Quick legato down (x: time; y: semitones)";
|
return _("E9xy: Quick legato down (x: time; y: semitones)");
|
||||||
case 0xea:
|
case 0xea:
|
||||||
return "EAxx: Legato";
|
return _("EAxx: Legato");
|
||||||
case 0xeb:
|
case 0xeb:
|
||||||
return "EBxx: Set LEGACY sample mode bank";
|
return _("EBxx: Set LEGACY sample mode bank");
|
||||||
case 0xec:
|
case 0xec:
|
||||||
return "ECxx: Note cut";
|
return _("ECxx: Note cut");
|
||||||
case 0xed:
|
case 0xed:
|
||||||
return "EDxx: Note delay";
|
return _("EDxx: Note delay");
|
||||||
case 0xee:
|
case 0xee:
|
||||||
return "EExx: Send external command";
|
return _("EExx: Send external command");
|
||||||
case 0xf0:
|
case 0xf0:
|
||||||
return "F0xx: Set tick rate (bpm)";
|
return _("F0xx: Set tick rate (bpm)");
|
||||||
case 0xf1:
|
case 0xf1:
|
||||||
return "F1xx: Single tick note slide up";
|
return _("F1xx: Single tick note slide up");
|
||||||
case 0xf2:
|
case 0xf2:
|
||||||
return "F2xx: Single tick note slide down";
|
return _("F2xx: Single tick note slide down");
|
||||||
case 0xf3:
|
case 0xf3:
|
||||||
return "F3xx: Fine volume slide up";
|
return _("F3xx: Fine volume slide up");
|
||||||
case 0xf4:
|
case 0xf4:
|
||||||
return "F4xx: Fine volume slide down";
|
return _("F4xx: Fine volume slide down");
|
||||||
case 0xf5:
|
case 0xf5:
|
||||||
return "F5xx: Disable macro (see manual)";
|
return _("F5xx: Disable macro (see manual)");
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
return "F6xx: Enable macro (see manual)";
|
return _("F6xx: Enable macro (see manual)");
|
||||||
case 0xf7:
|
case 0xf7:
|
||||||
return "F7xx: Restart macro (see manual)";
|
return _("F7xx: Restart macro (see manual)");
|
||||||
case 0xf8:
|
case 0xf8:
|
||||||
return "F8xx: Single tick volume slide up";
|
return _("F8xx: Single tick volume slide up");
|
||||||
case 0xf9:
|
case 0xf9:
|
||||||
return "F9xx: Single tick volume slide down";
|
return _("F9xx: Single tick volume slide down");
|
||||||
case 0xfa:
|
case 0xfa:
|
||||||
return "FAxx: Fast volume slide (0y: down; x0: up)";
|
return _("FAxx: Fast volume slide (0y: down; x0: up)");
|
||||||
case 0xfc:
|
case 0xfc:
|
||||||
return "FCxx: Note release";
|
return _("FCxx: Note release");
|
||||||
case 0xfd:
|
case 0xfd:
|
||||||
return "FDxx: Set virtual tempo numerator";
|
return _("FDxx: Set virtual tempo numerator");
|
||||||
case 0xfe:
|
case 0xfe:
|
||||||
return "FExx: Set virtual tempo denominator";
|
return _("FExx: Set virtual tempo denominator");
|
||||||
case 0xff:
|
case 0xff:
|
||||||
return "FFxx: Stop song";
|
return _("FFxx: Stop song");
|
||||||
default:
|
default:
|
||||||
if ((effect&0xf0)==0x90) {
|
if ((effect&0xf0)==0x90) {
|
||||||
if (song.oldSampleOffset) {
|
if (song.oldSampleOffset) {
|
||||||
return "9xxx: Set sample offset*256";
|
return _("9xxx: Set sample offset*256");
|
||||||
}
|
}
|
||||||
switch (effect) {
|
switch (effect) {
|
||||||
case 0x90:
|
case 0x90:
|
||||||
return "90xx: Set sample offset (first byte)";
|
return _("90xx: Set sample offset (first byte)");
|
||||||
case 0x91:
|
case 0x91:
|
||||||
return "91xx: Set sample offset (second byte, ×256)";
|
return _("91xx: Set sample offset (second byte, ×256)");
|
||||||
case 0x92:
|
case 0x92:
|
||||||
return "92xx: Set sample offset (third byte, ×65536)";
|
return _("92xx: Set sample offset (third byte, ×65536)");
|
||||||
}
|
}
|
||||||
} else if (chan>=0 && chan<chans) {
|
} else if (chan>=0 && chan<chans) {
|
||||||
DivSysDef* sysDef=sysDefs[sysOfChan[chan]];
|
DivSysDef* sysDef=sysDefs[sysOfChan[chan]];
|
||||||
|
@ -184,7 +184,7 @@ const char* DivEngine::getEffectDesc(unsigned char effect, int chan, bool notNul
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return notNull?"Invalid effect":NULL;
|
return notNull?_("Invalid effect"):NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivEngine::walkSong(int& loopOrder, int& loopRow, int& loopEnd) {
|
void DivEngine::walkSong(int& loopOrder, int& loopRow, int& loopEnd) {
|
||||||
|
@ -351,43 +351,43 @@ int DivEngine::loadSampleROM(String path, ssize_t expectedSize, unsigned char*&
|
||||||
}
|
}
|
||||||
if (fseek(f,0,SEEK_END)<0) {
|
if (fseek(f,0,SEEK_END)<0) {
|
||||||
logE("size error: %s",strerror(errno));
|
logE("size error: %s",strerror(errno));
|
||||||
lastError=fmt::sprintf("on seek: %s",strerror(errno));
|
lastError=fmt::sprintf(_("on seek: %s"),strerror(errno));
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ssize_t len=ftell(f);
|
ssize_t len=ftell(f);
|
||||||
if (len==(SIZE_MAX>>1)) {
|
if (len==(SIZE_MAX>>1)) {
|
||||||
logE("could not get file length: %s",strerror(errno));
|
logE("could not get file length: %s",strerror(errno));
|
||||||
lastError=fmt::sprintf("on pre tell: %s",strerror(errno));
|
lastError=fmt::sprintf(_("on pre tell: %s"),strerror(errno));
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (len<1) {
|
if (len<1) {
|
||||||
if (len==0) {
|
if (len==0) {
|
||||||
logE("that file is empty!");
|
logE("that file is empty!");
|
||||||
lastError="file is empty";
|
lastError=_("file is empty");
|
||||||
} else {
|
} else {
|
||||||
logE("tell error: %s",strerror(errno));
|
logE("tell error: %s",strerror(errno));
|
||||||
lastError=fmt::sprintf("on tell: %s",strerror(errno));
|
lastError=fmt::sprintf(_("on tell: %s"),strerror(errno));
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (len!=expectedSize) {
|
if (len!=expectedSize) {
|
||||||
logE("ROM size mismatch, expected: %d bytes, was: %d bytes", expectedSize, len);
|
logE("ROM size mismatch, expected: %d bytes, was: %d bytes", expectedSize, len);
|
||||||
lastError=fmt::sprintf("ROM size mismatch, expected: %d bytes, was: %d", expectedSize, len);
|
lastError=fmt::sprintf(_("ROM size mismatch, expected: %d bytes, was: %d"), expectedSize, len);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (fseek(f,0,SEEK_SET)<0) {
|
if (fseek(f,0,SEEK_SET)<0) {
|
||||||
logE("size error: %s",strerror(errno));
|
logE("size error: %s",strerror(errno));
|
||||||
lastError=fmt::sprintf("on get size: %s",strerror(errno));
|
lastError=fmt::sprintf(_("on get size: %s"),strerror(errno));
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
unsigned char* file=new unsigned char[len];
|
unsigned char* file=new unsigned char[len];
|
||||||
if (fread(file,1,(size_t)len,f)!=(size_t)len) {
|
if (fread(file,1,(size_t)len,f)!=(size_t)len) {
|
||||||
logE("read error: %s",strerror(errno));
|
logE("read error: %s",strerror(errno));
|
||||||
lastError=fmt::sprintf("on read: %s",strerror(errno));
|
lastError=fmt::sprintf(_("on read: %s"),strerror(errno));
|
||||||
fclose(f);
|
fclose(f);
|
||||||
delete[] file;
|
delete[] file;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1073,11 +1073,11 @@ void DivEngine::delUnusedSamples() {
|
||||||
|
|
||||||
bool DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
|
bool DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
|
||||||
if (index<0 || index>=song.systemLen) {
|
if (index<0 || index>=song.systemLen) {
|
||||||
lastError="invalid index";
|
lastError=_("invalid index");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (chans-getChannelCount(song.system[index])+getChannelCount(which)>DIV_MAX_CHANS) {
|
if (chans-getChannelCount(song.system[index])+getChannelCount(which)>DIV_MAX_CHANS) {
|
||||||
lastError=fmt::sprintf("max number of total channels is %d",DIV_MAX_CHANS);
|
lastError=fmt::sprintf(_("max number of total channels is %d"),DIV_MAX_CHANS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1128,11 +1128,11 @@ bool DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) {
|
||||||
|
|
||||||
bool DivEngine::addSystem(DivSystem which) {
|
bool DivEngine::addSystem(DivSystem which) {
|
||||||
if (song.systemLen>=DIV_MAX_CHIPS) {
|
if (song.systemLen>=DIV_MAX_CHIPS) {
|
||||||
lastError=fmt::sprintf("max number of systems is %d",DIV_MAX_CHIPS);
|
lastError=fmt::sprintf(_("max number of systems is %d"),DIV_MAX_CHIPS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (chans+getChannelCount(which)>DIV_MAX_CHANS) {
|
if (chans+getChannelCount(which)>DIV_MAX_CHANS) {
|
||||||
lastError=fmt::sprintf("max number of total channels is %d",DIV_MAX_CHANS);
|
lastError=fmt::sprintf(_("max number of total channels is %d"),DIV_MAX_CHANS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
quitDispatch();
|
quitDispatch();
|
||||||
|
@ -1178,15 +1178,15 @@ bool DivEngine::addSystem(DivSystem which) {
|
||||||
|
|
||||||
bool DivEngine::duplicateSystem(int index, bool pat, bool end) {
|
bool DivEngine::duplicateSystem(int index, bool pat, bool end) {
|
||||||
if (index<0 || index>=song.systemLen) {
|
if (index<0 || index>=song.systemLen) {
|
||||||
lastError="invalid index";
|
lastError=_("invalid index");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (song.systemLen>=DIV_MAX_CHIPS) {
|
if (song.systemLen>=DIV_MAX_CHIPS) {
|
||||||
lastError=fmt::sprintf("max number of systems is %d",DIV_MAX_CHIPS);
|
lastError=fmt::sprintf(_("max number of systems is %d"),DIV_MAX_CHIPS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (chans+getChannelCount(song.system[index])>DIV_MAX_CHANS) {
|
if (chans+getChannelCount(song.system[index])>DIV_MAX_CHANS) {
|
||||||
lastError=fmt::sprintf("max number of total channels is %d",DIV_MAX_CHANS);
|
lastError=fmt::sprintf(_("max number of total channels is %d"),DIV_MAX_CHANS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
quitDispatch();
|
quitDispatch();
|
||||||
|
@ -1283,11 +1283,11 @@ bool DivEngine::duplicateSystem(int index, bool pat, bool end) {
|
||||||
// TODO: maybe issue with subsongs?
|
// TODO: maybe issue with subsongs?
|
||||||
bool DivEngine::removeSystem(int index, bool preserveOrder) {
|
bool DivEngine::removeSystem(int index, bool preserveOrder) {
|
||||||
if (song.systemLen<=1) {
|
if (song.systemLen<=1) {
|
||||||
lastError="cannot remove the last one";
|
lastError=_("cannot remove the last one");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (index<0 || index>=song.systemLen) {
|
if (index<0 || index>=song.systemLen) {
|
||||||
lastError="invalid index";
|
lastError=_("invalid index");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int chanCount=chans;
|
int chanCount=chans;
|
||||||
|
@ -1457,15 +1457,15 @@ void DivEngine::swapSystemUnsafe(int src, int dest, bool preserveOrder) {
|
||||||
|
|
||||||
bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
|
bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
|
||||||
if (src==dest) {
|
if (src==dest) {
|
||||||
lastError="source and destination are equal";
|
lastError=_("source and destination are equal");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (src<0 || src>=song.systemLen) {
|
if (src<0 || src>=song.systemLen) {
|
||||||
lastError="invalid source index";
|
lastError=_("invalid source index");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (dest<0 || dest>=song.systemLen) {
|
if (dest<0 || dest>=song.systemLen) {
|
||||||
lastError="invalid destination index";
|
lastError=_("invalid destination index");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//int chanCount=chans;
|
//int chanCount=chans;
|
||||||
|
@ -2633,7 +2633,7 @@ int DivEngine::addInstrument(int refChan, DivInstrumentType fallbackType) {
|
||||||
*ins=song.nullInsQSound;
|
*ins=song.nullInsQSound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ins->name=fmt::sprintf("Instrument %d",insCount);
|
ins->name=fmt::sprintf(_("Instrument %d"),insCount);
|
||||||
if (prefType!=DIV_INS_NULL) {
|
if (prefType!=DIV_INS_NULL) {
|
||||||
ins->type=prefType;
|
ins->type=prefType;
|
||||||
}
|
}
|
||||||
|
@ -2707,7 +2707,7 @@ void DivEngine::delInstrument(int index) {
|
||||||
|
|
||||||
int DivEngine::addWave() {
|
int DivEngine::addWave() {
|
||||||
if (song.wave.size()>=256) {
|
if (song.wave.size()>=256) {
|
||||||
lastError="too many wavetables!";
|
lastError=_("too many wavetables!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
BUSY_BEGIN;
|
BUSY_BEGIN;
|
||||||
|
@ -2724,7 +2724,7 @@ int DivEngine::addWave() {
|
||||||
|
|
||||||
int DivEngine::addWavePtr(DivWavetable* which) {
|
int DivEngine::addWavePtr(DivWavetable* which) {
|
||||||
if (song.wave.size()>=256) {
|
if (song.wave.size()>=256) {
|
||||||
lastError="too many wavetables!";
|
lastError=_("too many wavetables!");
|
||||||
delete which;
|
delete which;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -2749,35 +2749,35 @@ DivWavetable* DivEngine::waveFromFile(const char* path, bool addRaw) {
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
if (fseek(f,0,SEEK_END)!=0) {
|
if (fseek(f,0,SEEK_END)!=0) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
lastError=fmt::sprintf("could not seek to end: %s",strerror(errno));
|
lastError=fmt::sprintf(_("could not seek to end: %s"),strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
len=ftell(f);
|
len=ftell(f);
|
||||||
if (len<0) {
|
if (len<0) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
lastError=fmt::sprintf("could not determine file size: %s",strerror(errno));
|
lastError=fmt::sprintf(_("could not determine file size: %s"),strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (len==(SIZE_MAX>>1)) {
|
if (len==(SIZE_MAX>>1)) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
lastError="file size is invalid!";
|
lastError=_("file size is invalid!");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (len==0) {
|
if (len==0) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
lastError="file is empty";
|
lastError=_("file is empty");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (fseek(f,0,SEEK_SET)!=0) {
|
if (fseek(f,0,SEEK_SET)!=0) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
lastError=fmt::sprintf("could not seek to beginning: %s",strerror(errno));
|
lastError=fmt::sprintf(_("could not seek to beginning: %s"),strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buf=new unsigned char[len];
|
buf=new unsigned char[len];
|
||||||
if (fread(buf,1,len,f)!=(size_t)len) {
|
if (fread(buf,1,len,f)!=(size_t)len) {
|
||||||
logW("did not read entire wavetable file buffer!");
|
logW("did not read entire wavetable file buffer!");
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
lastError=fmt::sprintf("could not read entire file: %s",strerror(errno));
|
lastError=fmt::sprintf(_("could not read entire file: %s"),strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -2803,7 +2803,7 @@ DivWavetable* DivEngine::waveFromFile(const char* path, bool addRaw) {
|
||||||
reader.readS(); // reserved
|
reader.readS(); // reserved
|
||||||
reader.seek(20,SEEK_SET);
|
reader.seek(20,SEEK_SET);
|
||||||
if (wave->readWaveData(reader,version)!=DIV_DATA_SUCCESS) {
|
if (wave->readWaveData(reader,version)!=DIV_DATA_SUCCESS) {
|
||||||
lastError="invalid wavetable header/data!";
|
lastError=_("invalid wavetable header/data!");
|
||||||
delete wave;
|
delete wave;
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2874,7 +2874,7 @@ DivWavetable* DivEngine::waveFromFile(const char* path, bool addRaw) {
|
||||||
} catch (EndOfFileException& e) {
|
} catch (EndOfFileException& e) {
|
||||||
delete wave;
|
delete wave;
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
lastError="premature end of file";
|
lastError=_("premature end of file");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2901,14 +2901,14 @@ void DivEngine::delWave(int index) {
|
||||||
|
|
||||||
int DivEngine::addSample() {
|
int DivEngine::addSample() {
|
||||||
if (song.sample.size()>=256) {
|
if (song.sample.size()>=256) {
|
||||||
lastError="too many samples!";
|
lastError=_("too many samples!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
BUSY_BEGIN;
|
BUSY_BEGIN;
|
||||||
saveLock.lock();
|
saveLock.lock();
|
||||||
DivSample* sample=new DivSample;
|
DivSample* sample=new DivSample;
|
||||||
int sampleCount=(int)song.sample.size();
|
int sampleCount=(int)song.sample.size();
|
||||||
sample->name=fmt::sprintf("Sample %d",sampleCount);
|
sample->name=fmt::sprintf(_("Sample %d"),sampleCount);
|
||||||
song.sample.push_back(sample);
|
song.sample.push_back(sample);
|
||||||
song.sampleLen=sampleCount+1;
|
song.sampleLen=sampleCount+1;
|
||||||
sPreview.sample=-1;
|
sPreview.sample=-1;
|
||||||
|
@ -2923,7 +2923,7 @@ int DivEngine::addSample() {
|
||||||
|
|
||||||
int DivEngine::addSamplePtr(DivSample* which) {
|
int DivEngine::addSamplePtr(DivSample* which) {
|
||||||
if (song.sample.size()>=256) {
|
if (song.sample.size()>=256) {
|
||||||
lastError="too many samples!";
|
lastError=_("too many samples!");
|
||||||
delete which;
|
delete which;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -3053,7 +3053,7 @@ void DivEngine::deepCloneOrder(int pos, bool where) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (didNotFind) {
|
if (didNotFind) {
|
||||||
addWarning(fmt::sprintf("no free patterns in channel %d!",i));
|
addWarning(fmt::sprintf(_("no free patterns in channel %d!"),i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (where) { // at the end
|
if (where) { // at the end
|
||||||
|
@ -3956,15 +3956,24 @@ bool DivEngine::deinitAudioBackend(bool dueToSwitchMaster) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DivEngine::preInit(bool noSafeMode) {
|
bool DivEngine::prePreInit() {
|
||||||
bool wantSafe=false;
|
|
||||||
// register systems
|
|
||||||
if (!systemsRegistered) registerSystems();
|
|
||||||
|
|
||||||
// init config
|
// init config
|
||||||
initConfDir();
|
initConfDir();
|
||||||
logD("config path: %s",configPath.c_str());
|
logD("config path: %s",configPath.c_str());
|
||||||
|
|
||||||
|
configLoaded=true;
|
||||||
|
return loadConf();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DivEngine::preInit(bool noSafeMode) {
|
||||||
|
bool wantSafe=false;
|
||||||
|
if (!configLoaded) prePreInit();
|
||||||
|
|
||||||
|
logI("Furnace version " DIV_VERSION ".");
|
||||||
|
|
||||||
|
// register systems
|
||||||
|
if (!systemsRegistered) registerSystems();
|
||||||
|
|
||||||
// TODO: re-enable with a better approach
|
// TODO: re-enable with a better approach
|
||||||
// see issue #1581
|
// see issue #1581
|
||||||
/*
|
/*
|
||||||
|
@ -3979,10 +3988,6 @@ bool DivEngine::preInit(bool noSafeMode) {
|
||||||
String logPath=configPath+DIR_SEPARATOR_STR+"furnace.log";
|
String logPath=configPath+DIR_SEPARATOR_STR+"furnace.log";
|
||||||
startLogFile(logPath.c_str());
|
startLogFile(logPath.c_str());
|
||||||
|
|
||||||
logI("Furnace version " DIV_VERSION ".");
|
|
||||||
|
|
||||||
loadConf();
|
|
||||||
|
|
||||||
if (!conf.has("opn1Core")) {
|
if (!conf.has("opn1Core")) {
|
||||||
if (conf.has("opnCore")) {
|
if (conf.has("opnCore")) {
|
||||||
conf.set("opn1Core",conf.getString("opnCore",""));
|
conf.set("opn1Core",conf.getString("opnCore",""));
|
||||||
|
|
|
@ -430,6 +430,7 @@ class DivEngine {
|
||||||
String exportPath;
|
String exportPath;
|
||||||
std::thread* exportThread;
|
std::thread* exportThread;
|
||||||
int chans;
|
int chans;
|
||||||
|
bool configLoaded;
|
||||||
bool active;
|
bool active;
|
||||||
bool lowQuality;
|
bool lowQuality;
|
||||||
bool dcHiPass;
|
bool dcHiPass;
|
||||||
|
@ -1295,6 +1296,9 @@ class DivEngine {
|
||||||
// quit dispatch
|
// quit dispatch
|
||||||
void quitDispatch();
|
void quitDispatch();
|
||||||
|
|
||||||
|
// pre-pre-initialize the engine.
|
||||||
|
bool prePreInit();
|
||||||
|
|
||||||
// pre-initialize the engine. returns whether Furnace should run in safe mode.
|
// pre-initialize the engine. returns whether Furnace should run in safe mode.
|
||||||
bool preInit(bool noSafeMode=true);
|
bool preInit(bool noSafeMode=true);
|
||||||
|
|
||||||
|
@ -1315,6 +1319,7 @@ class DivEngine {
|
||||||
output(NULL),
|
output(NULL),
|
||||||
exportThread(NULL),
|
exportThread(NULL),
|
||||||
chans(0),
|
chans(0),
|
||||||
|
configLoaded(false),
|
||||||
active(false),
|
active(false),
|
||||||
lowQuality(false),
|
lowQuality(false),
|
||||||
dcHiPass(true),
|
dcHiPass(true),
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -23,25 +23,25 @@
|
||||||
|
|
||||||
const char* aboutLine[]={
|
const char* aboutLine[]={
|
||||||
"tildearrow",
|
"tildearrow",
|
||||||
"is proud to present",
|
_N("is proud to present"),
|
||||||
"",
|
"",
|
||||||
("Furnace " DIV_VERSION),
|
("Furnace " DIV_VERSION),
|
||||||
"",
|
"",
|
||||||
"the biggest multi-system chiptune tracker!",
|
_N("the biggest multi-system chiptune tracker!"),
|
||||||
"featuring DefleMask song compatibility.",
|
_N("featuring DefleMask song compatibility."),
|
||||||
"",
|
"",
|
||||||
"> CREDITS <",
|
_N("> CREDITS <"),
|
||||||
"",
|
"",
|
||||||
"-- program --",
|
_N("-- program --"),
|
||||||
"tildearrow",
|
"tildearrow",
|
||||||
"A M 4 N (intro tune)",
|
_N("A M 4 N (intro tune)"),
|
||||||
"akumanatt",
|
"akumanatt",
|
||||||
"cam900",
|
"cam900",
|
||||||
"djtuBIG-MaliceX",
|
"djtuBIG-MaliceX",
|
||||||
"Eknous",
|
"Eknous",
|
||||||
"Kagamiin~",
|
"Kagamiin~",
|
||||||
"laoo",
|
"laoo",
|
||||||
"LTVA1",
|
"LTVA",
|
||||||
"MooingLemur",
|
"MooingLemur",
|
||||||
"OPNA2608",
|
"OPNA2608",
|
||||||
"scratchminer",
|
"scratchminer",
|
||||||
|
@ -49,14 +49,14 @@ const char* aboutLine[]={
|
||||||
"System64",
|
"System64",
|
||||||
"techmetx11",
|
"techmetx11",
|
||||||
"",
|
"",
|
||||||
"-- graphics/UI design --",
|
_N("-- graphics/UI design --"),
|
||||||
"tildearrow",
|
"tildearrow",
|
||||||
"BlastBrothers",
|
"BlastBrothers",
|
||||||
"Electric Keet",
|
"Electric Keet",
|
||||||
"Mahbod Karamoozian",
|
"Mahbod Karamoozian",
|
||||||
"Raijin",
|
"Raijin",
|
||||||
"",
|
"",
|
||||||
"-- documentation --",
|
_N("-- documentation --"),
|
||||||
"brickblock369",
|
"brickblock369",
|
||||||
"cam900",
|
"cam900",
|
||||||
"DeMOSic",
|
"DeMOSic",
|
||||||
|
@ -66,7 +66,19 @@ const char* aboutLine[]={
|
||||||
"Lunathir",
|
"Lunathir",
|
||||||
"tildearrow",
|
"tildearrow",
|
||||||
"",
|
"",
|
||||||
"-- demo songs --",
|
_N("-- localization/translation team --"),
|
||||||
|
"Español: CrimsonZN, ThaCuber, tildearrow",
|
||||||
|
"Հայերեն: Eknous",
|
||||||
|
"한국어: Heemin, leejh20",
|
||||||
|
"Nederlands: Lunathir",
|
||||||
|
"Polski: freq-mod, PoznańskiSzybkowiec",
|
||||||
|
"Português (Brasil): Kagamiin~",
|
||||||
|
"Русский: Background2982, LTVA",
|
||||||
|
"Slovenčina: Mr. Hassium",
|
||||||
|
"Svenska: RevvoBolt",
|
||||||
|
"ไทย: akumanatt",
|
||||||
|
"",
|
||||||
|
_N("-- demo songs --"),
|
||||||
"0x5066",
|
"0x5066",
|
||||||
"Abstract 64",
|
"Abstract 64",
|
||||||
"Aburtos",
|
"Aburtos",
|
||||||
|
@ -121,7 +133,7 @@ const char* aboutLine[]={
|
||||||
"Laggy",
|
"Laggy",
|
||||||
"leejh20",
|
"leejh20",
|
||||||
"LovelyA72",
|
"LovelyA72",
|
||||||
"LTVA1",
|
"LTVA",
|
||||||
"LunaMoth",
|
"LunaMoth",
|
||||||
"Lunathir",
|
"Lunathir",
|
||||||
"LVintageNerd",
|
"LVintageNerd",
|
||||||
|
@ -192,7 +204,7 @@ const char* aboutLine[]={
|
||||||
"Zaxolotl",
|
"Zaxolotl",
|
||||||
"ZoomTen (Zumi)",
|
"ZoomTen (Zumi)",
|
||||||
"",
|
"",
|
||||||
"-- additional feedback/fixes --",
|
_N("-- additional feedback/fixes --"),
|
||||||
"Electric Keet",
|
"Electric Keet",
|
||||||
"fd",
|
"fd",
|
||||||
"GENATARi",
|
"GENATARi",
|
||||||
|
@ -203,106 +215,117 @@ const char* aboutLine[]={
|
||||||
"plane",
|
"plane",
|
||||||
"TheEssem",
|
"TheEssem",
|
||||||
"",
|
"",
|
||||||
"-- Metal backend test team --",
|
_N("-- Metal backend test team --"),
|
||||||
"Diggo",
|
"Diggo",
|
||||||
"konard",
|
"konard",
|
||||||
"NaxeCode",
|
"NaxeCode",
|
||||||
"scratchminer",
|
"scratchminer",
|
||||||
"",
|
"",
|
||||||
"powered by:",
|
_N("-- DirectX 9 backend test team --"),
|
||||||
"Dear ImGui by Omar Cornut",
|
"EpicTyphlosion",
|
||||||
"SDL2 by Sam Lantinga",
|
"Lunathir",
|
||||||
|
"Mr. Hassium",
|
||||||
|
"wbcbz7",
|
||||||
|
"Yuzu4K",
|
||||||
|
"",
|
||||||
|
_N("powered by:"),
|
||||||
|
_N("Dear ImGui by Omar Cornut"),
|
||||||
|
_N("SDL2 by Sam Lantinga"),
|
||||||
#ifdef HAVE_FREETYPE
|
#ifdef HAVE_FREETYPE
|
||||||
"FreeType",
|
"FreeType",
|
||||||
#endif
|
#endif
|
||||||
"zlib by Jean-loup Gailly",
|
_N("zlib by Jean-loup Gailly"),
|
||||||
"and Mark Adler",
|
_N("and Mark Adler"),
|
||||||
"libsndfile by Erik de Castro Lopo",
|
_N("libsndfile by Erik de Castro Lopo"),
|
||||||
"Portable File Dialogs by Sam Hocevar",
|
_N("Portable File Dialogs by Sam Hocevar"),
|
||||||
"Native File Dialog by Frogtoss Games",
|
_N("Native File Dialog by Frogtoss Games"),
|
||||||
"PortAudio",
|
"PortAudio",
|
||||||
"Weak-JACK by x42",
|
_N("Weak-JACK by x42"),
|
||||||
"RtMidi by Gary P. Scavone",
|
_N("RtMidi by Gary P. Scavone"),
|
||||||
"FFTW by Matteo Frigo and Steven G. Johnson",
|
_N("FFTW by Matteo Frigo and Steven G. Johnson"),
|
||||||
"backward-cpp by Google",
|
_N("backward-cpp by Google"),
|
||||||
"adpcm by superctr",
|
_N("adpcm by superctr"),
|
||||||
"adpcm-xq by David Bryant",
|
_N("adpcm-xq by David Bryant"),
|
||||||
"Nuked-OPL3/OPLL/OPM/OPN2/PSG by nukeykt",
|
_N("Nuked-OPL3/OPLL/OPM/OPN2/PSG by nukeykt"),
|
||||||
"YM3812-LLE, YMF262-LLE, YMF276-LLE and YM2608-LLE by nukeykt",
|
_N("YM3812-LLE, YMF262-LLE, YMF276-LLE and YM2608-LLE by nukeykt"),
|
||||||
"ESFMu (modified version) by Kagamiin~",
|
_N("ESFMu (modified version) by Kagamiin~"),
|
||||||
"ymfm by Aaron Giles",
|
_N("ymfm by Aaron Giles"),
|
||||||
"emu2413 by Digital Sound Antiques",
|
_N("emu2413 by Digital Sound Antiques"),
|
||||||
"MAME SN76496 by Nicola Salmoria",
|
_N("MAME SN76496 by Nicola Salmoria"),
|
||||||
"MAME AY-3-8910 by Couriersud",
|
_N("MAME AY-3-8910 by Couriersud"),
|
||||||
"with AY8930 fixes by Eulous, cam900 and Grauw",
|
_N("with AY8930 fixes by Eulous, cam900 and Grauw"),
|
||||||
"MAME SAA1099 by Juergen Buchmueller and Manuel Abadia",
|
_N("MAME SAA1099 by Juergen Buchmueller and Manuel Abadia"),
|
||||||
"MAME Namco WSG by Nicola Salmoria and Aaron Giles",
|
_N("MAME Namco WSG by Nicola Salmoria and Aaron Giles"),
|
||||||
"MAME RF5C68 core by Olivier Galibert and Aaron Giles",
|
_N("MAME RF5C68 core by Olivier Galibert and Aaron Giles"),
|
||||||
"MAME MSM5232 core by Jarek Burczynski and Hiromitsu Shioya",
|
_N("MAME MSM5232 core by Jarek Burczynski and Hiromitsu Shioya"),
|
||||||
"MAME MSM6258 core by Barry Rodewald",
|
_N("MAME MSM6258 core by Barry Rodewald"),
|
||||||
"MAME YMZ280B core by Aaron Giles",
|
_N("MAME YMZ280B core by Aaron Giles"),
|
||||||
"MAME GA20 core by Acho A. Tang and R. Belmont",
|
_N("MAME GA20 core by Acho A. Tang and R. Belmont"),
|
||||||
"MAME SegaPCM core by Hiromitsu Shioya and Olivier Galibert",
|
_N("MAME SegaPCM core by Hiromitsu Shioya and Olivier Galibert"),
|
||||||
"SAASound by Dave Hooper and Simon Owen",
|
_N("SAASound by Dave Hooper and Simon Owen"),
|
||||||
"SameBoy by Lior Halphon",
|
_N("SameBoy by Lior Halphon"),
|
||||||
"Mednafen PCE, WonderSwan, T6W28 and Virtual Boy audio cores",
|
_N("Mednafen PCE, WonderSwan, T6W28 and Virtual Boy audio cores"),
|
||||||
"SNES DSP core by Blargg",
|
_N("SNES DSP core by Blargg"),
|
||||||
"puNES (NES, MMC5 and FDS) by FHorse",
|
_N("puNES (NES, MMC5 and FDS) by FHorse"),
|
||||||
"NSFPlay (NES and FDS) by Brad Smith and Brezza",
|
_N("NSFPlay (NES and FDS) by Brad Smith and Brezza"),
|
||||||
"reSID by Dag Lem",
|
_N("reSID by Dag Lem"),
|
||||||
"reSIDfp by Dag Lem, Antti Lankila",
|
_N("reSIDfp by Dag Lem, Antti Lankila"),
|
||||||
"and Leandro Nini",
|
_N("and Leandro Nini"),
|
||||||
"dSID by DefleMask Team based on jsSID",
|
_N("dSID by DefleMask Team based on jsSID"),
|
||||||
"Stella by Stella Team",
|
_N("Stella by Stella Team"),
|
||||||
"QSound emulator by superctr and Valley Bell",
|
_N("QSound emulator by superctr and Valley Bell"),
|
||||||
"VICE VIC-20 sound core by Rami Rasanen and viznut",
|
_N("VICE VIC-20 sound core by Rami Rasanen and viznut"),
|
||||||
"VICE TED sound core by Andreas Boose, Tibor Biczo",
|
_N("VICE TED sound core by Andreas Boose, Tibor Biczo"),
|
||||||
"and Marco van den Heuvel",
|
_N("and Marco van den Heuvel"),
|
||||||
"VERA sound core by Frank van den Hoef",
|
_N("VERA sound core by Frank van den Hoef"),
|
||||||
"mzpokeysnd POKEY emulator by Michael Borisov",
|
_N("mzpokeysnd POKEY emulator by Michael Borisov"),
|
||||||
"ASAP POKEY emulator by Piotr Fusik",
|
_N("ASAP POKEY emulator by Piotr Fusik"),
|
||||||
"ported by laoo to C++",
|
_N("ported by laoo to C++"),
|
||||||
"vgsound_emu (second version, modified version) by cam900",
|
_N("vgsound_emu (second version, modified version) by cam900"),
|
||||||
"SM8521 emulator (modified version) by cam900",
|
_N("SM8521 emulator (modified version) by cam900"),
|
||||||
"D65010G031 emulator (modified version) by cam900",
|
_N("D65010G031 emulator (modified version) by cam900"),
|
||||||
"Namco C140/C219 emulator (modified version) by cam900",
|
_N("Namco C140/C219 emulator (modified version) by cam900"),
|
||||||
"PowerNoise emulator by scratchminer",
|
_N("PowerNoise emulator by scratchminer"),
|
||||||
"ep128emu by Istvan Varga",
|
_N("ep128emu by Istvan Varga"),
|
||||||
"NDS sound emulator by cam900",
|
_N("NDS sound emulator by cam900"),
|
||||||
"",
|
"",
|
||||||
"greetings to:",
|
_N("greetings to:"),
|
||||||
"NEOART Costa Rica",
|
"NEOART Costa Rica",
|
||||||
"Xenium Demoparty",
|
"Xenium Demoparty",
|
||||||
"all members of Deflers of Noice!",
|
_N("all members of Deflers of Noice!"),
|
||||||
"",
|
"",
|
||||||
"copyright © 2021-2024 tildearrow",
|
"fuckings to:",
|
||||||
"(and contributors).",
|
"cream",
|
||||||
"licensed under GPLv2+! see",
|
"Monsia",
|
||||||
"LICENSE for more information.",
|
|
||||||
"",
|
"",
|
||||||
"help Furnace grow:",
|
_N("copyright © 2021-2024 tildearrow"),
|
||||||
|
_N("(and contributors)."),
|
||||||
|
_N("licensed under GPLv2+! see"),
|
||||||
|
_N("LICENSE for more information."),
|
||||||
|
"",
|
||||||
|
_N("help Furnace grow:"),
|
||||||
"https://github.com/tildearrow/furnace",
|
"https://github.com/tildearrow/furnace",
|
||||||
"",
|
"",
|
||||||
"contact tildearrow at:",
|
_N("contact tildearrow at:"),
|
||||||
"https://tildearrow.org/?p=contact",
|
"https://tildearrow.org/?p=contact",
|
||||||
"",
|
"",
|
||||||
"disclaimer:",
|
_N("disclaimer:"),
|
||||||
"despite the fact this program works",
|
_N("despite the fact this program works"),
|
||||||
"with the .dmf file format, it is NOT",
|
_N("with the .dmf file format, it is NOT"),
|
||||||
"affiliated with Delek or DefleMask in",
|
_N("affiliated with Delek or DefleMask in"),
|
||||||
"any way, nor it is a replacement for",
|
_N("any way, nor it is a replacement for"),
|
||||||
"the original program.",
|
_N("the original program."),
|
||||||
"",
|
"",
|
||||||
"it also comes with ABSOLUTELY NO WARRANTY.",
|
_N("it also comes with ABSOLUTELY NO WARRANTY."),
|
||||||
"",
|
"",
|
||||||
"thanks to all contributors/bug reporters!"
|
_N("thanks to all contributors/bug reporters!")
|
||||||
};
|
};
|
||||||
|
|
||||||
const size_t aboutCount=sizeof(aboutLine)/sizeof(aboutLine[0]);
|
const size_t aboutCount=sizeof(aboutLine)/sizeof(aboutLine[0]);
|
||||||
|
|
||||||
void FurnaceGUI::drawAbout() {
|
void FurnaceGUI::drawAbout() {
|
||||||
// do stuff
|
// do stuff
|
||||||
if (ImGui::Begin("About Furnace",NULL,ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoTitleBar)) {
|
if (ImGui::Begin("About Furnace",NULL,ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoTitleBar,_("About Furnace"))) {
|
||||||
ImGui::SetWindowPos(ImVec2(0,0));
|
ImGui::SetWindowPos(ImVec2(0,0));
|
||||||
ImGui::SetWindowSize(ImVec2(canvasW,canvasH));
|
ImGui::SetWindowSize(ImVec2(canvasW,canvasH));
|
||||||
ImGui::PushFont(bigFont);
|
ImGui::PushFont(bigFont);
|
||||||
|
@ -356,24 +379,26 @@ void FurnaceGUI::drawAbout() {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i=0; i<aboutCount; i++) {
|
for (size_t i=0; i<aboutCount; i++) {
|
||||||
double posX=(canvasW/2.0)+(sin(double(i)*0.5+double(aboutScroll)/(90.0*dpiScale))*120*dpiScale)-(ImGui::CalcTextSize(aboutLine[i]).x*0.5);
|
// don't localize tildearrow, the version or an empty line
|
||||||
|
const char* nextLine=(i==0 || i==3 || aboutLine[i][0]==0)?aboutLine[i]:_(aboutLine[i]);
|
||||||
|
double posX=(canvasW/2.0)+(sin(double(i)*0.5+double(aboutScroll)/(90.0*dpiScale))*120*dpiScale)-(ImGui::CalcTextSize(nextLine).x*0.5);
|
||||||
double posY=(canvasH-aboutScroll+42*i*dpiScale);
|
double posY=(canvasH-aboutScroll+42*i*dpiScale);
|
||||||
if (posY<-80*dpiScale || posY>canvasH) continue;
|
if (posY<-80*dpiScale || posY>canvasH) continue;
|
||||||
dl->AddText(bigFont,bigFont->FontSize,
|
dl->AddText(bigFont,bigFont->FontSize,
|
||||||
ImVec2(posX+dpiScale,posY+dpiScale),
|
ImVec2(posX+dpiScale,posY+dpiScale),
|
||||||
0xff000000,aboutLine[i]);
|
0xff000000,nextLine);
|
||||||
dl->AddText(bigFont,bigFont->FontSize,
|
dl->AddText(bigFont,bigFont->FontSize,
|
||||||
ImVec2(posX+dpiScale,posY-dpiScale),
|
ImVec2(posX+dpiScale,posY-dpiScale),
|
||||||
0xff000000,aboutLine[i]);
|
0xff000000,nextLine);
|
||||||
dl->AddText(bigFont,bigFont->FontSize,
|
dl->AddText(bigFont,bigFont->FontSize,
|
||||||
ImVec2(posX-dpiScale,posY+dpiScale),
|
ImVec2(posX-dpiScale,posY+dpiScale),
|
||||||
0xff000000,aboutLine[i]);
|
0xff000000,nextLine);
|
||||||
dl->AddText(bigFont,bigFont->FontSize,
|
dl->AddText(bigFont,bigFont->FontSize,
|
||||||
ImVec2(posX-dpiScale,posY-dpiScale),
|
ImVec2(posX-dpiScale,posY-dpiScale),
|
||||||
0xff000000,aboutLine[i]);
|
0xff000000,nextLine);
|
||||||
dl->AddText(bigFont,bigFont->FontSize,
|
dl->AddText(bigFont,bigFont->FontSize,
|
||||||
ImVec2(posX,posY),
|
ImVec2(posX,posY),
|
||||||
0xffffffff,aboutLine[i]);
|
0xffffffff,nextLine);
|
||||||
}
|
}
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
||||||
|
@ -390,7 +415,7 @@ void FurnaceGUI::drawAbout() {
|
||||||
if (ImGui::IsKeyPressed(ImGuiKey_Space)) {
|
if (ImGui::IsKeyPressed(ImGuiKey_Space)) {
|
||||||
aboutOpen=false;
|
aboutOpen=false;
|
||||||
if (modified) {
|
if (modified) {
|
||||||
showWarning("Unsaved changes! Save changes before playing?",GUI_WARN_CV);
|
showWarning(_("Unsaved changes! Save changes before playing?"),GUI_WARN_CV);
|
||||||
} else {
|
} else {
|
||||||
cvOpen=true;
|
cvOpen=true;
|
||||||
cvNotSerious=true;
|
cvNotSerious=true;
|
||||||
|
|
|
@ -29,23 +29,23 @@
|
||||||
#define FURNACE_FFT_CUTOFF 0.1
|
#define FURNACE_FFT_CUTOFF 0.1
|
||||||
|
|
||||||
const char* chanOscRefs[]={
|
const char* chanOscRefs[]={
|
||||||
"None (0%)",
|
_N("None (0%)"),
|
||||||
"None (50%)",
|
_N("None (50%)"),
|
||||||
"None (100%)",
|
_N("None (100%)"),
|
||||||
|
|
||||||
"Frequency",
|
_N("Frequency"),
|
||||||
"Volume",
|
_N("Volume"),
|
||||||
"Channel",
|
_N("Channel"),
|
||||||
"Brightness",
|
_N("Brightness"),
|
||||||
|
|
||||||
"Note Trigger"
|
_N("Note Trigger")
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* autoColsTypes[]={
|
const char* autoColsTypes[]={
|
||||||
"Off",
|
_N("Off"),
|
||||||
"Mode 1",
|
_N("Mode 1"),
|
||||||
"Mode 2",
|
_N("Mode 2"),
|
||||||
"Mode 3"
|
_N("Mode 3")
|
||||||
};
|
};
|
||||||
|
|
||||||
static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
||||||
|
@ -132,7 +132,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
if (!chanOscOpen) return;
|
if (!chanOscOpen) return;
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
if (ImGui::Begin("Oscilloscope (per-channel)",&chanOscOpen,globalWinFlags)) {
|
if (ImGui::Begin("Oscilloscope (per-channel)",&chanOscOpen,globalWinFlags,_("Oscilloscope (per-channel)"))) {
|
||||||
bool centerSettingReset=false;
|
bool centerSettingReset=false;
|
||||||
ImDrawList* dl=ImGui::GetWindowDrawList();
|
ImDrawList* dl=ImGui::GetWindowDrawList();
|
||||||
if (chanOscOptions) {
|
if (chanOscOptions) {
|
||||||
|
@ -140,7 +140,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Columns");
|
ImGui::Text(_("Columns"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (ImGui::InputInt("##COSColumns",&chanOscCols,1,3)) {
|
if (ImGui::InputInt("##COSColumns",&chanOscCols,1,3)) {
|
||||||
|
@ -149,7 +149,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Size (ms)");
|
ImGui::Text(_("Size (ms)"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (ImGui::InputFloat("##COSWinSize",&chanOscWindowSize,1.0f,10.0f)) {
|
if (ImGui::InputFloat("##COSWinSize",&chanOscWindowSize,1.0f,10.0f)) {
|
||||||
|
@ -160,7 +160,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Automatic columns");
|
ImGui::Text(_("Automatic columns"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
const char* previewColType=autoColsTypes[chanOscAutoColsType&3];
|
const char* previewColType=autoColsTypes[chanOscAutoColsType&3];
|
||||||
|
@ -174,19 +174,19 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Checkbox("Center waveform",&chanOscWaveCorr)) {
|
if (ImGui::Checkbox(_("Center waveform"),&chanOscWaveCorr)) {
|
||||||
centerSettingReset=true;
|
centerSettingReset=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Checkbox("Randomize phase on note",&chanOscRandomPhase)) {
|
if (ImGui::Checkbox(_("Randomize phase on note"),&chanOscRandomPhase)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Amplitude");
|
ImGui::Text(_("Amplitude"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (CWSliderFloat("##COSAmp",&chanOscAmplify,0.0f,2.0f)) {
|
if (CWSliderFloat("##COSAmp",&chanOscAmplify,0.0f,2.0f)) {
|
||||||
|
@ -196,7 +196,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Line size");
|
ImGui::Text(_("Line size"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (CWSliderFloat("##COSLine",&chanOscLineSize,0.25f,16.0f)) {
|
if (CWSliderFloat("##COSLine",&chanOscLineSize,0.25f,16.0f)) {
|
||||||
|
@ -208,14 +208,14 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Checkbox("Gradient",&chanOscUseGrad);
|
ImGui::Checkbox(_("Gradient"),&chanOscUseGrad);
|
||||||
|
|
||||||
if (chanOscUseGrad) {
|
if (chanOscUseGrad) {
|
||||||
if (chanOscGradTex==NULL) {
|
if (chanOscGradTex==NULL) {
|
||||||
chanOscGradTex=rend->createTexture(true,chanOscGrad.width,chanOscGrad.height,true,bestTexFormat);
|
chanOscGradTex=rend->createTexture(true,chanOscGrad.width,chanOscGrad.height,true,bestTexFormat);
|
||||||
|
|
||||||
if (chanOscGradTex==NULL) {
|
if (chanOscGradTex==NULL) {
|
||||||
logE("error while creating gradient texture!");
|
logE(_("error while creating gradient texture!"));
|
||||||
} else {
|
} else {
|
||||||
updateChanOscGradTex=true;
|
updateChanOscGradTex=true;
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
if (rend->updateTexture(chanOscGradTex,chanOscGrad.grad.get(),chanOscGrad.width*4)) {
|
if (rend->updateTexture(chanOscGradTex,chanOscGrad.grad.get(),chanOscGrad.width*4)) {
|
||||||
updateChanOscGradTex=false;
|
updateChanOscGradTex=false;
|
||||||
} else {
|
} else {
|
||||||
logE("error while updating gradient texture!");
|
logE(_("error while updating gradient texture!"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,11 +289,11 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
i.prevY=i.y;
|
i.prevY=i.y;
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopup("gradPointSettings",ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize)) {
|
if (ImGui::BeginPopup("gradPointSettings",ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||||
if (ImGui::ColorPicker4("Color",(float*)&i.color)) {
|
if (ImGui::ColorPicker4(_("Color"),(float*)&i.color)) {
|
||||||
updateChanOscGradTex=true;
|
updateChanOscGradTex=true;
|
||||||
}
|
}
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Distance");
|
ImGui::Text(_("Distance"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
float pDist=i.distance*100.0f;
|
float pDist=i.distance*100.0f;
|
||||||
if (ImGui::SliderFloat("##PDistance",&pDist,0.0f,150.0f,"%.1f%%")) {
|
if (ImGui::SliderFloat("##PDistance",&pDist,0.0f,150.0f,"%.1f%%")) {
|
||||||
|
@ -302,7 +302,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Spread");
|
ImGui::Text(_("Spread"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
float pSpread=i.spread*100.0f;
|
float pSpread=i.spread*100.0f;
|
||||||
if (ImGui::SliderFloat("##PSpread",&pSpread,0.0f,150.0f,"%.1f%%")) {
|
if (ImGui::SliderFloat("##PSpread",&pSpread,0.0f,150.0f,"%.1f%%")) {
|
||||||
|
@ -311,7 +311,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
pushDestColor();
|
pushDestColor();
|
||||||
if (ImGui::Button("Remove")) {
|
if (ImGui::Button(_("Remove"))) {
|
||||||
removePoint=index;
|
removePoint=index;
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
@ -335,26 +335,26 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::ColorEdit4("Background",(float*)&chanOscGrad.bgColor)) {
|
if (ImGui::ColorEdit4(_("Background"),(float*)&chanOscGrad.bgColor)) {
|
||||||
updateChanOscGradTex=true;
|
updateChanOscGradTex=true;
|
||||||
}
|
}
|
||||||
ImGui::Combo("X Axis##AxisX",&chanOscColorX,chanOscRefs,GUI_OSCREF_MAX);
|
ImGui::Combo(_("X Axis##AxisX"),&chanOscColorX,LocalizedComboGetter,chanOscRefs,GUI_OSCREF_MAX);
|
||||||
ImGui::Combo("Y Axis##AxisY",&chanOscColorY,chanOscRefs,GUI_OSCREF_MAX);
|
ImGui::Combo(_("Y Axis##AxisY"),&chanOscColorY,LocalizedComboGetter,chanOscRefs,GUI_OSCREF_MAX);
|
||||||
|
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetNextItemWidth(400.0f*dpiScale);
|
ImGui::SetNextItemWidth(400.0f*dpiScale);
|
||||||
ImGui::ColorPicker4("Color",(float*)&chanOscColor);
|
ImGui::ColorPicker4(_("Color"),(float*)&chanOscColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Text format:");
|
ImGui::Text(_("Text format:"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::InputText("##TextFormat",&chanOscTextFormat);
|
ImGui::InputText("##TextFormat",&chanOscTextFormat);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
if (ImGui::BeginTooltip()) {
|
if (ImGui::BeginTooltip()) {
|
||||||
ImGui::TextUnformatted(
|
ImGui::TextUnformatted(_(
|
||||||
"format guide:\n"
|
"format guide:\n"
|
||||||
"- %c: channel name\n"
|
"- %c: channel name\n"
|
||||||
"- %C: channel short name\n"
|
"- %C: channel short name\n"
|
||||||
|
@ -372,14 +372,14 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
"- %b: volume (hex)\n"
|
"- %b: volume (hex)\n"
|
||||||
"- %l: new line\n"
|
"- %l: new line\n"
|
||||||
"- %%: percent sign"
|
"- %%: percent sign"
|
||||||
);
|
));
|
||||||
ImGui::EndTooltip();
|
ImGui::EndTooltip();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::ColorEdit4("Text color",(float*)&chanOscTextColor);
|
ImGui::ColorEdit4(_("Text color"),(float*)&chanOscTextColor);
|
||||||
|
|
||||||
if (ImGui::Button("OK")) {
|
if (ImGui::Button(_("OK"))) {
|
||||||
chanOscOptions=false;
|
chanOscOptions=false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -397,7 +397,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
|
|
||||||
// check work thread
|
// check work thread
|
||||||
if (chanOscWorkPool==NULL) {
|
if (chanOscWorkPool==NULL) {
|
||||||
logV("creating chan osc work pool");
|
logV(_("creating chan osc work pool"));
|
||||||
chanOscWorkPool=new DivWorkPool(settings.chanOscThreads);
|
chanOscWorkPool=new DivWorkPool(settings.chanOscThreads);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,18 +426,18 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
|
|
||||||
// check FFT status existence
|
// check FFT status existence
|
||||||
if (!fft_->ready) {
|
if (!fft_->ready) {
|
||||||
logD("creating FFT plan for channel %d",fft_->relatedCh);
|
logD(_("creating FFT plan for channel %d"),fft_->relatedCh);
|
||||||
fft_->inBuf=(double*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(double));
|
fft_->inBuf=(double*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(double));
|
||||||
fft_->outBuf=(fftw_complex*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(fftw_complex));
|
fft_->outBuf=(fftw_complex*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(fftw_complex));
|
||||||
fft_->corrBuf=(double*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(double));
|
fft_->corrBuf=(double*)fftw_malloc(FURNACE_FFT_SIZE*sizeof(double));
|
||||||
fft_->plan=fftw_plan_dft_r2c_1d(FURNACE_FFT_SIZE,fft_->inBuf,fft_->outBuf,FFTW_ESTIMATE);
|
fft_->plan=fftw_plan_dft_r2c_1d(FURNACE_FFT_SIZE,fft_->inBuf,fft_->outBuf,FFTW_ESTIMATE);
|
||||||
fft_->planI=fftw_plan_dft_c2r_1d(FURNACE_FFT_SIZE,fft_->outBuf,fft_->corrBuf,FFTW_ESTIMATE);
|
fft_->planI=fftw_plan_dft_c2r_1d(FURNACE_FFT_SIZE,fft_->outBuf,fft_->corrBuf,FFTW_ESTIMATE);
|
||||||
if (fft_->plan==NULL) {
|
if (fft_->plan==NULL) {
|
||||||
logE("failed to create plan!");
|
logE(_("failed to create plan!"));
|
||||||
} else if (fft_->planI==NULL) {
|
} else if (fft_->planI==NULL) {
|
||||||
logE("failed to create inverse plan!");
|
logE(_("failed to create inverse plan!"));
|
||||||
} else if (fft_->inBuf==NULL || fft_->outBuf==NULL || fft_->corrBuf==NULL) {
|
} else if (fft_->inBuf==NULL || fft_->outBuf==NULL || fft_->corrBuf==NULL) {
|
||||||
logE("failed to create FFT buffers");
|
logE(_("failed to create FFT buffers"));
|
||||||
} else {
|
} else {
|
||||||
fft_->ready=true;
|
fft_->ready=true;
|
||||||
}
|
}
|
||||||
|
@ -582,7 +582,7 @@ void FurnaceGUI::drawChanOsc() {
|
||||||
ChanOscStatus* fft=oscFFTs[i];
|
ChanOscStatus* fft=oscFFTs[i];
|
||||||
int ch=oscChans[i];
|
int ch=oscChans[i];
|
||||||
if (buf==NULL) {
|
if (buf==NULL) {
|
||||||
ImGui::Text("Error!");
|
ImGui::Text(_("Error!"));
|
||||||
} else {
|
} else {
|
||||||
ImVec2 size=ImGui::GetContentRegionAvail();
|
ImVec2 size=ImGui::GetContentRegionAvail();
|
||||||
size.y=availY/rows;
|
size.y=availY/rows;
|
||||||
|
|
|
@ -37,7 +37,7 @@ void FurnaceGUI::drawChannels() {
|
||||||
} else {
|
} else {
|
||||||
//ImGui::SetNextWindowSizeConstraints(ImVec2(440.0f*dpiScale,400.0f*dpiScale),ImVec2(canvasW,canvasH));
|
//ImGui::SetNextWindowSizeConstraints(ImVec2(440.0f*dpiScale,400.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
}
|
}
|
||||||
if (ImGui::Begin("Channels",&channelsOpen,globalWinFlags)) {
|
if (ImGui::Begin("Channels",&channelsOpen,globalWinFlags,_("Channels"))) {
|
||||||
if (ImGui::BeginTable("ChannelList",5)) {
|
if (ImGui::BeginTable("ChannelList",5)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,0.0);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,0.0);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed,0.0);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed,0.0);
|
||||||
|
@ -46,13 +46,13 @@ void FurnaceGUI::drawChannels() {
|
||||||
ImGui::TableSetupColumn("c4",ImGuiTableColumnFlags_WidthFixed,48.0f*dpiScale);
|
ImGui::TableSetupColumn("c4",ImGuiTableColumnFlags_WidthFixed,48.0f*dpiScale);
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Pat");
|
ImGui::Text(_("Pat"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Osc");
|
ImGui::Text(_("Osc"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Swap");
|
ImGui::Text(_("Swap"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Name");
|
ImGui::Text(_("Name"));
|
||||||
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(i);
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
|
@ -61,14 +61,14 @@ void FurnaceGUI::drawChannels() {
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Show in pattern");
|
ImGui::SetTooltip(_("Show in pattern"));
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Checkbox("##VisibleChanOsc",&e->curSubSong->chanShowChanOsc[i])) {
|
if (ImGui::Checkbox("##VisibleChanOsc",&e->curSubSong->chanShowChanOsc[i])) {
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Show in per-channel oscilloscope");
|
ImGui::SetTooltip(_("Show in per-channel oscilloscope"));
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button(ICON_FA_ARROWS)) {
|
if (ImGui::Button(ICON_FA_ARROWS)) {
|
||||||
|
@ -79,7 +79,7 @@ void FurnaceGUI::drawChannels() {
|
||||||
ImGui::Button(ICON_FA_ARROWS "##ChanDrag");
|
ImGui::Button(ICON_FA_ARROWS "##ChanDrag");
|
||||||
ImGui::EndDragDropSource();
|
ImGui::EndDragDropSource();
|
||||||
} else if (ImGui::IsItemHovered()) {
|
} else if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("%s #%d\n(drag to swap channels)",e->getSystemName(e->sysOfChan[i]),e->dispatchChanOfChan[i]);
|
ImGui::SetTooltip(_("%s #%d\n(drag to swap channels)"),e->getSystemName(e->sysOfChan[i]),e->dispatchChanOfChan[i]);
|
||||||
}
|
}
|
||||||
if (ImGui::BeginDragDropTarget()) {
|
if (ImGui::BeginDragDropTarget()) {
|
||||||
const ImGuiPayload* dragItem=ImGui::AcceptDragDropPayload("FUR_CHAN");
|
const ImGuiPayload* dragItem=ImGui::AcceptDragDropPayload("FUR_CHAN");
|
||||||
|
|
|
@ -28,7 +28,7 @@ void FurnaceGUI::drawClock() {
|
||||||
nextWindow=GUI_WINDOW_NOTHING;
|
nextWindow=GUI_WINDOW_NOTHING;
|
||||||
}
|
}
|
||||||
if (!clockOpen) return;
|
if (!clockOpen) return;
|
||||||
if (ImGui::Begin("Clock",&clockOpen,globalWinFlags)) {
|
if (ImGui::Begin("Clock",&clockOpen,globalWinFlags,_("Clock"))) {
|
||||||
int row=oldRow;
|
int row=oldRow;
|
||||||
int elapsedBars=e->getElapsedBars();
|
int elapsedBars=e->getElapsedBars();
|
||||||
int elapsedBeats=e->getElapsedBeats();
|
int elapsedBeats=e->getElapsedBeats();
|
||||||
|
|
|
@ -48,22 +48,22 @@ void FurnaceGUI::drawPalette() {
|
||||||
int width=ImGui::GetContentRegionAvail().x;
|
int width=ImGui::GetContentRegionAvail().x;
|
||||||
ImGui::SetNextItemWidth(width);
|
ImGui::SetNextItemWidth(width);
|
||||||
|
|
||||||
const char* hint="Search...";
|
const char* hint=_("Search...");
|
||||||
switch (curPaletteType) {
|
switch (curPaletteType) {
|
||||||
case CMDPAL_TYPE_RECENT:
|
case CMDPAL_TYPE_RECENT:
|
||||||
hint="Search recent files...";
|
hint=_("Search recent files...");
|
||||||
break;
|
break;
|
||||||
case CMDPAL_TYPE_INSTRUMENTS:
|
case CMDPAL_TYPE_INSTRUMENTS:
|
||||||
hint="Search instruments...";
|
hint=_("Search instruments...");
|
||||||
break;
|
break;
|
||||||
case CMDPAL_TYPE_SAMPLES:
|
case CMDPAL_TYPE_SAMPLES:
|
||||||
hint="Search samples...";
|
hint=_("Search samples...");
|
||||||
break;
|
break;
|
||||||
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
||||||
hint="Search instruments (to change to)...";
|
hint=_("Search instruments (to change to)...");
|
||||||
break;
|
break;
|
||||||
case CMDPAL_TYPE_ADD_CHIP:
|
case CMDPAL_TYPE_ADD_CHIP:
|
||||||
hint="Search chip (to add)...";
|
hint=_("Search chip (to add)...");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
|
|
||||||
case CMDPAL_TYPE_INSTRUMENTS:
|
case CMDPAL_TYPE_INSTRUMENTS:
|
||||||
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
||||||
if (matchFuzzy("- None -",paletteQuery.c_str())) {
|
if (matchFuzzy(_("- None -"),paletteQuery.c_str())) {
|
||||||
paletteSearchResults.push_back(0);
|
paletteSearchResults.push_back(0);
|
||||||
}
|
}
|
||||||
for (int i=0; i<e->song.insLen; i++) {
|
for (int i=0; i<e->song.insLen; i++) {
|
||||||
|
@ -120,7 +120,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
logE("invalid command palette type");
|
logE(_("invalid command palette type"));
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
@ -164,7 +164,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
case CMDPAL_TYPE_INSTRUMENTS:
|
case CMDPAL_TYPE_INSTRUMENTS:
|
||||||
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
case CMDPAL_TYPE_INSTRUMENT_CHANGE:
|
||||||
if (id==0) {
|
if (id==0) {
|
||||||
s="- None -";
|
s=_("- None -");
|
||||||
} else {
|
} else {
|
||||||
s=fmt::sprintf("%02X: %s", id-1, e->song.ins[id-1]->name.c_str());
|
s=fmt::sprintf("%02X: %s", id-1, e->song.ins[id-1]->name.c_str());
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
s=getSystemName((DivSystem)id);
|
s=getSystemName((DivSystem)id);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
logE("invalid command palette type");
|
logE(_("invalid command palette type"));
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
accepted=ImGui::IsKeyPressed(ImGuiKey_Enter);
|
accepted=ImGui::IsKeyPressed(ImGuiKey_Enter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("Cancel") || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
if (ImGui::Button(_("Cancel")) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ void FurnaceGUI::drawPalette() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
logE("invalid command palette type");
|
logE(_("invalid command palette type"));
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,325 +28,325 @@ void FurnaceGUI::drawCompatFlags() {
|
||||||
nextWindow=GUI_WINDOW_NOTHING;
|
nextWindow=GUI_WINDOW_NOTHING;
|
||||||
}
|
}
|
||||||
if (!compatFlagsOpen) return;
|
if (!compatFlagsOpen) return;
|
||||||
if (ImGui::Begin("Compatibility Flags",&compatFlagsOpen,globalWinFlags)) {
|
if (ImGui::Begin("Compatibility Flags",&compatFlagsOpen,globalWinFlags,_("Compatibility Flags"))) {
|
||||||
ImGui::TextWrapped("these flags are designed to provide better DefleMask/older Furnace compatibility.\nit is recommended to disable most of these unless you rely on specific quirks.");
|
ImGui::TextWrapped(_("these flags are designed to provide better DefleMask/older Furnace compatibility.\nit is recommended to disable most of these unless you rely on specific quirks."));
|
||||||
if (ImGui::BeginTabBar("settingsTab")) {
|
if (ImGui::BeginTabBar("settingsTab")) {
|
||||||
if (ImGui::BeginTabItem("DefleMask")) {
|
if (ImGui::BeginTabItem(_("DefleMask"))) {
|
||||||
ImGui::Checkbox("Limit slide range",&e->song.limitSlides);
|
ImGui::Checkbox(_("Limit slide range"),&e->song.limitSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, slides are limited to a compatible range.\nmay cause problems with slides in negative octaves.");
|
ImGui::SetTooltip(_("when enabled, slides are limited to a compatible range.\nmay cause problems with slides in negative octaves."));
|
||||||
}
|
}
|
||||||
InvCheckbox("Compatible noise layout on NES and PC Engine",&e->song.properNoiseLayout);
|
InvCheckbox(_("Compatible noise layout on NES and PC Engine"),&e->song.properNoiseLayout);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("use a rather unusual compatible noise frequency layout.\nremoves some noise frequencies on PC Engine.");
|
ImGui::SetTooltip(_("use a rather unusual compatible noise frequency layout.\nremoves some noise frequencies on PC Engine."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Game Boy instrument duty is wave volume",&e->song.waveDutyIsVol);
|
ImGui::Checkbox(_("Game Boy instrument duty is wave volume"),&e->song.waveDutyIsVol);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if enabled, an instrument with duty macro in the wave channel will be mapped to wavetable volume.");
|
ImGui::SetTooltip(_("if enabled, an instrument with duty macro in the wave channel will be mapped to wavetable volume."));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Checkbox("Restart macro on portamento",&e->song.resetMacroOnPorta);
|
ImGui::Checkbox(_("Restart macro on portamento"),&e->song.resetMacroOnPorta);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, a portamento effect will reset the channel's macro if used in combination with a note.");
|
ImGui::SetTooltip(_("when enabled, a portamento effect will reset the channel's macro if used in combination with a note."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Legacy volume slides",&e->song.legacyVolumeSlides);
|
ImGui::Checkbox(_("Legacy volume slides"),&e->song.legacyVolumeSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("simulate glitchy volume slide behavior by silently overflowing the volume when the slide goes below 0.");
|
ImGui::SetTooltip(_("simulate glitchy volume slide behavior by silently overflowing the volume when the slide goes below 0."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Compatible arpeggio",&e->song.compatibleArpeggio);
|
ImGui::Checkbox(_("Compatible arpeggio"),&e->song.compatibleArpeggio);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("delay arpeggio by one tick on every new note.");
|
ImGui::SetTooltip(_("delay arpeggio by one tick on every new note."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Disable DAC when sample ends",&e->song.brokenDACMode);
|
ImGui::Checkbox(_("Disable DAC when sample ends"),&e->song.brokenDACMode);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, the DAC in YM2612 will be disabled if there isn't any sample playing.");
|
ImGui::SetTooltip(_("when enabled, the DAC in YM2612 will be disabled if there isn't any sample playing."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken speed alternation",&e->song.brokenSpeedSel);
|
ImGui::Checkbox(_("Broken speed alternation"),&e->song.brokenSpeedSel);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("determines next speed based on whether the row is odd/even instead of alternating between speeds.");
|
ImGui::SetTooltip(_("determines next speed based on whether the row is odd/even instead of alternating between speeds."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Ignore duplicate slide effects",&e->song.ignoreDuplicateSlides);
|
ImGui::Checkbox(_("Ignore duplicate slide effects"),&e->song.ignoreDuplicateSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if this is on, only the first slide of a row in a channel will be considered.");
|
ImGui::SetTooltip(_("if this is on, only the first slide of a row in a channel will be considered."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Ignore 0Dxx on the last order",&e->song.ignoreJumpAtEnd);
|
ImGui::Checkbox(_("Ignore 0Dxx on the last order"),&e->song.ignoreJumpAtEnd);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if this is on, a jump to next row effect will not take place when it is on the last order of a song.");
|
ImGui::SetTooltip(_("if this is on, a jump to next row effect will not take place when it is on the last order of a song."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Buggy portamento after pitch slide",&e->song.buggyPortaAfterSlide);
|
ImGui::Checkbox(_("Buggy portamento after pitch slide"),&e->song.buggyPortaAfterSlide);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("simulates a bug in where portamento does not work after sliding.");
|
ImGui::SetTooltip(_("simulates a bug in where portamento does not work after sliding."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("FM pitch slide octave boundary odd behavior",&e->song.fbPortaPause);
|
ImGui::Checkbox(_("FM pitch slide octave boundary odd behavior"),&e->song.fbPortaPause);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if this is on, a pitch slide that crosses the octave boundary will stop for one tick and then continue from the nearest octave boundary.\nfor .dmf compatibility.");
|
ImGui::SetTooltip(_("if this is on, a pitch slide that crosses the octave boundary will stop for one tick and then continue from the nearest octave boundary.\nfor .dmf compatibility."));
|
||||||
}
|
}
|
||||||
InvCheckbox("Don't apply Game Boy envelope on note-less instrument change",&e->song.gbInsAffectsEnvelope);
|
InvCheckbox(_("Don't apply Game Boy envelope on note-less instrument change"),&e->song.gbInsAffectsEnvelope);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if this is on, an instrument change will not affect the envelope.");
|
ImGui::SetTooltip(_("if this is on, an instrument change will not affect the envelope."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Ignore DAC mode change outside of intended channel in ExtCh mode",&e->song.ignoreDACModeOutsideIntendedChannel);
|
ImGui::Checkbox(_("Ignore DAC mode change outside of intended channel in ExtCh mode"),&e->song.ignoreDACModeOutsideIntendedChannel);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if this is on, 17xx has no effect on the operator channels in YM2612.");
|
ImGui::SetTooltip(_("if this is on, 17xx has no effect on the operator channels in YM2612."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("E1xy/E2xy also take priority over slide stops",&e->song.e1e2AlsoTakePriority);
|
ImGui::Checkbox(_("E1xy/E2xy also take priority over slide stops"),&e->song.e1e2AlsoTakePriority);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("does this make any sense by now?");
|
ImGui::SetTooltip(_("does this make any sense by now?"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("E1xy/E2xy stop when repeating the same note",&e->song.e1e2StopOnSameNote);
|
ImGui::Checkbox(_("E1xy/E2xy stop when repeating the same note"),&e->song.e1e2StopOnSameNote);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("ugh, if only this wasn't a thing...");
|
ImGui::SetTooltip(_("ugh, if only this wasn't a thing..."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("SN76489 duty macro always resets phase",&e->song.snDutyReset);
|
ImGui::Checkbox(_("SN76489 duty macro always resets phase"),&e->song.snDutyReset);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, duty macro will always reset phase, even if its value hasn't changed.");
|
ImGui::SetTooltip(_("when enabled, duty macro will always reset phase, even if its value hasn't changed."));
|
||||||
}
|
}
|
||||||
InvCheckbox("Broken volume scaling strategy",&e->song.newVolumeScaling);
|
InvCheckbox(_("Broken volume scaling strategy"),&e->song.newVolumeScaling);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled:\n- log scaling: multiply\n- linear scaling: subtract\nwhen disabled:\n- log scaling: subtract\n- linear scaling: multiply");
|
ImGui::SetTooltip(_("when enabled:\n- log scaling: multiply\n- linear scaling: subtract\nwhen disabled:\n- log scaling: subtract\n- linear scaling: multiply"));
|
||||||
}
|
}
|
||||||
InvCheckbox("Don't persist volume macro after it finishes",&e->song.volMacroLinger);
|
InvCheckbox(_("Don't persist volume macro after it finishes"),&e->song.volMacroLinger);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, a value in the volume column that happens after the volume macro is done will disregard the macro.");
|
ImGui::SetTooltip(_("when enabled, a value in the volume column that happens after the volume macro is done will disregard the macro."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken output volume on instrument change",&e->song.brokenOutVol);
|
ImGui::Checkbox(_("Broken output volume on instrument change"),&e->song.brokenOutVol);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("if enabled, no checks for the presence of a volume macro will be made.\nthis will cause the last macro value to linger unless a value in the volume column is present.");
|
ImGui::SetTooltip(_("if enabled, no checks for the presence of a volume macro will be made.\nthis will cause the last macro value to linger unless a value in the volume column is present."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken output volume - Episode 2 (PLEASE KEEP ME DISABLED)",&e->song.brokenOutVol2);
|
ImGui::Checkbox(_("Broken output volume - Episode 2 (PLEASE KEEP ME DISABLED)"),&e->song.brokenOutVol2);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("these compatibility flags are getting SO damn ridiculous and out of control.\nas you may have guessed, this one exists due to yet ANOTHER DefleMask-specific behavior.\nplease keep this off at all costs, because I will not support it when ROM export comes.\noh, and don't start an argument out of it. Furnace isn't a DefleMask replacement, and no,\nI am not trying to make it look like one with all these flags.\n\noh, and what about the other flags that don't have to do with DefleMask?\nthose are for .mod import, future FamiTracker import and personal taste!\n\nend of rant");
|
ImGui::SetTooltip(_("these compatibility flags are getting SO damn ridiculous and out of control.\nas you may have guessed, this one exists due to yet ANOTHER DefleMask-specific behavior.\nplease keep this off at all costs, because I will not support it when ROM export comes.\noh, and don't start an argument out of it. Furnace isn't a DefleMask replacement, and no,\nI am not trying to make it look like one with all these flags.\n\noh, and what about the other flags that don't have to do with DefleMask?\nthose are for .mod import, future FamiTracker import and personal taste!\n\nend of rant"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Treat SN76489 periods under 8 as 1",&e->song.snNoLowPeriods);
|
ImGui::Checkbox(_("Treat SN76489 periods under 8 as 1"),&e->song.snNoLowPeriods);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, any SN period under 8 will be written as 1 instead.\nthis replicates DefleMask behavior, but reduces available period range.");
|
ImGui::SetTooltip(_("when enabled, any SN period under 8 will be written as 1 instead.\nthis replicates DefleMask behavior, but reduces available period range."));
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Old Furnace")) {
|
if (ImGui::BeginTabItem(_("Old Furnace"))) {
|
||||||
ImGui::Checkbox("Arpeggio inhibits non-porta slides",&e->song.arpNonPorta);
|
ImGui::Checkbox(_("Arpeggio inhibits non-porta slides"),&e->song.arpNonPorta);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.5.5");
|
ImGui::SetTooltip(_("behavior changed in 0.5.5"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Wack FM algorithm macro",&e->song.algMacroBehavior);
|
ImGui::Checkbox(_("Wack FM algorithm macro"),&e->song.algMacroBehavior);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.5.5");
|
ImGui::SetTooltip(_("behavior changed in 0.5.5"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken shortcut slides (E1xy/E2xy)",&e->song.brokenShortcutSlides);
|
ImGui::Checkbox(_("Broken shortcut slides (E1xy/E2xy)"),&e->song.brokenShortcutSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.5.7");
|
ImGui::SetTooltip(_("behavior changed in 0.5.7"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Stop portamento on note off",&e->song.stopPortaOnNoteOff);
|
ImGui::Checkbox(_("Stop portamento on note off"),&e->song.stopPortaOnNoteOff);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
InvCheckbox("Don't allow instrument change during slides",&e->song.newInsTriggersInPorta);
|
InvCheckbox(_("Don't allow instrument change during slides"),&e->song.newInsTriggersInPorta);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
InvCheckbox("Don't reset note to base on arpeggio stop",&e->song.arp0Reset);
|
InvCheckbox(_("Don't reset note to base on arpeggio stop"),&e->song.arp0Reset);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
InvCheckbox("ExtCh channel status is not shared among operators",&e->song.sharedExtStat);
|
InvCheckbox(_("ExtCh channel status is not shared among operators"),&e->song.sharedExtStat);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
InvCheckbox("Disable new SegaPCM features (macros and better panning)",&e->song.newSegaPCM);
|
InvCheckbox(_("Disable new SegaPCM features (macros and better panning)"),&e->song.newSegaPCM);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Old FM octave boundary behavior",&e->song.oldOctaveBoundary);
|
ImGui::Checkbox(_("Old FM octave boundary behavior"),&e->song.oldOctaveBoundary);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Disable OPN2 DAC volume control",&e->song.noOPN2Vol);
|
ImGui::Checkbox(_("Disable OPN2 DAC volume control"),&e->song.noOPN2Vol);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken initial position of portamento after arpeggio",&e->song.brokenPortaArp);
|
ImGui::Checkbox(_("Broken initial position of portamento after arpeggio"),&e->song.brokenPortaArp);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre1.5");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre1.5"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Disable new sample features",&e->song.disableSampleMacro);
|
ImGui::Checkbox(_("Disable new sample features"),&e->song.disableSampleMacro);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre2");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre2"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Old arpeggio macro + pitch slide strategy",&e->song.oldArpStrategy);
|
ImGui::Checkbox(_("Old arpeggio macro + pitch slide strategy"),&e->song.oldArpStrategy);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre2");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre2"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken portamento during legato",&e->song.brokenPortaLegato);
|
ImGui::Checkbox(_("Broken portamento during legato"),&e->song.brokenPortaLegato);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre4");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre4"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Broken macros in some FM chips after note off",&e->song.brokenFMOff);
|
ImGui::Checkbox(_("Broken macros in some FM chips after note off"),&e->song.brokenFMOff);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre5");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre5"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Pre-note does not take effects into consideration",&e->song.preNoteNoEffect);
|
ImGui::Checkbox(_("Pre-note does not take effects into consideration"),&e->song.preNoteNoEffect);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6pre9");
|
ImGui::SetTooltip(_("behavior changed in 0.6pre9"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Disable new NES DPCM features",&e->song.oldDPCM);
|
ImGui::Checkbox(_("Disable new NES DPCM features"),&e->song.oldDPCM);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6.1");
|
ImGui::SetTooltip(_("behavior changed in 0.6.1"));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Legacy technical ALWAYS_SET_VOLUME behavior",&e->song.oldAlwaysSetVolume);
|
ImGui::Checkbox(_("Legacy technical ALWAYS_SET_VOLUME behavior"),&e->song.oldAlwaysSetVolume);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6.1\nthis flag will be removed if I find out that none of the songs break after disabling it.");
|
ImGui::SetTooltip(_("behavior changed in 0.6.1\nthis flag will be removed if I find out that none of the songs break after disabling it."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Old sample offset effect",&e->song.oldSampleOffset);
|
ImGui::Checkbox(_("Old sample offset effect"),&e->song.oldSampleOffset);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("behavior changed in 0.6.3");
|
ImGui::SetTooltip(_("behavior changed in 0.6.3"));
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem(".mod import")) {
|
if (ImGui::BeginTabItem(_(".mod import"))) {
|
||||||
ImGui::Checkbox("Don't slide on the first tick of a row",&e->song.noSlidesOnFirstTick);
|
ImGui::Checkbox(_("Don't slide on the first tick of a row"),&e->song.noSlidesOnFirstTick);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("simulates ProTracker's behavior of not applying volume/pitch slides on the first tick of a row.");
|
ImGui::SetTooltip(_("simulates ProTracker's behavior of not applying volume/pitch slides on the first tick of a row."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Reset arpeggio position on row change",&e->song.rowResetsArpPos);
|
ImGui::Checkbox(_("Reset arpeggio position on row change"),&e->song.rowResetsArpPos);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("simulates ProTracker's behavior of arpeggio being bound to the current tick of a row.");
|
ImGui::SetTooltip(_("simulates ProTracker's behavior of arpeggio being bound to the current tick of a row."));
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Pitch/Playback")) {
|
if (ImGui::BeginTabItem(_("Pitch/Playback"))) {
|
||||||
ImGui::Text("Pitch linearity:");
|
ImGui::Text(_("Pitch linearity:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("None",e->song.linearPitch==0)) {
|
if (ImGui::RadioButton(_("None"),e->song.linearPitch==0)) {
|
||||||
e->song.linearPitch=0;
|
e->song.linearPitch=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("like ProTracker/FamiTracker");
|
ImGui::SetTooltip(_("like ProTracker/FamiTracker"));
|
||||||
}
|
}
|
||||||
if (e->song.linearPitch==1) {
|
if (e->song.linearPitch==1) {
|
||||||
pushWarningColor(true);
|
pushWarningColor(true);
|
||||||
if (ImGui::RadioButton("Partial (only 04xy/E5xx)",e->song.linearPitch==1)) {
|
if (ImGui::RadioButton(_("Partial (only 04xy/E5xx)"),e->song.linearPitch==1)) {
|
||||||
e->song.linearPitch=1;
|
e->song.linearPitch=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("like DefleMask\n\nthis pitch linearity mode is deprecated due to:\n- excessive complexity\n- lack of possible optimization\n\nit is recommended to change it now because I will remove this option in the future!");
|
ImGui::SetTooltip(_("like DefleMask\n\nthis pitch linearity mode is deprecated due to:\n- excessive complexity\n- lack of possible optimization\n\nit is recommended to change it now because I will remove this option in the future!"));
|
||||||
}
|
}
|
||||||
popWarningColor();
|
popWarningColor();
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Full",e->song.linearPitch==2)) {
|
if (ImGui::RadioButton(_("Full"),e->song.linearPitch==2)) {
|
||||||
e->song.linearPitch=2;
|
e->song.linearPitch=2;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("like Impulse Tracker");
|
ImGui::SetTooltip(_("like Impulse Tracker"));
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
|
||||||
if (e->song.linearPitch==2) {
|
if (e->song.linearPitch==2) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(120.0f*dpiScale);
|
ImGui::SetNextItemWidth(120.0f*dpiScale);
|
||||||
if (ImGui::InputScalar("Pitch slide speed multiplier",ImGuiDataType_U8,&e->song.pitchSlideSpeed,&_ONE,&_ONE)) {
|
if (ImGui::InputScalar(_("Pitch slide speed multiplier"),ImGuiDataType_U8,&e->song.pitchSlideSpeed,&_ONE,&_ONE)) {
|
||||||
if (e->song.pitchSlideSpeed<1) e->song.pitchSlideSpeed=1;
|
if (e->song.pitchSlideSpeed<1) e->song.pitchSlideSpeed=1;
|
||||||
if (e->song.pitchSlideSpeed>64) e->song.pitchSlideSpeed=64;
|
if (e->song.pitchSlideSpeed>64) e->song.pitchSlideSpeed=64;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Text("Loop modality:");
|
ImGui::Text(_("Loop modality:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("Reset channels",e->song.loopModality==0)) {
|
if (ImGui::RadioButton(_("Reset channels"),e->song.loopModality==0)) {
|
||||||
e->song.loopModality=0;
|
e->song.loopModality=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("select to reset channels on loop. may trigger a voltage click on every loop!");
|
ImGui::SetTooltip(_("select to reset channels on loop. may trigger a voltage click on every loop!"));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Soft reset channels",e->song.loopModality==1)) {
|
if (ImGui::RadioButton(_("Soft reset channels"),e->song.loopModality==1)) {
|
||||||
e->song.loopModality=1;
|
e->song.loopModality=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("select to turn channels off on loop.");
|
ImGui::SetTooltip(_("select to turn channels off on loop."));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Do nothing",e->song.loopModality==2)) {
|
if (ImGui::RadioButton(_("Do nothing"),e->song.loopModality==2)) {
|
||||||
e->song.loopModality=2;
|
e->song.loopModality=2;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("select to not reset channels on loop.");
|
ImGui::SetTooltip(_("select to not reset channels on loop."));
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
|
||||||
ImGui::Text("Cut/delay effect policy:");
|
ImGui::Text(_("Cut/delay effect policy:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("Strict",e->song.delayBehavior==0)) {
|
if (ImGui::RadioButton(_("Strict"),e->song.delayBehavior==0)) {
|
||||||
e->song.delayBehavior=0;
|
e->song.delayBehavior=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("only when time is less than speed (like DefleMask/ProTracker)");
|
ImGui::SetTooltip(_("only when time is less than speed (like DefleMask/ProTracker)"));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Strict (old)",e->song.delayBehavior==1)) {
|
if (ImGui::RadioButton(_("Strict (old)"),e->song.delayBehavior==1)) {
|
||||||
e->song.delayBehavior=1;
|
e->song.delayBehavior=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("only when time is less than or equal to speed (original buggy behavior)");
|
ImGui::SetTooltip(_("only when time is less than or equal to speed (original buggy behavior)"));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Lax",e->song.delayBehavior==2)) {
|
if (ImGui::RadioButton(_("Lax"),e->song.delayBehavior==2)) {
|
||||||
e->song.delayBehavior=2;
|
e->song.delayBehavior=2;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("no checks");
|
ImGui::SetTooltip(_("no checks"));
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
|
||||||
ImGui::Text("Simultaneous jump (0B+0D) treatment:");
|
ImGui::Text(_("Simultaneous jump (0B+0D) treatment:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("Normal",e->song.jumpTreatment==0)) {
|
if (ImGui::RadioButton(_("Normal"),e->song.jumpTreatment==0)) {
|
||||||
e->song.jumpTreatment=0;
|
e->song.jumpTreatment=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("accept 0B+0D to jump to a specific row of an order");
|
ImGui::SetTooltip(_("accept 0B+0D to jump to a specific row of an order"));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Old Furnace",e->song.jumpTreatment==1)) {
|
if (ImGui::RadioButton(_("Old Furnace"),e->song.jumpTreatment==1)) {
|
||||||
e->song.jumpTreatment=1;
|
e->song.jumpTreatment=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("only accept the first jump effect");
|
ImGui::SetTooltip(_("only accept the first jump effect"));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("DefleMask",e->song.jumpTreatment==2)) {
|
if (ImGui::RadioButton(_("DefleMask"),e->song.jumpTreatment==2)) {
|
||||||
e->song.jumpTreatment=2;
|
e->song.jumpTreatment=2;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("only accept 0Dxx");
|
ImGui::SetTooltip(_("only accept 0Dxx"));
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Other")) {
|
if (ImGui::BeginTabItem(_("Other"))) {
|
||||||
ImGui::Checkbox("Auto-insert one tick gap between notes",&e->song.oneTickCut);
|
ImGui::Checkbox(_("Auto-insert one tick gap between notes"),&e->song.oneTickCut);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, a one-tick note cut will be inserted between non-legato/non-portamento notes.\nthis simulates the behavior of some Amiga/SNES music engines.\n\nineffective on C64.");
|
ImGui::SetTooltip(_("when enabled, a one-tick note cut will be inserted between non-legato/non-portamento notes.\nthis simulates the behavior of some Amiga/SNES music engines.\n\nineffective on C64."));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
InvCheckbox("Don't reset slides after note off",&e->song.noteOffResetsSlides);
|
InvCheckbox(_("Don't reset slides after note off"),&e->song.noteOffResetsSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, note off will not reset the channel's slide effect.");
|
ImGui::SetTooltip(_("when enabled, note off will not reset the channel's slide effect."));
|
||||||
}
|
}
|
||||||
InvCheckbox("Don't reset portamento after reaching target",&e->song.targetResetsSlides);
|
InvCheckbox(_("Don't reset portamento after reaching target"),&e->song.targetResetsSlides);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, the slide effect will not be disabled after it reaches its target.");
|
ImGui::SetTooltip(_("when enabled, the slide effect will not be disabled after it reaches its target."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Continuous vibrato",&e->song.continuousVibrato);
|
ImGui::Checkbox(_("Continuous vibrato"),&e->song.continuousVibrato);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, vibrato phase/position will not be reset on a new note.");
|
ImGui::SetTooltip(_("when enabled, vibrato phase/position will not be reset on a new note."));
|
||||||
}
|
}
|
||||||
InvCheckbox("Pitch macro is not linear",&e->song.pitchMacroIsLinear);
|
InvCheckbox(_("Pitch macro is not linear"),&e->song.pitchMacroIsLinear);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, the pitch macro of an instrument is in frequency/period space.");
|
ImGui::SetTooltip(_("when enabled, the pitch macro of an instrument is in frequency/period space."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Reset arpeggio effect position on new note",&e->song.resetArpPhaseOnNewNote);
|
ImGui::Checkbox(_("Reset arpeggio effect position on new note"),&e->song.resetArpPhaseOnNewNote);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, arpeggio effect (00xy) position is reset on a new note.");
|
ImGui::SetTooltip(_("when enabled, arpeggio effect (00xy) position is reset on a new note."));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("Volume scaling rounds up",&e->song.ceilVolumeScaling);
|
ImGui::Checkbox(_("Volume scaling rounds up"),&e->song.ceilVolumeScaling);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("when enabled, volume macros round up when applied\nthis prevents volume scaling from causing vol=0, which is silent on some chips\n\nineffective on logarithmic channels");
|
ImGui::SetTooltip(_("when enabled, volume macros round up when applied\nthis prevents volume scaling from causing vol=0, which is silent on some chips\n\nineffective on logarithmic channels"));
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,18 +109,18 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
nextWindow=GUI_WINDOW_NOTHING;
|
nextWindow=GUI_WINDOW_NOTHING;
|
||||||
}
|
}
|
||||||
if (!csPlayerOpen) return;
|
if (!csPlayerOpen) return;
|
||||||
if (ImGui::Begin("Command Stream Player",&csPlayerOpen,globalWinFlags)) {
|
if (ImGui::Begin("Command Stream Player",&csPlayerOpen,globalWinFlags,_("Command Stream Player"))) {
|
||||||
if (ImGui::Button("Load")) {
|
if (ImGui::Button(_("Load"))) {
|
||||||
openFileDialog(GUI_FILE_CMDSTREAM_OPEN);
|
openFileDialog(GUI_FILE_CMDSTREAM_OPEN);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Kill")) {
|
if (ImGui::Button(_("Kill"))) {
|
||||||
if (!e->killStream()) {
|
if (!e->killStream()) {
|
||||||
showError("Kikai wa mou shindeiru!");
|
showError(_("Kikai wa mou shindeiru!"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Burn Current Song")) {
|
if (ImGui::Button(_("Burn Current Song"))) {
|
||||||
SafeWriter* w=e->saveCommand();
|
SafeWriter* w=e->saveCommand();
|
||||||
if (w!=NULL) {
|
if (w!=NULL) {
|
||||||
if (!e->playStream(w->getFinalBuf(),w->size())) {
|
if (!e->playStream(w->getFinalBuf(),w->size())) {
|
||||||
|
@ -138,34 +138,34 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
if (cs) {
|
if (cs) {
|
||||||
if (ImGui::BeginTabBar("CSOptions")) {
|
if (ImGui::BeginTabBar("CSOptions")) {
|
||||||
int chans=e->getTotalChannelCount();
|
int chans=e->getTotalChannelCount();
|
||||||
if (ImGui::BeginTabItem("Status")) {
|
if (ImGui::BeginTabItem(_("Status"))) {
|
||||||
if (ImGui::BeginTable("CSStat",12,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_ScrollX|ImGuiTableFlags_Borders)) {
|
if (ImGui::BeginTable("CSStat",12,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_ScrollX|ImGuiTableFlags_Borders)) {
|
||||||
ImGui::TableSetupScrollFreeze(1,1);
|
ImGui::TableSetupScrollFreeze(1,1);
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("channel");
|
ImGui::Text(_("channel"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("start");
|
ImGui::Text(_("start"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("PC");
|
ImGui::Text(_("PC"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("wait");
|
ImGui::Text(_("wait"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("SP");
|
ImGui::Text(_("SP"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("note");
|
ImGui::Text(_("note"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("pitch");
|
ImGui::Text(_("pitch"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("vol");
|
ImGui::Text(_("vol"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("vols");
|
ImGui::Text(_("vols"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("vib");
|
ImGui::Text(_("vib"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("porta");
|
ImGui::Text(_("porta"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("arp");
|
ImGui::Text(_("arp"));
|
||||||
|
|
||||||
for (int i=0; i<chans; i++) {
|
for (int i=0; i<chans; i++) {
|
||||||
DivCSChannelState* state=cs->getChanState(i);
|
DivCSChannelState* state=cs->getChanState(i);
|
||||||
|
@ -200,7 +200,7 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Trace")) {
|
if (ImGui::BeginTabItem(_("Trace"))) {
|
||||||
ImGui::PushFont(patFont);
|
ImGui::PushFont(patFont);
|
||||||
if (ImGui::BeginTable("CSTrace",chans,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_Borders|ImGuiTableFlags_ScrollX)) {
|
if (ImGui::BeginTable("CSTrace",chans,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_Borders|ImGuiTableFlags_ScrollX)) {
|
||||||
char tempID[32];
|
char tempID[32];
|
||||||
|
@ -241,10 +241,10 @@ void FurnaceGUI::drawCSPlayer() {
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Disassemble")) {
|
if (ImGui::BeginTabItem(_("Disassemble"))) {
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Hex")) {
|
if (ImGui::BeginTabItem(_("Hex"))) {
|
||||||
ImGui::PushFont(patFont);
|
ImGui::PushFont(patFont);
|
||||||
if (ImGui::BeginTable("CSHexPos",chans,ImGuiTableFlags_SizingStretchSame)) {
|
if (ImGui::BeginTable("CSHexPos",chans,ImGuiTableFlags_SizingStretchSame)) {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
|
|
|
@ -202,7 +202,7 @@ void FurnaceGUI::finishSelection() {
|
||||||
selEnd.xFine=2+e->curPat[selEnd.xCoarse].effectCols*2;
|
selEnd.xFine=2+e->curPat[selEnd.xCoarse].effectCols*2;
|
||||||
}
|
}
|
||||||
|
|
||||||
logV("finish selection: %d.%d,%d - %d.%d,%d",selStart.xCoarse,selStart.xFine,selStart.y,selEnd.xCoarse,selEnd.xFine,selEnd.y);
|
logV(_("finish selection: %d.%d,%d - %d.%d,%d"),selStart.xCoarse,selStart.xFine,selStart.y,selEnd.xCoarse,selEnd.xFine,selEnd.y);
|
||||||
|
|
||||||
e->setMidiBaseChan(cursor.xCoarse);
|
e->setMidiBaseChan(cursor.xCoarse);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,10 +73,10 @@ const char* sampleNote[12]={
|
||||||
void FurnaceGUI::insListItem(int i, int dir, int asset) {
|
void FurnaceGUI::insListItem(int i, int dir, int asset) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(i);
|
||||||
String name=(settings.insIconsStyle==0)?"":ICON_FA_CIRCLE_O;
|
String name=(settings.insIconsStyle==0)?"":ICON_FA_CIRCLE_O;
|
||||||
const char* insType="Bug!";
|
const char* insType=_("Bug!");
|
||||||
if (i>=0 && i<e->song.insLen) {
|
if (i>=0 && i<e->song.insLen) {
|
||||||
DivInstrument* ins=e->song.ins[i];
|
DivInstrument* ins=e->song.ins[i];
|
||||||
insType=(ins->type>=DIV_INS_MAX)?"Unknown":insTypes[ins->type][0];
|
insType=(ins->type>=DIV_INS_MAX)?_("Unknown"):_(insTypes[ins->type][0]);
|
||||||
const char** insIcon=NULL;
|
const char** insIcon=NULL;
|
||||||
|
|
||||||
if (ins->type>=DIV_INS_MAX) {
|
if (ins->type>=DIV_INS_MAX) {
|
||||||
|
@ -133,19 +133,19 @@ void FurnaceGUI::insListItem(int i, int dir, int asset) {
|
||||||
curIns=i;
|
curIns=i;
|
||||||
updateFMPreview=true;
|
updateFMPreview=true;
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
||||||
if (ImGui::MenuItem("duplicate")) {
|
if (ImGui::MenuItem(_("duplicate"))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_DUPLICATE);
|
doAction(GUI_ACTION_INS_LIST_DUPLICATE);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("replace...")) {
|
if (ImGui::MenuItem(_("replace..."))) {
|
||||||
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("save")) {
|
if (ImGui::MenuItem(_("save"))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_SAVE);
|
doAction(GUI_ACTION_INS_LIST_SAVE);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("save (.dmp)")) {
|
if (ImGui::MenuItem(_("save (.dmp)"))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("delete")) {
|
if (ImGui::MenuItem(_("delete"))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_DELETE);
|
doAction(GUI_ACTION_INS_LIST_DELETE);
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
|
@ -240,7 +240,7 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) {
|
||||||
ImGui::Text(ICON_FA_EXCLAMATION_TRIANGLE);
|
ImGui::Text(ICON_FA_EXCLAMATION_TRIANGLE);
|
||||||
if (ImGui::IsItemHovered() && !mobileUI) {
|
if (ImGui::IsItemHovered() && !mobileUI) {
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
||||||
ImGui::SetTooltip("out of memory for this sample!");
|
ImGui::SetTooltip(_("out of memory for this sample!"));
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
|
@ -251,22 +251,22 @@ void FurnaceGUI::sampleListItem(int i, int dir, int asset) {
|
||||||
updateSampleTex=true;
|
updateSampleTex=true;
|
||||||
lastAssetType=2;
|
lastAssetType=2;
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
||||||
if (ImGui::MenuItem("make instrument")) {
|
if (ImGui::MenuItem(_("make instrument"))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_MAKE_INS);
|
doAction(GUI_ACTION_SAMPLE_MAKE_INS);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("make me a drum kit")) {
|
if (ImGui::MenuItem(_("make me a drum kit"))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_MAKE_MAP);
|
doAction(GUI_ACTION_SAMPLE_LIST_MAKE_MAP);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("duplicate")) {
|
if (ImGui::MenuItem(_("duplicate"))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE);
|
doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("replace...")) {
|
if (ImGui::MenuItem(_("replace..."))) {
|
||||||
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("save")) {
|
if (ImGui::MenuItem(_("save"))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("delete")) {
|
if (ImGui::MenuItem(_("delete"))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_DELETE);
|
doAction(GUI_ACTION_SAMPLE_LIST_DELETE);
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
|
@ -287,7 +287,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
if (asChild) {
|
if (asChild) {
|
||||||
began=ImGui::BeginChild("Instruments");
|
began=ImGui::BeginChild("Instruments");
|
||||||
} else {
|
} else {
|
||||||
began=ImGui::Begin("Instruments",&insListOpen,globalWinFlags);
|
began=ImGui::Begin("Instruments",&insListOpen,globalWinFlags,_("Instruments"));
|
||||||
}
|
}
|
||||||
if (began) {
|
if (began) {
|
||||||
if (settings.unifiedDataView) settings.horizontalDataView=0;
|
if (settings.unifiedDataView) settings.horizontalDataView=0;
|
||||||
|
@ -309,7 +309,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Add");
|
ImGui::SetTooltip(_("Add"));
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
makeInsTypeList=e->getPossibleInsTypes();
|
makeInsTypeList=e->getPossibleInsTypes();
|
||||||
|
@ -335,7 +335,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Duplicate");
|
ImGui::SetTooltip(_("Duplicate"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##InsLoad")) {
|
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##InsLoad")) {
|
||||||
|
@ -356,47 +356,47 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Open");
|
ImGui::SetTooltip(_("Open"));
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopupContextItem("InsOpenOpt")) {
|
if (ImGui::BeginPopupContextItem("InsOpenOpt")) {
|
||||||
if (settings.unifiedDataView) {
|
if (settings.unifiedDataView) {
|
||||||
if (ImGui::MenuItem("replace instrument...")) {
|
if (ImGui::MenuItem(_("replace instrument..."))) {
|
||||||
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("load instrument from TX81Z")) {
|
if (ImGui::MenuItem(_("load instrument from TX81Z"))) {
|
||||||
doAction(GUI_ACTION_TX81Z_REQUEST);
|
doAction(GUI_ACTION_TX81Z_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::MenuItem("replace wavetable...")) {
|
if (ImGui::MenuItem(_("replace wavetable..."))) {
|
||||||
doAction((curWave>=0 && curWave<(int)e->song.wave.size())?GUI_ACTION_WAVE_LIST_OPEN_REPLACE:GUI_ACTION_WAVE_LIST_OPEN);
|
doAction((curWave>=0 && curWave<(int)e->song.wave.size())?GUI_ACTION_WAVE_LIST_OPEN_REPLACE:GUI_ACTION_WAVE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::MenuItem("replace sample...")) {
|
if (ImGui::MenuItem(_("replace sample..."))) {
|
||||||
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("import raw sample...")) {
|
if (ImGui::MenuItem(_("import raw sample..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("import raw sample (replace)...")) {
|
if (ImGui::MenuItem(_("import raw sample (replace)..."))) {
|
||||||
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE_RAW:GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE_RAW:GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::MenuItem("replace...")) {
|
if (ImGui::MenuItem(_("replace..."))) {
|
||||||
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
doAction((curIns>=0 && curIns<(int)e->song.ins.size())?GUI_ACTION_INS_LIST_OPEN_REPLACE:GUI_ACTION_INS_LIST_OPEN);
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::MenuItem("load from TX81Z")) {
|
if (ImGui::MenuItem(_("load from TX81Z"))) {
|
||||||
doAction(GUI_ACTION_TX81Z_REQUEST);
|
doAction(GUI_ACTION_TX81Z_REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Open (insert; right-click to replace)");
|
ImGui::SetTooltip(_("Open (insert; right-click to replace)"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FLOPPY_O "##InsSave")) {
|
if (ImGui::Button(ICON_FA_FLOPPY_O "##InsSave")) {
|
||||||
|
@ -417,30 +417,30 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Save");
|
ImGui::SetTooltip(_("Save"));
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopupContextItem("InsSaveFormats",ImGuiMouseButton_Right)) {
|
if (ImGui::BeginPopupContextItem("InsSaveFormats",ImGuiMouseButton_Right)) {
|
||||||
if (settings.unifiedDataView) {
|
if (settings.unifiedDataView) {
|
||||||
if (ImGui::MenuItem("save instrument as .dmp...")) {
|
if (ImGui::MenuItem(_("save instrument as .dmp..."))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::MenuItem("save wavetable as .dmw...")) {
|
if (ImGui::MenuItem(_("save wavetable as .dmw..."))) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE_DMW);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_DMW);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("save raw wavetable...")) {
|
if (ImGui::MenuItem(_("save raw wavetable..."))) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::MenuItem("save raw sample...")) {
|
if (ImGui::MenuItem(_("save raw sample..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::MenuItem("save as .dmp...")) {
|
if (ImGui::MenuItem(_("save as .dmp..."))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -453,7 +453,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Toggle folders/standard view");
|
ImGui::SetTooltip(_("Toggle folders/standard view"));
|
||||||
}
|
}
|
||||||
if (!insListDir) {
|
if (!insListDir) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -475,7 +475,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move up");
|
ImGui::SetTooltip(_("Move up"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_ARROW_DOWN "##InsDown")) {
|
if (ImGui::Button(ICON_FA_ARROW_DOWN "##InsDown")) {
|
||||||
|
@ -496,7 +496,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move down");
|
ImGui::SetTooltip(_("Move down"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -507,7 +507,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
ImGui::InputText("##FolderName",&folderString);
|
ImGui::InputText("##FolderName",&folderString);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::BeginDisabled(folderString.empty());
|
ImGui::BeginDisabled(folderString.empty());
|
||||||
if (ImGui::Button("Create")) {
|
if (ImGui::Button(_("Create"))) {
|
||||||
if (settings.unifiedDataView) {
|
if (settings.unifiedDataView) {
|
||||||
switch (lastAssetType) {
|
switch (lastAssetType) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -537,7 +537,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("New folder");
|
ImGui::SetTooltip(_("New folder"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lastAssetType==2) {
|
if (lastAssetType==2) {
|
||||||
|
@ -546,7 +546,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_PREVIEW);
|
doAction(GUI_ACTION_SAMPLE_LIST_PREVIEW);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Preview (right click to stop)");
|
ImGui::SetTooltip(_("Preview (right click to stop)"));
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW);
|
doAction(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW);
|
||||||
|
@ -573,7 +573,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Delete");
|
ImGui::SetTooltip(_("Delete"));
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
int availableRows=ImGui::GetContentRegionAvail().y/ImGui::GetFrameHeight();
|
int availableRows=ImGui::GetContentRegionAvail().y/ImGui::GetFrameHeight();
|
||||||
|
@ -590,7 +590,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
lastAssetType=0;
|
lastAssetType=0;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Instruments");
|
ImGui::Text(_("Instruments"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,16 +605,16 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
int dirIndex=0;
|
int dirIndex=0;
|
||||||
int dirToDelete=-1;
|
int dirToDelete=-1;
|
||||||
for (DivAssetDir& i: e->song.insDir) {
|
for (DivAssetDir& i: e->song.insDir) {
|
||||||
String nodeName=fmt::sprintf("%s %s##_ADI%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?"<uncategorized>":i.name,i.name.empty()?-1:dirIndex);
|
String nodeName=fmt::sprintf("%s %s##_ADI%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?_("<uncategorized>"):i.name,i.name.empty()?-1:dirIndex);
|
||||||
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
||||||
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
||||||
DRAG_SOURCE(dirIndex,-1,"FUR_INSDIR");
|
DRAG_SOURCE(dirIndex,-1,"FUR_INSDIR");
|
||||||
DRAG_TARGET(dirIndex,-1,e->song.insDir,"FUR_INSDIR");
|
DRAG_TARGET(dirIndex,-1,e->song.insDir,"FUR_INSDIR");
|
||||||
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
||||||
if (ImGui::MenuItem("rename...")) {
|
if (ImGui::MenuItem(_("rename..."))) {
|
||||||
editStr(&i.name);
|
editStr(&i.name);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("delete")) {
|
if (ImGui::MenuItem(_("delete"))) {
|
||||||
dirToDelete=dirIndex;
|
dirToDelete=dirIndex;
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -660,7 +660,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
lastAssetType=1;
|
lastAssetType=1;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Wavetables");
|
ImGui::Text(_("Wavetables"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
actualWaveList();
|
actualWaveList();
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
@ -671,7 +671,7 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
lastAssetType=2;
|
lastAssetType=2;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Samples");
|
ImGui::Text(_("Samples"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
actualSampleList();
|
actualSampleList();
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
@ -704,31 +704,31 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
if (asChild) {
|
if (asChild) {
|
||||||
began=ImGui::BeginChild("Wavetables");
|
began=ImGui::BeginChild("Wavetables");
|
||||||
} else {
|
} else {
|
||||||
began=ImGui::Begin("Wavetables",&waveListOpen,globalWinFlags);
|
began=ImGui::Begin("Wavetables",&waveListOpen,globalWinFlags,_("Wavetables"));
|
||||||
}
|
}
|
||||||
if (began) {
|
if (began) {
|
||||||
if (ImGui::Button(ICON_FA_PLUS "##WaveAdd")) {
|
if (ImGui::Button(ICON_FA_PLUS "##WaveAdd")) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_ADD);
|
doAction(GUI_ACTION_WAVE_LIST_ADD);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Add");
|
ImGui::SetTooltip(_("Add"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FILES_O "##WaveClone")) {
|
if (ImGui::Button(ICON_FA_FILES_O "##WaveClone")) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_DUPLICATE);
|
doAction(GUI_ACTION_WAVE_LIST_DUPLICATE);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Duplicate");
|
ImGui::SetTooltip(_("Duplicate"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##WaveLoad")) {
|
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##WaveLoad")) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_OPEN);
|
doAction(GUI_ACTION_WAVE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Open");
|
ImGui::SetTooltip(_("Open"));
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopupContextItem("WaveOpenOpt")) {
|
if (ImGui::BeginPopupContextItem("WaveOpenOpt")) {
|
||||||
if (ImGui::MenuItem("replace...")) {
|
if (ImGui::MenuItem(_("replace..."))) {
|
||||||
doAction((curWave>=0 && curWave<(int)e->song.wave.size())?GUI_ACTION_WAVE_LIST_OPEN_REPLACE:GUI_ACTION_WAVE_LIST_OPEN);
|
doAction((curWave>=0 && curWave<(int)e->song.wave.size())?GUI_ACTION_WAVE_LIST_OPEN_REPLACE:GUI_ACTION_WAVE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -738,14 +738,14 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Save");
|
ImGui::SetTooltip(_("Save"));
|
||||||
}
|
}
|
||||||
if (!settings.unifiedDataView) {
|
if (!settings.unifiedDataView) {
|
||||||
if (ImGui::BeginPopupContextItem("WaveSaveFormats",ImGuiMouseButton_Right)) {
|
if (ImGui::BeginPopupContextItem("WaveSaveFormats",ImGuiMouseButton_Right)) {
|
||||||
if (ImGui::MenuItem("save as .dmw...")) {
|
if (ImGui::MenuItem(_("save as .dmw..."))) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE_DMW);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_DMW);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("save raw...")) {
|
if (ImGui::MenuItem(_("save raw..."))) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -758,7 +758,7 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Toggle folders/standard view");
|
ImGui::SetTooltip(_("Toggle folders/standard view"));
|
||||||
}
|
}
|
||||||
if (!waveListDir) {
|
if (!waveListDir) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -766,14 +766,14 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_MOVE_UP);
|
doAction(GUI_ACTION_WAVE_LIST_MOVE_UP);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move up");
|
ImGui::SetTooltip(_("Move up"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_ARROW_DOWN "##WaveDown")) {
|
if (ImGui::Button(ICON_FA_ARROW_DOWN "##WaveDown")) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_MOVE_DOWN);
|
doAction(GUI_ACTION_WAVE_LIST_MOVE_DOWN);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move down");
|
ImGui::SetTooltip(_("Move down"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -784,7 +784,7 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
ImGui::InputText("##FolderName",&folderString);
|
ImGui::InputText("##FolderName",&folderString);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::BeginDisabled(folderString.empty());
|
ImGui::BeginDisabled(folderString.empty());
|
||||||
if (ImGui::Button("Create")) {
|
if (ImGui::Button(_("Create"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->song.waveDir.push_back(DivAssetDir(folderString));
|
e->song.waveDir.push_back(DivAssetDir(folderString));
|
||||||
});
|
});
|
||||||
|
@ -794,7 +794,7 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("New folder");
|
ImGui::SetTooltip(_("New folder"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -804,7 +804,7 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Delete");
|
ImGui::SetTooltip(_("Delete"));
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::BeginTable("WaveListScroll",1,ImGuiTableFlags_ScrollY)) {
|
if (ImGui::BeginTable("WaveListScroll",1,ImGuiTableFlags_ScrollY)) {
|
||||||
|
@ -836,42 +836,42 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
if (asChild) {
|
if (asChild) {
|
||||||
began=ImGui::BeginChild("Samples");
|
began=ImGui::BeginChild("Samples");
|
||||||
} else {
|
} else {
|
||||||
began=ImGui::Begin("Samples",&sampleListOpen,globalWinFlags);
|
began=ImGui::Begin("Samples",&sampleListOpen,globalWinFlags,_("Samples"));
|
||||||
}
|
}
|
||||||
if (began) {
|
if (began) {
|
||||||
if (ImGui::Button(ICON_FA_FILE "##SampleAdd")) {
|
if (ImGui::Button(ICON_FA_FILE "##SampleAdd")) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_ADD);
|
doAction(GUI_ACTION_SAMPLE_LIST_ADD);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Add");
|
ImGui::SetTooltip(_("Add"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FILES_O "##SampleClone")) {
|
if (ImGui::Button(ICON_FA_FILES_O "##SampleClone")) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE);
|
doAction(GUI_ACTION_SAMPLE_LIST_DUPLICATE);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Duplicate");
|
ImGui::SetTooltip(_("Duplicate"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##SampleLoad")) {
|
if (ImGui::Button(ICON_FA_FOLDER_OPEN "##SampleLoad")) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_OPEN);
|
doAction(GUI_ACTION_SAMPLE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Open");
|
ImGui::SetTooltip(_("Open"));
|
||||||
}
|
}
|
||||||
if (mobileUI && ImGui::IsItemActive() && CHECK_LONG_HOLD) {
|
if (mobileUI && ImGui::IsItemActive() && CHECK_LONG_HOLD) {
|
||||||
ImGui::OpenPopup("SampleOpenOpt");
|
ImGui::OpenPopup("SampleOpenOpt");
|
||||||
NOTIFY_LONG_HOLD;
|
NOTIFY_LONG_HOLD;
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopupContextItem("SampleOpenOpt")) {
|
if (ImGui::BeginPopupContextItem("SampleOpenOpt")) {
|
||||||
if (ImGui::MenuItem("replace...")) {
|
if (ImGui::MenuItem(_("replace..."))) {
|
||||||
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE:GUI_ACTION_SAMPLE_LIST_OPEN);
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::MenuItem("import raw...")) {
|
if (ImGui::MenuItem(_("import raw..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("import raw (replace)...")) {
|
if (ImGui::MenuItem(_("import raw (replace)..."))) {
|
||||||
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE_RAW:GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
doAction((curSample>=0 && curSample<(int)e->song.sample.size())?GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE_RAW:GUI_ACTION_SAMPLE_LIST_OPEN_RAW);
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -881,14 +881,14 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Save");
|
ImGui::SetTooltip(_("Save"));
|
||||||
}
|
}
|
||||||
if (mobileUI && ImGui::IsItemActive() && CHECK_LONG_HOLD) {
|
if (mobileUI && ImGui::IsItemActive() && CHECK_LONG_HOLD) {
|
||||||
ImGui::OpenPopup("SampleSaveOpt");
|
ImGui::OpenPopup("SampleSaveOpt");
|
||||||
NOTIFY_LONG_HOLD;
|
NOTIFY_LONG_HOLD;
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopupContextItem("SampleSaveOpt")) {
|
if (ImGui::BeginPopupContextItem("SampleSaveOpt")) {
|
||||||
if (ImGui::MenuItem("save raw...")) {
|
if (ImGui::MenuItem(_("save raw..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -900,7 +900,7 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Toggle folders/standard view");
|
ImGui::SetTooltip(_("Toggle folders/standard view"));
|
||||||
}
|
}
|
||||||
if (!sampleListDir) {
|
if (!sampleListDir) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -908,14 +908,14 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_MOVE_UP);
|
doAction(GUI_ACTION_SAMPLE_LIST_MOVE_UP);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move up");
|
ImGui::SetTooltip(_("Move up"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_ARROW_DOWN "##SampleDown")) {
|
if (ImGui::Button(ICON_FA_ARROW_DOWN "##SampleDown")) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_MOVE_DOWN);
|
doAction(GUI_ACTION_SAMPLE_LIST_MOVE_DOWN);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move down");
|
ImGui::SetTooltip(_("Move down"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -926,7 +926,7 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
ImGui::InputText("##FolderName",&folderString);
|
ImGui::InputText("##FolderName",&folderString);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::BeginDisabled(folderString.empty());
|
ImGui::BeginDisabled(folderString.empty());
|
||||||
if (ImGui::Button("Create")) {
|
if (ImGui::Button(_("Create"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->song.sampleDir.push_back(DivAssetDir(folderString));
|
e->song.sampleDir.push_back(DivAssetDir(folderString));
|
||||||
});
|
});
|
||||||
|
@ -936,7 +936,7 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("New folder");
|
ImGui::SetTooltip(_("New folder"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -944,7 +944,7 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_PREVIEW);
|
doAction(GUI_ACTION_SAMPLE_LIST_PREVIEW);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Preview (right click to stop)");
|
ImGui::SetTooltip(_("Preview (right click to stop)"));
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW);
|
doAction(GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW);
|
||||||
|
@ -956,7 +956,7 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Delete");
|
ImGui::SetTooltip(_("Delete"));
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::BeginTable("SampleListScroll",1,ImGuiTableFlags_ScrollY)) {
|
if (ImGui::BeginTable("SampleListScroll",1,ImGuiTableFlags_ScrollY)) {
|
||||||
|
@ -982,16 +982,16 @@ void FurnaceGUI::actualWaveList() {
|
||||||
int dirIndex=0;
|
int dirIndex=0;
|
||||||
int dirToDelete=-1;
|
int dirToDelete=-1;
|
||||||
for (DivAssetDir& i: e->song.waveDir) {
|
for (DivAssetDir& i: e->song.waveDir) {
|
||||||
String nodeName=fmt::sprintf("%s %s##_ADW%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?"<uncategorized>":i.name,i.name.empty()?-1:dirIndex);
|
String nodeName=fmt::sprintf("%s %s##_ADW%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?_("<uncategorized>"):i.name,i.name.empty()?-1:dirIndex);
|
||||||
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
||||||
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
||||||
DRAG_SOURCE(dirIndex,-1,"FUR_WAVEDIR");
|
DRAG_SOURCE(dirIndex,-1,"FUR_WAVEDIR");
|
||||||
DRAG_TARGET(dirIndex,-1,e->song.waveDir,"FUR_WAVEDIR");
|
DRAG_TARGET(dirIndex,-1,e->song.waveDir,"FUR_WAVEDIR");
|
||||||
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
||||||
if (ImGui::MenuItem("rename...")) {
|
if (ImGui::MenuItem(_("rename..."))) {
|
||||||
editStr(&i.name);
|
editStr(&i.name);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("delete")) {
|
if (ImGui::MenuItem(_("delete"))) {
|
||||||
dirToDelete=dirIndex;
|
dirToDelete=dirIndex;
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
@ -1028,16 +1028,16 @@ void FurnaceGUI::actualSampleList() {
|
||||||
int dirIndex=0;
|
int dirIndex=0;
|
||||||
int dirToDelete=-1;
|
int dirToDelete=-1;
|
||||||
for (DivAssetDir& i: e->song.sampleDir) {
|
for (DivAssetDir& i: e->song.sampleDir) {
|
||||||
String nodeName=fmt::sprintf("%s %s##_ADS%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?"<uncategorized>":i.name,i.name.empty()?-1:dirIndex);
|
String nodeName=fmt::sprintf("%s %s##_ADS%d",i.name.empty()?ICON_FA_FOLDER_O:ICON_FA_FOLDER,i.name.empty()?_("<uncategorized>"):i.name,i.name.empty()?-1:dirIndex);
|
||||||
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
String popupID=fmt::sprintf("DirRightMenu%d",dirIndex);
|
||||||
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
bool treeNode=ImGui::TreeNodeEx(nodeName.c_str(),ImGuiTreeNodeFlags_SpanAvailWidth|(i.name.empty()?ImGuiTreeNodeFlags_DefaultOpen:0));
|
||||||
DRAG_SOURCE(dirIndex,-1,"FUR_SDIR");
|
DRAG_SOURCE(dirIndex,-1,"FUR_SDIR");
|
||||||
DRAG_TARGET(dirIndex,-1,e->song.sampleDir,"FUR_SDIR");
|
DRAG_TARGET(dirIndex,-1,e->song.sampleDir,"FUR_SDIR");
|
||||||
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
if (ImGui::BeginPopupContextItem(popupID.c_str())) {
|
||||||
if (ImGui::MenuItem("rename...")) {
|
if (ImGui::MenuItem(_("rename..."))) {
|
||||||
editStr(&i.name);
|
editStr(&i.name);
|
||||||
}
|
}
|
||||||
if (ImGui::MenuItem("delete")) {
|
if (ImGui::MenuItem(_("delete"))) {
|
||||||
dirToDelete=dirIndex;
|
dirToDelete=dirIndex;
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
|
|
|
@ -35,6 +35,7 @@ static float oscDebugMin=-1.0;
|
||||||
static float oscDebugMax=1.0;
|
static float oscDebugMax=1.0;
|
||||||
static float oscDebugPower=1.0;
|
static float oscDebugPower=1.0;
|
||||||
static int oscDebugRepeat=1;
|
static int oscDebugRepeat=1;
|
||||||
|
static int numApples=1;
|
||||||
|
|
||||||
static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
static void _drawOsc(const ImDrawList* drawList, const ImDrawCmd* cmd) {
|
||||||
if (cmd!=NULL) {
|
if (cmd!=NULL) {
|
||||||
|
@ -62,7 +63,7 @@ void FurnaceGUI::drawDebug() {
|
||||||
}
|
}
|
||||||
if (!debugOpen) return;
|
if (!debugOpen) return;
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(100.0f*dpiScale,100.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(100.0f*dpiScale,100.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
if (ImGui::Begin("Debug",&debugOpen,globalWinFlags|ImGuiWindowFlags_NoDocking)) {
|
if (ImGui::Begin("Debug",&debugOpen,globalWinFlags|ImGuiWindowFlags_NoDocking,_("Debug"))) {
|
||||||
ImGui::Text("NOTE: use with caution.");
|
ImGui::Text("NOTE: use with caution.");
|
||||||
if (ImGui::TreeNode("Debug Controls")) {
|
if (ImGui::TreeNode("Debug Controls")) {
|
||||||
if (e->isHalted()) {
|
if (e->isHalted()) {
|
||||||
|
@ -658,6 +659,11 @@ void FurnaceGUI::drawDebug() {
|
||||||
}
|
}
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
if (ImGui::TreeNode("Locale Test")) {
|
||||||
|
ImGui::TextUnformatted(_("This is a language test."));
|
||||||
|
ImGui::TextUnformatted(_("This is another language test."));
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
if (ImGui::TreeNode("Osc Render Test")) {
|
if (ImGui::TreeNode("Osc Render Test")) {
|
||||||
ImGui::InputInt("Length",&oscDebugLen);
|
ImGui::InputInt("Length",&oscDebugLen);
|
||||||
ImGui::InputInt("Height",&oscDebugHeight);
|
ImGui::InputInt("Height",&oscDebugHeight);
|
||||||
|
@ -708,6 +714,13 @@ void FurnaceGUI::drawDebug() {
|
||||||
}
|
}
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_LOCALE
|
||||||
|
if (ImGui::TreeNode("Plural Form Test")) {
|
||||||
|
ImGui::InputInt("Number",&numApples);
|
||||||
|
ImGui::Text(ngettext("%d apple","%d apples",numApples),numApples);
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (ImGui::TreeNode("User Interface")) {
|
if (ImGui::TreeNode("User Interface")) {
|
||||||
if (ImGui::Button("Inspect")) {
|
if (ImGui::Button("Inspect")) {
|
||||||
inspectorOpen=!inspectorOpen;
|
inspectorOpen=!inspectorOpen;
|
||||||
|
|
|
@ -35,21 +35,21 @@ void FurnaceGUI::doAction(int what) {
|
||||||
switch (what) {
|
switch (what) {
|
||||||
case GUI_ACTION_NEW:
|
case GUI_ACTION_NEW:
|
||||||
if (modified) {
|
if (modified) {
|
||||||
showWarning("Unsaved changes! Save changes before creating a new song?",GUI_WARN_NEW);
|
showWarning(_("Unsaved changes! Save changes before creating a new song?"),GUI_WARN_NEW);
|
||||||
} else {
|
} else {
|
||||||
displayNew=true;
|
displayNew=true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GUI_ACTION_OPEN:
|
case GUI_ACTION_OPEN:
|
||||||
if (modified) {
|
if (modified) {
|
||||||
showWarning("Unsaved changes! Save changes before opening another file?",GUI_WARN_OPEN);
|
showWarning(_("Unsaved changes! Save changes before opening another file?"),GUI_WARN_OPEN);
|
||||||
} else {
|
} else {
|
||||||
openFileDialog(GUI_FILE_OPEN);
|
openFileDialog(GUI_FILE_OPEN);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GUI_ACTION_OPEN_BACKUP:
|
case GUI_ACTION_OPEN_BACKUP:
|
||||||
if (modified) {
|
if (modified) {
|
||||||
showWarning("Unsaved changes! Save changes before opening backup?",GUI_WARN_OPEN_BACKUP);
|
showWarning(_("Unsaved changes! Save changes before opening backup?"),GUI_WARN_OPEN_BACKUP);
|
||||||
} else {
|
} else {
|
||||||
openFileDialog(GUI_FILE_OPEN_BACKUP);
|
openFileDialog(GUI_FILE_OPEN_BACKUP);
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
openFileDialog(GUI_FILE_SAVE);
|
openFileDialog(GUI_FILE_SAVE);
|
||||||
} else {
|
} else {
|
||||||
if (save(curFileName,e->song.isDMF?e->song.version:0)>0) {
|
if (save(curFileName,e->song.isDMF?e->song.version:0)>0) {
|
||||||
showError(fmt::sprintf("Error while saving file! (%s)",lastError));
|
showError(fmt::sprintf(_("Error while saving file! (%s)"),lastError));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -186,7 +186,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
msg.sysExLen=15;
|
msg.sysExLen=15;
|
||||||
memcpy(msg.sysExData.get(),avRequest,15);
|
memcpy(msg.sysExData.get(),avRequest,15);
|
||||||
if (!e->sendMidiMessage(msg)) {
|
if (!e->sendMidiMessage(msg)) {
|
||||||
showError("Error while sending request (MIDI output not configured?)");
|
showError(_("Error while sending request (MIDI output not configured?)"));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
e->syncReset();
|
e->syncReset();
|
||||||
break;
|
break;
|
||||||
case GUI_ACTION_CLEAR:
|
case GUI_ACTION_CLEAR:
|
||||||
showWarning("Select an option: (cannot be undone!)",GUI_WARN_CLEAR);
|
showWarning(_("Select an option: (cannot be undone!)"),GUI_WARN_CLEAR);
|
||||||
break;
|
break;
|
||||||
case GUI_ACTION_COMMAND_PALETTE:
|
case GUI_ACTION_COMMAND_PALETTE:
|
||||||
displayPalette=true;
|
displayPalette=true;
|
||||||
|
@ -688,7 +688,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
}
|
}
|
||||||
curIns=e->addInstrument(cursor.xCoarse);
|
curIns=e->addInstrument(cursor.xCoarse);
|
||||||
if (curIns==-1) {
|
if (curIns==-1) {
|
||||||
showError("too many instruments!");
|
showError(_("too many instruments!"));
|
||||||
} else {
|
} else {
|
||||||
if (settings.blankIns) {
|
if (settings.blankIns) {
|
||||||
e->song.ins[curIns]->fm.fb=0;
|
e->song.ins[curIns]->fm.fb=0;
|
||||||
|
@ -717,7 +717,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
int prevIns=curIns;
|
int prevIns=curIns;
|
||||||
curIns=e->addInstrument(cursor.xCoarse);
|
curIns=e->addInstrument(cursor.xCoarse);
|
||||||
if (curIns==-1) {
|
if (curIns==-1) {
|
||||||
showError("too many instruments!");
|
showError(_("too many instruments!"));
|
||||||
} else {
|
} else {
|
||||||
(*e->song.ins[curIns])=(*e->song.ins[prevIns]);
|
(*e->song.ins[curIns])=(*e->song.ins[prevIns]);
|
||||||
wantScrollListIns=true;
|
wantScrollListIns=true;
|
||||||
|
@ -822,7 +822,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
|
|
||||||
curWave=e->addWave();
|
curWave=e->addWave();
|
||||||
if (curWave==-1) {
|
if (curWave==-1) {
|
||||||
showError("too many wavetables!");
|
showError(_("too many wavetables!"));
|
||||||
} else {
|
} else {
|
||||||
wantScrollListWave=true;
|
wantScrollListWave=true;
|
||||||
e->song.wave[curWave]->len=finalWidth;
|
e->song.wave[curWave]->len=finalWidth;
|
||||||
|
@ -840,7 +840,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
int prevWave=curWave;
|
int prevWave=curWave;
|
||||||
curWave=e->addWave();
|
curWave=e->addWave();
|
||||||
if (curWave==-1) {
|
if (curWave==-1) {
|
||||||
showError("too many wavetables!");
|
showError(_("too many wavetables!"));
|
||||||
} else {
|
} else {
|
||||||
(*e->song.wave[curWave])=(*e->song.wave[prevWave]);
|
(*e->song.wave[curWave])=(*e->song.wave[prevWave]);
|
||||||
wantScrollListWave=true;
|
wantScrollListWave=true;
|
||||||
|
@ -906,7 +906,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
case GUI_ACTION_SAMPLE_LIST_ADD:
|
case GUI_ACTION_SAMPLE_LIST_ADD:
|
||||||
curSample=e->addSample();
|
curSample=e->addSample();
|
||||||
if (curSample==-1) {
|
if (curSample==-1) {
|
||||||
showError("too many samples!");
|
showError(_("too many samples!"));
|
||||||
} else {
|
} else {
|
||||||
wantScrollListSample=true;
|
wantScrollListSample=true;
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
|
@ -918,7 +918,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
DivSample* prevSample=e->getSample(curSample);
|
DivSample* prevSample=e->getSample(curSample);
|
||||||
curSample=e->addSample();
|
curSample=e->addSample();
|
||||||
if (curSample==-1) {
|
if (curSample==-1) {
|
||||||
showError("too many samples!");
|
showError(_("too many samples!"));
|
||||||
} else {
|
} else {
|
||||||
e->lockEngine([this,prevSample]() {
|
e->lockEngine([this,prevSample]() {
|
||||||
DivSample* sample=e->getSample(curSample);
|
DivSample* sample=e->getSample(curSample);
|
||||||
|
@ -1121,7 +1121,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
|
|
||||||
e->lockEngine([this,sample,pos]() {
|
e->lockEngine([this,sample,pos]() {
|
||||||
if (!sample->insert(pos,sampleClipboardLen)) {
|
if (!sample->insert(pos,sampleClipboardLen)) {
|
||||||
showError("couldn't paste! make sure your sample is 8 or 16-bit.");
|
showError(_("couldn't paste! make sure your sample is 8 or 16-bit."));
|
||||||
} else {
|
} else {
|
||||||
if (sample->depth==DIV_SAMPLE_DEPTH_8BIT) {
|
if (sample->depth==DIV_SAMPLE_DEPTH_8BIT) {
|
||||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||||
|
@ -1590,7 +1590,7 @@ void FurnaceGUI::doAction(int what) {
|
||||||
DivSample* sample=e->song.sample[curSample];
|
DivSample* sample=e->song.sample[curSample];
|
||||||
curIns=e->addInstrument(cursor.xCoarse);
|
curIns=e->addInstrument(cursor.xCoarse);
|
||||||
if (curIns==-1) {
|
if (curIns==-1) {
|
||||||
showError("too many instruments!");
|
showError(_("too many instruments!"));
|
||||||
} else {
|
} else {
|
||||||
e->song.ins[curIns]->type=insType;
|
e->song.ins[curIns]->type=insType;
|
||||||
e->song.ins[curIns]->name=sample->name;
|
e->song.ins[curIns]->name=sample->name;
|
||||||
|
@ -1625,13 +1625,13 @@ void FurnaceGUI::doAction(int what) {
|
||||||
DivSample* sample=e->song.sample[curSample];
|
DivSample* sample=e->song.sample[curSample];
|
||||||
SAMPLE_OP_BEGIN;
|
SAMPLE_OP_BEGIN;
|
||||||
if (end-start<1) {
|
if (end-start<1) {
|
||||||
showError("select at least one sample!");
|
showError(_("select at least one sample!"));
|
||||||
} else if (end-start>256) {
|
} else if (end-start>256) {
|
||||||
showError("maximum size is 256 samples!");
|
showError(_("maximum size is 256 samples!"));
|
||||||
} else {
|
} else {
|
||||||
curWave=e->addWave();
|
curWave=e->addWave();
|
||||||
if (curWave==-1) {
|
if (curWave==-1) {
|
||||||
showError("too many wavetables!");
|
showError(_("too many wavetables!"));
|
||||||
} else {
|
} else {
|
||||||
DivWavetable* wave=e->song.wave[curWave];
|
DivWavetable* wave=e->song.wave[curWave];
|
||||||
wave->min=0;
|
wave->min=0;
|
||||||
|
|
|
@ -44,44 +44,44 @@ const float mobileButtonDistances[4][8]={
|
||||||
|
|
||||||
const char* mobileButtonLabels[32]={
|
const char* mobileButtonLabels[32]={
|
||||||
// page 1
|
// page 1
|
||||||
"cut",
|
_N("cut"),
|
||||||
"copy",
|
_N("copy"),
|
||||||
"paste",
|
_N("paste"),
|
||||||
"delete",
|
_N("delete"),
|
||||||
"select\nall",
|
_N("select\nall"),
|
||||||
"piano",
|
_N("piano"),
|
||||||
"undo",
|
_N("undo"),
|
||||||
"redo",
|
_N("redo"),
|
||||||
|
|
||||||
// page 2
|
// page 2
|
||||||
"paste\nmix",
|
_N("paste\nmix"),
|
||||||
"paste\nmix bg",
|
_N("paste\nmix bg"),
|
||||||
"paste\nins",
|
_N("paste\nins"),
|
||||||
"paste\nins bg",
|
_N("paste\nins bg"),
|
||||||
"paste\nflood",
|
_N("paste\nflood"),
|
||||||
"paste\noverflow",
|
_N("paste\noverflow"),
|
||||||
"transpose\nnotes",
|
_N("transpose\nnotes"),
|
||||||
"transpose\nvalues",
|
_N("transpose\nvalues"),
|
||||||
|
|
||||||
// page 3
|
// page 3
|
||||||
"change\nins",
|
_N("change\nins"),
|
||||||
"find/\nreplace",
|
_N("find/\nreplace"),
|
||||||
"collapse",
|
_N("collapse"),
|
||||||
"expand",
|
_N("expand"),
|
||||||
"flip",
|
_N("flip"),
|
||||||
"invert",
|
_N("invert"),
|
||||||
"interpolate",
|
_N("interpolate"),
|
||||||
"scale",
|
_N("scale"),
|
||||||
|
|
||||||
// page 4
|
// page 4
|
||||||
"fade",
|
_N("fade"),
|
||||||
"randomize",
|
_N("randomize"),
|
||||||
"opmask",
|
_N("opmask"),
|
||||||
"scroll\nmode",
|
_N("scroll\nmode"),
|
||||||
"input\nlatch",
|
_N("input\nlatch"),
|
||||||
"set\nlatch",
|
_N("set\nlatch"),
|
||||||
"clear\nlatch",
|
_N("clear\nlatch"),
|
||||||
"clear"
|
_N("clear")
|
||||||
};
|
};
|
||||||
|
|
||||||
const int mobileButtonActions[32]={
|
const int mobileButtonActions[32]={
|
||||||
|
@ -293,7 +293,7 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
(mobileEditButtonPos.x*canvasW)+cos(buttonDir*2.0*M_PI)*buttonDist*buttonMirrorX*anim,
|
(mobileEditButtonPos.x*canvasW)+cos(buttonDir*2.0*M_PI)*buttonDist*buttonMirrorX*anim,
|
||||||
(mobileEditButtonPos.y*canvasH)+sin(buttonDir*2.0*M_PI)*buttonDist*buttonMirrorY*anim
|
(mobileEditButtonPos.y*canvasH)+sin(buttonDir*2.0*M_PI)*buttonDist*buttonMirrorY*anim
|
||||||
));
|
));
|
||||||
if (ImGui::Button(mobileButtonLabels[i+mobileEditPage*8],mobileEditButtonSize)) {
|
if (ImGui::Button(_(mobileButtonLabels[i+mobileEditPage*8]),mobileEditButtonSize)) {
|
||||||
if (mobileButtonActions[i+mobileEditPage*8]) {
|
if (mobileButtonActions[i+mobileEditPage*8]) {
|
||||||
doAction(mobileButtonActions[i+mobileEditPage*8]);
|
doAction(mobileButtonActions[i+mobileEditPage*8]);
|
||||||
}
|
}
|
||||||
|
@ -330,7 +330,7 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
|
|
||||||
ImGui::SetNextWindowPos(portrait?ImVec2(0.0f,((1.0-mobileMenuPos*0.65)*canvasH)-(0.16*canvasW)):ImVec2(0.5*canvasW*mobileMenuPos,0.0f));
|
ImGui::SetNextWindowPos(portrait?ImVec2(0.0f,((1.0-mobileMenuPos*0.65)*canvasH)-(0.16*canvasW)):ImVec2(0.5*canvasW*mobileMenuPos,0.0f));
|
||||||
ImGui::SetNextWindowSize(portrait?ImVec2(canvasW,0.16*canvasW):ImVec2(0.16*canvasH,canvasH));
|
ImGui::SetNextWindowSize(portrait?ImVec2(canvasW,0.16*canvasW):ImVec2(0.16*canvasH,canvasH));
|
||||||
if (ImGui::Begin("Mobile Controls",NULL,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags)) {
|
if (ImGui::Begin("Mobile Controls",NULL,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags,_("Mobile Controls"))) {
|
||||||
float avail=portrait?ImGui::GetContentRegionAvail().y:ImGui::GetContentRegionAvail().x;
|
float avail=portrait?ImGui::GetContentRegionAvail().y:ImGui::GetContentRegionAvail().x;
|
||||||
ImVec2 buttonSize=ImVec2(avail,avail);
|
ImVec2 buttonSize=ImVec2(avail,avail);
|
||||||
const char* mobButtonName=ICON_FA_CHEVRON_RIGHT "##MobileMenu";
|
const char* mobButtonName=ICON_FA_CHEVRON_RIGHT "##MobileMenu";
|
||||||
|
@ -405,7 +405,7 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
|
|
||||||
ImGui::SetNextWindowPos(portrait?ImVec2(0.0f,((1.0-mobileMenuPos*0.65)*canvasH)):ImVec2(0.5*canvasW*(mobileMenuPos-1.0),0.0f));
|
ImGui::SetNextWindowPos(portrait?ImVec2(0.0f,((1.0-mobileMenuPos*0.65)*canvasH)):ImVec2(0.5*canvasW*(mobileMenuPos-1.0),0.0f));
|
||||||
ImGui::SetNextWindowSize(portrait?ImVec2(canvasW,0.65*canvasH):ImVec2(0.5*canvasW,canvasH));
|
ImGui::SetNextWindowSize(portrait?ImVec2(canvasW,0.65*canvasH):ImVec2(0.5*canvasW,canvasH));
|
||||||
if (ImGui::Begin("Mobile Menu",NULL,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags)) {
|
if (ImGui::Begin("Mobile Menu",NULL,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags,_("Mobile Menu"))) {
|
||||||
if (ImGui::BeginTable("SceneSel",5)) {
|
if (ImGui::BeginTable("SceneSel",5)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthStretch,1.0f);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthStretch,1.0f);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,1.0f);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,1.0f);
|
||||||
|
@ -418,44 +418,44 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
ImVec2 buttonSize=ImGui::GetContentRegionAvail();
|
ImVec2 buttonSize=ImGui::GetContentRegionAvail();
|
||||||
buttonSize.y=30.0f*dpiScale;
|
buttonSize.y=30.0f*dpiScale;
|
||||||
|
|
||||||
if (ImGui::Button("Pattern",buttonSize)) {
|
if (ImGui::Button(_("Pattern"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_PATTERN;
|
mobScene=GUI_SCENE_PATTERN;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Orders",buttonSize)) {
|
if (ImGui::Button(_("Orders"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_ORDERS;
|
mobScene=GUI_SCENE_ORDERS;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Ins",buttonSize)) {
|
if (ImGui::Button(_("Ins"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_INSTRUMENT;
|
mobScene=GUI_SCENE_INSTRUMENT;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Wave",buttonSize)) {
|
if (ImGui::Button(_("Wave"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_WAVETABLE;
|
mobScene=GUI_SCENE_WAVETABLE;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Sample",buttonSize)) {
|
if (ImGui::Button(_("Sample"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_SAMPLE;
|
mobScene=GUI_SCENE_SAMPLE;
|
||||||
}
|
}
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Song",buttonSize)) {
|
if (ImGui::Button(_("Song"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_SONG;
|
mobScene=GUI_SCENE_SONG;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Channels",buttonSize)) {
|
if (ImGui::Button(_("Channels"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_CHANNELS;
|
mobScene=GUI_SCENE_CHANNELS;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Chips",buttonSize)) {
|
if (ImGui::Button(_("Chips"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_CHIPS;
|
mobScene=GUI_SCENE_CHIPS;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Mixer",buttonSize)) {
|
if (ImGui::Button(_("Mixer"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_MIXER;
|
mobScene=GUI_SCENE_MIXER;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Button("Other",buttonSize)) {
|
if (ImGui::Button(_("Other"),buttonSize)) {
|
||||||
mobScene=GUI_SCENE_OTHER;
|
mobScene=GUI_SCENE_OTHER;
|
||||||
}
|
}
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
|
@ -484,36 +484,36 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GUI_SCENE_SONG: {
|
case GUI_SCENE_SONG: {
|
||||||
if (ImGui::Button("New")) {
|
if (ImGui::Button(_("New"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
//doAction(GUI_ACTION_NEW);
|
//doAction(GUI_ACTION_NEW);
|
||||||
if (modified) {
|
if (modified) {
|
||||||
showWarning("Unsaved changes! Save changes before creating a new song?",GUI_WARN_NEW);
|
showWarning(_("Unsaved changes! Save changes before creating a new song?"),GUI_WARN_NEW);
|
||||||
} else {
|
} else {
|
||||||
displayNew=true;
|
displayNew=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Open")) {
|
if (ImGui::Button(_("Open"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
doAction(GUI_ACTION_OPEN);
|
doAction(GUI_ACTION_OPEN);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Save")) {
|
if (ImGui::Button(_("Save"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
doAction(GUI_ACTION_SAVE);
|
doAction(GUI_ACTION_SAVE);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Save as...")) {
|
if (ImGui::Button(_("Save as..."))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
doAction(GUI_ACTION_SAVE_AS);
|
doAction(GUI_ACTION_SAVE_AS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("Export")) {
|
if (ImGui::Button(_("Export"))) {
|
||||||
doAction(GUI_ACTION_EXPORT);
|
doAction(GUI_ACTION_EXPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("Restore Backup")) {
|
if (ImGui::Button(_("Restore Backup"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
doAction(GUI_ACTION_OPEN_BACKUP);
|
doAction(GUI_ACTION_OPEN_BACKUP);
|
||||||
}
|
}
|
||||||
|
@ -521,15 +521,15 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::BeginTabBar("MobileSong")) {
|
if (ImGui::BeginTabBar("MobileSong")) {
|
||||||
if (ImGui::BeginTabItem("Song Info")) {
|
if (ImGui::BeginTabItem(_("Song Info"))) {
|
||||||
drawSongInfo(true);
|
drawSongInfo(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Subsongs")) {
|
if (ImGui::BeginTabItem(_("Subsongs"))) {
|
||||||
drawSubSongs(true);
|
drawSubSongs(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Speed")) {
|
if (ImGui::BeginTabItem(_("Speed"))) {
|
||||||
drawSpeed(true);
|
drawSpeed(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
@ -538,85 +538,85 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GUI_SCENE_CHANNELS:
|
case GUI_SCENE_CHANNELS:
|
||||||
ImGui::Text("Channels here...");
|
ImGui::Text(_("Channels here..."));
|
||||||
break;
|
break;
|
||||||
case GUI_SCENE_CHIPS:
|
case GUI_SCENE_CHIPS:
|
||||||
ImGui::Text("Chips here...");
|
ImGui::Text(_("Chips here..."));
|
||||||
break;
|
break;
|
||||||
case GUI_SCENE_MIXER:
|
case GUI_SCENE_MIXER:
|
||||||
ImGui::Text("What the hell...");
|
ImGui::Text(_("What the hell..."));
|
||||||
break;
|
break;
|
||||||
case GUI_SCENE_OTHER: {
|
case GUI_SCENE_OTHER: {
|
||||||
if (ImGui::Button("Osc")) {
|
if (ImGui::Button(_("Osc"))) {
|
||||||
oscOpen=!oscOpen;
|
oscOpen=!oscOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("ChanOsc")) {
|
if (ImGui::Button(_("ChanOsc"))) {
|
||||||
chanOscOpen=!chanOscOpen;
|
chanOscOpen=!chanOscOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("RegView")) {
|
if (ImGui::Button(_("RegView"))) {
|
||||||
regViewOpen=!regViewOpen;
|
regViewOpen=!regViewOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Stats")) {
|
if (ImGui::Button(_("Stats"))) {
|
||||||
statsOpen=!statsOpen;
|
statsOpen=!statsOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Grooves")) {
|
if (ImGui::Button(_("Grooves"))) {
|
||||||
groovesOpen=!groovesOpen;
|
groovesOpen=!groovesOpen;
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Compat Flags")) {
|
if (ImGui::Button(_("Compat Flags"))) {
|
||||||
compatFlagsOpen=!compatFlagsOpen;
|
compatFlagsOpen=!compatFlagsOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("XYOsc")) {
|
if (ImGui::Button(_("XYOsc"))) {
|
||||||
xyOscOpen=!xyOscOpen;
|
xyOscOpen=!xyOscOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Meter")) {
|
if (ImGui::Button(_("Meter"))) {
|
||||||
volMeterOpen=!volMeterOpen;
|
volMeterOpen=!volMeterOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Memory")) {
|
if (ImGui::Button(_("Memory"))) {
|
||||||
memoryOpen=!memoryOpen;
|
memoryOpen=!memoryOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("CV")) {
|
if (ImGui::Button(_("CV"))) {
|
||||||
cvOpen=!cvOpen;
|
cvOpen=!cvOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Presets")) {
|
if (ImGui::Button(_("Presets"))) {
|
||||||
userPresetsOpen=!userPresetsOpen;
|
userPresetsOpen=!userPresetsOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("PatManager")) {
|
if (ImGui::Button(_("PatManager"))) {
|
||||||
patManagerOpen=!patManagerOpen;
|
patManagerOpen=!patManagerOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
ImGui::Button("Panic");
|
ImGui::Button(_("Panic"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Settings")) {
|
if (ImGui::Button(_("Settings"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
settingsOpen=true;
|
settingsOpen=true;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Log")) {
|
if (ImGui::Button(_("Log"))) {
|
||||||
logOpen=!logOpen;
|
logOpen=!logOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Debug")) {
|
if (ImGui::Button(_("Debug"))) {
|
||||||
debugOpen=!debugOpen;
|
debugOpen=!debugOpen;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("About")) {
|
if (ImGui::Button(_("About"))) {
|
||||||
mobileMenuOpen=false;
|
mobileMenuOpen=false;
|
||||||
mobileMenuPos=0.0f;
|
mobileMenuPos=0.0f;
|
||||||
aboutOpen=true;
|
aboutOpen=true;
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Switch to Desktop Mode")) {
|
if (ImGui::Button(_("Switch to Desktop Mode"))) {
|
||||||
toggleMobileUI(!mobileUI);
|
toggleMobileUI(!mobileUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,16 +626,16 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numAmiga) {
|
if (numAmiga) {
|
||||||
ImGui::Text(
|
ImGui::Text(_(
|
||||||
"this is NOT ROM export! only use for making sure the\n"
|
"this is NOT ROM export! only use for making sure the\n"
|
||||||
"Furnace Amiga emulator is working properly by\n"
|
"Furnace Amiga emulator is working properly by\n"
|
||||||
"comparing it with real Amiga output."
|
"comparing it with real Amiga output."
|
||||||
);
|
));
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Directory");
|
ImGui::Text(_("Directory"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::InputText("##AVDPath",&workingDirROMExport);
|
ImGui::InputText("##AVDPath",&workingDirROMExport);
|
||||||
if (ImGui::Button("Bake Data")) {
|
if (ImGui::Button(_("Bake Data"))) {
|
||||||
std::vector<DivROMExportOutput> out=e->buildROM(DIV_ROM_AMIGA_VALIDATION);
|
std::vector<DivROMExportOutput> out=e->buildROM(DIV_ROM_AMIGA_VALIDATION);
|
||||||
if (workingDirROMExport.size()>0) {
|
if (workingDirROMExport.size()>0) {
|
||||||
if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR;
|
if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR;
|
||||||
|
@ -650,7 +650,7 @@ void FurnaceGUI::drawMobileControls() {
|
||||||
i.data->finish();
|
i.data->finish();
|
||||||
delete i.data;
|
delete i.data;
|
||||||
}
|
}
|
||||||
showError(fmt::sprintf("Done! Baked %d files.",(int)out.size()));
|
showError(fmt::sprintf(_("Done! Baked %d files."),(int)out.size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,7 +670,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
if (!editControlsOpen) return;
|
if (!editControlsOpen) return;
|
||||||
switch (settings.controlLayout) {
|
switch (settings.controlLayout) {
|
||||||
case 0: // classic
|
case 0: // classic
|
||||||
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,globalWinFlags)) {
|
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,globalWinFlags,_("Play/Edit Controls"))) {
|
||||||
if (ImGui::BeginTable("PlayEditAlign",2)) {
|
if (ImGui::BeginTable("PlayEditAlign",2)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
@ -678,7 +678,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Octave");
|
ImGui::Text(_("Octave"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (ImGui::InputInt("##Octave",&curOctave,1,1)) {
|
if (ImGui::InputInt("##Octave",&curOctave,1,1)) {
|
||||||
|
@ -695,7 +695,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
if (ImGui::SmallButton(changeCoarse?"Coarse Step":"Edit Step")) {
|
if (ImGui::SmallButton(changeCoarse?_("Coarse Step"):_("Edit Step"))) {
|
||||||
changeCoarse=!changeCoarse;
|
changeCoarse=!changeCoarse;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
@ -728,7 +728,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Play");
|
ImGui::SetTooltip(_("Play"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -736,25 +736,25 @@ void FurnaceGUI::drawEditControls() {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Stop");
|
ImGui::SetTooltip(_("Stop"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Checkbox("Edit",&edit);
|
ImGui::Checkbox(_("Edit"),&edit);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
bool metro=e->getMetronome();
|
bool metro=e->getMetronome();
|
||||||
if (ImGui::Checkbox("Metronome",&metro)) {
|
if (ImGui::Checkbox(_("Metronome"),&metro)) {
|
||||||
e->setMetronome(metro);
|
e->setMetronome(metro);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Follow");
|
ImGui::Text(_("Follow"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
unimportant(ImGui::Checkbox("Orders",&followOrders));
|
unimportant(ImGui::Checkbox(_("Orders"),&followOrders));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
unimportant(ImGui::Checkbox("Pattern",&followPattern));
|
unimportant(ImGui::Checkbox(_("Pattern"),&followPattern));
|
||||||
|
|
||||||
bool repeatPattern=e->getRepeatPattern();
|
bool repeatPattern=e->getRepeatPattern();
|
||||||
if (ImGui::Checkbox("Repeat pattern",&repeatPattern)) {
|
if (ImGui::Checkbox(_("Repeat pattern"),&repeatPattern)) {
|
||||||
e->setRepeatPattern(repeatPattern);
|
e->setRepeatPattern(repeatPattern);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -763,17 +763,17 @@ void FurnaceGUI::drawEditControls() {
|
||||||
pendingStepUpdate=1;
|
pendingStepUpdate=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Step one row");
|
ImGui::SetTooltip(_("Step one row"));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
pushToggleColors(noteInputPoly);
|
pushToggleColors(noteInputPoly);
|
||||||
if (ImGui::Button(noteInputPoly?("Poly##PolyInput"):("Mono##PolyInput"))) {
|
if (ImGui::Button(noteInputPoly?(_("Poly##PolyInput")):(_("Mono##PolyInput")))) {
|
||||||
noteInputPoly=!noteInputPoly;
|
noteInputPoly=!noteInputPoly;
|
||||||
e->setAutoNotePoly(noteInputPoly);
|
e->setAutoNotePoly(noteInputPoly);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Polyphony");
|
ImGui::SetTooltip(_("Polyphony"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
}
|
}
|
||||||
|
@ -781,12 +781,12 @@ void FurnaceGUI::drawEditControls() {
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
break;
|
break;
|
||||||
case 1: // compact
|
case 1: // compact
|
||||||
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags)) {
|
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags,_("Play/Edit Controls"))) {
|
||||||
if (ImGui::Button(ICON_FA_STOP "##Stop")) {
|
if (ImGui::Button(ICON_FA_STOP "##Stop")) {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Stop");
|
ImGui::SetTooltip(_("Stop"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
pushToggleColors(e->isPlaying());
|
pushToggleColors(e->isPlaying());
|
||||||
|
@ -794,7 +794,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Play");
|
ImGui::SetTooltip(_("Play"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -803,7 +803,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
pendingStepUpdate=1;
|
pendingStepUpdate=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Step one row");
|
ImGui::SetTooltip(_("Step one row"));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -813,7 +813,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setRepeatPattern(!repeatPattern);
|
e->setRepeatPattern(!repeatPattern);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Repeat pattern");
|
ImGui::SetTooltip(_("Repeat pattern"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -823,7 +823,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
edit=!edit;
|
edit=!edit;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Edit");
|
ImGui::SetTooltip(_("Edit"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -834,12 +834,12 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setMetronome(!metro);
|
e->setMetronome(!metro);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Metronome");
|
ImGui::SetTooltip(_("Metronome"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Octave");
|
ImGui::Text(_("Octave"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(96.0f*dpiScale);
|
ImGui::SetNextItemWidth(96.0f*dpiScale);
|
||||||
if (ImGui::InputInt("##Octave",&curOctave,1,1)) {
|
if (ImGui::InputInt("##Octave",&curOctave,1,1)) {
|
||||||
|
@ -854,7 +854,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::SmallButton(changeCoarse?"Coarse Step":"Edit Step")) {
|
if (ImGui::SmallButton(changeCoarse?_("Coarse Step"):_("Edit Step"))) {
|
||||||
changeCoarse=!changeCoarse;
|
changeCoarse=!changeCoarse;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -880,20 +880,20 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Follow");
|
ImGui::Text(_("Follow"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
unimportant(ImGui::Checkbox("Orders",&followOrders));
|
unimportant(ImGui::Checkbox(_("Orders"),&followOrders));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
unimportant(ImGui::Checkbox("Pattern",&followPattern));
|
unimportant(ImGui::Checkbox(_("Pattern"),&followPattern));
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
pushToggleColors(noteInputPoly);
|
pushToggleColors(noteInputPoly);
|
||||||
if (ImGui::Button(noteInputPoly?("Poly##PolyInput"):("Mono##PolyInput"))) {
|
if (ImGui::Button(noteInputPoly?_("Poly##PolyInput"):_("Mono##PolyInput"))) {
|
||||||
noteInputPoly=!noteInputPoly;
|
noteInputPoly=!noteInputPoly;
|
||||||
e->setAutoNotePoly(noteInputPoly);
|
e->setAutoNotePoly(noteInputPoly);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Polyphony");
|
ImGui::SetTooltip(_("Polyphony"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
}
|
}
|
||||||
|
@ -901,28 +901,28 @@ void FurnaceGUI::drawEditControls() {
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
break;
|
break;
|
||||||
case 2: // compact vertical
|
case 2: // compact vertical
|
||||||
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags)) {
|
if (ImGui::Begin("Play/Edit Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags,_("Play/Edit Controls"))) {
|
||||||
ImVec2 buttonSize=ImVec2(ImGui::GetContentRegionAvail().x,0.0f);
|
ImVec2 buttonSize=ImVec2(ImGui::GetContentRegionAvail().x,0.0f);
|
||||||
pushToggleColors(e->isPlaying());
|
pushToggleColors(e->isPlaying());
|
||||||
if (ImGui::Button(ICON_FA_PLAY "##Play",buttonSize)) {
|
if (ImGui::Button(ICON_FA_PLAY "##Play",buttonSize)) {
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Play");
|
ImGui::SetTooltip(_("Play"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
if (ImGui::Button(ICON_FA_STOP "##Stop",buttonSize)) {
|
if (ImGui::Button(ICON_FA_STOP "##Stop",buttonSize)) {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Stop");
|
ImGui::SetTooltip(_("Stop"));
|
||||||
}
|
}
|
||||||
if (ImGui::Button(ICON_FA_ARROW_DOWN "##StepOne",buttonSize)) {
|
if (ImGui::Button(ICON_FA_ARROW_DOWN "##StepOne",buttonSize)) {
|
||||||
e->stepOne(cursor.y);
|
e->stepOne(cursor.y);
|
||||||
pendingStepUpdate=1;
|
pendingStepUpdate=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Step one row");
|
ImGui::SetTooltip(_("Step one row"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool repeatPattern=e->getRepeatPattern();
|
bool repeatPattern=e->getRepeatPattern();
|
||||||
|
@ -931,7 +931,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setRepeatPattern(!repeatPattern);
|
e->setRepeatPattern(!repeatPattern);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Repeat pattern");
|
ImGui::SetTooltip(_("Repeat pattern"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -940,7 +940,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
edit=!edit;
|
edit=!edit;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Edit");
|
ImGui::SetTooltip(_("Edit"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -950,13 +950,13 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setMetronome(!metro);
|
e->setMetronome(!metro);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Metronome");
|
ImGui::SetTooltip(_("Metronome"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
ImGui::Text("Oct.");
|
ImGui::Text(_("Oct."));
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Octave");
|
ImGui::SetTooltip(_("Octave"));
|
||||||
}
|
}
|
||||||
float avail=ImGui::GetContentRegionAvail().x;
|
float avail=ImGui::GetContentRegionAvail().x;
|
||||||
ImGui::SetNextItemWidth(avail);
|
ImGui::SetNextItemWidth(avail);
|
||||||
|
@ -971,7 +971,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::SmallButton(changeCoarse?"Coarse":"Step")) {
|
if (ImGui::SmallButton(changeCoarse?_("Coarse"):_("Step"))) {
|
||||||
changeCoarse=!changeCoarse;
|
changeCoarse=!changeCoarse;
|
||||||
}
|
}
|
||||||
ImGui::SetNextItemWidth(avail);
|
ImGui::SetNextItemWidth(avail);
|
||||||
|
@ -995,34 +995,34 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Text("Foll.");
|
ImGui::Text(_("Foll."));
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Follow");
|
ImGui::SetTooltip(_("Follow"));
|
||||||
}
|
}
|
||||||
pushToggleColors(followOrders);
|
pushToggleColors(followOrders);
|
||||||
if (ImGui::Button("Ord##FollowOrders",buttonSize)) { handleUnimportant
|
if (ImGui::Button(_("Ord##FollowOrders"),buttonSize)) { handleUnimportant
|
||||||
followOrders=!followOrders;
|
followOrders=!followOrders;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Orders");
|
ImGui::SetTooltip(_("Orders"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
pushToggleColors(followPattern);
|
pushToggleColors(followPattern);
|
||||||
if (ImGui::Button("Pat##FollowPattern",buttonSize)) { handleUnimportant
|
if (ImGui::Button(_("Pat##FollowPattern"),buttonSize)) { handleUnimportant
|
||||||
followPattern=!followPattern;
|
followPattern=!followPattern;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Pattern");
|
ImGui::SetTooltip(_("Pattern"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
pushToggleColors(noteInputPoly);
|
pushToggleColors(noteInputPoly);
|
||||||
if (ImGui::Button(noteInputPoly?("Poly##PolyInput"):("Mono##PolyInput"))) {
|
if (ImGui::Button(noteInputPoly?_("Poly##PolyInput"):_("Mono##PolyInput"))) {
|
||||||
noteInputPoly=!noteInputPoly;
|
noteInputPoly=!noteInputPoly;
|
||||||
e->setAutoNotePoly(noteInputPoly);
|
e->setAutoNotePoly(noteInputPoly);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Polyphony");
|
ImGui::SetTooltip(_("Polyphony"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
}
|
}
|
||||||
|
@ -1030,14 +1030,14 @@ void FurnaceGUI::drawEditControls() {
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
break;
|
break;
|
||||||
case 3: // split
|
case 3: // split
|
||||||
if (ImGui::Begin("Play Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags)) {
|
if (ImGui::Begin("Play Controls",&editControlsOpen,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse|globalWinFlags,_("Play Controls"))) {
|
||||||
if (e->isPlaying()) {
|
if (e->isPlaying()) {
|
||||||
pushToggleColors(true);
|
pushToggleColors(true);
|
||||||
if (ImGui::Button(ICON_FA_STOP "##Stop")) {
|
if (ImGui::Button(ICON_FA_STOP "##Stop")) {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Stop");
|
ImGui::SetTooltip(_("Stop"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1045,7 +1045,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
play(oldRow);
|
play(oldRow);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Play");
|
ImGui::SetTooltip(_("Play"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -1054,7 +1054,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Play from the beginning of this pattern");
|
ImGui::SetTooltip(_("Play from the beginning of this pattern"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_STEP_FORWARD "##PlayRepeat")) {
|
if (ImGui::Button(ICON_FA_STEP_FORWARD "##PlayRepeat")) {
|
||||||
|
@ -1062,7 +1062,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Repeat from the beginning of this pattern");
|
ImGui::SetTooltip(_("Repeat from the beginning of this pattern"));
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button(ICON_FA_ARROW_DOWN "##StepOne")) {
|
if (ImGui::Button(ICON_FA_ARROW_DOWN "##StepOne")) {
|
||||||
|
@ -1070,7 +1070,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
pendingStepUpdate=1;
|
pendingStepUpdate=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Step one row");
|
ImGui::SetTooltip(_("Step one row"));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -1079,7 +1079,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
edit=!edit;
|
edit=!edit;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Edit");
|
ImGui::SetTooltip(_("Edit"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -1090,7 +1090,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setMetronome(!metro);
|
e->setMetronome(!metro);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Metronome");
|
ImGui::SetTooltip(_("Metronome"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
|
@ -1101,28 +1101,28 @@ void FurnaceGUI::drawEditControls() {
|
||||||
e->setRepeatPattern(!repeatPattern);
|
e->setRepeatPattern(!repeatPattern);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Repeat pattern");
|
ImGui::SetTooltip(_("Repeat pattern"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
pushToggleColors(noteInputPoly);
|
pushToggleColors(noteInputPoly);
|
||||||
if (ImGui::Button(noteInputPoly?("Poly##PolyInput"):("Mono##PolyInput"))) {
|
if (ImGui::Button(noteInputPoly?_("Poly##PolyInput"):_("Mono##PolyInput"))) {
|
||||||
noteInputPoly=!noteInputPoly;
|
noteInputPoly=!noteInputPoly;
|
||||||
e->setAutoNotePoly(noteInputPoly);
|
e->setAutoNotePoly(noteInputPoly);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Polyphony");
|
ImGui::SetTooltip(_("Polyphony"));
|
||||||
}
|
}
|
||||||
popToggleColors();
|
popToggleColors();
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_EDIT_CONTROLS;
|
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_EDIT_CONTROLS;
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
||||||
if (ImGui::Begin("Edit Controls",&editControlsOpen,globalWinFlags)) {
|
if (ImGui::Begin("Edit Controls",&editControlsOpen,globalWinFlags,_("Edit Controls"))) {
|
||||||
ImGui::Columns(2);
|
ImGui::Columns(2);
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Octave");
|
ImGui::Text(_("Octave"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
float cursor=ImGui::GetCursorPosX();
|
float cursor=ImGui::GetCursorPosX();
|
||||||
float avail=ImGui::GetContentRegionAvail().x;
|
float avail=ImGui::GetContentRegionAvail().x;
|
||||||
|
@ -1139,7 +1139,7 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
if (ImGui::SmallButton(changeCoarse?"Coarse":"Step")) {
|
if (ImGui::SmallButton(changeCoarse?_("Coarse"):_("Step"))) {
|
||||||
changeCoarse=!changeCoarse;
|
changeCoarse=!changeCoarse;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -1166,8 +1166,8 @@ void FurnaceGUI::drawEditControls() {
|
||||||
}
|
}
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
|
|
||||||
unimportant(ImGui::Checkbox("Follow orders",&followOrders));
|
unimportant(ImGui::Checkbox(_("Follow orders"),&followOrders));
|
||||||
unimportant(ImGui::Checkbox("Follow pattern",&followPattern));
|
unimportant(ImGui::Checkbox(_("Follow pattern"),&followPattern));
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_EDIT_CONTROLS;
|
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_EDIT_CONTROLS;
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
|
@ -197,7 +197,7 @@ void FurnaceGUI::makeUndo(ActionType action, UndoRegion region) {
|
||||||
|
|
||||||
auto it=oldPatMap.find(id);
|
auto it=oldPatMap.find(id);
|
||||||
if (it==oldPatMap.end()) {
|
if (it==oldPatMap.end()) {
|
||||||
logW("no data in oldPatMap for channel %d!",i);
|
logW(_("no data in oldPatMap for channel %d!"),i);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
op=it->second;
|
op=it->second;
|
||||||
|
@ -661,7 +661,7 @@ void FurnaceGUI::doPasteFurnace(PasteMode mode, int arg, bool readClipboard, Str
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invalidData) {
|
if (invalidData) {
|
||||||
logW("invalid clipboard data! failed at line %d char %d",i,charPos);
|
logW(_("invalid clipboard data! failed at line %d char %d"),i,charPos);
|
||||||
logW("%s",line.c_str());
|
logW("%s",line.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1200,7 +1200,7 @@ void FurnaceGUI::doPasteMPT(PasteMode mode, int arg, bool readClipboard, String
|
||||||
|
|
||||||
if (invalidData)
|
if (invalidData)
|
||||||
{
|
{
|
||||||
logW("invalid clipboard data! failed at line %d char %d",i,charPos);
|
logW(_("invalid clipboard data! failed at line %d char %d"),i,charPos);
|
||||||
logW("%s",line.c_str());
|
logW("%s",line.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1562,7 +1562,7 @@ void FurnaceGUI::doFlip() {
|
||||||
void FurnaceGUI::doCollapse(int divider, const SelectionPoint& sStart, const SelectionPoint& sEnd) {
|
void FurnaceGUI::doCollapse(int divider, const SelectionPoint& sStart, const SelectionPoint& sEnd) {
|
||||||
if (divider<2) return;
|
if (divider<2) return;
|
||||||
if (e->curSubSong->patLen<divider) {
|
if (e->curSubSong->patLen<divider) {
|
||||||
showError("can't collapse any further!");
|
showError(_("can't collapse any further!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1666,7 +1666,7 @@ void FurnaceGUI::doExpand(int multiplier, const SelectionPoint& sStart, const Se
|
||||||
void FurnaceGUI::doCollapseSong(int divider) {
|
void FurnaceGUI::doCollapseSong(int divider) {
|
||||||
if (divider<2) return;
|
if (divider<2) return;
|
||||||
if (e->curSubSong->patLen<divider) {
|
if (e->curSubSong->patLen<divider) {
|
||||||
showError("can't collapse any further!");
|
showError(_("can't collapse any further!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
finishSelection();
|
finishSelection();
|
||||||
|
@ -1746,7 +1746,7 @@ void FurnaceGUI::doCollapseSong(int divider) {
|
||||||
void FurnaceGUI::doExpandSong(int multiplier) {
|
void FurnaceGUI::doExpandSong(int multiplier) {
|
||||||
if (multiplier<2) return;
|
if (multiplier<2) return;
|
||||||
if (e->curSubSong->patLen>(256/multiplier)) {
|
if (e->curSubSong->patLen>(256/multiplier)) {
|
||||||
showError("can't expand any further!");
|
showError(_("can't expand any further!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
finishSelection();
|
finishSelection();
|
||||||
|
@ -1833,7 +1833,7 @@ void FurnaceGUI::doDrag() {
|
||||||
// copy and clear
|
// copy and clear
|
||||||
String c=doCopy(true,false,dragStart,dragEnd);
|
String c=doCopy(true,false,dragStart,dragEnd);
|
||||||
|
|
||||||
logV("copy: %s",c);
|
logV(_("copy: %s"),c);
|
||||||
|
|
||||||
// replace
|
// replace
|
||||||
cursor=selStart;
|
cursor=selStart;
|
||||||
|
@ -1848,7 +1848,7 @@ void FurnaceGUI::moveSelected(int x, int y) {
|
||||||
// copy and clear
|
// copy and clear
|
||||||
String c=doCopy(true,false,selStart,selEnd);
|
String c=doCopy(true,false,selStart,selEnd);
|
||||||
|
|
||||||
logV("copy: %s",c);
|
logV(_("copy: %s"),c);
|
||||||
|
|
||||||
// replace
|
// replace
|
||||||
selStart.xCoarse+=x;
|
selStart.xCoarse+=x;
|
||||||
|
|
|
@ -11,27 +11,27 @@ void FurnaceGUI::drawEffectList() {
|
||||||
}
|
}
|
||||||
if (!effectListOpen) return;
|
if (!effectListOpen) return;
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(60.0f*dpiScale,20.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(60.0f*dpiScale,20.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
if (ImGui::Begin("Effect List",&effectListOpen,globalWinFlags)) {
|
if (ImGui::Begin("Effect List",&effectListOpen,globalWinFlags,_("Effect List"))) {
|
||||||
float availB=ImGui::GetContentRegionAvail().x-ImGui::GetFrameHeightWithSpacing();
|
float availB=ImGui::GetContentRegionAvail().x-ImGui::GetFrameHeightWithSpacing();
|
||||||
if (availB>0) {
|
if (availB>0) {
|
||||||
ImGui::PushTextWrapPos(availB);
|
ImGui::PushTextWrapPos(availB);
|
||||||
ImGui::TextWrapped("Chip at cursor: %s",e->getSystemName(e->sysOfChan[cursor.xCoarse]));
|
ImGui::TextWrapped(_("Chip at cursor: %s"),e->getSystemName(e->sysOfChan[cursor.xCoarse]));
|
||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
}
|
}
|
||||||
effectSearch.Draw("Search");
|
effectSearch.Draw(_("Search"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Button(ICON_FA_BARS "##SortEffects");
|
ImGui::Button(ICON_FA_BARS "##SortEffects");
|
||||||
if (ImGui::BeginPopupContextItem("effectSort",ImGuiPopupFlags_MouseButtonLeft)) {
|
if (ImGui::BeginPopupContextItem("effectSort",ImGuiPopupFlags_MouseButtonLeft)) {
|
||||||
ImGui::Text("Effect types to show:");
|
ImGui::Text(_("Effect types to show:"));
|
||||||
for (int i=1; i<10; i++) {
|
for (int i=1; i<10; i++) {
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[i+GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[i+GUI_COLOR_PATTERN_EFFECT_INVALID]);
|
||||||
ImGui::Checkbox(fxColorsNames[i],&effectsShow[i]);
|
ImGui::Checkbox(_(fxColorsNames[i]),&effectsShow[i]);
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("All")) memset(effectsShow,1,sizeof(bool)*10);
|
if (ImGui::Button(_("All"))) memset(effectsShow,1,sizeof(bool)*10);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("None")) memset(effectsShow,0,sizeof(bool)*10);
|
if (ImGui::Button(_("None"))) memset(effectsShow,0,sizeof(bool)*10);
|
||||||
|
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
|
@ -42,9 +42,9 @@ void FurnaceGUI::drawEffectList() {
|
||||||
|
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Name");
|
ImGui::Text(_("Name"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Description");
|
ImGui::Text(_("Description"));
|
||||||
|
|
||||||
const char* prevName=NULL;
|
const char* prevName=NULL;
|
||||||
for (int i=0; i<256; i++) {
|
for (int i=0; i<256; i++) {
|
||||||
|
@ -81,7 +81,7 @@ void FurnaceGUI::drawEffectList() {
|
||||||
if (strlen(name)>6) {
|
if (strlen(name)>6) {
|
||||||
ImGui::TextWrapped("%s",&name[6]);
|
ImGui::TextWrapped("%s",&name[6]);
|
||||||
} else {
|
} else {
|
||||||
ImGui::Text("ERROR");
|
ImGui::Text(_("ERROR"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,68 +26,68 @@
|
||||||
void FurnaceGUI::drawExportAudio(bool onWindow) {
|
void FurnaceGUI::drawExportAudio(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text("Export type:");
|
ImGui::Text(_("Export type:"));
|
||||||
|
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("one file",audioExportOptions.mode==DIV_EXPORT_MODE_ONE)) {
|
if (ImGui::RadioButton(_("one file"),audioExportOptions.mode==DIV_EXPORT_MODE_ONE)) {
|
||||||
audioExportOptions.mode=DIV_EXPORT_MODE_ONE;
|
audioExportOptions.mode=DIV_EXPORT_MODE_ONE;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("multiple files (one per chip)",audioExportOptions.mode==DIV_EXPORT_MODE_MANY_SYS)) {
|
if (ImGui::RadioButton(_("multiple files (one per chip)"),audioExportOptions.mode==DIV_EXPORT_MODE_MANY_SYS)) {
|
||||||
audioExportOptions.mode=DIV_EXPORT_MODE_MANY_SYS;
|
audioExportOptions.mode=DIV_EXPORT_MODE_MANY_SYS;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("multiple files (one per channel)",audioExportOptions.mode==DIV_EXPORT_MODE_MANY_CHAN)) {
|
if (ImGui::RadioButton(_("multiple files (one per channel)"),audioExportOptions.mode==DIV_EXPORT_MODE_MANY_CHAN)) {
|
||||||
audioExportOptions.mode=DIV_EXPORT_MODE_MANY_CHAN;
|
audioExportOptions.mode=DIV_EXPORT_MODE_MANY_CHAN;
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
|
|
||||||
if (audioExportOptions.mode!=DIV_EXPORT_MODE_MANY_SYS) {
|
if (audioExportOptions.mode!=DIV_EXPORT_MODE_MANY_SYS) {
|
||||||
ImGui::Text("Bit depth:");
|
ImGui::Text(_("Bit depth:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("16-bit integer",audioExportOptions.format==DIV_EXPORT_FORMAT_S16)) {
|
if (ImGui::RadioButton(_("16-bit integer"),audioExportOptions.format==DIV_EXPORT_FORMAT_S16)) {
|
||||||
audioExportOptions.format=DIV_EXPORT_FORMAT_S16;
|
audioExportOptions.format=DIV_EXPORT_FORMAT_S16;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("32-bit float",audioExportOptions.format==DIV_EXPORT_FORMAT_F32)) {
|
if (ImGui::RadioButton(_("32-bit float"),audioExportOptions.format==DIV_EXPORT_FORMAT_F32)) {
|
||||||
audioExportOptions.format=DIV_EXPORT_FORMAT_F32;
|
audioExportOptions.format=DIV_EXPORT_FORMAT_F32;
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::InputInt("Sample rate",&audioExportOptions.sampleRate,100,10000)) {
|
if (ImGui::InputInt(_("Sample rate"),&audioExportOptions.sampleRate,100,10000)) {
|
||||||
if (audioExportOptions.sampleRate<8000) audioExportOptions.sampleRate=8000;
|
if (audioExportOptions.sampleRate<8000) audioExportOptions.sampleRate=8000;
|
||||||
if (audioExportOptions.sampleRate>384000) audioExportOptions.sampleRate=384000;
|
if (audioExportOptions.sampleRate>384000) audioExportOptions.sampleRate=384000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audioExportOptions.mode!=DIV_EXPORT_MODE_MANY_SYS) {
|
if (audioExportOptions.mode!=DIV_EXPORT_MODE_MANY_SYS) {
|
||||||
if (ImGui::InputInt("Channels in file",&audioExportOptions.chans,1,1)) {
|
if (ImGui::InputInt(_("Channels in file"),&audioExportOptions.chans,1,1)) {
|
||||||
if (audioExportOptions.chans<1) audioExportOptions.chans=1;
|
if (audioExportOptions.chans<1) audioExportOptions.chans=1;
|
||||||
if (audioExportOptions.chans>16) audioExportOptions.chans=16;
|
if (audioExportOptions.chans>16) audioExportOptions.chans=16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::InputInt("Loops",&audioExportOptions.loops,1,2)) {
|
if (ImGui::InputInt(_("Loops"),&audioExportOptions.loops,1,2)) {
|
||||||
if (audioExportOptions.loops<0) audioExportOptions.loops=0;
|
if (audioExportOptions.loops<0) audioExportOptions.loops=0;
|
||||||
}
|
}
|
||||||
if (ImGui::InputDouble("Fade out (seconds)",&audioExportOptions.fadeOut,1.0,2.0,"%.1f")) {
|
if (ImGui::InputDouble(_("Fade out (seconds)"),&audioExportOptions.fadeOut,1.0,2.0,"%.1f")) {
|
||||||
if (audioExportOptions.fadeOut<0.0) audioExportOptions.fadeOut=0.0;
|
if (audioExportOptions.fadeOut<0.0) audioExportOptions.fadeOut=0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isOneOn=false;
|
bool isOneOn=false;
|
||||||
if (audioExportOptions.mode==DIV_EXPORT_MODE_MANY_CHAN) {
|
if (audioExportOptions.mode==DIV_EXPORT_MODE_MANY_CHAN) {
|
||||||
ImGui::Text("Channels to export:");
|
ImGui::Text(_("Channels to export:"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::SmallButton("All")) {
|
if (ImGui::SmallButton(_("All"))) {
|
||||||
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
||||||
audioExportOptions.channelMask[i]=true;
|
audioExportOptions.channelMask[i]=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::SmallButton("None")) {
|
if (ImGui::SmallButton(_("None"))) {
|
||||||
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
||||||
audioExportOptions.channelMask[i]=false;
|
audioExportOptions.channelMask[i]=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::SmallButton("Invert")) {
|
if (ImGui::SmallButton(_("Invert"))) {
|
||||||
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
||||||
audioExportOptions.channelMask[i]=!audioExportOptions.channelMask[i];
|
audioExportOptions.channelMask[i]=!audioExportOptions.channelMask[i];
|
||||||
}
|
}
|
||||||
|
@ -107,12 +107,12 @@ void FurnaceGUI::drawExportAudio(bool onWindow) {
|
||||||
|
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isOneOn) {
|
if (isOneOn) {
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
switch (audioExportOptions.mode) {
|
switch (audioExportOptions.mode) {
|
||||||
case DIV_EXPORT_MODE_ONE:
|
case DIV_EXPORT_MODE_ONE:
|
||||||
openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE);
|
openFileDialog(GUI_FILE_EXPORT_AUDIO_ONE);
|
||||||
|
@ -127,15 +127,15 @@ void FurnaceGUI::drawExportAudio(bool onWindow) {
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::Text("select at least one channel");
|
ImGui::Text(_("select at least one channel"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::drawExportVGM(bool onWindow) {
|
void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text("settings:");
|
ImGui::Text(_("settings:"));
|
||||||
if (ImGui::BeginCombo("format version",fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) {
|
if (ImGui::BeginCombo(_("format version"),fmt::sprintf("%d.%.2x",vgmExportVersion>>8,vgmExportVersion&0xff).c_str())) {
|
||||||
for (int i=0; i<7; i++) {
|
for (int i=0; i<7; i++) {
|
||||||
if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) {
|
if (ImGui::Selectable(fmt::sprintf("%d.%.2x",vgmVersions[i]>>8,vgmVersions[i]&0xff).c_str(),vgmExportVersion==vgmVersions[i])) {
|
||||||
vgmExportVersion=vgmVersions[i];
|
vgmExportVersion=vgmVersions[i];
|
||||||
|
@ -143,17 +143,17 @@ void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
}
|
}
|
||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("loop",&vgmExportLoop);
|
ImGui::Checkbox(_("loop"),&vgmExportLoop);
|
||||||
if (vgmExportLoop && e->song.loopModality==2) {
|
if (vgmExportLoop && e->song.loopModality==2) {
|
||||||
ImGui::Text("loop trail:");
|
ImGui::Text(_("loop trail:"));
|
||||||
ImGui::Indent();
|
ImGui::Indent();
|
||||||
if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) {
|
if (ImGui::RadioButton(_("auto-detect"),vgmExportTrailingTicks==-1)) {
|
||||||
vgmExportTrailingTicks=-1;
|
vgmExportTrailingTicks=-1;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("add one loop",vgmExportTrailingTicks==-2)) {
|
if (ImGui::RadioButton(_("add one loop"),vgmExportTrailingTicks==-2)) {
|
||||||
vgmExportTrailingTicks=-2;
|
vgmExportTrailingTicks=-2;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("custom",vgmExportTrailingTicks>=0)) {
|
if (ImGui::RadioButton(_("custom"),vgmExportTrailingTicks>=0)) {
|
||||||
vgmExportTrailingTicks=0;
|
vgmExportTrailingTicks=0;
|
||||||
}
|
}
|
||||||
if (vgmExportTrailingTicks>=0) {
|
if (vgmExportTrailingTicks>=0) {
|
||||||
|
@ -164,9 +164,9 @@ void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
}
|
}
|
||||||
ImGui::Unindent();
|
ImGui::Unindent();
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints);
|
ImGui::Checkbox(_("add pattern change hints"),&vgmExportPatternHints);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip(
|
ImGui::SetTooltip(_(
|
||||||
"inserts data blocks on pattern changes.\n"
|
"inserts data blocks on pattern changes.\n"
|
||||||
"useful if you are writing a playback routine.\n\n"
|
"useful if you are writing a playback routine.\n\n"
|
||||||
|
|
||||||
|
@ -178,17 +178,17 @@ void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
"- pp: pattern index (one per channel)\n\n"
|
"- pp: pattern index (one per channel)\n\n"
|
||||||
|
|
||||||
"pattern indexes are ordered as they appear in the song."
|
"pattern indexes are ordered as they appear in the song."
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("direct stream mode",&vgmExportDirectStream);
|
ImGui::Checkbox(_("direct stream mode"),&vgmExportDirectStream);
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip(
|
ImGui::SetTooltip(_(
|
||||||
"required for DualPCM and MSM6258 export.\n\n"
|
"required for DualPCM and MSM6258 export.\n\n"
|
||||||
"allows for volume/direction changes when playing samples,\n"
|
"allows for volume/direction changes when playing samples,\n"
|
||||||
"at the cost of a massive increase in file size."
|
"at the cost of a massive increase in file size."
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
ImGui::Text("chips to export:");
|
ImGui::Text(_("chips to export:"));
|
||||||
bool hasOneAtLeast=false;
|
bool hasOneAtLeast=false;
|
||||||
for (int i=0; i<e->song.systemLen; i++) {
|
for (int i=0; i<e->song.systemLen; i++) {
|
||||||
int minVersion=e->minVGMVersion(e->song.system[i]);
|
int minVersion=e->minVGMVersion(e->song.system[i]);
|
||||||
|
@ -197,32 +197,32 @@ void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
if (minVersion>vgmExportVersion) {
|
if (minVersion>vgmExportVersion) {
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
||||||
ImGui::SetTooltip("this chip is only available in VGM %d.%.2x and higher!",minVersion>>8,minVersion&0xff);
|
ImGui::SetTooltip(_("this chip is only available in VGM %d.%.2x and higher!"),minVersion>>8,minVersion&0xff);
|
||||||
}
|
}
|
||||||
} else if (minVersion==0) {
|
} else if (minVersion==0) {
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
|
||||||
ImGui::SetTooltip("this chip is not supported by the VGM format!");
|
ImGui::SetTooltip(_("this chip is not supported by the VGM format!"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (willExport[i]) hasOneAtLeast=true;
|
if (willExport[i]) hasOneAtLeast=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::Text("select the chip you wish to export, but only up to %d of each type.",(vgmExportVersion>=0x151)?2:1);
|
ImGui::Text(_("select the chip you wish to export, but only up to %d of each type."),(vgmExportVersion>=0x151)?2:1);
|
||||||
if (hasOneAtLeast) {
|
if (hasOneAtLeast) {
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
openFileDialog(GUI_FILE_EXPORT_VGM);
|
openFileDialog(GUI_FILE_EXPORT_VGM);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::Text("nothing to export");
|
ImGui::Text(_("nothing to export"));
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(400.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(400.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,20 +230,20 @@ void FurnaceGUI::drawExportVGM(bool onWindow) {
|
||||||
void FurnaceGUI::drawExportZSM(bool onWindow) {
|
void FurnaceGUI::drawExportZSM(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text("Commander X16 Zsound Music File");
|
ImGui::Text(_("Commander X16 Zsound Music File"));
|
||||||
if (ImGui::InputInt("Tick Rate (Hz)",&zsmExportTickRate,1,2)) {
|
if (ImGui::InputInt(_("Tick Rate (Hz)"),&zsmExportTickRate,1,2)) {
|
||||||
if (zsmExportTickRate<1) zsmExportTickRate=1;
|
if (zsmExportTickRate<1) zsmExportTickRate=1;
|
||||||
if (zsmExportTickRate>44100) zsmExportTickRate=44100;
|
if (zsmExportTickRate>44100) zsmExportTickRate=44100;
|
||||||
}
|
}
|
||||||
ImGui::Checkbox("loop",&zsmExportLoop);
|
ImGui::Checkbox(_("loop"),&zsmExportLoop);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Checkbox("optimize size",&zsmExportOptimize);
|
ImGui::Checkbox(_("optimize size"),&zsmExportOptimize);
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
openFileDialog(GUI_FILE_EXPORT_ZSM);
|
openFileDialog(GUI_FILE_EXPORT_ZSM);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
@ -252,21 +252,21 @@ void FurnaceGUI::drawExportZSM(bool onWindow) {
|
||||||
void FurnaceGUI::drawExportAmigaVal(bool onWindow) {
|
void FurnaceGUI::drawExportAmigaVal(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text(
|
ImGui::Text(_(
|
||||||
"this is NOT ROM export! only use for making sure the\n"
|
"this is NOT ROM export! only use for making sure the\n"
|
||||||
"Furnace Amiga emulator is working properly by\n"
|
"Furnace Amiga emulator is working properly by\n"
|
||||||
"comparing it with real Amiga output."
|
"comparing it with real Amiga output."
|
||||||
);
|
));
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Directory");
|
ImGui::Text(_("Directory"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::InputText("##AVDPath",&workingDirROMExport);
|
ImGui::InputText("##AVDPath",&workingDirROMExport);
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Bake Data",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Bake Data"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
std::vector<DivROMExportOutput> out=e->buildROM(DIV_ROM_AMIGA_VALIDATION);
|
std::vector<DivROMExportOutput> out=e->buildROM(DIV_ROM_AMIGA_VALIDATION);
|
||||||
if (workingDirROMExport.size()>0) {
|
if (workingDirROMExport.size()>0) {
|
||||||
if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR;
|
if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR;
|
||||||
|
@ -281,7 +281,7 @@ void FurnaceGUI::drawExportAmigaVal(bool onWindow) {
|
||||||
i.data->finish();
|
i.data->finish();
|
||||||
delete i.data;
|
delete i.data;
|
||||||
}
|
}
|
||||||
showError(fmt::sprintf("Done! Baked %d files.",(int)out.size()));
|
showError(fmt::sprintf(_("Done! Baked %d files."),(int)out.size()));
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,14 +290,14 @@ void FurnaceGUI::drawExportText(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text(
|
ImGui::Text(
|
||||||
"this option exports the song to a text file.\n"
|
_("this option exports the song to a text file.\n")
|
||||||
);
|
);
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
openFileDialog(GUI_FILE_EXPORT_TEXT);
|
openFileDialog(GUI_FILE_EXPORT_TEXT);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
@ -306,19 +306,19 @@ void FurnaceGUI::drawExportText(bool onWindow) {
|
||||||
void FurnaceGUI::drawExportCommand(bool onWindow) {
|
void FurnaceGUI::drawExportCommand(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text(
|
ImGui::Text(_(
|
||||||
"this option exports a text or binary file which\n"
|
"this option exports a text or binary file which\n"
|
||||||
"contains a dump of the internal command stream\n"
|
"contains a dump of the internal command stream\n"
|
||||||
"produced when playing the song.\n\n"
|
"produced when playing the song.\n\n"
|
||||||
|
|
||||||
"technical/development use only!"
|
"technical/development use only!"
|
||||||
);
|
));
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
openFileDialog(GUI_FILE_EXPORT_CMDSTREAM);
|
openFileDialog(GUI_FILE_EXPORT_CMDSTREAM);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
@ -327,21 +327,21 @@ void FurnaceGUI::drawExportCommand(bool onWindow) {
|
||||||
void FurnaceGUI::drawExportDMF(bool onWindow) {
|
void FurnaceGUI::drawExportDMF(bool onWindow) {
|
||||||
exitDisabledTimer=1;
|
exitDisabledTimer=1;
|
||||||
|
|
||||||
ImGui::Text(
|
ImGui::Text(_(
|
||||||
"export in DefleMask module format.\n"
|
"export in DefleMask module format.\n"
|
||||||
"only do it if you really, really need to, or are downgrading an existing .dmf."
|
"only do it if you really, really need to, or are downgrading an existing .dmf."
|
||||||
);
|
));
|
||||||
|
|
||||||
ImGui::Text("format version:");
|
ImGui::Text(_("format version:"));
|
||||||
ImGui::RadioButton("1.1.3 and higher",&dmfExportVersion,0);
|
ImGui::RadioButton(_("1.1.3 and higher"),&dmfExportVersion,0);
|
||||||
ImGui::RadioButton("1.0/legacy (0.12)",&dmfExportVersion,1);
|
ImGui::RadioButton(_("1.0/legacy (0.12)"),&dmfExportVersion,1);
|
||||||
|
|
||||||
if (onWindow) {
|
if (onWindow) {
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Button("Cancel",ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
if (ImGui::Button(_("Cancel"),ImVec2(200.0f*dpiScale,0))) ImGui::CloseCurrentPopup();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Export",ImVec2(200.0f*dpiScale,0))) {
|
if (ImGui::Button(_("Export"),ImVec2(200.0f*dpiScale,0))) {
|
||||||
if (dmfExportVersion==1) {
|
if (dmfExportVersion==1) {
|
||||||
openFileDialog(GUI_FILE_SAVE_DMF_LEGACY);
|
openFileDialog(GUI_FILE_SAVE_DMF_LEGACY);
|
||||||
} else {
|
} else {
|
||||||
|
@ -354,11 +354,11 @@ void FurnaceGUI::drawExportDMF(bool onWindow) {
|
||||||
void FurnaceGUI::drawExport() {
|
void FurnaceGUI::drawExport() {
|
||||||
if (settings.exportOptionsLayout==1 || curExportType==GUI_EXPORT_NONE) {
|
if (settings.exportOptionsLayout==1 || curExportType==GUI_EXPORT_NONE) {
|
||||||
if (ImGui::BeginTabBar("ExportTypes")) {
|
if (ImGui::BeginTabBar("ExportTypes")) {
|
||||||
if (ImGui::BeginTabItem("Audio")) {
|
if (ImGui::BeginTabItem(_("Audio"))) {
|
||||||
drawExportAudio(true);
|
drawExportAudio(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("VGM")) {
|
if (ImGui::BeginTabItem(_("VGM"))) {
|
||||||
drawExportVGM(true);
|
drawExportVGM(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,7 @@ void FurnaceGUI::drawExport() {
|
||||||
if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++;
|
if ((e->song.system[i]==DIV_SYSTEM_VERA) || (e->song.system[i]==DIV_SYSTEM_YM2151)) numZSMCompat++;
|
||||||
}
|
}
|
||||||
if (numZSMCompat>0) {
|
if (numZSMCompat>0) {
|
||||||
if (ImGui::BeginTabItem("ZSM")) {
|
if (ImGui::BeginTabItem(_("ZSM"))) {
|
||||||
drawExportZSM(true);
|
drawExportZSM(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
@ -377,20 +377,20 @@ void FurnaceGUI::drawExport() {
|
||||||
if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++;
|
if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++;
|
||||||
}
|
}
|
||||||
if (numAmiga && settings.iCannotWait) {
|
if (numAmiga && settings.iCannotWait) {
|
||||||
if (ImGui::BeginTabItem("Amiga Validation")) {
|
if (ImGui::BeginTabItem(_("Amiga Validation"))) {
|
||||||
drawExportAmigaVal(true);
|
drawExportAmigaVal(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Text")) {
|
if (ImGui::BeginTabItem(_("Text"))) {
|
||||||
drawExportText(true);
|
drawExportText(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Command Stream")) {
|
if (ImGui::BeginTabItem(_("Command Stream"))) {
|
||||||
drawExportCommand(true);
|
drawExportCommand(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("DMF")) {
|
if (ImGui::BeginTabItem(_("DMF"))) {
|
||||||
drawExportDMF(true);
|
drawExportDMF(true);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
@ -419,39 +419,39 @@ void FurnaceGUI::drawExport() {
|
||||||
drawExportDMF(true);
|
drawExportDMF(true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ImGui::Text("congratulations! you've unlocked a secret panel.");
|
ImGui::Text(_("congratulations! you've unlocked a secret panel."));
|
||||||
if (ImGui::Button("Toggle hidden systems")) {
|
if (ImGui::Button(_("Toggle hidden systems"))) {
|
||||||
settings.hiddenSystems=!settings.hiddenSystems;
|
settings.hiddenSystems=!settings.hiddenSystems;
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Toggle all instrument types")) {
|
if (ImGui::Button(_("Toggle all instrument types"))) {
|
||||||
settings.displayAllInsTypes=!settings.displayAllInsTypes;
|
settings.displayAllInsTypes=!settings.displayAllInsTypes;
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Set pitch linearity to Partial")) {
|
if (ImGui::Button(_("Set pitch linearity to Partial"))) {
|
||||||
e->song.linearPitch=1;
|
e->song.linearPitch=1;
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Enable multi-threading settings")) {
|
if (ImGui::Button(_("Enable multi-threading settings"))) {
|
||||||
settings.showPool=1;
|
settings.showPool=1;
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Set fat to max")) {
|
if (ImGui::Button(_("Set fat to max"))) {
|
||||||
ImGuiStyle& sty=ImGui::GetStyle();
|
ImGuiStyle& sty=ImGui::GetStyle();
|
||||||
sty.FramePadding=ImVec2(20.0f*dpiScale,20.0f*dpiScale);
|
sty.FramePadding=ImVec2(20.0f*dpiScale,20.0f*dpiScale);
|
||||||
sty.ItemSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale);
|
sty.ItemSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale);
|
||||||
sty.ItemInnerSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale);
|
sty.ItemInnerSpacing=ImVec2(10.0f*dpiScale,10.0f*dpiScale);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Set muscle and fat to zero")) {
|
if (ImGui::Button(_("Set muscle and fat to zero"))) {
|
||||||
ImGuiStyle& sty=ImGui::GetStyle();
|
ImGuiStyle& sty=ImGui::GetStyle();
|
||||||
sty.FramePadding=ImVec2(0,0);
|
sty.FramePadding=ImVec2(0,0);
|
||||||
sty.ItemSpacing=ImVec2(0,0);
|
sty.ItemSpacing=ImVec2(0,0);
|
||||||
sty.ItemInnerSpacing=ImVec2(0,0);
|
sty.ItemInnerSpacing=ImVec2(0,0);
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Tell tildearrow this must be a mistake")) {
|
if (ImGui::Button(_("Tell tildearrow this must be a mistake"))) {
|
||||||
showError("yeah, it's a bug. write a bug report in the GitHub page and tell me how did you get here.");
|
showError(_("yeah, it's a bug. write a bug report in the GitHub page and tell me how did you get here."));
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -26,21 +26,21 @@
|
||||||
#include "../ta-log.h"
|
#include "../ta-log.h"
|
||||||
|
|
||||||
const char* queryModes[GUI_QUERY_MAX]={
|
const char* queryModes[GUI_QUERY_MAX]={
|
||||||
"ignore",
|
_N("ignore"),
|
||||||
"equals",
|
_N("equals"),
|
||||||
"not equal",
|
_N("not equal"),
|
||||||
"between",
|
_N("between"),
|
||||||
"not between",
|
_N("not between"),
|
||||||
"any",
|
_N("any"),
|
||||||
"none"
|
_N("none")
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* queryReplaceModes[GUI_QUERY_REPLACE_MAX]={
|
const char* queryReplaceModes[GUI_QUERY_REPLACE_MAX]={
|
||||||
"set",
|
_N("set"),
|
||||||
"add",
|
_N("add"),
|
||||||
"add (overflow)",
|
_N("add (overflow)"),
|
||||||
"scale %",
|
_N("scale %"),
|
||||||
"clear"
|
_N("clear")
|
||||||
};
|
};
|
||||||
|
|
||||||
int queryNote(int note, int octave) {
|
int queryNote(int note, int octave) {
|
||||||
|
@ -509,7 +509,7 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
}
|
}
|
||||||
if (!findOpen) return;
|
if (!findOpen) return;
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
if (ImGui::Begin("Find/Replace",&findOpen,globalWinFlags)) {
|
if (ImGui::Begin("Find/Replace",&findOpen,globalWinFlags,_("Find/Replace"))) {
|
||||||
if (curQuery.empty()) {
|
if (curQuery.empty()) {
|
||||||
curQuery.push_back(FurnaceGUIFindQuery());
|
curQuery.push_back(FurnaceGUIFindQuery());
|
||||||
}
|
}
|
||||||
|
@ -517,14 +517,14 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
int eraseIndex=-1;
|
int eraseIndex=-1;
|
||||||
char tempID[1024];
|
char tempID[1024];
|
||||||
if (ImGui::BeginTabBar("FindOrReplace")) {
|
if (ImGui::BeginTabBar("FindOrReplace")) {
|
||||||
if (ImGui::BeginTabItem("Find")) {
|
if (ImGui::BeginTabItem(_("Find"))) {
|
||||||
if (queryViewingResults) {
|
if (queryViewingResults) {
|
||||||
if (!curQueryResults.empty()) {
|
if (!curQueryResults.empty()) {
|
||||||
ImVec2 avail=ImGui::GetContentRegionAvail();
|
ImVec2 avail=ImGui::GetContentRegionAvail();
|
||||||
avail.y-=ImGui::GetFrameHeightWithSpacing();
|
avail.y-=ImGui::GetFrameHeightWithSpacing();
|
||||||
if (ImGui::BeginTable("FindResults",4,ImGuiTableFlags_Borders|ImGuiTableFlags_ScrollY,avail)) {
|
if (ImGui::BeginTable("FindResults",4,ImGuiTableFlags_Borders|ImGuiTableFlags_ScrollY,avail)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,ImGui::CalcTextSize("order").x);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,ImGui::CalcTextSize(_("order")).x);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed,ImGui::CalcTextSize("row").x);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed,ImGui::CalcTextSize(_("row")).x);
|
||||||
ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch);
|
||||||
ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthFixed);
|
ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthFixed);
|
||||||
|
|
||||||
|
@ -532,13 +532,13 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
|
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("order");
|
ImGui::Text(_("order"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("row");
|
ImGui::Text(_("row"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("channel");
|
ImGui::Text(_("channel"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("go");
|
ImGui::Text(_("go"));
|
||||||
|
|
||||||
int index=0;
|
int index=0;
|
||||||
for (FurnaceGUIQueryResult& i: curQueryResults) {
|
for (FurnaceGUIQueryResult& i: curQueryResults) {
|
||||||
|
@ -582,9 +582,9 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ImGui::Text("no matches found!");
|
ImGui::Text(_("no matches found!"));
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Back")) {
|
if (ImGui::Button(_("Back"))) {
|
||||||
queryViewingResults=false;
|
queryViewingResults=false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -598,10 +598,10 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Note");
|
ImGui::Text(_("Note"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##NCondition",&i.noteMode,queryModes,GUI_QUERY_MAX);
|
ImGui::Combo("##NCondition",&i.noteMode,LocalizedComboGetter,queryModes,GUI_QUERY_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (FIRST_VISIBLE(i.noteMode)) {
|
if (FIRST_VISIBLE(i.noteMode)) {
|
||||||
if ((i.noteMode==GUI_QUERY_RANGE || i.noteMode==GUI_QUERY_RANGE_NOT) && i.note>=120) {
|
if ((i.noteMode==GUI_QUERY_RANGE || i.noteMode==GUI_QUERY_RANGE_NOT) && i.note>=120) {
|
||||||
|
@ -666,10 +666,10 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Ins");
|
ImGui::Text(_("Ins"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##ICondition",&i.insMode,queryModes,GUI_QUERY_MAX);
|
ImGui::Combo("##ICondition",&i.insMode,LocalizedComboGetter,queryModes,GUI_QUERY_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (FIRST_VISIBLE(i.insMode)) {
|
if (FIRST_VISIBLE(i.insMode)) {
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
@ -684,10 +684,10 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Volume");
|
ImGui::Text(_("Volume"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##VCondition",&i.volMode,queryModes,GUI_QUERY_MAX);
|
ImGui::Combo("##VCondition",&i.volMode,LocalizedComboGetter,queryModes,GUI_QUERY_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (FIRST_VISIBLE(i.volMode)) {
|
if (FIRST_VISIBLE(i.volMode)) {
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
@ -704,10 +704,10 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Effect");
|
ImGui::Text(_("Effect"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##ECondition",&i.effectMode[j],queryModes,GUI_QUERY_MAX);
|
ImGui::Combo("##ECondition",&i.effectMode[j],LocalizedComboGetter,queryModes,GUI_QUERY_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (FIRST_VISIBLE(i.effectMode[j])) {
|
if (FIRST_VISIBLE(i.effectMode[j])) {
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
@ -722,10 +722,10 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("Value");
|
ImGui::Text(_("Value"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##EVCondition",&i.effectValMode[j],queryModes,GUI_QUERY_MAX);
|
ImGui::Combo("##EVCondition",&i.effectValMode[j],LocalizedComboGetter,queryModes,GUI_QUERY_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (FIRST_VISIBLE(i.effectValMode[j])) {
|
if (FIRST_VISIBLE(i.effectValMode[j])) {
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
@ -747,18 +747,18 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Delete query");
|
ImGui::SetTooltip(_("Delete query"));
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (i.effectCount<8) {
|
if (i.effectCount<8) {
|
||||||
if (ImGui::Button("Add effect")) {
|
if (ImGui::Button(_("Add effect"))) {
|
||||||
i.effectCount++;
|
i.effectCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (i.effectCount>0) {
|
if (i.effectCount>0) {
|
||||||
pushDestColor();
|
pushDestColor();
|
||||||
if (ImGui::Button("Remove effect")) {
|
if (ImGui::Button(_("Remove effect"))) {
|
||||||
i.effectCount--;
|
i.effectCount--;
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
|
@ -783,24 +783,24 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
ImGui::Text("Search range:");
|
ImGui::Text(_("Search range:"));
|
||||||
|
|
||||||
if (ImGui::RadioButton("Song",curQueryRangeY==0)) {
|
if (ImGui::RadioButton(_("Song"),curQueryRangeY==0)) {
|
||||||
curQueryRangeY=0;
|
curQueryRangeY=0;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Selection",curQueryRangeY==1)) {
|
if (ImGui::RadioButton(_("Selection"),curQueryRangeY==1)) {
|
||||||
curQueryRangeY=1;
|
curQueryRangeY=1;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Pattern",curQueryRangeY==2)) {
|
if (ImGui::RadioButton(_("Pattern"),curQueryRangeY==2)) {
|
||||||
curQueryRangeY=2;
|
curQueryRangeY=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Confine to channels",&curQueryRangeX);
|
ImGui::Checkbox(_("Confine to channels"),&curQueryRangeX);
|
||||||
|
|
||||||
ImGui::BeginDisabled(!curQueryRangeX);
|
ImGui::BeginDisabled(!curQueryRangeX);
|
||||||
snprintf(tempID,1024,"%d: %s",curQueryRangeXMin+1,e->getChannelName(curQueryRangeXMin));
|
snprintf(tempID,1024,"%d: %s",curQueryRangeXMin+1,e->getChannelName(curQueryRangeXMin));
|
||||||
if (ImGui::BeginCombo("From",tempID)) {
|
if (ImGui::BeginCombo(_("From"),tempID)) {
|
||||||
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
||||||
snprintf(tempID,1024,"%d: %s",i+1,e->getChannelName(i));
|
snprintf(tempID,1024,"%d: %s",i+1,e->getChannelName(i));
|
||||||
if (ImGui::Selectable(tempID,curQueryRangeXMin==i)) {
|
if (ImGui::Selectable(tempID,curQueryRangeXMin==i)) {
|
||||||
|
@ -811,7 +811,7 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(tempID,1024,"%d: %s",curQueryRangeXMax+1,e->getChannelName(curQueryRangeXMax));
|
snprintf(tempID,1024,"%d: %s",curQueryRangeXMax+1,e->getChannelName(curQueryRangeXMax));
|
||||||
if (ImGui::BeginCombo("To",tempID)) {
|
if (ImGui::BeginCombo(_("To"),tempID)) {
|
||||||
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
for (int i=0; i<e->getTotalChannelCount(); i++) {
|
||||||
snprintf(tempID,1024,"%d: %s",i+1,e->getChannelName(i));
|
snprintf(tempID,1024,"%d: %s",i+1,e->getChannelName(i));
|
||||||
if (ImGui::Selectable(tempID,curQueryRangeXMax==i)) {
|
if (ImGui::Selectable(tempID,curQueryRangeXMax==i)) {
|
||||||
|
@ -823,37 +823,37 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Match effect position:");
|
ImGui::Text(_("Match effect position:"));
|
||||||
|
|
||||||
if (ImGui::RadioButton("No",curQueryEffectPos==0)) {
|
if (ImGui::RadioButton(_("No"),curQueryEffectPos==0)) {
|
||||||
curQueryEffectPos=0;
|
curQueryEffectPos=0;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("match effects regardless of position.");
|
ImGui::SetTooltip(_("match effects regardless of position."));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Lax",curQueryEffectPos==1)) {
|
if (ImGui::RadioButton(_("Lax"),curQueryEffectPos==1)) {
|
||||||
curQueryEffectPos=1;
|
curQueryEffectPos=1;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("match effects only if they appear in-order.");
|
ImGui::SetTooltip(_("match effects only if they appear in-order."));
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Strict",curQueryEffectPos==2)) {
|
if (ImGui::RadioButton(_("Strict"),curQueryEffectPos==2)) {
|
||||||
curQueryEffectPos=2;
|
curQueryEffectPos=2;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("match effects only if they appear exactly as specified.");
|
ImGui::SetTooltip(_("match effects only if they appear exactly as specified."));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("Find")) {
|
if (ImGui::Button(_("Find"))) {
|
||||||
doFind();
|
doFind();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Replace")) {
|
if (ImGui::BeginTabItem(_("Replace"))) {
|
||||||
if (ImGui::BeginTable("QueryReplace",3,ImGuiTableFlags_BordersOuter)) {
|
if (ImGui::BeginTable("QueryReplace",3,ImGuiTableFlags_BordersOuter)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.5);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.5);
|
||||||
|
@ -861,11 +861,11 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Note",&queryReplaceNoteDo);
|
ImGui::Checkbox(_("Note"),&queryReplaceNoteDo);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled(!queryReplaceNoteDo);
|
ImGui::BeginDisabled(!queryReplaceNoteDo);
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##NRMode",&queryReplaceNoteMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
ImGui::Combo("##NRMode",&queryReplaceNoteMode,LocalizedComboGetter,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (queryReplaceNoteMode==GUI_QUERY_REPLACE_SET) {
|
if (queryReplaceNoteMode==GUI_QUERY_REPLACE_SET) {
|
||||||
|
@ -905,17 +905,17 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
if (queryReplaceNote>180) queryReplaceNote=180;
|
if (queryReplaceNote>180) queryReplaceNote=180;
|
||||||
}
|
}
|
||||||
} else if (queryReplaceNoteMode==GUI_QUERY_REPLACE_SCALE) {
|
} else if (queryReplaceNoteMode==GUI_QUERY_REPLACE_SCALE) {
|
||||||
ImGui::Text("INVALID");
|
ImGui::Text(_("INVALID"));
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Ins",&queryReplaceInsDo);
|
ImGui::Checkbox(_("Ins"),&queryReplaceInsDo);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled(!queryReplaceInsDo);
|
ImGui::BeginDisabled(!queryReplaceInsDo);
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##IRMode",&queryReplaceInsMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
ImGui::Combo("##IRMode",&queryReplaceInsMode,LocalizedComboGetter,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (queryReplaceInsMode==GUI_QUERY_REPLACE_SET) {
|
if (queryReplaceInsMode==GUI_QUERY_REPLACE_SET) {
|
||||||
|
@ -940,11 +940,11 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Volume",&queryReplaceVolDo);
|
ImGui::Checkbox(_("Volume"),&queryReplaceVolDo);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled(!queryReplaceVolDo);
|
ImGui::BeginDisabled(!queryReplaceVolDo);
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##VRMode",&queryReplaceVolMode,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
ImGui::Combo("##VRMode",&queryReplaceVolMode,LocalizedComboGetter,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (queryReplaceVolMode==GUI_QUERY_REPLACE_SET) {
|
if (queryReplaceVolMode==GUI_QUERY_REPLACE_SET) {
|
||||||
|
@ -971,11 +971,11 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::PushID(0x100+i);
|
ImGui::PushID(0x100+i);
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Effect",&queryReplaceEffectDo[i]);
|
ImGui::Checkbox(_("Effect"),&queryReplaceEffectDo[i]);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled(!queryReplaceEffectDo[i]);
|
ImGui::BeginDisabled(!queryReplaceEffectDo[i]);
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##ERMode",&queryReplaceEffectMode[i],queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
ImGui::Combo("##ERMode",&queryReplaceEffectMode[i],LocalizedComboGetter,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (queryReplaceEffectMode[i]==GUI_QUERY_REPLACE_SET) {
|
if (queryReplaceEffectMode[i]==GUI_QUERY_REPLACE_SET) {
|
||||||
|
@ -1000,11 +1000,11 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Value",&queryReplaceEffectValDo[i]);
|
ImGui::Checkbox(_("Value"),&queryReplaceEffectValDo[i]);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::BeginDisabled(!queryReplaceEffectValDo[i]);
|
ImGui::BeginDisabled(!queryReplaceEffectValDo[i]);
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##ERModeV",&queryReplaceEffectValMode[i],queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
ImGui::Combo("##ERModeV",&queryReplaceEffectValMode[i],LocalizedComboGetter,queryReplaceModes,GUI_QUERY_REPLACE_MAX);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (queryReplaceEffectValMode[i]==GUI_QUERY_REPLACE_SET) {
|
if (queryReplaceEffectValMode[i]==GUI_QUERY_REPLACE_SET) {
|
||||||
|
@ -1034,14 +1034,14 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (queryReplaceEffectCount<8) {
|
if (queryReplaceEffectCount<8) {
|
||||||
if (ImGui::Button("Add effect")) {
|
if (ImGui::Button(_("Add effect"))) {
|
||||||
queryReplaceEffectCount++;
|
queryReplaceEffectCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (queryReplaceEffectCount>0) {
|
if (queryReplaceEffectCount>0) {
|
||||||
pushDestColor();
|
pushDestColor();
|
||||||
if (ImGui::Button("Remove effect")) {
|
if (ImGui::Button(_("Remove effect"))) {
|
||||||
queryReplaceEffectCount--;
|
queryReplaceEffectCount--;
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
|
@ -1049,20 +1049,20 @@ void FurnaceGUI::drawFindReplace() {
|
||||||
|
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
ImGui::Text("Effect replace mode:");
|
ImGui::Text(_("Effect replace mode:"));
|
||||||
if (ImGui::RadioButton("Replace matches only",queryReplaceEffectPos==1)) {
|
if (ImGui::RadioButton(_("Replace matches only"),queryReplaceEffectPos==1)) {
|
||||||
queryReplaceEffectPos=1;
|
queryReplaceEffectPos=1;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Replace matches, then free spaces",queryReplaceEffectPos==2)) {
|
if (ImGui::RadioButton(_("Replace matches, then free spaces"),queryReplaceEffectPos==2)) {
|
||||||
queryReplaceEffectPos=2;
|
queryReplaceEffectPos=2;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Clear effects",queryReplaceEffectPos==0)) {
|
if (ImGui::RadioButton(_("Clear effects"),queryReplaceEffectPos==0)) {
|
||||||
queryReplaceEffectPos=0;
|
queryReplaceEffectPos=0;
|
||||||
}
|
}
|
||||||
if (ImGui::RadioButton("Insert in free spaces",queryReplaceEffectPos==3)) {
|
if (ImGui::RadioButton(_("Insert in free spaces"),queryReplaceEffectPos==3)) {
|
||||||
queryReplaceEffectPos=3;
|
queryReplaceEffectPos=3;
|
||||||
}
|
}
|
||||||
if (ImGui::Button("Replace##QueryReplace")) {
|
if (ImGui::Button(_("Replace##QueryReplace"))) {
|
||||||
doReplace();
|
doReplace();
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
128045
src/gui/font_plexSansJP.cpp
Normal file
128045
src/gui/font_plexSansJP.cpp
Normal file
File diff suppressed because it is too large
Load diff
51400
src/gui/font_plexSansKR.cpp
Normal file
51400
src/gui/font_plexSansKR.cpp
Normal file
File diff suppressed because it is too large
Load diff
|
@ -30,6 +30,10 @@ extern const unsigned int font_mononoki_compressed_size;
|
||||||
extern const unsigned char font_mononoki_compressed_data[];
|
extern const unsigned char font_mononoki_compressed_data[];
|
||||||
extern const unsigned int font_plexSans_compressed_size;
|
extern const unsigned int font_plexSans_compressed_size;
|
||||||
extern const unsigned char font_plexSans_compressed_data[];
|
extern const unsigned char font_plexSans_compressed_data[];
|
||||||
|
extern const unsigned int font_plexSansJP_compressed_size;
|
||||||
|
extern const unsigned char font_plexSansJP_compressed_data[];
|
||||||
|
extern const unsigned int font_plexSansKR_compressed_size;
|
||||||
|
extern const unsigned char font_plexSansKR_compressed_data[];
|
||||||
extern const unsigned int font_plexMono_compressed_size;
|
extern const unsigned int font_plexMono_compressed_size;
|
||||||
extern const unsigned char font_plexMono_compressed_data[];
|
extern const unsigned char font_plexMono_compressed_data[];
|
||||||
extern const unsigned int font_proggyClean_compressed_size;
|
extern const unsigned int font_proggyClean_compressed_size;
|
||||||
|
|
|
@ -32,10 +32,10 @@ void FurnaceGUI::drawGrooves() {
|
||||||
}
|
}
|
||||||
if (!groovesOpen) return;
|
if (!groovesOpen) return;
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(64.0f*dpiScale,32.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
if (ImGui::Begin("Grooves",&groovesOpen,globalWinFlags)) {
|
if (ImGui::Begin("Grooves",&groovesOpen,globalWinFlags,_("Grooves"))) {
|
||||||
int delGroove=-1;
|
int delGroove=-1;
|
||||||
|
|
||||||
ImGui::Text("use effect 09xx to select a groove pattern.");
|
ImGui::Text(_("use effect 09xx to select a groove pattern."));
|
||||||
if (!e->song.grooves.empty()) if (ImGui::BeginTable("GrooveList",3,ImGuiTableFlags_Borders)) {
|
if (!e->song.grooves.empty()) if (ImGui::BeginTable("GrooveList",3,ImGuiTableFlags_Borders)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed);
|
||||||
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
@ -45,7 +45,7 @@ void FurnaceGUI::drawGrooves() {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("#");
|
ImGui::Text("#");
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("pattern");
|
ImGui::Text(_("pattern"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
// ImGui::Text("remove"); removed because the text clips from the fixed width
|
// ImGui::Text("remove"); removed because the text clips from the fixed width
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ void FurnaceGUI::drawGrooves() {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("remove");
|
ImGui::SetTooltip(_("remove"));
|
||||||
}
|
}
|
||||||
|
|
||||||
index++;
|
index++;
|
||||||
|
|
1068
src/gui/gui.cpp
1068
src/gui/gui.cpp
File diff suppressed because it is too large
Load diff
|
@ -133,6 +133,10 @@ enum FurnaceGUIRenderBackend {
|
||||||
#define GUI_DECORATIONS_DEFAULT 1
|
#define GUI_DECORATIONS_DEFAULT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_MOMO
|
||||||
|
#define ngettext momo_ngettext
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - add colors for FM envelope and waveform
|
// - add colors for FM envelope and waveform
|
||||||
// - maybe add "alternate" color for FM modulators/carriers (a bit difficult)
|
// - maybe add "alternate" color for FM modulators/carriers (a bit difficult)
|
||||||
|
@ -1954,6 +1958,7 @@ class FurnaceGUI {
|
||||||
String emptyLabel2;
|
String emptyLabel2;
|
||||||
String sdlAudioDriver;
|
String sdlAudioDriver;
|
||||||
String defaultAuthorName;
|
String defaultAuthorName;
|
||||||
|
String locale;
|
||||||
DivConfig initialSys;
|
DivConfig initialSys;
|
||||||
|
|
||||||
Settings():
|
Settings():
|
||||||
|
@ -2208,7 +2213,8 @@ class FurnaceGUI {
|
||||||
emptyLabel("..."),
|
emptyLabel("..."),
|
||||||
emptyLabel2(".."),
|
emptyLabel2(".."),
|
||||||
sdlAudioDriver(""),
|
sdlAudioDriver(""),
|
||||||
defaultAuthorName("") {}
|
defaultAuthorName(""),
|
||||||
|
locale("") {}
|
||||||
} settings;
|
} settings;
|
||||||
|
|
||||||
struct Tutorial {
|
struct Tutorial {
|
||||||
|
@ -2226,6 +2232,12 @@ class FurnaceGUI {
|
||||||
|
|
||||||
char finalLayoutPath[4096];
|
char finalLayoutPath[4096];
|
||||||
|
|
||||||
|
bool localeRequiresJapanese;
|
||||||
|
bool localeRequiresChinese;
|
||||||
|
bool localeRequiresChineseTrad;
|
||||||
|
bool localeRequiresKorean;
|
||||||
|
std::vector<ImWchar> localeExtraRanges;
|
||||||
|
|
||||||
DivInstrument* prevInsData;
|
DivInstrument* prevInsData;
|
||||||
|
|
||||||
unsigned char* pendingLayoutImport;
|
unsigned char* pendingLayoutImport;
|
||||||
|
@ -2676,6 +2688,9 @@ class FurnaceGUI {
|
||||||
void renderFMPreviewOPZ(const DivInstrumentFM& params, int pos=0);
|
void renderFMPreviewOPZ(const DivInstrumentFM& params, int pos=0);
|
||||||
void renderFMPreviewESFM(const DivInstrumentFM& params, const DivInstrumentESFM& esfmParams, int pos=0);
|
void renderFMPreviewESFM(const DivInstrumentFM& params, const DivInstrumentESFM& esfmParams, int pos=0);
|
||||||
|
|
||||||
|
// combo with locale
|
||||||
|
static bool LocalizedComboGetter(void* data, int idx, const char** out_text);
|
||||||
|
|
||||||
// these ones offer ctrl-wheel fine value changes.
|
// these ones offer ctrl-wheel fine value changes.
|
||||||
bool CWSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
|
bool CWSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
|
||||||
bool CWVSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
|
bool CWVSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
|
||||||
|
|
|
@ -124,7 +124,7 @@ const char* insTypes[DIV_INS_MAX+1][3]={
|
||||||
{"FM (OPN)",ICON_FA_AREA_CHART,ICON_FUR_INS_FM},
|
{"FM (OPN)",ICON_FA_AREA_CHART,ICON_FUR_INS_FM},
|
||||||
{"Game Boy",ICON_FA_GAMEPAD,ICON_FUR_INS_GB},
|
{"Game Boy",ICON_FA_GAMEPAD,ICON_FUR_INS_GB},
|
||||||
{"C64",ICON_FA_KEYBOARD_O,ICON_FUR_INS_C64},
|
{"C64",ICON_FA_KEYBOARD_O,ICON_FUR_INS_C64},
|
||||||
{"Generic Sample",ICON_FA_VOLUME_UP,ICON_FUR_INS_AMIGA},
|
{_N("Generic Sample"),ICON_FA_VOLUME_UP,ICON_FUR_INS_AMIGA},
|
||||||
{"PC Engine",ICON_FA_ID_BADGE,ICON_FUR_INS_PCE},
|
{"PC Engine",ICON_FA_ID_BADGE,ICON_FUR_INS_PCE},
|
||||||
{"AY-3-8910/SSG",ICON_FA_BAR_CHART,ICON_FUR_INS_AY},
|
{"AY-3-8910/SSG",ICON_FA_BAR_CHART,ICON_FUR_INS_AY},
|
||||||
{"AY8930",ICON_FA_BAR_CHART,ICON_FUR_INS_AY8930},
|
{"AY8930",ICON_FA_BAR_CHART,ICON_FUR_INS_AY8930},
|
||||||
|
@ -146,13 +146,13 @@ const char* insTypes[DIV_INS_MAX+1][3]={
|
||||||
{"Atari Lynx",ICON_FA_BAR_CHART,ICON_FUR_INS_MIKEY},
|
{"Atari Lynx",ICON_FA_BAR_CHART,ICON_FUR_INS_MIKEY},
|
||||||
{"VERA",ICON_FA_KEYBOARD_O,ICON_FUR_INS_VERA},
|
{"VERA",ICON_FA_KEYBOARD_O,ICON_FUR_INS_VERA},
|
||||||
{"X1-010",ICON_FA_BAR_CHART,ICON_FUR_INS_X1_010},
|
{"X1-010",ICON_FA_BAR_CHART,ICON_FUR_INS_X1_010},
|
||||||
{"VRC6 (saw)",ICON_FA_BAR_CHART,ICON_FUR_INS_VRC6_SAW},
|
{_("VRC6 (saw)"),ICON_FA_BAR_CHART,ICON_FUR_INS_VRC6_SAW},
|
||||||
{"ES5506",ICON_FA_VOLUME_UP,ICON_FUR_INS_ES5506},
|
{"ES5506",ICON_FA_VOLUME_UP,ICON_FUR_INS_ES5506},
|
||||||
{"MultiPCM",ICON_FA_VOLUME_UP,ICON_FUR_INS_MULTIPCM},
|
{"MultiPCM",ICON_FA_VOLUME_UP,ICON_FUR_INS_MULTIPCM},
|
||||||
{"SNES",ICON_FA_VOLUME_UP,ICON_FUR_INS_SNES},
|
{"SNES",ICON_FA_VOLUME_UP,ICON_FUR_INS_SNES},
|
||||||
{"Sound Unit",ICON_FA_MICROCHIP,ICON_FUR_INS_SU},
|
{"Sound Unit",ICON_FA_MICROCHIP,ICON_FUR_INS_SU},
|
||||||
{"Namco WSG",ICON_FA_PIE_CHART,ICON_FUR_INS_NAMCO},
|
{"Namco WSG",ICON_FA_PIE_CHART,ICON_FUR_INS_NAMCO},
|
||||||
{"OPL (drums)",ICON_FA_COFFEE,ICON_FUR_INS_OPL_DRUMS},
|
{_N("OPL (drums)"),ICON_FA_COFFEE,ICON_FUR_INS_OPL_DRUMS},
|
||||||
{"FM (OPM)",ICON_FA_AREA_CHART,ICON_FUR_INS_OPM},
|
{"FM (OPM)",ICON_FA_AREA_CHART,ICON_FUR_INS_OPM},
|
||||||
{"NES",ICON_FA_GAMEPAD,ICON_FUR_INS_NES},
|
{"NES",ICON_FA_GAMEPAD,ICON_FUR_INS_NES},
|
||||||
{"MSM6258",ICON_FA_VOLUME_UP,ICON_FUR_INS_MSM6258},
|
{"MSM6258",ICON_FA_VOLUME_UP,ICON_FUR_INS_MSM6258},
|
||||||
|
@ -176,8 +176,8 @@ const char* insTypes[DIV_INS_MAX+1][3]={
|
||||||
{"C140",ICON_FA_VOLUME_UP,ICON_FUR_INS_C140},
|
{"C140",ICON_FA_VOLUME_UP,ICON_FUR_INS_C140},
|
||||||
{"C219",ICON_FA_VOLUME_UP,ICON_FUR_INS_C219},
|
{"C219",ICON_FA_VOLUME_UP,ICON_FUR_INS_C219},
|
||||||
{"FM (ESFM)",ICON_FA_AREA_CHART,ICON_FUR_INS_ESFM},
|
{"FM (ESFM)",ICON_FA_AREA_CHART,ICON_FUR_INS_ESFM},
|
||||||
{"PowerNoise (noise)",ICON_FUR_NOISE,ICON_FUR_INS_POWERNOISE},
|
{_N("PowerNoise (noise)"),ICON_FUR_NOISE,ICON_FUR_INS_POWERNOISE},
|
||||||
{"PowerNoise (slope)",ICON_FUR_SAW,ICON_FUR_INS_POWERNOISE_SAW},
|
{_N("PowerNoise (slope)"),ICON_FUR_SAW,ICON_FUR_INS_POWERNOISE_SAW},
|
||||||
{"Dave",ICON_FA_BAR_CHART,ICON_FUR_INS_DAVE},
|
{"Dave",ICON_FA_BAR_CHART,ICON_FUR_INS_DAVE},
|
||||||
{"Nintendo DS",ICON_FA_BAR_CHART,ICON_FUR_INS_NDS},
|
{"Nintendo DS",ICON_FA_BAR_CHART,ICON_FUR_INS_NDS},
|
||||||
{"GBA DMA",ICON_FA_GAMEPAD,ICON_FUR_INS_GBA_DMA},
|
{"GBA DMA",ICON_FA_GAMEPAD,ICON_FUR_INS_GBA_DMA},
|
||||||
|
@ -188,9 +188,9 @@ const char* insTypes[DIV_INS_MAX+1][3]={
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* sampleLoopModes[DIV_SAMPLE_LOOP_MAX]={
|
const char* sampleLoopModes[DIV_SAMPLE_LOOP_MAX]={
|
||||||
"Forward",
|
_N("Forward"),
|
||||||
"Backward",
|
_N("Backward"),
|
||||||
"Ping pong"
|
_N("Ping pong")
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* sampleDepths[DIV_SAMPLE_DEPTH_MAX]={
|
const char* sampleDepths[DIV_SAMPLE_DEPTH_MAX]={
|
||||||
|
@ -214,25 +214,25 @@ const char* sampleDepths[DIV_SAMPLE_DEPTH_MAX]={
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* resampleStrats[]={
|
const char* resampleStrats[]={
|
||||||
"none",
|
_N("none"),
|
||||||
"linear",
|
_N("linear"),
|
||||||
"cubic spline",
|
_N("cubic spline"),
|
||||||
"blep synthesis",
|
_N("blep synthesis"),
|
||||||
"sinc",
|
_N("sinc"),
|
||||||
"best possible"
|
_N("best possible")
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* fxColorsNames[]={
|
const char* fxColorsNames[]={
|
||||||
"Invalid",
|
_N("Invalid"),
|
||||||
"Pitch",
|
_N("Pitch"),
|
||||||
"Volume",
|
_N("Volume"),
|
||||||
"Panning",
|
_N("Panning"),
|
||||||
"Song",
|
_N("Song"),
|
||||||
"Time",
|
_N("Time"),
|
||||||
"Speed",
|
_N("Speed"),
|
||||||
"System (Primary)",
|
_N("System (Primary)"),
|
||||||
"System (Secondary)",
|
_N("System (Secondary)"),
|
||||||
"Miscellaneous"
|
_N("Miscellaneous")
|
||||||
};
|
};
|
||||||
|
|
||||||
const FurnaceGUIColors fxColors[256]={
|
const FurnaceGUIColors fxColors[256]={
|
||||||
|
@ -527,274 +527,274 @@ const FurnaceGUIColors fxColors[256]={
|
||||||
|
|
||||||
// format: ("ACTION_ENUM", "Action name", defaultBind)
|
// format: ("ACTION_ENUM", "Action name", defaultBind)
|
||||||
const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
|
const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
|
||||||
D("GLOBAL_MIN", "---Global", NOT_AN_ACTION),
|
D("GLOBAL_MIN", _N("---Global"), NOT_AN_ACTION),
|
||||||
D("NEW", "New", FURKMOD_CMD|SDLK_n),
|
D("NEW", _N("New"), FURKMOD_CMD|SDLK_n),
|
||||||
D("OPEN", "Open file", FURKMOD_CMD|SDLK_o),
|
D("OPEN", _N("Open file"), FURKMOD_CMD|SDLK_o),
|
||||||
D("OPEN_BACKUP", "Restore backup", 0),
|
D("OPEN_BACKUP", _N("Restore backup"), 0),
|
||||||
D("SAVE", "Save file", FURKMOD_CMD|SDLK_s),
|
D("SAVE", _N("Save file"), FURKMOD_CMD|SDLK_s),
|
||||||
D("SAVE_AS", "Save as", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_s),
|
D("SAVE_AS", _N("Save as"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_s),
|
||||||
D("EXPORT", "Export", 0),
|
D("EXPORT", _N("Export"), 0),
|
||||||
D("UNDO", "Undo", FURKMOD_CMD|SDLK_z),
|
D("UNDO", _N("Undo"), FURKMOD_CMD|SDLK_z),
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
D("REDO", "Redo", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_z),
|
D("REDO", _N("Redo"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_z),
|
||||||
#else
|
#else
|
||||||
D("REDO", "Redo", FURKMOD_CMD|SDLK_y),
|
D("REDO", _N("Redo"), FURKMOD_CMD|SDLK_y),
|
||||||
#endif
|
#endif
|
||||||
D("QUIT", "Exit", 0),
|
D("QUIT", _N("Exit"), 0),
|
||||||
D("PLAY_TOGGLE", "Play/Stop (toggle)", SDLK_RETURN),
|
D("PLAY_TOGGLE", _N("Play/Stop (toggle)"), SDLK_RETURN),
|
||||||
D("PLAY", "Play", 0),
|
D("PLAY", _N("Play"), 0),
|
||||||
D("STOP", "Stop", 0),
|
D("STOP", _N("Stop"), 0),
|
||||||
D("PLAY_START", "Play (from beginning)", SDLK_F5),
|
D("PLAY_START", _N("Play (from beginning)"), SDLK_F5),
|
||||||
D("PLAY_REPEAT", "Play (repeat pattern)", 0),
|
D("PLAY_REPEAT", _N("Play (repeat pattern)"), 0),
|
||||||
D("PLAY_CURSOR", "Play from cursor", FURKMOD_SHIFT|SDLK_RETURN),
|
D("PLAY_CURSOR", _N("Play from cursor"), FURKMOD_SHIFT|SDLK_RETURN),
|
||||||
D("STEP_ONE", "Step row", FURKMOD_CMD|SDLK_RETURN),
|
D("STEP_ONE", _N("Step row"), FURKMOD_CMD|SDLK_RETURN),
|
||||||
D("OCTAVE_UP", "Octave up", SDLK_KP_MULTIPLY),
|
D("OCTAVE_UP", _N("Octave up"), SDLK_KP_MULTIPLY),
|
||||||
D("OCTAVE_DOWN", "Octave down", SDLK_KP_DIVIDE),
|
D("OCTAVE_DOWN", _N("Octave down"), SDLK_KP_DIVIDE),
|
||||||
D("INS_UP", "Previous instrument", FURKMOD_SHIFT|SDLK_KP_DIVIDE),
|
D("INS_UP", _N("Previous instrument"), FURKMOD_SHIFT|SDLK_KP_DIVIDE),
|
||||||
D("INS_DOWN", "Next instrument", FURKMOD_SHIFT|SDLK_KP_MULTIPLY),
|
D("INS_DOWN", _N("Next instrument"), FURKMOD_SHIFT|SDLK_KP_MULTIPLY),
|
||||||
D("STEP_UP", "Increase edit step", FURKMOD_CMD|SDLK_KP_MULTIPLY),
|
D("STEP_UP", _N("Increase edit step"), FURKMOD_CMD|SDLK_KP_MULTIPLY),
|
||||||
D("STEP_DOWN", "Decrease edit step", FURKMOD_CMD|SDLK_KP_DIVIDE),
|
D("STEP_DOWN", _N("Decrease edit step"), FURKMOD_CMD|SDLK_KP_DIVIDE),
|
||||||
D("TOGGLE_EDIT", "Toggle edit mode", SDLK_SPACE),
|
D("TOGGLE_EDIT", _N("Toggle edit mode"), SDLK_SPACE),
|
||||||
D("METRONOME", "Metronome", FURKMOD_CMD|SDLK_m),
|
D("METRONOME", _N("Metronome"), FURKMOD_CMD|SDLK_m),
|
||||||
D("REPEAT_PATTERN", "Toggle repeat pattern", 0),
|
D("REPEAT_PATTERN", _N("Toggle repeat pattern"), 0),
|
||||||
D("FOLLOW_ORDERS", "Follow orders", 0),
|
D("FOLLOW_ORDERS", _N("Follow orders"), 0),
|
||||||
D("FOLLOW_PATTERN", "Follow pattern", 0),
|
D("FOLLOW_PATTERN", _N("Follow pattern"), 0),
|
||||||
D("FULLSCREEN", "Toggle full-screen", SDLK_F11),
|
D("FULLSCREEN", _N("Toggle full-screen"), SDLK_F11),
|
||||||
D("TX81Z_REQUEST", "Request voice from TX81Z", 0),
|
D("TX81Z_REQUEST", _N("Request voice from TX81Z"), 0),
|
||||||
D("PANIC", "Panic", SDLK_F12),
|
D("PANIC", _N("Panic"), SDLK_F12),
|
||||||
D("CLEAR", "Clear song data", 0),
|
D("CLEAR", _N("Clear song data"), 0),
|
||||||
|
|
||||||
D("COMMAND_PALETTE", "Command Palette", FURKMOD_CMD|SDLK_p),
|
D("COMMAND_PALETTE", _N("Command Palette"), FURKMOD_CMD|SDLK_p),
|
||||||
D("CMDPAL_MIN", "", NOT_AN_ACTION),
|
D("CMDPAL_MIN", "", NOT_AN_ACTION),
|
||||||
D("CMDPAL_RECENT", "Recent files (Palette)", 0),
|
D("CMDPAL_RECENT", _N("Recent files (Palette)"), 0),
|
||||||
D("CMDPAL_INSTRUMENTS", "Instruments (Palette)", 0),
|
D("CMDPAL_INSTRUMENTS", _N("Instruments (Palette)"), 0),
|
||||||
D("CMDPAL_SAMPLES", "Samples (Palette)", 0),
|
D("CMDPAL_SAMPLES", _N("Samples (Palette)"), 0),
|
||||||
D("CMDPAL_INSTRUMENT_CHANGE", "Change instrument (Palette)", 0),
|
D("CMDPAL_INSTRUMENT_CHANGE", _N("Change instrument (Palette)"), 0),
|
||||||
D("CMDPAL_ADD_CHIP", "Add chip (Palette)", 0),
|
D("CMDPAL_ADD_CHIP", _N("Add chip (Palette)"), 0),
|
||||||
D("CMDPAL_MAX", "", NOT_AN_ACTION),
|
D("CMDPAL_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("WINDOW_EDIT_CONTROLS", "Edit Controls", 0),
|
D("WINDOW_EDIT_CONTROLS", _N("Edit Controls"), 0),
|
||||||
D("WINDOW_ORDERS", "Orders", 0),
|
D("WINDOW_ORDERS", _N("Orders"), 0),
|
||||||
D("WINDOW_INS_LIST", "Instrument List", 0),
|
D("WINDOW_INS_LIST", _N("Instrument List"), 0),
|
||||||
D("WINDOW_INS_EDIT", "Instrument Editor", 0),
|
D("WINDOW_INS_EDIT", _N("Instrument Editor"), 0),
|
||||||
D("WINDOW_SONG_INFO", "Song Information", 0),
|
D("WINDOW_SONG_INFO", _N("Song Information"), 0),
|
||||||
D("WINDOW_SPEED", "Speed", 0),
|
D("WINDOW_SPEED", _N("Speed"), 0),
|
||||||
D("WINDOW_PATTERN", "Pattern", 0),
|
D("WINDOW_PATTERN", _N("Pattern"), 0),
|
||||||
D("WINDOW_WAVE_LIST", "Wavetable List", 0),
|
D("WINDOW_WAVE_LIST", _N("Wavetable List"), 0),
|
||||||
D("WINDOW_WAVE_EDIT", "Wavetable Editor", 0),
|
D("WINDOW_WAVE_EDIT", _N("Wavetable Editor"), 0),
|
||||||
D("WINDOW_SAMPLE_LIST", "Sample List", 0),
|
D("WINDOW_SAMPLE_LIST", _N("Sample List"), 0),
|
||||||
D("WINDOW_SAMPLE_EDIT", "Sample Editor", 0),
|
D("WINDOW_SAMPLE_EDIT", _N("Sample Editor"), 0),
|
||||||
D("WINDOW_ABOUT", "About", 0),
|
D("WINDOW_ABOUT", _N("About"), 0),
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
D("WINDOW_SETTINGS", "Settings", FURKMOD_CMD|SDLK_COMMA),
|
D("WINDOW_SETTINGS", _N("Settings"), FURKMOD_CMD|SDLK_COMMA),
|
||||||
#else
|
#else
|
||||||
D("WINDOW_SETTINGS", "Settings", 0),
|
D("WINDOW_SETTINGS", _N("Settings"), 0),
|
||||||
#endif
|
#endif
|
||||||
D("WINDOW_MIXER", "Mixer", 0),
|
D("WINDOW_MIXER", _N("Mixer"), 0),
|
||||||
D("WINDOW_DEBUG", "Debug Menu", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_d),
|
D("WINDOW_DEBUG", _N("Debug Menu"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_d),
|
||||||
D("WINDOW_OSCILLOSCOPE", "Oscilloscope (master)", 0),
|
D("WINDOW_OSCILLOSCOPE", _N("Oscilloscope (master)"), 0),
|
||||||
D("WINDOW_VOL_METER", "Volume Meter", 0),
|
D("WINDOW_VOL_METER", _N("Volume Meter"), 0),
|
||||||
D("WINDOW_STATS", "Statistics", 0),
|
D("WINDOW_STATS", _N("Statistics"), 0),
|
||||||
D("WINDOW_COMPAT_FLAGS", "Compatibility Flags", 0),
|
D("WINDOW_COMPAT_FLAGS", _N("Compatibility Flags"), 0),
|
||||||
D("WINDOW_PIANO", "Piano", 0),
|
D("WINDOW_PIANO", _N("Piano"), 0),
|
||||||
D("WINDOW_NOTES", "Song Comments", 0),
|
D("WINDOW_NOTES", _N("Song Comments"), 0),
|
||||||
D("WINDOW_CHANNELS", "Channels", 0),
|
D("WINDOW_CHANNELS", _N("Channels"), 0),
|
||||||
D("WINDOW_PAT_MANAGER", "Pattern Manager", 0),
|
D("WINDOW_PAT_MANAGER", _N("Pattern Manager"), 0),
|
||||||
D("WINDOW_SYS_MANAGER", "Chip Manager", 0),
|
D("WINDOW_SYS_MANAGER", _N("Chip Manager"), 0),
|
||||||
D("WINDOW_REGISTER_VIEW", "Register View", 0),
|
D("WINDOW_REGISTER_VIEW", _N("Register View"), 0),
|
||||||
D("WINDOW_LOG", "Log Viewer", 0),
|
D("WINDOW_LOG", _N("Log Viewer"), 0),
|
||||||
D("WINDOW_EFFECT_LIST", "Effect List", 0),
|
D("WINDOW_EFFECT_LIST", _N("Effect List"), 0),
|
||||||
D("WINDOW_CHAN_OSC", "Oscilloscope (per-channel)", 0),
|
D("WINDOW_CHAN_OSC", _N("Oscilloscope (per-channel)"), 0),
|
||||||
D("WINDOW_SUBSONGS", "Subsongs", 0),
|
D("WINDOW_SUBSONGS", _N("Subsongs"), 0),
|
||||||
D("WINDOW_FIND", "Find/Replace", FURKMOD_CMD|SDLK_f),
|
D("WINDOW_FIND", _N("Find/Replace"), FURKMOD_CMD|SDLK_f),
|
||||||
D("WINDOW_CLOCK", "Clock", 0),
|
D("WINDOW_CLOCK", _N("Clock"), 0),
|
||||||
D("WINDOW_GROOVES", "Grooves", 0),
|
D("WINDOW_GROOVES", _N("Grooves"), 0),
|
||||||
D("WINDOW_XY_OSC", "Oscilloscope (X-Y)", 0),
|
D("WINDOW_XY_OSC", _N("Oscilloscope (X-Y)"), 0),
|
||||||
D("WINDOW_MEMORY", "Memory Composition", 0),
|
D("WINDOW_MEMORY", _N("Memory Composition"), 0),
|
||||||
D("WINDOW_CS_PLAYER", "Command Stream Player", 0),
|
D("WINDOW_CS_PLAYER", _N("Command Stream Player"), 0),
|
||||||
D("WINDOW_USER_PRESETS", "User Presets", 0),
|
D("WINDOW_USER_PRESETS", _N("User Presets"), 0),
|
||||||
|
|
||||||
D("COLLAPSE_WINDOW", "Collapse/expand current window", 0),
|
D("COLLAPSE_WINDOW", _N("Collapse/expand current window"), 0),
|
||||||
D("CLOSE_WINDOW", "Close current window", FURKMOD_SHIFT|SDLK_ESCAPE),
|
D("CLOSE_WINDOW", _N("Close current window"), FURKMOD_SHIFT|SDLK_ESCAPE),
|
||||||
D("GLOBAL_MAX", "", NOT_AN_ACTION),
|
D("GLOBAL_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("PAT_MIN", "---Pattern", NOT_AN_ACTION),
|
D("PAT_MIN", _N("---Pattern"), NOT_AN_ACTION),
|
||||||
D("PAT_NOTE_UP", "Transpose (+1)", FURKMOD_CMD|SDLK_F2),
|
D("PAT_NOTE_UP", _N("Transpose (+1)"), FURKMOD_CMD|SDLK_F2),
|
||||||
D("PAT_NOTE_DOWN", "Transpose (-1)", FURKMOD_CMD|SDLK_F1),
|
D("PAT_NOTE_DOWN", _N("Transpose (-1)"), FURKMOD_CMD|SDLK_F1),
|
||||||
D("PAT_OCTAVE_UP", "Transpose (+1 octave)", FURKMOD_CMD|SDLK_F4),
|
D("PAT_OCTAVE_UP", _N("Transpose (+1 octave)"), FURKMOD_CMD|SDLK_F4),
|
||||||
D("PAT_OCTAVE_DOWN", "Transpose (-1 octave)", FURKMOD_CMD|SDLK_F3),
|
D("PAT_OCTAVE_DOWN", _N("Transpose (-1 octave)"), FURKMOD_CMD|SDLK_F3),
|
||||||
D("PAT_VALUE_UP", "Increase values (+1)", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F2),
|
D("PAT_VALUE_UP", _N("Increase values (+1)"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F2),
|
||||||
D("PAT_VALUE_DOWN", "Increase values (-1)", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F1),
|
D("PAT_VALUE_DOWN", _N("Increase values (-1)"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F1),
|
||||||
D("PAT_VALUE_UP_COARSE", "Increase values (+16)", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F4),
|
D("PAT_VALUE_UP_COARSE", _N("Increase values (+16)"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F4),
|
||||||
D("PAT_VALUE_DOWN_COARSE", "Increase values (-16)", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F3),
|
D("PAT_VALUE_DOWN_COARSE", _N("Increase values (-16)"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_F3),
|
||||||
D("PAT_SELECT_ALL", "Select all", FURKMOD_CMD|SDLK_a),
|
D("PAT_SELECT_ALL", _N("Select all"), FURKMOD_CMD|SDLK_a),
|
||||||
D("PAT_CUT", "Cut", FURKMOD_CMD|SDLK_x),
|
D("PAT_CUT", _N("Cut"), FURKMOD_CMD|SDLK_x),
|
||||||
D("PAT_COPY", "Copy", FURKMOD_CMD|SDLK_c),
|
D("PAT_COPY", _N("Copy"), FURKMOD_CMD|SDLK_c),
|
||||||
D("PAT_PASTE", "Paste", FURKMOD_CMD|SDLK_v),
|
D("PAT_PASTE", _N("Paste"), FURKMOD_CMD|SDLK_v),
|
||||||
D("PAT_PASTE_MIX", "Paste Mix (foreground)", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_v),
|
D("PAT_PASTE_MIX", _N("Paste Mix (foreground)"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_v),
|
||||||
D("PAT_PASTE_MIX_BG", "Paste Mix (background)", 0),
|
D("PAT_PASTE_MIX_BG", _N("Paste Mix (background)"), 0),
|
||||||
D("PAT_PASTE_FLOOD", "Paste Flood", 0),
|
D("PAT_PASTE_FLOOD", _N("Paste Flood"), 0),
|
||||||
D("PAT_PASTE_OVERFLOW", "Paste Overflow", 0),
|
D("PAT_PASTE_OVERFLOW", _N("Paste Overflow"), 0),
|
||||||
D("PAT_CURSOR_UP", "Move cursor up", SDLK_UP),
|
D("PAT_CURSOR_UP", _N("Move cursor up"), SDLK_UP),
|
||||||
D("PAT_CURSOR_DOWN", "Move cursor down", SDLK_DOWN),
|
D("PAT_CURSOR_DOWN", _N("Move cursor down"), SDLK_DOWN),
|
||||||
D("PAT_CURSOR_LEFT", "Move cursor left", SDLK_LEFT),
|
D("PAT_CURSOR_LEFT", _N("Move cursor left"), SDLK_LEFT),
|
||||||
D("PAT_CURSOR_RIGHT", "Move cursor right", SDLK_RIGHT),
|
D("PAT_CURSOR_RIGHT", _N("Move cursor right"), SDLK_RIGHT),
|
||||||
D("PAT_CURSOR_UP_ONE", "Move cursor up by one (override Edit Step)", FURKMOD_SHIFT|SDLK_HOME),
|
D("PAT_CURSOR_UP_ONE", _N("Move cursor up by one (override Edit Step)"), FURKMOD_SHIFT|SDLK_HOME),
|
||||||
D("PAT_CURSOR_DOWN_ONE", "Move cursor down by one (override Edit Step)", FURKMOD_SHIFT|SDLK_END),
|
D("PAT_CURSOR_DOWN_ONE", _N("Move cursor down by one (override Edit Step)"), FURKMOD_SHIFT|SDLK_END),
|
||||||
D("PAT_CURSOR_LEFT_CHANNEL", "Move cursor to previous channel", 0),
|
D("PAT_CURSOR_LEFT_CHANNEL", _N("Move cursor to previous channel"), 0),
|
||||||
D("PAT_CURSOR_RIGHT_CHANNEL", "Move cursor to next channel", 0),
|
D("PAT_CURSOR_RIGHT_CHANNEL", _N("Move cursor to next channel"), 0),
|
||||||
D("PAT_CURSOR_NEXT_CHANNEL", "Move cursor to next channel (overflow)", 0),
|
D("PAT_CURSOR_NEXT_CHANNEL", _N("Move cursor to next channel (overflow)"), 0),
|
||||||
D("PAT_CURSOR_PREVIOUS_CHANNEL", "Move cursor to previous channel (overflow)", 0),
|
D("PAT_CURSOR_PREVIOUS_CHANNEL", _N("Move cursor to previous channel (overflow)"), 0),
|
||||||
D("PAT_CURSOR_BEGIN", "Move cursor to beginning of pattern", SDLK_HOME),
|
D("PAT_CURSOR_BEGIN", _N("Move cursor to beginning of pattern"), SDLK_HOME),
|
||||||
D("PAT_CURSOR_END", "Move cursor to end of pattern", SDLK_END),
|
D("PAT_CURSOR_END", _N("Move cursor to end of pattern"), SDLK_END),
|
||||||
D("PAT_CURSOR_UP_COARSE", "Move cursor up (coarse)", SDLK_PAGEUP),
|
D("PAT_CURSOR_UP_COARSE", _N("Move cursor up (coarse)"), SDLK_PAGEUP),
|
||||||
D("PAT_CURSOR_DOWN_COARSE", "Move cursor down (coarse)", SDLK_PAGEDOWN),
|
D("PAT_CURSOR_DOWN_COARSE", _N("Move cursor down (coarse)"), SDLK_PAGEDOWN),
|
||||||
D("PAT_SELECTION_UP", "Expand selection upwards", FURKMOD_SHIFT|SDLK_UP),
|
D("PAT_SELECTION_UP", _N("Expand selection upwards"), FURKMOD_SHIFT|SDLK_UP),
|
||||||
D("PAT_SELECTION_DOWN", "Expand selection downwards", FURKMOD_SHIFT|SDLK_DOWN),
|
D("PAT_SELECTION_DOWN", _N("Expand selection downwards"), FURKMOD_SHIFT|SDLK_DOWN),
|
||||||
D("PAT_SELECTION_LEFT", "Expand selection to the left", FURKMOD_SHIFT|SDLK_LEFT),
|
D("PAT_SELECTION_LEFT", _N("Expand selection to the left"), FURKMOD_SHIFT|SDLK_LEFT),
|
||||||
D("PAT_SELECTION_RIGHT", "Expand selection to the right", FURKMOD_SHIFT|SDLK_RIGHT),
|
D("PAT_SELECTION_RIGHT", _N("Expand selection to the right"), FURKMOD_SHIFT|SDLK_RIGHT),
|
||||||
D("PAT_SELECTION_UP_ONE", "Expand selection upwards by one (override Edit Step)", 0),
|
D("PAT_SELECTION_UP_ONE", _N("Expand selection upwards by one (override Edit Step)"), 0),
|
||||||
D("PAT_SELECTION_DOWN_ONE", "Expand selection downwards by one (override Edit Step)", 0),
|
D("PAT_SELECTION_DOWN_ONE", _N("Expand selection downwards by one (override Edit Step)"), 0),
|
||||||
D("PAT_SELECTION_BEGIN", "Expand selection to beginning of pattern", 0),
|
D("PAT_SELECTION_BEGIN", _N("Expand selection to beginning of pattern"), 0),
|
||||||
D("PAT_SELECTION_END", "Expand selection to end of pattern", 0),
|
D("PAT_SELECTION_END", _N("Expand selection to end of pattern"), 0),
|
||||||
D("PAT_SELECTION_UP_COARSE", "Expand selection upwards (coarse)", FURKMOD_SHIFT|SDLK_PAGEUP),
|
D("PAT_SELECTION_UP_COARSE", _N("Expand selection upwards (coarse)"), FURKMOD_SHIFT|SDLK_PAGEUP),
|
||||||
D("PAT_SELECTION_DOWN_COARSE", "Expand selection downwards (coarse)", FURKMOD_SHIFT|SDLK_PAGEDOWN),
|
D("PAT_SELECTION_DOWN_COARSE", _N("Expand selection downwards (coarse)"), FURKMOD_SHIFT|SDLK_PAGEDOWN),
|
||||||
D("PAT_MOVE_UP", "Move selection up", FURKMOD_ALT|SDLK_UP),
|
D("PAT_MOVE_UP", _N("Move selection up"), FURKMOD_ALT|SDLK_UP),
|
||||||
D("PAT_MOVE_DOWN", "Move selection down", FURKMOD_ALT|SDLK_DOWN),
|
D("PAT_MOVE_DOWN", _N("Move selection down"), FURKMOD_ALT|SDLK_DOWN),
|
||||||
D("PAT_MOVE_LEFT_CHANNEL", "Move selection to previous channel", FURKMOD_ALT|SDLK_LEFT),
|
D("PAT_MOVE_LEFT_CHANNEL", _N("Move selection to previous channel"), FURKMOD_ALT|SDLK_LEFT),
|
||||||
D("PAT_MOVE_RIGHT_CHANNEL", "Move selection to next channel", FURKMOD_ALT|SDLK_RIGHT),
|
D("PAT_MOVE_RIGHT_CHANNEL", _N("Move selection to next channel"), FURKMOD_ALT|SDLK_RIGHT),
|
||||||
D("PAT_DELETE", "Delete", SDLK_DELETE),
|
D("PAT_DELETE", _N("Delete"), SDLK_DELETE),
|
||||||
D("PAT_PULL_DELETE", "Pull delete", SDLK_BACKSPACE),
|
D("PAT_PULL_DELETE", _N("Pull delete"), SDLK_BACKSPACE),
|
||||||
D("PAT_INSERT", "Insert", SDLK_INSERT),
|
D("PAT_INSERT", _N("Insert"), SDLK_INSERT),
|
||||||
D("PAT_MUTE_CURSOR", "Mute channel at cursor", FURKMOD_ALT|SDLK_F9),
|
D("PAT_MUTE_CURSOR", _N("Mute channel at cursor"), FURKMOD_ALT|SDLK_F9),
|
||||||
D("PAT_SOLO_CURSOR", "Solo channel at cursor", FURKMOD_ALT|SDLK_F10),
|
D("PAT_SOLO_CURSOR", _N("Solo channel at cursor"), FURKMOD_ALT|SDLK_F10),
|
||||||
D("PAT_UNMUTE_ALL", "Unmute all channels", FURKMOD_ALT|FURKMOD_SHIFT|SDLK_F9),
|
D("PAT_UNMUTE_ALL", _N("Unmute all channels"), FURKMOD_ALT|FURKMOD_SHIFT|SDLK_F9),
|
||||||
D("PAT_NEXT_ORDER", "Go to next order", 0),
|
D("PAT_NEXT_ORDER", _N("Go to next order"), 0),
|
||||||
D("PAT_PREV_ORDER", "Go to previous order", 0),
|
D("PAT_PREV_ORDER", _N("Go to previous order"), 0),
|
||||||
D("PAT_COLLAPSE", "Collapse channel at cursor", 0),
|
D("PAT_COLLAPSE", _N("Collapse channel at cursor"), 0),
|
||||||
D("PAT_INCREASE_COLUMNS", "Increase effect columns", 0),
|
D("PAT_INCREASE_COLUMNS", _N("Increase effect columns"), 0),
|
||||||
D("PAT_DECREASE_COLUMNS", "Decrease effect columns", 0),
|
D("PAT_DECREASE_COLUMNS", _N("Decrease effect columns"), 0),
|
||||||
D("PAT_INTERPOLATE", "Interpolate", 0),
|
D("PAT_INTERPOLATE", _N("Interpolate"), 0),
|
||||||
D("PAT_FADE", "Fade", 0),
|
D("PAT_FADE", _N("Fade"), 0),
|
||||||
D("PAT_INVERT_VALUES", "Invert values", 0),
|
D("PAT_INVERT_VALUES", _N("Invert values"), 0),
|
||||||
D("PAT_FLIP_SELECTION", "Flip selection", 0),
|
D("PAT_FLIP_SELECTION", _N("Flip selection"), 0),
|
||||||
D("PAT_COLLAPSE_ROWS", "Collapse rows", 0),
|
D("PAT_COLLAPSE_ROWS", _N("Collapse rows"), 0),
|
||||||
D("PAT_EXPAND_ROWS", "Expand rows", 0),
|
D("PAT_EXPAND_ROWS", _N("Expand rows"), 0),
|
||||||
D("PAT_COLLAPSE_PAT", "Collapse pattern", 0),
|
D("PAT_COLLAPSE_PAT", _N("Collapse pattern"), 0),
|
||||||
D("PAT_EXPAND_PAT", "Expand pattern", 0),
|
D("PAT_EXPAND_PAT", _N("Expand pattern"), 0),
|
||||||
D("PAT_COLLAPSE_SONG", "Collapse song", 0),
|
D("PAT_COLLAPSE_SONG", _N("Collapse song"), 0),
|
||||||
D("PAT_EXPAND_SONG", "Expand song", 0),
|
D("PAT_EXPAND_SONG", _N("Expand song"), 0),
|
||||||
D("PAT_LATCH", "Set note input latch", 0),
|
D("PAT_LATCH", _N("Set note input latch"), 0),
|
||||||
D("PAT_SCROLL_MODE", "Change mobile scroll mode", 0),
|
D("PAT_SCROLL_MODE", _N("Change mobile scroll mode"), 0),
|
||||||
D("PAT_CLEAR_LATCH", "Clear note input latch", 0),
|
D("PAT_CLEAR_LATCH", _N("Clear note input latch"), 0),
|
||||||
D("PAT_MAX", "", NOT_AN_ACTION),
|
D("PAT_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("INS_LIST_MIN", "---Instrument list", NOT_AN_ACTION),
|
D("INS_LIST_MIN", _N("---Instrument list"), NOT_AN_ACTION),
|
||||||
D("INS_LIST_ADD", "Add instrument", SDLK_INSERT),
|
D("INS_LIST_ADD", _N("Add instrument"), SDLK_INSERT),
|
||||||
D("INS_LIST_DUPLICATE", "Duplicate instrument", FURKMOD_CMD|SDLK_d),
|
D("INS_LIST_DUPLICATE", _N("Duplicate instrument"), FURKMOD_CMD|SDLK_d),
|
||||||
D("INS_LIST_OPEN", "Open instrument", 0),
|
D("INS_LIST_OPEN", _N("Open instrument"), 0),
|
||||||
D("INS_LIST_OPEN_REPLACE", "Open instrument (replace current)", 0),
|
D("INS_LIST_OPEN_REPLACE", _N("Open instrument (replace current)"), 0),
|
||||||
D("INS_LIST_SAVE", "Save instrument", 0),
|
D("INS_LIST_SAVE", _N("Save instrument"), 0),
|
||||||
D("INS_LIST_SAVE_DMP", "Save instrument (.dmp)", 0),
|
D("INS_LIST_SAVE_DMP", _N("Save instrument (.dmp)"), 0),
|
||||||
D("INS_LIST_MOVE_UP", "Move instrument up in list", FURKMOD_SHIFT|SDLK_UP),
|
D("INS_LIST_MOVE_UP", _N("Move instrument up in list"), FURKMOD_SHIFT|SDLK_UP),
|
||||||
D("INS_LIST_MOVE_DOWN", "Move instrument down in list", FURKMOD_SHIFT|SDLK_DOWN),
|
D("INS_LIST_MOVE_DOWN", _N("Move instrument down in list"), FURKMOD_SHIFT|SDLK_DOWN),
|
||||||
D("INS_LIST_DELETE", "Delete instrument", 0),
|
D("INS_LIST_DELETE", _N("Delete instrument"), 0),
|
||||||
D("INS_LIST_EDIT", "Edit instrument", FURKMOD_SHIFT|SDLK_RETURN),
|
D("INS_LIST_EDIT", _N("Edit instrument"), FURKMOD_SHIFT|SDLK_RETURN),
|
||||||
D("INS_LIST_UP", "Instrument cursor up", SDLK_UP),
|
D("INS_LIST_UP", _N("Instrument cursor up"), SDLK_UP),
|
||||||
D("INS_LIST_DOWN", "Instrument cursor down", SDLK_DOWN),
|
D("INS_LIST_DOWN", _N("Instrument cursor down"), SDLK_DOWN),
|
||||||
D("INS_LIST_DIR_VIEW", "Instruments: toggle folders/standard view", FURKMOD_CMD|SDLK_v),
|
D("INS_LIST_DIR_VIEW", _N("Instruments: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
D("INS_LIST_MAX", "", NOT_AN_ACTION),
|
D("INS_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("WAVE_LIST_MIN", "---Wavetable list", NOT_AN_ACTION),
|
D("WAVE_LIST_MIN", _N("---Wavetable list"), NOT_AN_ACTION),
|
||||||
D("WAVE_LIST_ADD", "Add wavetable", SDLK_INSERT),
|
D("WAVE_LIST_ADD", _N("Add wavetable"), SDLK_INSERT),
|
||||||
D("WAVE_LIST_DUPLICATE", "Duplicate wavetable", FURKMOD_CMD|SDLK_d),
|
D("WAVE_LIST_DUPLICATE", _N("Duplicate wavetable"), FURKMOD_CMD|SDLK_d),
|
||||||
D("WAVE_LIST_OPEN", "Open wavetable", 0),
|
D("WAVE_LIST_OPEN", _N("Open wavetable"), 0),
|
||||||
D("WAVE_LIST_OPEN_REPLACE", "Open wavetable (replace current)", 0),
|
D("WAVE_LIST_OPEN_REPLACE", _N("Open wavetable (replace current)"), 0),
|
||||||
D("WAVE_LIST_SAVE", "Save wavetable", 0),
|
D("WAVE_LIST_SAVE", _N("Save wavetable"), 0),
|
||||||
D("WAVE_LIST_SAVE_DMW", "Save wavetable (.dmw)", 0),
|
D("WAVE_LIST_SAVE_DMW", _N("Save wavetable (.dmw)"), 0),
|
||||||
D("WAVE_LIST_SAVE_RAW", "Save wavetable (raw)", 0),
|
D("WAVE_LIST_SAVE_RAW", _N("Save wavetable (raw)"), 0),
|
||||||
D("WAVE_LIST_MOVE_UP", "Move wavetable up in list", FURKMOD_SHIFT|SDLK_UP),
|
D("WAVE_LIST_MOVE_UP", _N("Move wavetable up in list"), FURKMOD_SHIFT|SDLK_UP),
|
||||||
D("WAVE_LIST_MOVE_DOWN", "Move wavetable down in list", FURKMOD_SHIFT|SDLK_DOWN),
|
D("WAVE_LIST_MOVE_DOWN", _N("Move wavetable down in list"), FURKMOD_SHIFT|SDLK_DOWN),
|
||||||
D("WAVE_LIST_DELETE", "Delete wavetable", 0),
|
D("WAVE_LIST_DELETE", _N("Delete wavetable"), 0),
|
||||||
D("WAVE_LIST_EDIT", "Edit wavetable", FURKMOD_SHIFT|SDLK_RETURN),
|
D("WAVE_LIST_EDIT", _N("Edit wavetable"), FURKMOD_SHIFT|SDLK_RETURN),
|
||||||
D("WAVE_LIST_UP", "Wavetable cursor up", SDLK_UP),
|
D("WAVE_LIST_UP", _N("Wavetable cursor up"), SDLK_UP),
|
||||||
D("WAVE_LIST_DOWN", "Wavetable cursor down", SDLK_DOWN),
|
D("WAVE_LIST_DOWN", _N("Wavetable cursor down"), SDLK_DOWN),
|
||||||
D("WAVE_LIST_DIR_VIEW", "Wavetables: toggle folders/standard view", FURKMOD_CMD|SDLK_v),
|
D("WAVE_LIST_DIR_VIEW", _N("Wavetables: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
D("WAVE_LIST_MAX", "", NOT_AN_ACTION),
|
D("WAVE_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("SAMPLE_LIST_MIN", "---Sample list", NOT_AN_ACTION),
|
D("SAMPLE_LIST_MIN", _N("---Sample list"), NOT_AN_ACTION),
|
||||||
D("SAMPLE_LIST_ADD", "Add sample", SDLK_INSERT),
|
D("SAMPLE_LIST_ADD", _N("Add sample"), SDLK_INSERT),
|
||||||
D("SAMPLE_LIST_DUPLICATE", "Duplicate sample", FURKMOD_CMD|SDLK_d),
|
D("SAMPLE_LIST_DUPLICATE", _N("Duplicate sample"), FURKMOD_CMD|SDLK_d),
|
||||||
D("SAMPLE_LIST_OPEN", "Open sample", 0),
|
D("SAMPLE_LIST_OPEN", _N("Open sample"), 0),
|
||||||
D("SAMPLE_LIST_OPEN_REPLACE", "Open sample (replace current)", 0),
|
D("SAMPLE_LIST_OPEN_REPLACE", _N("Open sample (replace current)"), 0),
|
||||||
D("SAMPLE_LIST_OPEN_RAW", "Import raw sample data", 0),
|
D("SAMPLE_LIST_OPEN_RAW", _N("Import raw sample data"), 0),
|
||||||
D("SAMPLE_LIST_OPEN_REPLACE_RAW", "Import raw sample data (replace current)", 0),
|
D("SAMPLE_LIST_OPEN_REPLACE_RAW", _N("Import raw sample data (replace current)"), 0),
|
||||||
D("SAMPLE_LIST_SAVE", "Save sample", 0),
|
D("SAMPLE_LIST_SAVE", _N("Save sample"), 0),
|
||||||
D("SAMPLE_LIST_SAVE_RAW", "Save sample (raw)", 0),
|
D("SAMPLE_LIST_SAVE_RAW", _N("Save sample (raw)"), 0),
|
||||||
D("SAMPLE_LIST_MOVE_UP", "Move sample up in list", FURKMOD_SHIFT|SDLK_UP),
|
D("SAMPLE_LIST_MOVE_UP", _N("Move sample up in list"), FURKMOD_SHIFT|SDLK_UP),
|
||||||
D("SAMPLE_LIST_MOVE_DOWN", "Move sample down in list", FURKMOD_SHIFT|SDLK_DOWN),
|
D("SAMPLE_LIST_MOVE_DOWN", _N("Move sample down in list"), FURKMOD_SHIFT|SDLK_DOWN),
|
||||||
D("SAMPLE_LIST_DELETE", "Delete sample", 0),
|
D("SAMPLE_LIST_DELETE", _N("Delete sample"), 0),
|
||||||
D("SAMPLE_LIST_EDIT", "Edit sample", FURKMOD_SHIFT|SDLK_RETURN),
|
D("SAMPLE_LIST_EDIT", _N("Edit sample"), FURKMOD_SHIFT|SDLK_RETURN),
|
||||||
D("SAMPLE_LIST_UP", "Sample cursor up", SDLK_UP),
|
D("SAMPLE_LIST_UP", _N("Sample cursor up"), SDLK_UP),
|
||||||
D("SAMPLE_LIST_DOWN", "Sample cursor down", SDLK_DOWN),
|
D("SAMPLE_LIST_DOWN", _N("Sample cursor down"), SDLK_DOWN),
|
||||||
D("SAMPLE_LIST_PREVIEW", "Sample preview", 0),
|
D("SAMPLE_LIST_PREVIEW", _N("Sample preview"), 0),
|
||||||
D("SAMPLE_LIST_STOP_PREVIEW", "Stop sample preview", 0),
|
D("SAMPLE_LIST_STOP_PREVIEW", _N("Stop sample preview"), 0),
|
||||||
D("SAMPLE_LIST_DIR_VIEW", "Samples: Toggle folders/standard view", FURKMOD_CMD|SDLK_v),
|
D("SAMPLE_LIST_DIR_VIEW", _N("Samples: Toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
D("SAMPLE_LIST_MAKE_MAP", "Samples: Make me a drum kit", 0),
|
D("SAMPLE_LIST_MAKE_MAP", _N("Samples: Make me a drum kit"), 0),
|
||||||
D("SAMPLE_LIST_MAX", "", NOT_AN_ACTION),
|
D("SAMPLE_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("SAMPLE_MIN", "---Sample editor", NOT_AN_ACTION),
|
D("SAMPLE_MIN", _N("---Sample editor"), NOT_AN_ACTION),
|
||||||
D("SAMPLE_SELECT", "Sample editor mode: Select", FURKMOD_SHIFT|SDLK_i),
|
D("SAMPLE_SELECT", _N("Sample editor mode: Select"), FURKMOD_SHIFT|SDLK_i),
|
||||||
D("SAMPLE_DRAW", "Sample editor mode: Draw", FURKMOD_SHIFT|SDLK_d),
|
D("SAMPLE_DRAW", _N("Sample editor mode: Draw"), FURKMOD_SHIFT|SDLK_d),
|
||||||
D("SAMPLE_CUT", "Sample editor: Cut", FURKMOD_CMD|SDLK_x),
|
D("SAMPLE_CUT", _N("Sample editor: Cut"), FURKMOD_CMD|SDLK_x),
|
||||||
D("SAMPLE_COPY", "Sample editor: Copy", FURKMOD_CMD|SDLK_c),
|
D("SAMPLE_COPY", _N("Sample editor: Copy"), FURKMOD_CMD|SDLK_c),
|
||||||
D("SAMPLE_PASTE", "Sample editor: Paste", FURKMOD_CMD|SDLK_v),
|
D("SAMPLE_PASTE", _N("Sample editor: Paste"), FURKMOD_CMD|SDLK_v),
|
||||||
D("SAMPLE_PASTE_REPLACE", "Sample editor: Paste replace", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_v),
|
D("SAMPLE_PASTE_REPLACE", _N("Sample editor: Paste replace"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_v),
|
||||||
D("SAMPLE_PASTE_MIX", "Sample editor: Paste mix", FURKMOD_CMD|FURKMOD_ALT|SDLK_v),
|
D("SAMPLE_PASTE_MIX", _N("Sample editor: Paste mix"), FURKMOD_CMD|FURKMOD_ALT|SDLK_v),
|
||||||
D("SAMPLE_SELECT_ALL", "Sample editor: Select all", FURKMOD_CMD|SDLK_a),
|
D("SAMPLE_SELECT_ALL", _N("Sample editor: Select all"), FURKMOD_CMD|SDLK_a),
|
||||||
D("SAMPLE_RESIZE", "Sample editor: Resize", FURKMOD_CMD|SDLK_r),
|
D("SAMPLE_RESIZE", _N("Sample editor: Resize"), FURKMOD_CMD|SDLK_r),
|
||||||
D("SAMPLE_RESAMPLE", "Sample editor: Resample", FURKMOD_CMD|SDLK_e),
|
D("SAMPLE_RESAMPLE", _N("Sample editor: Resample"), FURKMOD_CMD|SDLK_e),
|
||||||
D("SAMPLE_AMPLIFY", "Sample editor: Amplify", FURKMOD_CMD|SDLK_b),
|
D("SAMPLE_AMPLIFY", _N("Sample editor: Amplify"), FURKMOD_CMD|SDLK_b),
|
||||||
D("SAMPLE_NORMALIZE", "Sample editor: Normalize", FURKMOD_CMD|SDLK_n),
|
D("SAMPLE_NORMALIZE", _N("Sample editor: Normalize"), FURKMOD_CMD|SDLK_n),
|
||||||
D("SAMPLE_FADE_IN", "Sample editor: Fade in", FURKMOD_CMD|SDLK_i),
|
D("SAMPLE_FADE_IN", _N("Sample editor: Fade in"), FURKMOD_CMD|SDLK_i),
|
||||||
D("SAMPLE_FADE_OUT", "Sample editor: Fade out", FURKMOD_CMD|SDLK_o),
|
D("SAMPLE_FADE_OUT", _N("Sample editor: Fade out"), FURKMOD_CMD|SDLK_o),
|
||||||
D("SAMPLE_SILENCE", "Sample editor: Apply silence", FURKMOD_SHIFT|SDLK_DELETE),
|
D("SAMPLE_SILENCE", _N("Sample editor: Apply silence"), FURKMOD_SHIFT|SDLK_DELETE),
|
||||||
D("SAMPLE_INSERT", "Sample editor: Insert silence", SDLK_INSERT),
|
D("SAMPLE_INSERT", _N("Sample editor: Insert silence"), SDLK_INSERT),
|
||||||
D("SAMPLE_DELETE", "Sample editor: Delete", SDLK_DELETE),
|
D("SAMPLE_DELETE", _N("Sample editor: Delete"), SDLK_DELETE),
|
||||||
D("SAMPLE_TRIM", "Sample editor: Trim", FURKMOD_CMD|SDLK_DELETE),
|
D("SAMPLE_TRIM", _N("Sample editor: Trim"), FURKMOD_CMD|SDLK_DELETE),
|
||||||
D("SAMPLE_REVERSE", "Sample editor: Reverse", FURKMOD_CMD|SDLK_t),
|
D("SAMPLE_REVERSE", _N("Sample editor: Reverse"), FURKMOD_CMD|SDLK_t),
|
||||||
D("SAMPLE_INVERT", "Sample editor: Invert", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_t),
|
D("SAMPLE_INVERT", _N("Sample editor: Invert"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_t),
|
||||||
D("SAMPLE_SIGN", "Sample editor: Signed/unsigned exchange", FURKMOD_CMD|SDLK_u),
|
D("SAMPLE_SIGN", _N("Sample editor: Signed/unsigned exchange"), FURKMOD_CMD|SDLK_u),
|
||||||
D("SAMPLE_FILTER", "Sample editor: Apply filter", FURKMOD_CMD|SDLK_f),
|
D("SAMPLE_FILTER", _N("Sample editor: Apply filter"), FURKMOD_CMD|SDLK_f),
|
||||||
D("SAMPLE_CROSSFADE_LOOP", "Sample editor: Crossfade loop points", NOT_AN_ACTION),
|
D("SAMPLE_CROSSFADE_LOOP", _N("Sample editor: Crossfade loop points"), NOT_AN_ACTION),
|
||||||
D("SAMPLE_PREVIEW", "Sample editor: Preview sample", 0),
|
D("SAMPLE_PREVIEW", _N("Sample editor: Preview sample"), 0),
|
||||||
D("SAMPLE_STOP_PREVIEW", "Sample editor: Stop sample preview", 0),
|
D("SAMPLE_STOP_PREVIEW", _N("Sample editor: Stop sample preview"), 0),
|
||||||
D("SAMPLE_ZOOM_IN", "Sample editor: Zoom in", FURKMOD_CMD|SDLK_EQUALS),
|
D("SAMPLE_ZOOM_IN", _N("Sample editor: Zoom in"), FURKMOD_CMD|SDLK_EQUALS),
|
||||||
D("SAMPLE_ZOOM_OUT", "Sample editor: Zoom out", FURKMOD_CMD|SDLK_MINUS),
|
D("SAMPLE_ZOOM_OUT", _N("Sample editor: Zoom out"), FURKMOD_CMD|SDLK_MINUS),
|
||||||
D("SAMPLE_ZOOM_AUTO", "Sample editor: Toggle auto-zoom", FURKMOD_CMD|SDLK_0),
|
D("SAMPLE_ZOOM_AUTO", _N("Sample editor: Toggle auto-zoom"), FURKMOD_CMD|SDLK_0),
|
||||||
D("SAMPLE_MAKE_INS", "Sample editor: Create instrument from sample", 0),
|
D("SAMPLE_MAKE_INS", _N("Sample editor: Create instrument from sample"), 0),
|
||||||
D("SAMPLE_SET_LOOP", "Sample editor: Set loop to selection", FURKMOD_CMD|SDLK_l),
|
D("SAMPLE_SET_LOOP", _N("Sample editor: Set loop to selection"), FURKMOD_CMD|SDLK_l),
|
||||||
D("SAMPLE_CREATE_WAVE", "Sample editor: Create wavetable from selection", FURKMOD_CMD|SDLK_w),
|
D("SAMPLE_CREATE_WAVE", _N("Sample editor: Create wavetable from selection"), FURKMOD_CMD|SDLK_w),
|
||||||
D("SAMPLE_MAX", "", NOT_AN_ACTION),
|
D("SAMPLE_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("ORDERS_MIN", "---Orders", NOT_AN_ACTION),
|
D("ORDERS_MIN", _N("---Orders"), NOT_AN_ACTION),
|
||||||
D("ORDERS_UP", "Previous order", SDLK_UP),
|
D("ORDERS_UP", _N("Previous order"), SDLK_UP),
|
||||||
D("ORDERS_DOWN", "Next order", SDLK_DOWN),
|
D("ORDERS_DOWN", _N("Next order"), SDLK_DOWN),
|
||||||
D("ORDERS_LEFT", "Order cursor left", SDLK_LEFT),
|
D("ORDERS_LEFT", _N("Order cursor left"), SDLK_LEFT),
|
||||||
D("ORDERS_RIGHT", "Order cursor right", SDLK_RIGHT),
|
D("ORDERS_RIGHT", _N("Order cursor right"), SDLK_RIGHT),
|
||||||
D("ORDERS_INCREASE", "Increase order value", 0),
|
D("ORDERS_INCREASE", _N("Increase order value"), 0),
|
||||||
D("ORDERS_DECREASE", "Decrease order value", 0),
|
D("ORDERS_DECREASE", _N("Decrease order value"), 0),
|
||||||
D("ORDERS_EDIT_MODE", "Switch order edit mode", 0),
|
D("ORDERS_EDIT_MODE", _N("Switch order edit mode"), 0),
|
||||||
D("ORDERS_LINK", "Order: toggle alter entire row", FURKMOD_CMD|SDLK_l),
|
D("ORDERS_LINK", _N("Order: toggle alter entire row"), FURKMOD_CMD|SDLK_l),
|
||||||
D("ORDERS_ADD", "Add order", SDLK_INSERT),
|
D("ORDERS_ADD", _N("Add order"), SDLK_INSERT),
|
||||||
D("ORDERS_DUPLICATE", "Duplicate order", FURKMOD_CMD|SDLK_d),
|
D("ORDERS_DUPLICATE", _N("Duplicate order"), FURKMOD_CMD|SDLK_d),
|
||||||
D("ORDERS_DEEP_CLONE", "Deep clone order", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_d),
|
D("ORDERS_DEEP_CLONE", _N("Deep clone order"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_d),
|
||||||
D("ORDERS_DUPLICATE_END", "Copy current order to end of song", FURKMOD_CMD|SDLK_e),
|
D("ORDERS_DUPLICATE_END", _N("Copy current order to end of song"), FURKMOD_CMD|SDLK_e),
|
||||||
D("ORDERS_DEEP_CLONE_END", "Deep clone current order to end of song", FURKMOD_CMD|FURKMOD_SHIFT|SDLK_e),
|
D("ORDERS_DEEP_CLONE_END", _N("Deep clone current order to end of song"), FURKMOD_CMD|FURKMOD_SHIFT|SDLK_e),
|
||||||
D("ORDERS_REMOVE", "Remove order", SDLK_DELETE),
|
D("ORDERS_REMOVE", _N("Remove order"), SDLK_DELETE),
|
||||||
D("ORDERS_MOVE_UP", "Move order up", FURKMOD_SHIFT|SDLK_UP),
|
D("ORDERS_MOVE_UP", _N("Move order up"), FURKMOD_SHIFT|SDLK_UP),
|
||||||
D("ORDERS_MOVE_DOWN", "Move order down", FURKMOD_SHIFT|SDLK_DOWN),
|
D("ORDERS_MOVE_DOWN", _N("Move order down"), FURKMOD_SHIFT|SDLK_DOWN),
|
||||||
D("ORDERS_REPLAY", "Replay order", 0),
|
D("ORDERS_REPLAY", _N("Replay order"), 0),
|
||||||
D("ORDERS_MAX", "", NOT_AN_ACTION),
|
D("ORDERS_MAX", "", NOT_AN_ACTION),
|
||||||
};
|
};
|
||||||
#undef D
|
#undef D
|
||||||
|
@ -1389,11 +1389,11 @@ const int* chipCategories[]={
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* chipCategoryNames[]={
|
const char* chipCategoryNames[]={
|
||||||
"All chips",
|
_N("All chips"),
|
||||||
"FM",
|
_N("FM"),
|
||||||
"Square",
|
_N("Square"),
|
||||||
"Wavetable",
|
_N("Wavetable"),
|
||||||
"Special",
|
_N("Special"),
|
||||||
"Sample",
|
_N("Sample"),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
1935
src/gui/insEdit.cpp
1935
src/gui/insEdit.cpp
File diff suppressed because it is too large
Load diff
|
@ -86,7 +86,7 @@ void FurnaceGUI::endIntroTune() {
|
||||||
e->createNewFromDefaults();
|
e->createNewFromDefaults();
|
||||||
} else { // load pending song
|
} else { // load pending song
|
||||||
if (load(curFileName)>0) {
|
if (load(curFileName)>0) {
|
||||||
showError(fmt::sprintf("Error while loading file! (%s)",lastError));
|
showError(fmt::sprintf(_("Error while loading file! (%s)"),lastError));
|
||||||
curFileName="";
|
curFileName="";
|
||||||
e->createNewFromDefaults();
|
e->createNewFromDefaults();
|
||||||
}
|
}
|
||||||
|
@ -119,9 +119,9 @@ void FurnaceGUI::drawIntro(double introTime, bool monitor) {
|
||||||
ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH));
|
||||||
if (introPos<0.1) ImGui::SetNextWindowFocus();
|
if (introPos<0.1) ImGui::SetNextWindowFocus();
|
||||||
}
|
}
|
||||||
if (ImGui::Begin(monitor?"IntroMon X":"Intro",NULL,monitor?globalWinFlags:(ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoBackground))) {
|
if (ImGui::Begin(monitor?"IntroMon X":"Intro",NULL,monitor?globalWinFlags:(ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoBackground),monitor?_("IntroMon X"):_("Intro"))) {
|
||||||
if (monitor) {
|
if (monitor) {
|
||||||
if (ImGui::Button("Preview")) {
|
if (ImGui::Button(_("Preview"))) {
|
||||||
introPos=0;
|
introPos=0;
|
||||||
tutorial.introPlayed=false;
|
tutorial.introPlayed=false;
|
||||||
shortIntro=false;
|
shortIntro=false;
|
||||||
|
@ -173,9 +173,9 @@ void FurnaceGUI::drawIntro(double introTime, bool monitor) {
|
||||||
|
|
||||||
if (monitor) {
|
if (monitor) {
|
||||||
ImVec2 textPos=ImLerp(top,bottom,ImVec2(0.5,0.5));
|
ImVec2 textPos=ImLerp(top,bottom,ImVec2(0.5,0.5));
|
||||||
textPos.x-=ImGui::CalcTextSize("SORRY NOTHING").x*0.5;
|
textPos.x-=ImGui::CalcTextSize(_("SORRY NOTHING")).x*0.5;
|
||||||
textPos.y-=ImGui::CalcTextSize("SORRY NOTHING").y*0.5;
|
textPos.y-=ImGui::CalcTextSize(_("SORRY NOTHING")).y*0.5;
|
||||||
dl->AddText(textPos,ImGui::GetColorU32(uiColors[GUI_COLOR_TEXT]),"SORRY NOTHING");
|
dl->AddText(textPos,ImGui::GetColorU32(uiColors[GUI_COLOR_TEXT]),_("SORRY NOTHING"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (introSkip<0.5 || monitor) {
|
if (introSkip<0.5 || monitor) {
|
||||||
|
@ -307,7 +307,7 @@ void FurnaceGUI::drawIntro(double introTime, bool monitor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
dl->AddRectFilled(top,bottom,ImGui::GetColorU32(ImVec4(0.0,0.0,0.0,CLAMP(introSkip*2.0,0.0,1.0)-CLAMP((introSkip-0.5)*4,0.0,1.0))));
|
dl->AddRectFilled(top,bottom,ImGui::GetColorU32(ImVec4(0.0,0.0,0.0,CLAMP(introSkip*2.0,0.0,1.0)-CLAMP((introSkip-0.5)*4,0.0,1.0))));
|
||||||
if (introSkip<0.5) dl->AddText(ImVec2(8.0*dpiScale,8.0*dpiScale),ImGui::GetColorU32(ImVec4(1.0,1.0,1.0,CLAMP(introSkip*8.0,0.0,1.0))),"hold to skip");
|
if (introSkip<0.5) dl->AddText(ImVec2(8.0*dpiScale,8.0*dpiScale),ImGui::GetColorU32(ImVec4(1.0,1.0,1.0,CLAMP(introSkip*8.0,0.0,1.0))),_("hold to skip"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
const char* logLevels[5]={
|
const char* logLevels[5]={
|
||||||
"ERROR",
|
_N("ERROR"),
|
||||||
"warning",
|
_N("warning"),
|
||||||
"info",
|
_N("info"),
|
||||||
"debug",
|
_N("debug"),
|
||||||
"trace"
|
_N("trace")
|
||||||
};
|
};
|
||||||
|
|
||||||
FurnaceGUIColors logColors[5]={
|
FurnaceGUIColors logColors[5]={
|
||||||
|
@ -44,13 +44,13 @@ void FurnaceGUI::drawLog() {
|
||||||
nextWindow=GUI_WINDOW_NOTHING;
|
nextWindow=GUI_WINDOW_NOTHING;
|
||||||
}
|
}
|
||||||
if (!logOpen) return;
|
if (!logOpen) return;
|
||||||
if (ImGui::Begin("Log Viewer",&logOpen,globalWinFlags)) {
|
if (ImGui::Begin("Log Viewer",&logOpen,globalWinFlags,_("Log Viewer"))) {
|
||||||
ImGui::Checkbox("Follow",&followLog);
|
ImGui::Checkbox(_("Follow"),&followLog);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Level");
|
ImGui::Text(_("Level"));
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
ImGui::Combo("##LogLevel",&logLevel,logLevels,5);
|
ImGui::Combo("##LogLevel",&logLevel,LocalizedComboGetter,logLevels,5);
|
||||||
if (ImGui::BeginTable("LogView",3,ImGuiTableFlags_ScrollY|ImGuiTableFlags_BordersInnerV)) {
|
if (ImGui::BeginTable("LogView",3,ImGuiTableFlags_ScrollY|ImGuiTableFlags_BordersInnerV)) {
|
||||||
ImGui::PushFont(patFont);
|
ImGui::PushFont(patFont);
|
||||||
|
|
||||||
|
@ -65,11 +65,11 @@ void FurnaceGUI::drawLog() {
|
||||||
|
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TextUnformatted("time");
|
ImGui::TextUnformatted(_("time"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TextUnformatted("level");
|
ImGui::TextUnformatted(_("level"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TextUnformatted("message");
|
ImGui::TextUnformatted(_("message"));
|
||||||
|
|
||||||
int pos=logPosition;
|
int pos=logPosition;
|
||||||
for (int i=0; i<TA_LOG_SIZE; i++) {
|
for (int i=0; i<TA_LOG_SIZE; i++) {
|
||||||
|
@ -80,7 +80,7 @@ void FurnaceGUI::drawLog() {
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("%02d:%02d:%02d",logEntry.time.tm_hour,logEntry.time.tm_min,logEntry.time.tm_sec);
|
ImGui::Text("%02d:%02d:%02d",logEntry.time.tm_hour,logEntry.time.tm_min,logEntry.time.tm_sec);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TextColored(uiColors[logColors[logEntry.loglevel]],"%s",logLevels[logEntry.loglevel]);
|
ImGui::TextColored(uiColors[logColors[logEntry.loglevel]],"%s",_(logLevels[logEntry.loglevel]));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::TextWrapped("%s",logEntry.text.c_str());
|
ImGui::TextWrapped("%s",logEntry.text.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ void FurnaceGUI::drawMemory() {
|
||||||
nextWindow=GUI_WINDOW_NOTHING;
|
nextWindow=GUI_WINDOW_NOTHING;
|
||||||
}
|
}
|
||||||
if (!memoryOpen) return;
|
if (!memoryOpen) return;
|
||||||
if (ImGui::Begin("Memory Composition",&memoryOpen,globalWinFlags)) {
|
if (ImGui::Begin("Memory Composition",&memoryOpen,globalWinFlags,_("Memory Composition"))) {
|
||||||
ImDrawList* dl=ImGui::GetWindowDrawList();
|
ImDrawList* dl=ImGui::GetWindowDrawList();
|
||||||
ImGuiWindow* window=ImGui::GetCurrentWindow();
|
ImGuiWindow* window=ImGui::GetCurrentWindow();
|
||||||
char tempID[1024];
|
char tempID[1024];
|
||||||
|
@ -143,7 +143,7 @@ void FurnaceGUI::drawMemory() {
|
||||||
DivSample* sample=e->getSample(entry.asset);
|
DivSample* sample=e->getSample(entry.asset);
|
||||||
ImGui::Text("%d: %s",curHover,sample->name.c_str());
|
ImGui::Text("%d: %s",curHover,sample->name.c_str());
|
||||||
if ((int)entry.type>=(int)DIV_MEMORY_BANK0) {
|
if ((int)entry.type>=(int)DIV_MEMORY_BANK0) {
|
||||||
ImGui::Text("bank %d",(int)entry.type-(int)DIV_MEMORY_BANK0);
|
ImGui::Text(_("bank %d"),(int)entry.type-(int)DIV_MEMORY_BANK0);
|
||||||
}
|
}
|
||||||
if ((entry.end-entry.begin)>=1024 && settings.memUsageUnit==1) {
|
if ((entry.end-entry.begin)>=1024 && settings.memUsageUnit==1) {
|
||||||
ImGui::Text("%d-%d ($%x-$%x): %dK ($%x)",(int)entry.begin,(int)entry.end-1,(int)entry.begin,(int)entry.end-1,(int)(entry.end-entry.begin)>>10,(int)(entry.end-entry.begin));
|
ImGui::Text("%d-%d ($%x-$%x): %dK ($%x)",(int)entry.begin,(int)entry.end-1,(int)entry.begin,(int)entry.end-1,(int)(entry.end-entry.begin)>>10,(int)(entry.end-entry.begin));
|
||||||
|
@ -172,8 +172,8 @@ void FurnaceGUI::drawMemory() {
|
||||||
|
|
||||||
if (!have) {
|
if (!have) {
|
||||||
ImGui::SetCursorPosY(ImGui::GetCursorPosY()+(ImGui::GetContentRegionAvail().y-ImGui::GetFrameHeight()+ImGui::GetStyle().ItemSpacing.y)*0.5f);
|
ImGui::SetCursorPosY(ImGui::GetCursorPosY()+(ImGui::GetContentRegionAvail().y-ImGui::GetFrameHeight()+ImGui::GetStyle().ItemSpacing.y)*0.5f);
|
||||||
CENTER_TEXT("no chips with memory");
|
CENTER_TEXT(_("no chips with memory"));
|
||||||
ImGui::Text("no chips with memory");
|
ImGui::Text(_("no chips with memory"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_MEMORY;
|
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_MEMORY;
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
#include "imgui_internal.h"
|
#include "imgui_internal.h"
|
||||||
|
|
||||||
const char* portNamesStereo[2]={
|
const char* portNamesStereo[2]={
|
||||||
"left",
|
_N("left"),
|
||||||
"right"
|
_N("right")
|
||||||
};
|
};
|
||||||
|
|
||||||
ImVec2 FurnaceGUI::calcPortSetSize(String label, int ins, int outs) {
|
ImVec2 FurnaceGUI::calcPortSetSize(String label, int ins, int outs) {
|
||||||
|
@ -125,10 +125,10 @@ bool FurnaceGUI::portSet(String label, unsigned int portSetID, int ins, int outs
|
||||||
|
|
||||||
// input ports
|
// input ports
|
||||||
for (int i=0; i<ins; i++) {
|
for (int i=0; i<ins; i++) {
|
||||||
String portLabel="input";
|
String portLabel=_("input");
|
||||||
String subPortID=fmt::sprintf("subPort%.5x",(portSetID<<4)|i);
|
String subPortID=fmt::sprintf("subPort%.5x",(portSetID<<4)|i);
|
||||||
if (ins==2) {
|
if (ins==2) {
|
||||||
portLabel=portNamesStereo[i&1];
|
portLabel=_(portNamesStereo[i&1]);
|
||||||
} else if (ins>2) {
|
} else if (ins>2) {
|
||||||
portLabel=fmt::sprintf("%d",i+1);
|
portLabel=fmt::sprintf("%d",i+1);
|
||||||
}
|
}
|
||||||
|
@ -165,10 +165,10 @@ bool FurnaceGUI::portSet(String label, unsigned int portSetID, int ins, int outs
|
||||||
|
|
||||||
// output ports
|
// output ports
|
||||||
for (int i=0; i<outs; i++) {
|
for (int i=0; i<outs; i++) {
|
||||||
String portLabel="output";
|
String portLabel=_("output");
|
||||||
String subPortID=fmt::sprintf("subPort%.5x",(portSetID<<4)|i);
|
String subPortID=fmt::sprintf("subPort%.5x",(portSetID<<4)|i);
|
||||||
if (outs==2) {
|
if (outs==2) {
|
||||||
portLabel=portNamesStereo[i&1];
|
portLabel=_(portNamesStereo[i&1]);
|
||||||
} else if (outs>2) {
|
} else if (outs>2) {
|
||||||
portLabel=fmt::sprintf("%d",i+1);
|
portLabel=fmt::sprintf("%d",i+1);
|
||||||
}
|
}
|
||||||
|
@ -223,10 +223,10 @@ void FurnaceGUI::drawMixer() {
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetNextWindowSizeConstraints(ImVec2(400.0f*dpiScale,200.0f*dpiScale),ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSizeConstraints(ImVec2(400.0f*dpiScale,200.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
}
|
}
|
||||||
if (ImGui::Begin("Mixer",&mixerOpen,globalWinFlags|(settings.allowEditDocking?0:ImGuiWindowFlags_NoDocking))) {
|
if (ImGui::Begin("Mixer",&mixerOpen,globalWinFlags|(settings.allowEditDocking?0:ImGuiWindowFlags_NoDocking),_("Mixer"))) {
|
||||||
if (ImGui::BeginTabBar("MixerView")) {
|
if (ImGui::BeginTabBar("MixerView")) {
|
||||||
if (ImGui::BeginTabItem("Mixer")) {
|
if (ImGui::BeginTabItem(_("Mixer"))) {
|
||||||
if (ImGui::SliderFloat("Master Volume",&e->song.masterVol,0,3,"%.2fx")) {
|
if (ImGui::SliderFloat(_("Master Volume"),&e->song.masterVol,0,3,"%.2fx")) {
|
||||||
if (e->song.masterVol<0) e->song.masterVol=0;
|
if (e->song.masterVol<0) e->song.masterVol=0;
|
||||||
if (e->song.masterVol>3) e->song.masterVol=3;
|
if (e->song.masterVol>3) e->song.masterVol=3;
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
|
@ -247,7 +247,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Text("%d. %s",i+1,getSystemName(e->song.system[i]));
|
ImGui::Text("%d. %s",i+1,getSystemName(e->song.system[i]));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Checkbox("Invert",&doInvert)) {
|
if (ImGui::Checkbox(_("Invert"),&doInvert)) {
|
||||||
e->song.systemVol[i]=-e->song.systemVol[i];
|
e->song.systemVol[i]=-e->song.systemVol[i];
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
|
@ -265,7 +265,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
} rightClickable
|
} rightClickable
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Volume");
|
ImGui::Text(_("Volume"));
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
@ -276,7 +276,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
} rightClickable
|
} rightClickable
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Panning");
|
ImGui::Text(_("Panning"));
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
@ -287,7 +287,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
} rightClickable
|
} rightClickable
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Front/Rear");
|
ImGui::Text(_("Front/Rear"));
|
||||||
|
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
|
@ -296,20 +296,20 @@ void FurnaceGUI::drawMixer() {
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Patchbay")) {
|
if (ImGui::BeginTabItem(_("Patchbay"))) {
|
||||||
std::map<unsigned int,ImVec2> portPos;
|
std::map<unsigned int,ImVec2> portPos;
|
||||||
|
|
||||||
if (ImGui::BeginTable("PatchbayOptions",3)) {
|
if (ImGui::BeginTable("PatchbayOptions",3)) {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (ImGui::Checkbox("Automatic patchbay",&e->song.patchbayAuto)) {
|
if (ImGui::Checkbox(_("Automatic patchbay"),&e->song.patchbayAuto)) {
|
||||||
if (e->song.patchbayAuto) e->autoPatchbayP();
|
if (e->song.patchbayAuto) e->autoPatchbayP();
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Display hidden ports",&displayHiddenPorts);
|
ImGui::Checkbox(_("Display hidden ports"),&displayHiddenPorts);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Checkbox("Display internal",&displayInternalPorts);
|
ImGui::Checkbox(_("Display internal"),&displayInternalPorts);
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
if (ImGui::BeginChild("Patchbay",ImVec2(0,0),true)) {
|
if (ImGui::BeginChild("Patchbay",ImVec2(0,0),true)) {
|
||||||
ImDrawList* dl=ImGui::GetWindowDrawList();
|
ImDrawList* dl=ImGui::GetWindowDrawList();
|
||||||
ImVec2 topPos=ImGui::GetCursorPos();
|
ImVec2 topPos=ImGui::GetCursorPos();
|
||||||
ImVec2 sysSize=calcPortSetSize("System",displayHiddenPorts?DIV_MAX_OUTPUTS:e->getAudioDescGot().outChans,0);
|
ImVec2 sysSize=calcPortSetSize(_("System"),displayHiddenPorts?DIV_MAX_OUTPUTS:e->getAudioDescGot().outChans,0);
|
||||||
topPos.x+=ImGui::GetContentRegionAvail().x-sysSize.x;
|
topPos.x+=ImGui::GetContentRegionAvail().x-sysSize.x;
|
||||||
if (ImGui::GetContentRegionAvail().y>sysSize.y) topPos.y+=(ImGui::GetContentRegionAvail().y-sysSize.y)*0.5+ImGui::GetScrollY();
|
if (ImGui::GetContentRegionAvail().y>sysSize.y) topPos.y+=(ImGui::GetContentRegionAvail().y-sysSize.y)*0.5+ImGui::GetScrollY();
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
|
|
||||||
// metronome/sample preview
|
// metronome/sample preview
|
||||||
if (displayInternalPorts) {
|
if (displayInternalPorts) {
|
||||||
if (portSet("Sample Preview",0xffd,0,1,0,1,selectedSubPort,portPos)) {
|
if (portSet(_("Sample Preview"),0xffd,0,1,0,1,selectedSubPort,portPos)) {
|
||||||
selectedPortSet=0xffd;
|
selectedPortSet=0xffd;
|
||||||
if (selectedSubPort>=0) {
|
if (selectedSubPort>=0) {
|
||||||
portDragActive=true;
|
portDragActive=true;
|
||||||
|
@ -364,7 +364,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (portSet("Metronome",0xffe,0,1,0,1,selectedSubPort,portPos)) {
|
if (portSet(_("Metronome"),0xffe,0,1,0,1,selectedSubPort,portPos)) {
|
||||||
selectedPortSet=0xffe;
|
selectedPortSet=0xffe;
|
||||||
if (selectedSubPort>=0) {
|
if (selectedSubPort>=0) {
|
||||||
portDragActive=true;
|
portDragActive=true;
|
||||||
|
@ -380,7 +380,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SetCursorPos(topPos);
|
ImGui::SetCursorPos(topPos);
|
||||||
if (portSet("System",0x1000,displayHiddenPorts?DIV_MAX_OUTPUTS:e->getAudioDescGot().outChans,0,e->getAudioDescGot().outChans,0,selectedSubPort,portPos)) {
|
if (portSet(_("System"),0x1000,displayHiddenPorts?DIV_MAX_OUTPUTS:e->getAudioDescGot().outChans,0,e->getAudioDescGot().outChans,0,selectedSubPort,portPos)) {
|
||||||
selectedPortSet=0x1000;
|
selectedPortSet=0x1000;
|
||||||
if (selectedSubPort>=0) {
|
if (selectedSubPort>=0) {
|
||||||
portDragActive=true;
|
portDragActive=true;
|
||||||
|
@ -443,7 +443,7 @@ void FurnaceGUI::drawMixer() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ImGui::BeginPopup("SubPortOptions",ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) {
|
if (ImGui::BeginPopup("SubPortOptions",ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) {
|
||||||
if (ImGui::MenuItem("disconnect all")) {
|
if (ImGui::MenuItem(_("disconnect all"))) {
|
||||||
e->patchDisconnectAll(selectedPortSet);
|
e->patchDisconnectAll(selectedPortSet);
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,8 +119,8 @@ void FurnaceGUI::drawNewSong() {
|
||||||
std::vector<int> sysDefStack;
|
std::vector<int> sysDefStack;
|
||||||
|
|
||||||
ImGui::PushFont(bigFont);
|
ImGui::PushFont(bigFont);
|
||||||
ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize("Choose a System!").x)*0.5);
|
ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize(_("Choose a System!")).x)*0.5);
|
||||||
ImGui::Text("Choose a System!");
|
ImGui::Text(_("Choose a System!"));
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
||||||
ImVec2 avail=ImGui::GetContentRegionAvail();
|
ImVec2 avail=ImGui::GetContentRegionAvail();
|
||||||
|
@ -130,7 +130,7 @@ void FurnaceGUI::drawNewSong() {
|
||||||
if (newSongFirstFrame)
|
if (newSongFirstFrame)
|
||||||
ImGui::SetKeyboardFocusHere();
|
ImGui::SetKeyboardFocusHere();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
if (ImGui::InputTextWithHint("##SysSearch","Search...",&newSongQuery)) {
|
if (ImGui::InputTextWithHint("##SysSearch",_("Search..."),&newSongQuery)) {
|
||||||
String lowerCase=newSongQuery;
|
String lowerCase=newSongQuery;
|
||||||
for (char& i: lowerCase) {
|
for (char& i: lowerCase) {
|
||||||
if (i>='A' && i<='Z') i+='a'-'A';
|
if (i>='A' && i<='Z') i+='a'-'A';
|
||||||
|
@ -176,9 +176,9 @@ void FurnaceGUI::drawNewSong() {
|
||||||
if (newSongQuery.empty()) {
|
if (newSongQuery.empty()) {
|
||||||
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
ImGui::TableNextRow(ImGuiTableRowFlags_Headers);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Categories");
|
ImGui::Text(_("Categories"));
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("Systems");
|
ImGui::Text(_("Systems"));
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
|
@ -207,9 +207,9 @@ void FurnaceGUI::drawNewSong() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
if (newSongQuery.empty()) {
|
if (newSongQuery.empty()) {
|
||||||
ImGui::Text("no systems here yet!");
|
ImGui::Text(_("no systems here yet!"));
|
||||||
} else {
|
} else {
|
||||||
ImGui::Text("no results");
|
ImGui::Text(_("no results"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bool alreadyHover=false;
|
bool alreadyHover=false;
|
||||||
|
@ -225,9 +225,9 @@ void FurnaceGUI::drawNewSong() {
|
||||||
}
|
}
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
|
|
||||||
if (ImGui::Button("I'm feeling lucky")) {
|
if (ImGui::Button(_("I'm feeling lucky"))) {
|
||||||
if (sysCategories.size()==0) {
|
if (sysCategories.size()==0) {
|
||||||
showError("no categories available! what in the world.");
|
showError(_("no categories available! what in the world."));
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
} else {
|
} else {
|
||||||
int tries=0;
|
int tries=0;
|
||||||
|
@ -262,7 +262,7 @@ void FurnaceGUI::drawNewSong() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tries>=50) {
|
if (tries>=50) {
|
||||||
showError("it appears you're extremely lucky today!");
|
showError(_("it appears you're extremely lucky today!"));
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ void FurnaceGUI::drawNewSong() {
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
if (ImGui::Button("Cancel") || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
if (ImGui::Button(_("Cancel")) || ImGui::IsKeyPressed(ImGuiKey_Escape)) {
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
doAction(GUI_ACTION_ORDERS_ADD);
|
doAction(GUI_ACTION_ORDERS_ADD);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Add new order");
|
ImGui::SetTooltip(_("Add new order"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
}
|
}
|
||||||
popDestColor();
|
popDestColor();
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Remove order");
|
ImGui::SetTooltip(_("Remove order"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
doAction(GUI_ACTION_ORDERS_DEEP_CLONE);
|
doAction(GUI_ACTION_ORDERS_DEEP_CLONE);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Duplicate order (right-click to deep clone)");
|
ImGui::SetTooltip(_("Duplicate order (right-click to deep clone)"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
doAction(GUI_ACTION_ORDERS_MOVE_UP);
|
doAction(GUI_ACTION_ORDERS_MOVE_UP);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move order up");
|
ImGui::SetTooltip(_("Move order up"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
doAction(GUI_ACTION_ORDERS_MOVE_DOWN);
|
doAction(GUI_ACTION_ORDERS_MOVE_DOWN);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Move order down");
|
ImGui::SetTooltip(_("Move order down"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
doAction(GUI_ACTION_ORDERS_DEEP_CLONE_END);
|
doAction(GUI_ACTION_ORDERS_DEEP_CLONE_END);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("Place copy of current order at end of song (right-click to deep clone)");
|
ImGui::SetTooltip(_("Place copy of current order at end of song (right-click to deep clone)"));
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
|
||||||
|
@ -174,9 +174,9 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
if (changeAllOrders) {
|
if (changeAllOrders) {
|
||||||
ImGui::SetTooltip("Order change mode: entire row");
|
ImGui::SetTooltip(_("Order change mode: entire row"));
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetTooltip("Order change mode: one");
|
ImGui::SetTooltip(_("Order change mode: one"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NEXT_BUTTON;
|
NEXT_BUTTON;
|
||||||
|
@ -202,13 +202,13 @@ void FurnaceGUI::drawOrderButtons() {
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
if (orderEditMode==3) {
|
if (orderEditMode==3) {
|
||||||
ImGui::SetTooltip("Order edit mode: Select and type (scroll vertically)");
|
ImGui::SetTooltip(_("Order edit mode: Select and type (scroll vertically)"));
|
||||||
} else if (orderEditMode==2) {
|
} else if (orderEditMode==2) {
|
||||||
ImGui::SetTooltip("Order edit mode: Select and type (scroll horizontally)");
|
ImGui::SetTooltip(_("Order edit mode: Select and type (scroll horizontally)"));
|
||||||
} else if (orderEditMode==1) {
|
} else if (orderEditMode==1) {
|
||||||
ImGui::SetTooltip("Order edit mode: Select and type (don't scroll)");
|
ImGui::SetTooltip(_("Order edit mode: Select and type (don't scroll)"));
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetTooltip("Order edit mode: Click to change");
|
ImGui::SetTooltip(_("Order edit mode: Click to change"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ void FurnaceGUI::drawOrders() {
|
||||||
} else {
|
} else {
|
||||||
//ImGui::SetNextWindowSizeConstraints(ImVec2(440.0f*dpiScale,400.0f*dpiScale),ImVec2(canvasW,canvasH));
|
//ImGui::SetNextWindowSizeConstraints(ImVec2(440.0f*dpiScale,400.0f*dpiScale),ImVec2(canvasW,canvasH));
|
||||||
}
|
}
|
||||||
if (ImGui::Begin("Orders",&ordersOpen,globalWinFlags|ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse)) {
|
if (ImGui::Begin("Orders",&ordersOpen,globalWinFlags|ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse,_("Orders"))) {
|
||||||
if (ImGui::BeginTable("OrdColumn",(settings.orderButtonPos==0)?1:2,ImGuiTableFlags_BordersInnerV)) {
|
if (ImGui::BeginTable("OrdColumn",(settings.orderButtonPos==0)?1:2,ImGuiTableFlags_BordersInnerV)) {
|
||||||
if (settings.orderButtonPos==2) {
|
if (settings.orderButtonPos==2) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthStretch);
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
|
|
@ -166,14 +166,14 @@ void FurnaceGUI::drawOsc() {
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(0,0));
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(0,0));
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing,ImVec2(0,0));
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing,ImVec2(0,0));
|
||||||
}
|
}
|
||||||
if (ImGui::Begin("Oscilloscope",&oscOpen,globalWinFlags)) {
|
if (ImGui::Begin("Oscilloscope",&oscOpen,globalWinFlags,_("Oscilloscope"))) {
|
||||||
if (oscZoomSlider) {
|
if (oscZoomSlider) {
|
||||||
if (ImGui::VSliderFloat("##OscZoom",ImVec2(20.0f*dpiScale,ImGui::GetContentRegionAvail().y),&oscZoom,0.5,2.0)) {
|
if (ImGui::VSliderFloat("##OscZoom",ImVec2(20.0f*dpiScale,ImGui::GetContentRegionAvail().y),&oscZoom,0.5,2.0)) {
|
||||||
if (oscZoom<0.5) oscZoom=0.5;
|
if (oscZoom<0.5) oscZoom=0.5;
|
||||||
if (oscZoom>2.0) oscZoom=2.0;
|
if (oscZoom>2.0) oscZoom=2.0;
|
||||||
} rightClickable
|
} rightClickable
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("zoom: %.2fx (%.1fdB)",oscZoom,20.0*log10(oscZoom*2.0));
|
ImGui::SetTooltip(_("zoom: %.2fx (%.1fdB)"),oscZoom,20.0*log10(oscZoom*2.0));
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Middle)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Middle)) {
|
||||||
oscZoom=0.5;
|
oscZoom=0.5;
|
||||||
|
@ -184,7 +184,7 @@ void FurnaceGUI::drawOsc() {
|
||||||
if (oscWindowSize>100.0) oscWindowSize=100.0;
|
if (oscWindowSize>100.0) oscWindowSize=100.0;
|
||||||
} rightClickable
|
} rightClickable
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("window size: %.1fms",oscWindowSize);
|
ImGui::SetTooltip(_("window size: %.1fms"),oscWindowSize);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Middle)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Middle)) {
|
||||||
oscWindowSize=20.0;
|
oscWindowSize=20.0;
|
||||||
|
@ -382,7 +382,7 @@ void FurnaceGUI::drawOsc() {
|
||||||
float val=20.0*log10(2.0*fabs(0.5-((ImGui::GetMousePos().y-inRect.Min.y)/(inRect.Max.y-inRect.Min.y))));
|
float val=20.0*log10(2.0*fabs(0.5-((ImGui::GetMousePos().y-inRect.Min.y)/(inRect.Max.y-inRect.Min.y))));
|
||||||
if (val>0.0f) val=0.0f;
|
if (val>0.0f) val=0.0f;
|
||||||
if (val<=-INFINITY) {
|
if (val<=-INFINITY) {
|
||||||
ImGui::SetTooltip("(-Infinity)dB");
|
ImGui::SetTooltip(_("(-Infinity)dB"));
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetTooltip("%.1fdB",val);
|
ImGui::SetTooltip("%.1fdB",val);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,29 +32,29 @@ void FurnaceGUI::drawPatManager() {
|
||||||
char id[1024];
|
char id[1024];
|
||||||
unsigned char isUsed[DIV_MAX_PATTERNS];
|
unsigned char isUsed[DIV_MAX_PATTERNS];
|
||||||
bool isNull[DIV_MAX_PATTERNS];
|
bool isNull[DIV_MAX_PATTERNS];
|
||||||
if (ImGui::Begin("Pattern Manager",&patManagerOpen,globalWinFlags)) {
|
if (ImGui::Begin("Pattern Manager",&patManagerOpen,globalWinFlags,_("Pattern Manager"))) {
|
||||||
if (ImGui::Button("De-duplicate patterns")) {
|
if (ImGui::Button(_("De-duplicate patterns"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->curSubSong->optimizePatterns();
|
e->curSubSong->optimizePatterns();
|
||||||
});
|
});
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Re-arrange patterns")) {
|
if (ImGui::Button(_("Re-arrange patterns"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->curSubSong->rearrangePatterns();
|
e->curSubSong->rearrangePatterns();
|
||||||
});
|
});
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Sort orders")) {
|
if (ImGui::Button(_("Sort orders"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->curSubSong->sortOrders();
|
e->curSubSong->sortOrders();
|
||||||
});
|
});
|
||||||
MARK_MODIFIED;
|
MARK_MODIFIED;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Make patterns unique")) {
|
if (ImGui::Button(_("Make patterns unique"))) {
|
||||||
e->lockEngine([this]() {
|
e->lockEngine([this]() {
|
||||||
e->curSubSong->makePatUnique();
|
e->curSubSong->makePatUnique();
|
||||||
});
|
});
|
||||||
|
@ -100,9 +100,9 @@ void FurnaceGUI::drawPatManager() {
|
||||||
ImGui::PushFont(mainFont);
|
ImGui::PushFont(mainFont);
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]);
|
||||||
if (isNull[k]) {
|
if (isNull[k]) {
|
||||||
ImGui::SetTooltip("Pattern %.2X\n- not allocated",k);
|
ImGui::SetTooltip(_("Pattern %.2X\n- not allocated"),k);
|
||||||
} else {
|
} else {
|
||||||
ImGui::SetTooltip("Pattern %.2X\n- use count: %d (%.0f%%)\n\nright-click to erase",k,isUsed[k],100.0*(double)isUsed[k]/(double)e->curSubSong->ordersLen);
|
ImGui::SetTooltip(_("Pattern %.2X\n- use count: %d (%.0f%%)\n\nright-click to erase"),k,isUsed[k],100.0*(double)isUsed[k]/(double)e->curSubSong->ordersLen);
|
||||||
}
|
}
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue