Merge branch 'locale'

thanks everyone involved!

also special thanks to LTVA for pioneering language support in Furnace
This commit is contained in:
tildearrow 2024-06-13 16:55:08 -05:00
commit e8d34143cb
127 changed files with 509168 additions and 17328 deletions

View file

@ -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)

View file

@ -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'
} }

View file

@ -0,0 +1 @@
../../../../../po/locale

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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;

View file

@ -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

View file

@ -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();
} }

View file

@ -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)

View file

@ -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)

View file

@ -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);

View file

@ -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)

View file

@ -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
View 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.

16025
po/de.po Normal file

File diff suppressed because it is too large Load diff

16704
po/es.po Normal file

File diff suppressed because it is too large Load diff

16025
po/fi.po Normal file

File diff suppressed because it is too large Load diff

16025
po/fr.po Normal file

File diff suppressed because it is too large Load diff

16021
po/furnace.pot Normal file

File diff suppressed because it is too large Load diff

16029
po/hy.po Normal file

File diff suppressed because it is too large Load diff

16019
po/ja.po Normal file

File diff suppressed because it is too large Load diff

16157
po/ko.po Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

16075
po/nl.po Normal file

File diff suppressed because it is too large Load diff

20742
po/pl.po Normal file

File diff suppressed because it is too large Load diff

20169
po/pt_BR.po Normal file

File diff suppressed because it is too large Load diff

20672
po/ru.po Normal file

File diff suppressed because it is too large Load diff

16049
po/sk.po Normal file

File diff suppressed because it is too large Load diff

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
View 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
View 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."

16739
po/sv.po Normal file

File diff suppressed because it is too large Load diff

16036
po/th.po Normal file

File diff suppressed because it is too large Load diff

16025
po/tr.po Normal file

File diff suppressed because it is too large Load diff

16032
po/uk.po Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 21 KiB

7
scripts/build-po.sh Executable file
View 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
View 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

View file

@ -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;

View file

@ -0,0 +1,7 @@
#include <locale.h>
int main(int argc, char** argv) {
setlocale(LC_CTYPE,"");
setlocale(LC_MESSAGES,"");
return 0;
}

View file

@ -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);
} }

View file

@ -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",""));

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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");

View file

@ -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();

View file

@ -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;
}; };
} }

View file

@ -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();
} }

View file

@ -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();

View file

@ -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);
} }

View file

@ -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();

View file

@ -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;

View file

@ -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;

View file

@ -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();

View file

@ -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;

View file

@ -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"));
} }
} }
} }

View file

@ -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;

View file

@ -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

File diff suppressed because it is too large Load diff

51400
src/gui/font_plexSansKR.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -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;

View file

@ -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++;

File diff suppressed because it is too large Load diff

View file

@ -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);

View file

@ -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
}; };

File diff suppressed because it is too large Load diff

View file

@ -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"));
} }
} }

View file

@ -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());
} }

View file

@ -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;

View file

@ -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;
} }

View file

@ -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();
} }

View file

@ -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);

View file

@ -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);
} }

View file

@ -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