Compare commits

...

4 Commits

Author SHA1 Message Date
Stenzek c149d66d4d
System: Add 'Reduce Input Latency' option
i.e. pre-frame sleep.
2024-04-13 19:57:25 +10:00
Stenzek 6258cb9e0e
FullscreenUI: Various minor bug fixes 2024-04-13 19:57:25 +10:00
Stenzek 8ab1623276
CI/Flatpak: Remove unused file 2024-04-13 19:57:25 +10:00
PugsyMAME 7adbedd341
Renamed Mem Scanner Op Text&added Virtual Address (#3172)
* Renamed Mem Scanner Op Text&added Virtual Address

Renamed the Memory Scanner Operator Text for clarity. Replaced '...' with 'Value' and 'Previous' with 'Previous Result'.
Also changed "Any Value" to "Any Value ('New Search' or 'Reset Result Value')", Any Valur should really be at the top of the index and the Previous Results should come before the other Value operators. But that's a job for another time.
The Virtual Address extra will display the virtual address of DuckStation's PSX RAM so it can be easily edited with the likes of HXD or another tool where the location of the virtual memory needs to be known.

* Replaced Mem Scanner Op Text with latest English text

Not touched the translations, just added the updated english text for the Memory Scanner "Operator:" text

* Rearranged  Memory Scanner Operator class

Re-arranged Memory Scanner Operator class into a more logical order - with likely frequency of use moving item up the list.

New Order:-
Better Order:-
Any Value ('New Search' or 'Reset Result Value')         x    Any.
Less Than Previous Result                                x    LessThanLast,
Less or Equal to Previous Result                         x    LessEqualLast,
Greater Than Previous Result                             x    GreaterThanLast,
Greater or Equal to Previous Result                      x    GreaterEqualLast,
Not Equal to Previous Result (Changed Value)             x    NotEqualLast,
Equal to Previous Result (Unchanged Value)               x    EqualLast,
Decreased By Value                                       x    DecreasedBy,
Increased By Value                                       x    IncreasedBy,
Changed By Value                                         x    ChangedBy,
Equal to Value                                           x    Equal,
Not Equal to Value                                       x    NotEqual,
Less Than Value                                          x    LessThan,
Less or Equal to Value	                                 x    LessEqual,
Greater Than Value                                       x    GreaterThan,
Greater or Equal to Value                                x    GreaterEqual

* Rearranged  Memory Scanner Operator class

Changes operator order to:-
Any Value ('New Search' or 'Reset Result Value')        
Less Than Previous Result                               
Less or Equal to Previous Result                        
Greater Than Previous Result                            
Greater or Equal to Previous Result                     
Not Equal to Previous Result (Changed Value)            
Equal to Previous Result (Unchanged Value)              
Decreased By Value                                      
Increased By Value                                      
Changed By Value                                        
Equal to Value                                          
Not Equal to Value                                      
Less Than Value                                         
Less or Equal to Value	                                
Greater Than Value                                      
Greater or Equal to Value

* Memory Scanner line references updates

Updated <location filename="../memoryscannerwindow.ui" line="???"/> line numbers for the Memory Scanner operation re-ordering.
These are currently the only 4 translation files that make reference to memoryscannerwindow.ui, the other 12 still reference cheatmanagerdialog.ui so not replicated for them as this would only partially fix them - so I left them alone as I hope there's some automated tools to handle it.

* Update src/duckstation-qt/memoryscannerwindow.cpp
2024-04-13 19:57:12 +10:00
34 changed files with 756 additions and 498 deletions

View File

@ -24,6 +24,7 @@
"/lib/*.a", "/lib/*.a",
"/lib/*.la", "/lib/*.la",
"/lib/cmake", "/lib/cmake",
"/lib/pkgconfig" "/lib/pkgconfig",
"/share/aclocal"
] ]
} }

View File

@ -342,7 +342,7 @@ private:
#endif #endif
template<u32 L> template<u32 L>
ALWAYS_INLINE SmallStackString<L> SmallStackString<L>::from_sprintf(const char* format, ...) SmallStackString<L> SmallStackString<L>::from_sprintf(const char* format, ...)
{ {
std::va_list ap; std::va_list ap;
va_start(ap, format); va_start(ap, format);

View File

@ -204,22 +204,22 @@ class MemoryScan
public: public:
enum class Operator enum class Operator
{ {
Equal, Any,
NotEqual,
GreaterThan,
GreaterEqual,
LessThan,
LessEqual,
IncreasedBy,
DecreasedBy,
ChangedBy,
EqualLast,
NotEqualLast,
GreaterThanLast,
GreaterEqualLast,
LessThanLast, LessThanLast,
LessEqualLast, LessEqualLast,
Any GreaterThanLast,
GreaterEqualLast,
NotEqualLast,
EqualLast,
DecreasedBy,
IncreasedBy,
ChangedBy,
Equal,
NotEqual,
LessThan,
LessEqual,
GreaterThan,
GreaterEqual
}; };
struct Result struct Result

View File

@ -1917,8 +1917,8 @@ void FullscreenUI::DrawIntRangeSetting(SettingsInterface* bsi, const char* title
const bool game_settings = IsEditingGameSettings(bsi); const bool game_settings = IsEditingGameSettings(bsi);
const std::optional<int> value = const std::optional<int> value =
bsi->GetOptionalIntValue(section, key, game_settings ? std::nullopt : std::optional<int>(default_value)); bsi->GetOptionalIntValue(section, key, game_settings ? std::nullopt : std::optional<int>(default_value));
const std::string value_text(value.has_value() ? StringUtil::StdStringFromFormat(format, value.value()) : const SmallString value_text =
FSUI_STR("Use Global Setting")); value.has_value() ? SmallString::from_sprintf(format, value.value()) : SmallString(FSUI_VSTR("Use Global Setting"));
if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font))
ImGui::OpenPopup(title); ImGui::OpenPopup(title);
@ -1975,8 +1975,8 @@ void FullscreenUI::DrawFloatRangeSetting(SettingsInterface* bsi, const char* tit
const bool game_settings = IsEditingGameSettings(bsi); const bool game_settings = IsEditingGameSettings(bsi);
const std::optional<float> value = const std::optional<float> value =
bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional<float>(default_value)); bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional<float>(default_value));
const std::string value_text(value.has_value() ? StringUtil::StdStringFromFormat(format, value.value() * multiplier) : const SmallString value_text = value.has_value() ? SmallString::from_sprintf(format, value.value() * multiplier) :
FSUI_STR("Use Global Setting")); SmallString(FSUI_VSTR("Use Global Setting"));
if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font))
ImGui::OpenPopup(title); ImGui::OpenPopup(title);
@ -2036,8 +2036,8 @@ void FullscreenUI::DrawFloatSpinBoxSetting(SettingsInterface* bsi, const char* t
const bool game_settings = IsEditingGameSettings(bsi); const bool game_settings = IsEditingGameSettings(bsi);
const std::optional<float> value = const std::optional<float> value =
bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional<float>(default_value)); bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional<float>(default_value));
const std::string value_text(value.has_value() ? StringUtil::StdStringFromFormat(format, value.value() * multiplier) : const SmallString value_text = value.has_value() ? SmallString::from_sprintf(format, value.value() * multiplier) :
FSUI_STR("Use Global Setting")); SmallString(FSUI_VSTR("Use Global Setting"));
static bool manual_input = false; static bool manual_input = false;
@ -2174,12 +2174,12 @@ void FullscreenUI::DrawIntRectSetting(SettingsInterface* bsi, const char* title,
bsi->GetOptionalIntValue(section, right_key, game_settings ? std::nullopt : std::optional<int>(default_right)); bsi->GetOptionalIntValue(section, right_key, game_settings ? std::nullopt : std::optional<int>(default_right));
const std::optional<int> bottom_value = const std::optional<int> bottom_value =
bsi->GetOptionalIntValue(section, bottom_key, game_settings ? std::nullopt : std::optional<int>(default_bottom)); bsi->GetOptionalIntValue(section, bottom_key, game_settings ? std::nullopt : std::optional<int>(default_bottom));
const std::string value_text(fmt::format( const SmallString value_text = SmallString::from_format(
"{}/{}/{}/{}", "{}/{}/{}/{}",
left_value.has_value() ? StringUtil::StdStringFromFormat(format, left_value.value()) : std::string("Default"), left_value.has_value() ? TinyString::from_sprintf(format, left_value.value()) : TinyString(FSUI_VSTR("Default")),
top_value.has_value() ? StringUtil::StdStringFromFormat(format, top_value.value()) : std::string("Default"), top_value.has_value() ? TinyString::from_sprintf(format, top_value.value()) : TinyString(FSUI_VSTR("Default")),
right_value.has_value() ? StringUtil::StdStringFromFormat(format, right_value.value()) : std::string("Default"), right_value.has_value() ? TinyString::from_sprintf(format, right_value.value()) : TinyString(FSUI_VSTR("Default")),
bottom_value.has_value() ? StringUtil::StdStringFromFormat(format, bottom_value.value()) : std::string("Default"))); bottom_value.has_value() ? TinyString::from_sprintf(format, bottom_value.value()) : TinyString(FSUI_VSTR("Default")));
if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font))
ImGui::OpenPopup(title); ImGui::OpenPopup(title);
@ -3350,32 +3350,62 @@ void FullscreenUI::DrawEmulationSettingsPage()
MenuHeading(FSUI_CSTR("Speed Control")); MenuHeading(FSUI_CSTR("Speed Control"));
DrawFloatListSetting( DrawFloatListSetting(
bsi, FSUI_CSTR("Emulation Speed"), bsi, FSUI_ICONSTR(ICON_FA_STOPWATCH, "Emulation Speed"),
FSUI_CSTR("Sets the target emulation speed. It is not guaranteed that this speed will be reached on all systems."), FSUI_CSTR("Sets the target emulation speed. It is not guaranteed that this speed will be reached on all systems."),
"Main", "EmulationSpeed", 1.0f, emulation_speed_titles.data(), emulation_speed_values.data(), "Main", "EmulationSpeed", 1.0f, emulation_speed_titles.data(), emulation_speed_values.data(),
emulation_speed_titles.size(), true); emulation_speed_titles.size(), true);
DrawFloatListSetting( DrawFloatListSetting(
bsi, FSUI_CSTR("Fast Forward Speed"), bsi, FSUI_ICONSTR(ICON_FA_BOLT, "Fast Forward Speed"),
FSUI_CSTR("Sets the fast forward speed. It is not guaranteed that this speed will be reached on all systems."), FSUI_CSTR("Sets the fast forward speed. It is not guaranteed that this speed will be reached on all systems."),
"Main", "FastForwardSpeed", 0.0f, emulation_speed_titles.data(), emulation_speed_values.data(), "Main", "FastForwardSpeed", 0.0f, emulation_speed_titles.data(), emulation_speed_values.data(),
emulation_speed_titles.size(), true); emulation_speed_titles.size(), true);
DrawFloatListSetting( DrawFloatListSetting(
bsi, FSUI_CSTR("Turbo Speed"), bsi, FSUI_ICONSTR(ICON_FA_BOLT, "Turbo Speed"),
FSUI_CSTR("Sets the turbo speed. It is not guaranteed that this speed will be reached on all systems."), "Main", FSUI_CSTR("Sets the turbo speed. It is not guaranteed that this speed will be reached on all systems."), "Main",
"TurboSpeed", 2.0f, emulation_speed_titles.data(), emulation_speed_values.data(), emulation_speed_titles.size(), "TurboSpeed", 2.0f, emulation_speed_titles.data(), emulation_speed_values.data(), emulation_speed_titles.size(),
true); true);
MenuHeading(FSUI_CSTR("Latency Control"));
DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_FA_TV, "Vertical Sync (VSync)"),
FSUI_CSTR("Synchronizes presentation of the console's frames to the host. GSync/FreeSync users "
"should enable Optimal Frame Pacing instead."),
"Display", "VSync", false);
DrawToggleSetting(
bsi, FSUI_ICONSTR(ICON_FA_LIGHTBULB, "Sync To Host Refresh Rate"),
FSUI_CSTR("Adjusts the emulation speed so the console's refresh rate matches the host when VSync is enabled."),
"Main", "SyncToHostRefreshRate", false);
DrawToggleSetting(
bsi, FSUI_ICONSTR(ICON_FA_TACHOMETER_ALT, "Optimal Frame Pacing"),
FSUI_CSTR("Ensures every frame generated is displayed for optimal pacing. Enable for variable refresh displays, "
"such as GSync/FreeSync. Disable if you are having speed or sound issues."),
"Display", "OptimalFramePacing", false);
const bool optimal_frame_pacing_active = GetEffectiveBoolSetting(bsi, "Display", "OptimalFramePacing", false);
DrawToggleSetting(
bsi, FSUI_ICONSTR(ICON_FA_STOPWATCH_20, "Reduce Input Latency"),
FSUI_CSTR("Reduces input latency by delaying the start of frame until closer to the presentation time."), "Display",
"PreFrameSleep", false, optimal_frame_pacing_active);
const bool pre_frame_sleep_active =
(optimal_frame_pacing_active && GetEffectiveBoolSetting(bsi, "Display", "PreFrameSleep", false));
DrawFloatRangeSetting(
bsi, FSUI_ICONSTR(ICON_FA_BATTERY_FULL, "Frame Time Buffer"),
FSUI_CSTR("Specifies the amount of buffer time added, which reduces the additional sleep time introduced."),
"Display", "PreFrameSleepBuffer", Settings::DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER, 0.0f, 20.0f, "%.1f", 1.0f,
pre_frame_sleep_active);
MenuHeading(FSUI_CSTR("Runahead/Rewind")); MenuHeading(FSUI_CSTR("Runahead/Rewind"));
DrawToggleSetting(bsi, FSUI_CSTR("Enable Rewinding"), DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_FA_BACKWARD, "Enable Rewinding"),
FSUI_CSTR("Saves state periodically so you can rewind any mistakes while playing."), "Main", FSUI_CSTR("Saves state periodically so you can rewind any mistakes while playing."), "Main",
"RewindEnable", false); "RewindEnable", false);
DrawFloatRangeSetting( DrawFloatRangeSetting(
bsi, FSUI_CSTR("Rewind Save Frequency"), bsi, FSUI_ICONSTR(ICON_FA_SAVE, "Rewind Save Frequency"),
FSUI_CSTR("How often a rewind state will be created. Higher frequencies have greater system requirements."), "Main", FSUI_CSTR("How often a rewind state will be created. Higher frequencies have greater system requirements."), "Main",
"RewindFrequency", 10.0f, 0.0f, 3600.0f, FSUI_CSTR("%.2f Seconds")); "RewindFrequency", 10.0f, 0.0f, 3600.0f, FSUI_CSTR("%.2f Seconds"));
DrawIntRangeSetting( DrawIntRangeSetting(
bsi, FSUI_CSTR("Rewind Save Slots"), bsi, FSUI_ICONSTR(ICON_FA_GLASS_WHISKEY, "Rewind Save Slots"),
FSUI_CSTR("How many saves will be kept for rewinding. Higher values have greater memory requirements."), "Main", FSUI_CSTR("How many saves will be kept for rewinding. Higher values have greater memory requirements."), "Main",
"RewindSaveSlots", 10, 1, 10000, FSUI_CSTR("%d Frames")); "RewindSaveSlots", 10, 1, 10000, FSUI_CSTR("%d Frames"));
@ -3389,7 +3419,7 @@ void FullscreenUI::DrawEmulationSettingsPage()
FSUI_NSTR("8 Frames"), FSUI_NSTR("9 Frames"), FSUI_NSTR("10 Frames")}; FSUI_NSTR("8 Frames"), FSUI_NSTR("9 Frames"), FSUI_NSTR("10 Frames")};
DrawIntListSetting( DrawIntListSetting(
bsi, FSUI_CSTR("Runahead"), bsi, FSUI_ICONSTR(ICON_FA_RUNNING, "Runahead"),
FSUI_CSTR( FSUI_CSTR(
"Simulates the system ahead of time and rolls back/replays to reduce input lag. Very high system requirements."), "Simulates the system ahead of time and rolls back/replays to reduce input lag. Very high system requirements."),
"Main", "RunaheadFrameCount", 0, runahead_options.data(), runahead_options.size(), true); "Main", "RunaheadFrameCount", 0, runahead_options.data(), runahead_options.size(), true);
@ -3514,12 +3544,16 @@ void FullscreenUI::DoSaveInputProfile()
if (index < 0) if (index < 0)
return; return;
CloseChoiceDialog();
if (index > 0) if (index > 0)
{
DoSaveInputProfile(title); DoSaveInputProfile(title);
CloseChoiceDialog();
}
else else
{
CloseChoiceDialog();
DoSaveNewInputProfile(); DoSaveNewInputProfile();
}
}); });
} }
@ -4180,23 +4214,6 @@ void FullscreenUI::DrawDisplaySettingsPage()
"GPU", "UseSoftwareRendererForReadbacks", false); "GPU", "UseSoftwareRendererForReadbacks", false);
} }
DrawToggleSetting(bsi, FSUI_CSTR("VSync"),
FSUI_CSTR("Synchronizes presentation of the console's frames to the host. GSync/FreeSync users "
"should enable Optimal Frame Pacing instead."),
"Display", "VSync", false);
DrawToggleSetting(
bsi, FSUI_CSTR("Sync To Host Refresh Rate"),
FSUI_CSTR("Adjusts the emulation speed so the console's refresh rate matches the host when VSync and Audio "
"Resampling are enabled."),
"Main", "SyncToHostRefreshRate", false);
DrawToggleSetting(
bsi, FSUI_CSTR("Optimal Frame Pacing"),
FSUI_CSTR("Ensures every frame generated is displayed for optimal pacing. Enable for variable refresh displays, "
"such as GSync/FreeSync. Disable if you are having speed or sound issues."),
"Display", "OptimalFramePacing", false);
MenuHeading(FSUI_CSTR("Rendering")); MenuHeading(FSUI_CSTR("Rendering"));
DrawIntListSetting( DrawIntListSetting(
@ -6136,6 +6153,9 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size)
return; return;
} }
if (!AreAnyDialogsOpen() && WantsToCloseMenu())
ReturnToPreviousWindow();
auto game_list_lock = GameList::GetLock(); auto game_list_lock = GameList::GetLock();
const GameList::Entry* selected_entry = nullptr; const GameList::Entry* selected_entry = nullptr;
PopulateGameListEntryList(); PopulateGameListEntryList();
@ -6346,11 +6366,8 @@ void FullscreenUI::DrawGameGrid(const ImVec2& heading_size)
return; return;
} }
if (WantsToCloseMenu()) if (ImGui::IsWindowFocused() && WantsToCloseMenu())
{
if (ImGui::IsWindowFocused())
ReturnToPreviousWindow(); ReturnToPreviousWindow();
}
ResetFocusHere(); ResetFocusHere();
BeginMenuButtons(); BeginMenuButtons();
@ -6537,14 +6554,11 @@ void FullscreenUI::DrawGameListSettingsWindow()
return; return;
} }
if (WantsToCloseMenu()) if (ImGui::IsWindowFocused() && WantsToCloseMenu())
{
if (ImGui::IsWindowFocused())
{ {
s_current_main_window = MainWindowType::GameList; s_current_main_window = MainWindowType::GameList;
QueueResetFocus(); QueueResetFocus();
} }
}
auto lock = Host::GetSettingsLock(); auto lock = Host::GetSettingsLock();
SettingsInterface* bsi = GetEditingSettingsInterface(false); SettingsInterface* bsi = GetEditingSettingsInterface(false);
@ -6982,7 +6996,7 @@ TRANSLATE_NOOP("FullscreenUI", "Add Shader");
TRANSLATE_NOOP("FullscreenUI", "Adds a new directory to the game search list."); TRANSLATE_NOOP("FullscreenUI", "Adds a new directory to the game search list.");
TRANSLATE_NOOP("FullscreenUI", "Adds a new shader to the chain."); TRANSLATE_NOOP("FullscreenUI", "Adds a new shader to the chain.");
TRANSLATE_NOOP("FullscreenUI", "Adds additional precision to PGXP data post-projection. May improve visuals in some games."); TRANSLATE_NOOP("FullscreenUI", "Adds additional precision to PGXP data post-projection. May improve visuals in some games.");
TRANSLATE_NOOP("FullscreenUI", "Adjusts the emulation speed so the console's refresh rate matches the host when VSync and Audio Resampling are enabled."); TRANSLATE_NOOP("FullscreenUI", "Adjusts the emulation speed so the console's refresh rate matches the host when VSync is enabled.");
TRANSLATE_NOOP("FullscreenUI", "Advanced Settings"); TRANSLATE_NOOP("FullscreenUI", "Advanced Settings");
TRANSLATE_NOOP("FullscreenUI", "All Time: {}"); TRANSLATE_NOOP("FullscreenUI", "All Time: {}");
TRANSLATE_NOOP("FullscreenUI", "Allow Booting Without SBI File"); TRANSLATE_NOOP("FullscreenUI", "Allow Booting Without SBI File");
@ -7151,7 +7165,7 @@ TRANSLATE_NOOP("FullscreenUI", "Enables more precise frame pacing at the cost of
TRANSLATE_NOOP("FullscreenUI", "Enables the replacement of background textures in supported games."); TRANSLATE_NOOP("FullscreenUI", "Enables the replacement of background textures in supported games.");
TRANSLATE_NOOP("FullscreenUI", "Encore Mode"); TRANSLATE_NOOP("FullscreenUI", "Encore Mode");
TRANSLATE_NOOP("FullscreenUI", "Enhancements"); TRANSLATE_NOOP("FullscreenUI", "Enhancements");
TRANSLATE_NOOP("FullscreenUI", "Ensures every frame generated is displayed for optimal pacing. Disable if you are having speed or sound issues."); TRANSLATE_NOOP("FullscreenUI", "Ensures every frame generated is displayed for optimal pacing. Enable for variable refresh displays, such as GSync/FreeSync. Disable if you are having speed or sound issues.");
TRANSLATE_NOOP("FullscreenUI", "Enter Value"); TRANSLATE_NOOP("FullscreenUI", "Enter Value");
TRANSLATE_NOOP("FullscreenUI", "Enter the name of the input profile you wish to create."); TRANSLATE_NOOP("FullscreenUI", "Enter the name of the input profile you wish to create.");
TRANSLATE_NOOP("FullscreenUI", "Execution Mode"); TRANSLATE_NOOP("FullscreenUI", "Execution Mode");
@ -7177,6 +7191,7 @@ TRANSLATE_NOOP("FullscreenUI", "Force NTSC Timings");
TRANSLATE_NOOP("FullscreenUI", "Forces PAL games to run at NTSC timings, i.e. 60hz. Some PAL games will run at their \"normal\" speeds, while others will break."); TRANSLATE_NOOP("FullscreenUI", "Forces PAL games to run at NTSC timings, i.e. 60hz. Some PAL games will run at their \"normal\" speeds, while others will break.");
TRANSLATE_NOOP("FullscreenUI", "Forces a full rescan of all games previously identified."); TRANSLATE_NOOP("FullscreenUI", "Forces a full rescan of all games previously identified.");
TRANSLATE_NOOP("FullscreenUI", "Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable background music in some games."); TRANSLATE_NOOP("FullscreenUI", "Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable background music in some games.");
TRANSLATE_NOOP("FullscreenUI", "Frame Time Buffer");
TRANSLATE_NOOP("FullscreenUI", "From File..."); TRANSLATE_NOOP("FullscreenUI", "From File...");
TRANSLATE_NOOP("FullscreenUI", "Fullscreen Resolution"); TRANSLATE_NOOP("FullscreenUI", "Fullscreen Resolution");
TRANSLATE_NOOP("FullscreenUI", "GPU Adapter"); TRANSLATE_NOOP("FullscreenUI", "GPU Adapter");
@ -7225,6 +7240,7 @@ TRANSLATE_NOOP("FullscreenUI", "Interface Settings");
TRANSLATE_NOOP("FullscreenUI", "Internal Resolution"); TRANSLATE_NOOP("FullscreenUI", "Internal Resolution");
TRANSLATE_NOOP("FullscreenUI", "Last Played"); TRANSLATE_NOOP("FullscreenUI", "Last Played");
TRANSLATE_NOOP("FullscreenUI", "Last Played: %s"); TRANSLATE_NOOP("FullscreenUI", "Last Played: %s");
TRANSLATE_NOOP("FullscreenUI", "Latency Control");
TRANSLATE_NOOP("FullscreenUI", "Launch Options"); TRANSLATE_NOOP("FullscreenUI", "Launch Options");
TRANSLATE_NOOP("FullscreenUI", "Launch a game by selecting a file/disc image."); TRANSLATE_NOOP("FullscreenUI", "Launch a game by selecting a file/disc image.");
TRANSLATE_NOOP("FullscreenUI", "Launch a game from a file, disc, or starts the console without any disc inserted."); TRANSLATE_NOOP("FullscreenUI", "Launch a game from a file, disc, or starts the console without any disc inserted.");
@ -7334,8 +7350,10 @@ TRANSLATE_NOOP("FullscreenUI", "RAIntegration is being used instead of the built
TRANSLATE_NOOP("FullscreenUI", "Read Speedup"); TRANSLATE_NOOP("FullscreenUI", "Read Speedup");
TRANSLATE_NOOP("FullscreenUI", "Readahead Sectors"); TRANSLATE_NOOP("FullscreenUI", "Readahead Sectors");
TRANSLATE_NOOP("FullscreenUI", "Recompiler Fast Memory Access"); TRANSLATE_NOOP("FullscreenUI", "Recompiler Fast Memory Access");
TRANSLATE_NOOP("FullscreenUI", "Reduce Input Latency");
TRANSLATE_NOOP("FullscreenUI", "Reduces \"wobbly\" polygons by attempting to preserve the fractional component through memory transfers."); TRANSLATE_NOOP("FullscreenUI", "Reduces \"wobbly\" polygons by attempting to preserve the fractional component through memory transfers.");
TRANSLATE_NOOP("FullscreenUI", "Reduces hitches in emulation by reading/decompressing CD data asynchronously on a worker thread."); TRANSLATE_NOOP("FullscreenUI", "Reduces hitches in emulation by reading/decompressing CD data asynchronously on a worker thread.");
TRANSLATE_NOOP("FullscreenUI", "Reduces input latency by delaying the start of frame until closer to the presentation time.");
TRANSLATE_NOOP("FullscreenUI", "Reduces polygon Z-fighting through depth testing. Low compatibility with games."); TRANSLATE_NOOP("FullscreenUI", "Reduces polygon Z-fighting through depth testing. Low compatibility with games.");
TRANSLATE_NOOP("FullscreenUI", "Region"); TRANSLATE_NOOP("FullscreenUI", "Region");
TRANSLATE_NOOP("FullscreenUI", "Region: "); TRANSLATE_NOOP("FullscreenUI", "Region: ");
@ -7454,6 +7472,7 @@ TRANSLATE_NOOP("FullscreenUI", "Smooths out the blockiness of magnified textures
TRANSLATE_NOOP("FullscreenUI", "Sort By"); TRANSLATE_NOOP("FullscreenUI", "Sort By");
TRANSLATE_NOOP("FullscreenUI", "Sort Reversed"); TRANSLATE_NOOP("FullscreenUI", "Sort Reversed");
TRANSLATE_NOOP("FullscreenUI", "Sound Effects"); TRANSLATE_NOOP("FullscreenUI", "Sound Effects");
TRANSLATE_NOOP("FullscreenUI", "Specifies the amount of buffer time added, which reduces the additional sleep time introduced.");
TRANSLATE_NOOP("FullscreenUI", "Spectator Mode"); TRANSLATE_NOOP("FullscreenUI", "Spectator Mode");
TRANSLATE_NOOP("FullscreenUI", "Speed Control"); TRANSLATE_NOOP("FullscreenUI", "Speed Control");
TRANSLATE_NOOP("FullscreenUI", "Speeds up CD-ROM reads by the specified factor. May improve loading speeds in some games, and break others."); TRANSLATE_NOOP("FullscreenUI", "Speeds up CD-ROM reads by the specified factor. May improve loading speeds in some games, and break others.");
@ -7474,7 +7493,7 @@ TRANSLATE_NOOP("FullscreenUI", "Summary");
TRANSLATE_NOOP("FullscreenUI", "Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs."); TRANSLATE_NOOP("FullscreenUI", "Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs.");
TRANSLATE_NOOP("FullscreenUI", "Switches between full screen and windowed when the window is double-clicked."); TRANSLATE_NOOP("FullscreenUI", "Switches between full screen and windowed when the window is double-clicked.");
TRANSLATE_NOOP("FullscreenUI", "Sync To Host Refresh Rate"); TRANSLATE_NOOP("FullscreenUI", "Sync To Host Refresh Rate");
TRANSLATE_NOOP("FullscreenUI", "Synchronizes presentation of the console's frames to the host. Enable for smoother animations."); TRANSLATE_NOOP("FullscreenUI", "Synchronizes presentation of the console's frames to the host. GSync/FreeSync users should enable Optimal Frame Pacing instead.");
TRANSLATE_NOOP("FullscreenUI", "Temporarily disables all enhancements, useful when testing."); TRANSLATE_NOOP("FullscreenUI", "Temporarily disables all enhancements, useful when testing.");
TRANSLATE_NOOP("FullscreenUI", "Test Unofficial Achievements"); TRANSLATE_NOOP("FullscreenUI", "Test Unofficial Achievements");
TRANSLATE_NOOP("FullscreenUI", "Texture Dumping"); TRANSLATE_NOOP("FullscreenUI", "Texture Dumping");
@ -7522,8 +7541,8 @@ TRANSLATE_NOOP("FullscreenUI", "Uses game-specific settings for controllers for
TRANSLATE_NOOP("FullscreenUI", "Uses perspective-correct interpolation for colors, which can improve visuals in some games."); TRANSLATE_NOOP("FullscreenUI", "Uses perspective-correct interpolation for colors, which can improve visuals in some games.");
TRANSLATE_NOOP("FullscreenUI", "Uses perspective-correct interpolation for texture coordinates, straightening out warped textures."); TRANSLATE_NOOP("FullscreenUI", "Uses perspective-correct interpolation for texture coordinates, straightening out warped textures.");
TRANSLATE_NOOP("FullscreenUI", "Uses screen positions to resolve PGXP data. May improve visuals in some games."); TRANSLATE_NOOP("FullscreenUI", "Uses screen positions to resolve PGXP data. May improve visuals in some games.");
TRANSLATE_NOOP("FullscreenUI", "VSync");
TRANSLATE_NOOP("FullscreenUI", "Value: {} | Default: {} | Minimum: {} | Maximum: {}"); TRANSLATE_NOOP("FullscreenUI", "Value: {} | Default: {} | Minimum: {} | Maximum: {}");
TRANSLATE_NOOP("FullscreenUI", "Vertical Sync (VSync)");
TRANSLATE_NOOP("FullscreenUI", "When enabled and logged in, DuckStation will scan for achievements on startup."); TRANSLATE_NOOP("FullscreenUI", "When enabled and logged in, DuckStation will scan for achievements on startup.");
TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will assume all achievements are locked and not send any unlock notifications to the server."); TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will assume all achievements are locked and not send any unlock notifications to the server.");
TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements."); TRANSLATE_NOOP("FullscreenUI", "When enabled, DuckStation will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements.");

View File

@ -349,6 +349,12 @@ void ImGuiManager::DrawPerformanceOverlay()
DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255));
} }
if (g_settings.display_show_latency_stats)
{
System::FormatLatencyStats(text);
DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255));
}
if (g_settings.display_show_cpu_usage) if (g_settings.display_show_cpu_usage)
{ {
text.format("{:.2f}ms | {:.2f}ms | {:.2f}ms", System::GetMinimumFrameTime(), System::GetAverageFrameTime(), text.format("{:.2f}ms | {:.2f}ms | {:.2f}ms", System::GetMinimumFrameTime(), System::GetAverageFrameTime(),
@ -410,15 +416,6 @@ void ImGuiManager::DrawPerformanceOverlay()
FormatProcessorStat(text, System::GetSWThreadUsage(), System::GetSWThreadAverageTime()); FormatProcessorStat(text, System::GetSWThreadUsage(), System::GetSWThreadAverageTime());
DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255));
} }
#if 0
{
AudioStream* stream = g_spu.GetOutputStream();
const u32 frames = stream->GetBufferedFramesRelaxed();
text.fmt("Audio: {:<4u}f/{:<3u}ms", frames, AudioStream::GetMSForBufferSize(stream->GetSampleRate(), frames));
DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255));
}
#endif
} }
if (g_settings.display_show_gpu_usage && g_gpu_device->IsGPUTimingEnabled()) if (g_settings.display_show_gpu_usage && g_gpu_device->IsGPUTimingEnabled())

View File

@ -267,6 +267,9 @@ void Settings::Load(SettingsInterface& si)
display_screenshot_quality = static_cast<u8>( display_screenshot_quality = static_cast<u8>(
std::clamp<u32>(si.GetUIntValue("Display", "ScreenshotQuality", DEFAULT_DISPLAY_SCREENSHOT_QUALITY), 1, 100)); std::clamp<u32>(si.GetUIntValue("Display", "ScreenshotQuality", DEFAULT_DISPLAY_SCREENSHOT_QUALITY), 1, 100));
display_optimal_frame_pacing = si.GetBoolValue("Display", "OptimalFramePacing", false); display_optimal_frame_pacing = si.GetBoolValue("Display", "OptimalFramePacing", false);
display_pre_frame_sleep = si.GetBoolValue("Display", "PreFrameSleep", false);
display_pre_frame_sleep_buffer =
si.GetFloatValue("Display", "PreFrameSleepBuffer", DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER);
display_vsync = si.GetBoolValue("Display", "VSync", false); display_vsync = si.GetBoolValue("Display", "VSync", false);
display_force_4_3_for_24bit = si.GetBoolValue("Display", "Force4_3For24Bit", false); display_force_4_3_for_24bit = si.GetBoolValue("Display", "Force4_3For24Bit", false);
display_active_start_offset = static_cast<s16>(si.GetIntValue("Display", "ActiveStartOffset", 0)); display_active_start_offset = static_cast<s16>(si.GetIntValue("Display", "ActiveStartOffset", 0));
@ -278,6 +281,7 @@ void Settings::Load(SettingsInterface& si)
display_show_speed = si.GetBoolValue("Display", "ShowSpeed", false); display_show_speed = si.GetBoolValue("Display", "ShowSpeed", false);
display_show_gpu_stats = si.GetBoolValue("Display", "ShowGPUStatistics", false); display_show_gpu_stats = si.GetBoolValue("Display", "ShowGPUStatistics", false);
display_show_resolution = si.GetBoolValue("Display", "ShowResolution", false); display_show_resolution = si.GetBoolValue("Display", "ShowResolution", false);
display_show_latency_stats = si.GetBoolValue("Display", "ShowLatencyStatistics", false);
display_show_cpu_usage = si.GetBoolValue("Display", "ShowCPU", false); display_show_cpu_usage = si.GetBoolValue("Display", "ShowCPU", false);
display_show_gpu_usage = si.GetBoolValue("Display", "ShowGPU", false); display_show_gpu_usage = si.GetBoolValue("Display", "ShowGPU", false);
display_show_frame_times = si.GetBoolValue("Display", "ShowFrameTimes", false); display_show_frame_times = si.GetBoolValue("Display", "ShowFrameTimes", false);
@ -521,6 +525,8 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const
si.SetStringValue("Display", "Alignment", GetDisplayAlignmentName(display_alignment)); si.SetStringValue("Display", "Alignment", GetDisplayAlignmentName(display_alignment));
si.SetStringValue("Display", "Scaling", GetDisplayScalingName(display_scaling)); si.SetStringValue("Display", "Scaling", GetDisplayScalingName(display_scaling));
si.SetBoolValue("Display", "OptimalFramePacing", display_optimal_frame_pacing); si.SetBoolValue("Display", "OptimalFramePacing", display_optimal_frame_pacing);
si.SetBoolValue("Display", "PreFrameSleep", display_pre_frame_sleep);
si.SetFloatValue("Display", "PreFrameSleepBuffer", display_pre_frame_sleep_buffer);
si.SetBoolValue("Display", "VSync", display_vsync); si.SetBoolValue("Display", "VSync", display_vsync);
si.SetStringValue("Display", "ExclusiveFullscreenControl", si.SetStringValue("Display", "ExclusiveFullscreenControl",
GetDisplayExclusiveFullscreenControlName(display_exclusive_fullscreen_control)); GetDisplayExclusiveFullscreenControlName(display_exclusive_fullscreen_control));
@ -535,6 +541,7 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const
si.SetBoolValue("Display", "ShowFPS", display_show_fps); si.SetBoolValue("Display", "ShowFPS", display_show_fps);
si.SetBoolValue("Display", "ShowSpeed", display_show_speed); si.SetBoolValue("Display", "ShowSpeed", display_show_speed);
si.SetBoolValue("Display", "ShowResolution", display_show_resolution); si.SetBoolValue("Display", "ShowResolution", display_show_resolution);
si.SetBoolValue("Display", "ShowLatencyStatistics", display_show_latency_stats);
si.SetBoolValue("Display", "ShowGPUStatistics", display_show_gpu_stats); si.SetBoolValue("Display", "ShowGPUStatistics", display_show_gpu_stats);
si.SetBoolValue("Display", "ShowCPU", display_show_cpu_usage); si.SetBoolValue("Display", "ShowCPU", display_show_cpu_usage);
si.SetBoolValue("Display", "ShowGPU", display_show_gpu_usage); si.SetBoolValue("Display", "ShowGPU", display_show_gpu_usage);

View File

@ -146,6 +146,7 @@ struct Settings
s8 display_line_start_offset = 0; s8 display_line_start_offset = 0;
s8 display_line_end_offset = 0; s8 display_line_end_offset = 0;
bool display_optimal_frame_pacing : 1 = false; bool display_optimal_frame_pacing : 1 = false;
bool display_pre_frame_sleep : 1 = false;
bool display_vsync : 1 = false; bool display_vsync : 1 = false;
bool display_force_4_3_for_24bit : 1 = false; bool display_force_4_3_for_24bit : 1 = false;
bool gpu_24bit_chroma_smoothing : 1 = false; bool gpu_24bit_chroma_smoothing : 1 = false;
@ -154,6 +155,7 @@ struct Settings
bool display_show_speed : 1 = false; bool display_show_speed : 1 = false;
bool display_show_gpu_stats : 1 = false; bool display_show_gpu_stats : 1 = false;
bool display_show_resolution : 1 = false; bool display_show_resolution : 1 = false;
bool display_show_latency_stats : 1 = false;
bool display_show_cpu_usage : 1 = false; bool display_show_cpu_usage : 1 = false;
bool display_show_gpu_usage : 1 = false; bool display_show_gpu_usage : 1 = false;
bool display_show_frame_times : 1 = false; bool display_show_frame_times : 1 = false;
@ -161,8 +163,9 @@ struct Settings
bool display_show_inputs : 1 = false; bool display_show_inputs : 1 = false;
bool display_show_enhancements : 1 = false; bool display_show_enhancements : 1 = false;
bool display_stretch_vertically : 1 = false; bool display_stretch_vertically : 1 = false;
float display_osd_scale = 100.0f; float display_pre_frame_sleep_buffer = DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER;
float display_max_fps = DEFAULT_DISPLAY_MAX_FPS; float display_max_fps = DEFAULT_DISPLAY_MAX_FPS;
float display_osd_scale = 100.0f;
float gpu_pgxp_tolerance = -1.0f; float gpu_pgxp_tolerance = -1.0f;
float gpu_pgxp_depth_clear_threshold = DEFAULT_GPU_PGXP_DEPTH_THRESHOLD / GPU_PGXP_DEPTH_THRESHOLD_SCALE; float gpu_pgxp_depth_clear_threshold = DEFAULT_GPU_PGXP_DEPTH_THRESHOLD / GPU_PGXP_DEPTH_THRESHOLD_SCALE;
@ -498,6 +501,7 @@ struct Settings
static constexpr DisplayScreenshotMode DEFAULT_DISPLAY_SCREENSHOT_MODE = DisplayScreenshotMode::ScreenResolution; static constexpr DisplayScreenshotMode DEFAULT_DISPLAY_SCREENSHOT_MODE = DisplayScreenshotMode::ScreenResolution;
static constexpr DisplayScreenshotFormat DEFAULT_DISPLAY_SCREENSHOT_FORMAT = DisplayScreenshotFormat::PNG; static constexpr DisplayScreenshotFormat DEFAULT_DISPLAY_SCREENSHOT_FORMAT = DisplayScreenshotFormat::PNG;
static constexpr u8 DEFAULT_DISPLAY_SCREENSHOT_QUALITY = 85; static constexpr u8 DEFAULT_DISPLAY_SCREENSHOT_QUALITY = 85;
static constexpr float DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER = 2.0f;
static constexpr float DEFAULT_OSD_SCALE = 100.0f; static constexpr float DEFAULT_OSD_SCALE = 100.0f;
static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8; static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8;

View File

@ -45,6 +45,7 @@
#include "util/postprocessing.h" #include "util/postprocessing.h"
#include "util/state_wrapper.h" #include "util/state_wrapper.h"
#include "common/align.h"
#include "common/error.h" #include "common/error.h"
#include "common/file_system.h" #include "common/file_system.h"
#include "common/log.h" #include "common/log.h"
@ -113,6 +114,9 @@ static void LogUnsafeSettingsToConsole(const std::string& messages);
/// Throttles the system, i.e. sleeps until it's time to execute the next frame. /// Throttles the system, i.e. sleeps until it's time to execute the next frame.
static void Throttle(Common::Timer::Value current_time); static void Throttle(Common::Timer::Value current_time);
static void UpdatePerformanceCounters();
static void AccumulatePreFrameSleepTime();
static void UpdatePreFrameSleepTime();
static void SetRewinding(bool enabled); static void SetRewinding(bool enabled);
static bool SaveRewindState(); static bool SaveRewindState();
@ -166,12 +170,6 @@ static const GameDatabase::Entry* s_running_game_entry = nullptr;
static System::GameHash s_running_game_hash; static System::GameHash s_running_game_hash;
static bool s_was_fast_booted; static bool s_was_fast_booted;
static float s_throttle_frequency = 0.0f;
static float s_target_speed = 0.0f;
static Common::Timer::Value s_frame_period = 0;
static Common::Timer::Value s_next_frame_time = 0;
static bool s_last_frame_skipped = false;
static bool s_system_executing = false; static bool s_system_executing = false;
static bool s_system_interrupted = false; static bool s_system_interrupted = false;
static bool s_frame_step_request = false; static bool s_frame_step_request = false;
@ -179,7 +177,20 @@ static bool s_fast_forward_enabled = false;
static bool s_turbo_enabled = false; static bool s_turbo_enabled = false;
static bool s_throttler_enabled = false; static bool s_throttler_enabled = false;
static bool s_optimal_frame_pacing = false; static bool s_optimal_frame_pacing = false;
static bool s_pre_frame_sleep = false;
static bool s_syncing_to_host = false; static bool s_syncing_to_host = false;
static bool s_last_frame_skipped = false;
static float s_throttle_frequency = 0.0f;
static float s_target_speed = 0.0f;
static Common::Timer::Value s_frame_period = 0;
static Common::Timer::Value s_next_frame_time = 0;
static Common::Timer::Value s_frame_start_time = 0;
static Common::Timer::Value s_last_active_frame_time = 0;
static Common::Timer::Value s_pre_frame_sleep_time = 0;
static Common::Timer::Value s_max_active_frame_time = 0;
static float s_average_frame_time_accumulator = 0.0f; static float s_average_frame_time_accumulator = 0.0f;
static float s_minimum_frame_time_accumulator = 0.0f; static float s_minimum_frame_time_accumulator = 0.0f;
@ -1861,7 +1872,15 @@ void System::FrameDone()
SaveRunaheadState(); SaveRunaheadState();
} }
const Common::Timer::Value current_time = Common::Timer::GetCurrentValue(); Common::Timer::Value current_time = Common::Timer::GetCurrentValue();
// pre-frame sleep accounting (input lag reduction)
const Common::Timer::Value pre_frame_sleep_until = s_next_frame_time + s_pre_frame_sleep_time;
s_last_active_frame_time = current_time - s_frame_start_time;
if (s_pre_frame_sleep)
AccumulatePreFrameSleepTime();
// explicit present (frame pacing)
if (current_time < s_next_frame_time || s_syncing_to_host || s_optimal_frame_pacing || s_last_frame_skipped) if (current_time < s_next_frame_time || s_syncing_to_host || s_optimal_frame_pacing || s_last_frame_skipped)
{ {
const bool throttle_before_present = (s_optimal_frame_pacing && s_throttler_enabled && !IsExecutionInterrupted()); const bool throttle_before_present = (s_optimal_frame_pacing && s_throttler_enabled && !IsExecutionInterrupted());
@ -1890,6 +1909,25 @@ void System::FrameDone()
Throttle(current_time); Throttle(current_time);
} }
// pre-frame sleep (input lag reduction)
current_time = Common::Timer::GetCurrentValue();
if (s_pre_frame_sleep)
{
// don't sleep if it's under 1ms, because we're just going to overshoot (or spin).
if (pre_frame_sleep_until > current_time &&
Common::Timer::ConvertValueToMilliseconds(pre_frame_sleep_until - current_time) >= 1)
{
Common::Timer::SleepUntil(pre_frame_sleep_until, true);
current_time = Common::Timer::GetCurrentValue();
}
else
{
Log_WarningPrint("Skipping pre-frame sleep");
}
}
s_frame_start_time = current_time;
// Input poll already done above // Input poll already done above
if (s_runahead_frames == 0) if (s_runahead_frames == 0)
{ {
@ -1940,6 +1978,7 @@ void System::UpdateThrottlePeriod()
void System::ResetThrottler() void System::ResetThrottler()
{ {
s_next_frame_time = Common::Timer::GetCurrentValue() + s_frame_period; s_next_frame_time = Common::Timer::GetCurrentValue() + s_frame_period;
s_pre_frame_sleep_time = 0;
} }
void System::Throttle(Common::Timer::Value current_time) void System::Throttle(Common::Timer::Value current_time)
@ -2624,6 +2663,9 @@ void System::UpdatePerformanceCounters()
if (g_settings.display_show_gpu_stats) if (g_settings.display_show_gpu_stats)
g_gpu->UpdateStatistics(frames_run); g_gpu->UpdateStatistics(frames_run);
if (s_pre_frame_sleep)
UpdatePreFrameSleepTime();
Log_VerbosePrintf("FPS: %.2f VPS: %.2f CPU: %.2f GPU: %.2f Average: %.2fms Min: %.2fms Max: %.2f ms", s_fps, s_vps, Log_VerbosePrintf("FPS: %.2f VPS: %.2f CPU: %.2f GPU: %.2f Average: %.2fms Min: %.2fms Max: %.2f ms", s_fps, s_vps,
s_cpu_thread_usage, s_gpu_usage, s_average_frame_time, s_minimum_frame_time, s_maximum_frame_time); s_cpu_thread_usage, s_gpu_usage, s_average_frame_time, s_minimum_frame_time, s_maximum_frame_time);
@ -2649,6 +2691,56 @@ void System::ResetPerformanceCounters()
ResetThrottler(); ResetThrottler();
} }
void System::AccumulatePreFrameSleepTime()
{
DebugAssert(s_pre_frame_sleep);
s_max_active_frame_time = std::max(s_max_active_frame_time, s_last_active_frame_time);
// in case one frame runs over, adjust to compensate
const Common::Timer::Value max_sleep_time_for_this_frame =
s_frame_period - std::min(s_last_active_frame_time, s_frame_period);
if (max_sleep_time_for_this_frame < s_pre_frame_sleep_time)
{
s_pre_frame_sleep_time = Common::AlignDown(max_sleep_time_for_this_frame,
static_cast<unsigned int>(Common::Timer::ConvertMillisecondsToValue(1)));
Log_DevFmt("Adjust pre-frame time to {} ms due to overrun of {} ms",
Common::Timer::ConvertValueToMilliseconds(s_pre_frame_sleep_time),
Common::Timer::ConvertValueToMilliseconds(s_last_active_frame_time));
}
}
void System::UpdatePreFrameSleepTime()
{
DebugAssert(s_pre_frame_sleep);
const Common::Timer::Value expected_frame_time =
s_max_active_frame_time + Common::Timer::ConvertMillisecondsToValue(g_settings.display_pre_frame_sleep_buffer);
s_pre_frame_sleep_time = Common::AlignDown(s_frame_period - std::min(expected_frame_time, s_frame_period),
static_cast<unsigned int>(Common::Timer::ConvertMillisecondsToValue(1)));
Log_DevFmt("Set pre-frame time to {} ms (expected frame time of {} ms)",
Common::Timer::ConvertValueToMilliseconds(s_pre_frame_sleep_time),
Common::Timer::ConvertValueToMilliseconds(expected_frame_time));
s_max_active_frame_time = 0;
}
void System::FormatLatencyStats(SmallStringBase& str)
{
AudioStream* audio_stream = SPU::GetOutputStream();
const u32 audio_latency =
AudioStream::GetMSForBufferSize(audio_stream->GetSampleRate(), audio_stream->GetBufferedFramesRelaxed());
const double active_frame_time = std::ceil(Common::Timer::ConvertValueToMilliseconds(s_last_active_frame_time));
const double pre_frame_time = std::ceil(Common::Timer::ConvertValueToMilliseconds(s_pre_frame_sleep_time));
const double input_latency = std::ceil(
Common::Timer::ConvertValueToMilliseconds(s_frame_period - s_pre_frame_sleep_time) -
Common::Timer::ConvertValueToMilliseconds(static_cast<Common::Timer::Value>(s_runahead_frames) * s_frame_period));
str.format("AF: {:.0f}ms | PF: {:.0f}ms | IL: {:.0f}ms | AL: {}ms", active_frame_time, pre_frame_time, input_latency,
audio_latency);
}
void System::UpdateSpeedLimiterState() void System::UpdateSpeedLimiterState()
{ {
const float old_target_speed = s_target_speed; const float old_target_speed = s_target_speed;
@ -2657,6 +2749,7 @@ void System::UpdateSpeedLimiterState()
(s_fast_forward_enabled ? g_settings.fast_forward_speed : g_settings.emulation_speed); (s_fast_forward_enabled ? g_settings.fast_forward_speed : g_settings.emulation_speed);
s_throttler_enabled = (s_target_speed != 0.0f); s_throttler_enabled = (s_target_speed != 0.0f);
s_optimal_frame_pacing = s_throttler_enabled && g_settings.display_optimal_frame_pacing; s_optimal_frame_pacing = s_throttler_enabled && g_settings.display_optimal_frame_pacing;
s_pre_frame_sleep = s_throttler_enabled && g_settings.display_pre_frame_sleep;
s_syncing_to_host = false; s_syncing_to_host = false;
if (g_settings.sync_to_host_refresh_rate && (g_settings.audio_stretch_mode != AudioStretchMode::Off) && if (g_settings.sync_to_host_refresh_rate && (g_settings.audio_stretch_mode != AudioStretchMode::Off) &&
@ -3786,6 +3879,8 @@ void System::CheckForSettingsChanges(const Settings& old_settings)
g_settings.fast_forward_speed != old_settings.fast_forward_speed || g_settings.fast_forward_speed != old_settings.fast_forward_speed ||
g_settings.display_max_fps != old_settings.display_max_fps || g_settings.display_max_fps != old_settings.display_max_fps ||
g_settings.display_optimal_frame_pacing != old_settings.display_optimal_frame_pacing || g_settings.display_optimal_frame_pacing != old_settings.display_optimal_frame_pacing ||
g_settings.display_pre_frame_sleep != old_settings.display_pre_frame_sleep ||
g_settings.display_pre_frame_sleep_buffer != old_settings.display_pre_frame_sleep_buffer ||
g_settings.display_vsync != old_settings.display_vsync || g_settings.display_vsync != old_settings.display_vsync ||
g_settings.sync_to_host_refresh_rate != old_settings.sync_to_host_refresh_rate) g_settings.sync_to_host_refresh_rate != old_settings.sync_to_host_refresh_rate)
{ {

View File

@ -2,10 +2,13 @@
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
#pragma once #pragma once
#include "common/timer.h"
#include "settings.h" #include "settings.h"
#include "timing_event.h" #include "timing_event.h"
#include "types.h" #include "types.h"
#include "common/timer.h"
#include <memory> #include <memory>
#include <optional> #include <optional>
#include <string> #include <string>
@ -13,6 +16,7 @@
class ByteStream; class ByteStream;
class CDImage; class CDImage;
class Error; class Error;
class SmallStringBase;
class StateWrapper; class StateWrapper;
class Controller; class Controller;
@ -230,6 +234,7 @@ float GetGPUUsage();
float GetGPUAverageTime(); float GetGPUAverageTime();
const FrameTimeHistory& GetFrameTimeHistory(); const FrameTimeHistory& GetFrameTimeHistory();
u32 GetFrameTimeHistoryPos(); u32 GetFrameTimeHistoryPos();
void FormatLatencyStats(SmallStringBase& str);
/// Loads global settings (i.e. EmuConfig). /// Loads global settings (i.e. EmuConfig).
void LoadSettings(bool display_osd_messages); void LoadSettings(bool display_osd_messages);
@ -282,8 +287,6 @@ void SetThrottleFrequency(float frequency);
/// Updates the throttle period, call when target emulation speed changes. /// Updates the throttle period, call when target emulation speed changes.
void UpdateThrottlePeriod(); void UpdateThrottlePeriod();
void ResetThrottler(); void ResetThrottler();
void UpdatePerformanceCounters();
void ResetPerformanceCounters(); void ResetPerformanceCounters();
/// Resets vsync/max present fps state. /// Resets vsync/max present fps state.

View File

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com> // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
#include "emulationsettingswidget.h" #include "emulationsettingswidget.h"
@ -19,6 +19,9 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* dialog, QWidget
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.vsync, "Display", "VSync", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.vsync, "Display", "VSync", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.syncToHostRefreshRate, "Main", "SyncToHostRefreshRate", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.syncToHostRefreshRate, "Main", "SyncToHostRefreshRate", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.optimalFramePacing, "Display", "OptimalFramePacing", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.optimalFramePacing, "Display", "OptimalFramePacing", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.preFrameSleep, "Display", "PreFrameSleep", false);
SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.preFrameSleepBuffer, "Display", "PreFrameSleepBuffer",
Settings::DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.rewindEnable, "Main", "RewindEnable", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.rewindEnable, "Main", "RewindEnable", false);
SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.rewindSaveFrequency, "Main", "RewindFrequency", 10.0f); SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.rewindSaveFrequency, "Main", "RewindFrequency", 10.0f);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.rewindSaveSlots, "Main", "RewindSaveSlots", 10); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.rewindSaveSlots, "Main", "RewindSaveSlots", 10);
@ -69,6 +72,9 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* dialog, QWidget
connect(m_ui.turboSpeed, QOverload<int>::of(&QComboBox::currentIndexChanged), this, connect(m_ui.turboSpeed, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&EmulationSettingsWidget::onTurboSpeedIndexChanged); &EmulationSettingsWidget::onTurboSpeedIndexChanged);
connect(m_ui.vsync, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::onVSyncChanged); connect(m_ui.vsync, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::onVSyncChanged);
connect(m_ui.optimalFramePacing, &QCheckBox::checkStateChanged, this,
&EmulationSettingsWidget::onOptimalFramePacingChanged);
connect(m_ui.preFrameSleep, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::onPreFrameSleepChanged);
connect(m_ui.rewindEnable, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::updateRewind); connect(m_ui.rewindEnable, &QCheckBox::checkStateChanged, this, &EmulationSettingsWidget::updateRewind);
connect(m_ui.rewindSaveFrequency, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, connect(m_ui.rewindSaveFrequency, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this,
@ -96,16 +102,25 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* dialog, QWidget
"instead.</strong>")); "instead.</strong>"));
dialog->registerWidgetHelp( dialog->registerWidgetHelp(
m_ui.syncToHostRefreshRate, tr("Sync To Host Refresh Rate"), tr("Unchecked"), m_ui.syncToHostRefreshRate, tr("Sync To Host Refresh Rate"), tr("Unchecked"),
tr("Adjusts the emulation speed so the console's refresh rate matches the host's refresh rate when both VSync and " tr(
"Audio Resampling settings are enabled. This results in the smoothest animations possible, at the cost of " "Adjusts the emulation speed so the console's refresh rate matches the host's refresh rate when VSync is "
"potentially increasing the emulation speed by less than 1%. Sync To Host Refresh Rate will not take effect if " "enabled. This results in the smoothest animations possible, at the cost of potentially increasing the emulation "
"the console's refresh rate is too far from the host's refresh rate. Users with variable refresh rate displays " "speed by less than 1%. Sync To Host Refresh Rate will not take effect if the console's refresh rate is too far "
"should disable this option.")); "from the host's refresh rate. Users with variable refresh rate displays should disable this option."));
dialog->registerWidgetHelp( dialog->registerWidgetHelp(
m_ui.optimalFramePacing, tr("Optimal Frame Pacing"), tr("Unchecked"), m_ui.optimalFramePacing, tr("Optimal Frame Pacing"), tr("Unchecked"),
tr("Enabling this option will ensure every frame the console renders is displayed to the screen, at a consistent " tr("Enabling this option will ensure every frame the console renders is displayed to the screen, at a consistent "
"rate, for optimal frame pacing. If you have a GSync/FreeSync display, enable this option. If you are having " "rate, for optimal frame pacing. If you have a GSync/FreeSync display, enable this option. If you are having "
"difficulties maintaining full speed, or are getting audio glitches, try disabling this option.")); "difficulties maintaining full speed, or are getting audio glitches, try disabling this option."));
dialog->registerWidgetHelp(
m_ui.preFrameSleep, tr("Reduce Input Latency"), tr("Unchecked"),
tr("Reduces input latency by delaying the start of frame until closer to the presentation time. This may cause "
"dropped frames on slower systems with higher frame time variance, if the buffer size is not sufficient."));
dialog->registerWidgetHelp(m_ui.preFrameSleepBuffer, tr("Frame Time Buffer"),
tr("%1 ms").arg(Settings::DEFAULT_DISPLAY_PRE_FRAME_SLEEP_BUFFER),
tr("Specifies the amount of buffer time added, which reduces the additional sleep time "
"introduced. Higher values increase input latency, but decrease the risk of overrun, "
"or missed frames. Lower values require faster hardware."));
dialog->registerWidgetHelp( dialog->registerWidgetHelp(
m_ui.rewindEnable, tr("Rewinding"), tr("Unchecked"), m_ui.rewindEnable, tr("Rewinding"), tr("Unchecked"),
tr("<b>Enable Rewinding:</b> Saves state periodically so you can rewind any mistakes while playing.<br> " tr("<b>Enable Rewinding:</b> Saves state periodically so you can rewind any mistakes while playing.<br> "
@ -119,6 +134,7 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsWindow* dialog, QWidget
"Simulates the system ahead of time and rolls back/replays to reduce input lag. Very high system requirements.")); "Simulates the system ahead of time and rolls back/replays to reduce input lag. Very high system requirements."));
onVSyncChanged(); onVSyncChanged();
onOptimalFramePacingChanged();
updateRewind(); updateRewind();
} }
@ -190,6 +206,21 @@ void EmulationSettingsWidget::onVSyncChanged()
m_ui.syncToHostRefreshRate->setEnabled(vsync); m_ui.syncToHostRefreshRate->setEnabled(vsync);
} }
void EmulationSettingsWidget::onOptimalFramePacingChanged()
{
const bool optimal_frame_pacing_enabled = m_dialog->getEffectiveBoolValue("Display", "OptimalFramePacing", false);
m_ui.preFrameSleep->setEnabled(optimal_frame_pacing_enabled);
onPreFrameSleepChanged();
}
void EmulationSettingsWidget::onPreFrameSleepChanged()
{
const bool pre_frame_sleep_enabled = m_dialog->getEffectiveBoolValue("Display", "PreFrameSleep", false);
const bool show_buffer_size = (m_ui.preFrameSleep->isEnabled() && pre_frame_sleep_enabled);
m_ui.preFrameSleepBuffer->setVisible(show_buffer_size);
m_ui.preFrameSleepBufferLabel->setVisible(show_buffer_size);
}
void EmulationSettingsWidget::updateRewind() void EmulationSettingsWidget::updateRewind()
{ {
const bool rewind_enabled = m_dialog->getEffectiveBoolValue("Main", "RewindEnable", false); const bool rewind_enabled = m_dialog->getEffectiveBoolValue("Main", "RewindEnable", false);

View File

@ -22,6 +22,8 @@ private Q_SLOTS:
void onFastForwardSpeedIndexChanged(int index); void onFastForwardSpeedIndexChanged(int index);
void onTurboSpeedIndexChanged(int index); void onTurboSpeedIndexChanged(int index);
void onVSyncChanged(); void onVSyncChanged();
void onOptimalFramePacingChanged();
void onPreFrameSleepChanged();
void updateRewind(); void updateRewind();
private: private:

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>568</width> <width>618</width>
<height>369</height> <height>440</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -59,7 +59,14 @@
<item row="2" column="1"> <item row="2" column="1">
<widget class="QComboBox" name="turboSpeed"/> <widget class="QComboBox" name="turboSpeed"/>
</item> </item>
<item row="3" column="0" colspan="2"> </layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Latency Control</string>
</property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="vsync"> <widget class="QCheckBox" name="vsync">
@ -68,7 +75,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="1">
<widget class="QCheckBox" name="syncToHostRefreshRate"> <widget class="QCheckBox" name="syncToHostRefreshRate">
<property name="text"> <property name="text">
<string>Sync To Host Refresh Rate</string> <string>Sync To Host Refresh Rate</string>
@ -82,6 +89,35 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QCheckBox" name="preFrameSleep">
<property name="text">
<string>Reduce Input Latency</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="preFrameSleepBufferLayout" stretch="0,1">
<item>
<widget class="QLabel" name="preFrameSleepBufferLabel">
<property name="text">
<string>Frame Time Buffer:</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="preFrameSleepBuffer">
<property name="suffix">
<string> Milliseconds</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="singleStep">
<double>0.500000000000000</double>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>

View File

@ -174,6 +174,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showGPU, "Display", "ShowGPU", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showGPU, "Display", "ShowGPU", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showInput, "Display", "ShowInputs", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showInput, "Display", "ShowInputs", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showGPUStatistics, "Display", "ShowGPUStatistics", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showGPUStatistics, "Display", "ShowGPUStatistics", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showLatencyStatistics, "Display", "ShowLatencyStatistics",
false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showStatusIndicators, "Display", "ShowStatusIndicators", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showStatusIndicators, "Display", "ShowStatusIndicators", true);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showFrameTimes, "Display", "ShowFrameTimes", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showFrameTimes, "Display", "ShowFrameTimes", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showSettings, "Display", "ShowEnhancements", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.showSettings, "Display", "ShowEnhancements", false);
@ -426,6 +428,9 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
tr("Shows the host's GPU usage in the top-right corner of the display.")); tr("Shows the host's GPU usage in the top-right corner of the display."));
dialog->registerWidgetHelp(m_ui.showGPUStatistics, tr("Show GPU Statistics"), tr("Unchecked"), dialog->registerWidgetHelp(m_ui.showGPUStatistics, tr("Show GPU Statistics"), tr("Unchecked"),
tr("Shows information about the emulated GPU in the top-right corner of the display.")); tr("Shows information about the emulated GPU in the top-right corner of the display."));
dialog->registerWidgetHelp(
m_ui.showLatencyStatistics, tr("Show Latency Statistics"), tr("Unchecked"),
tr("Shows information about input and audio latency in the top-right corner of the display."));
dialog->registerWidgetHelp( dialog->registerWidgetHelp(
m_ui.showFrameTimes, tr("Show Frame Times"), tr("Unchecked"), m_ui.showFrameTimes, tr("Show Frame Times"), tr("Unchecked"),
tr("Shows the history of frame rendering times as a graph in the top-right corner of the display.")); tr("Shows the history of frame rendering times as a graph in the top-right corner of the display."));

View File

@ -704,20 +704,6 @@
</item> </item>
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="4" column="0">
<widget class="QCheckBox" name="showInput">
<property name="text">
<string>Show Controller Input</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="showStatusIndicators">
<property name="text">
<string>Show Status Indicators</string>
</property>
</widget>
</item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QCheckBox" name="showFPS"> <widget class="QCheckBox" name="showFPS">
<property name="text"> <property name="text">
@ -732,20 +718,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QCheckBox" name="showResolution">
<property name="text">
<string>Show Resolution</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="showSettings">
<property name="text">
<string>Show Settings</string>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QCheckBox" name="showCPU"> <widget class="QCheckBox" name="showCPU">
<property name="text"> <property name="text">
@ -767,17 +739,52 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="2" column="1">
<widget class="QCheckBox" name="showGPU">
<property name="text">
<string>Show GPU Usage</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="showSettings">
<property name="text">
<string>Show Settings</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="showStatusIndicators">
<property name="text">
<string>Show Status Indicators</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="showInput">
<property name="text">
<string>Show Controller Input</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="showFrameTimes"> <widget class="QCheckBox" name="showFrameTimes">
<property name="text"> <property name="text">
<string>Show Frame Times</string> <string>Show Frame Times</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="3" column="1">
<widget class="QCheckBox" name="showGPU"> <widget class="QCheckBox" name="showResolution">
<property name="text"> <property name="text">
<string>Show GPU Usage</string> <string>Show Resolution</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="showLatencyStatistics">
<property name="text">
<string>Show Latency Statistics</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -90,6 +90,8 @@ MemoryScannerWindow::MemoryScannerWindow() : QWidget()
{ {
m_ui.setupUi(this); m_ui.setupUi(this);
connectUi(); connectUi();
m_ui.cheatEngineAddress->setText(tr("Address of RAM for HxD Usage: 0x%1").arg(reinterpret_cast<qulonglong>(Bus::g_unprotected_ram), 16, 16, QChar('0')));
} }
MemoryScannerWindow::~MemoryScannerWindow() = default; MemoryScannerWindow::~MemoryScannerWindow() = default;

View File

@ -152,82 +152,82 @@
<widget class="QComboBox" name="scanOperator"> <widget class="QComboBox" name="scanOperator">
<item> <item>
<property name="text"> <property name="text">
<string>Equal to...</string> <string>Any Value ('New Search' or 'Reset Result Value')</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Not Equal to...</string> <string>Less Than Previous Result</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Greater Than...</string> <string>Less or Equal to Previous Result</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Greater or Equal...</string> <string>Greater Than Previous Result</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Less Than...</string> <string>Greater or Equal to Previous Result</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Less or Equal...</string> <string>Not Equal to Previous Result (Changed Value)</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Increased By...</string> <string>Equal to Previous Result (Unchanged Value)</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Decreased By...</string> <string>Decreased By Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Changed By...</string> <string>Increased By Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Equal to Previous (Unchanged Value)</string> <string>Changed By Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Not Equal to Previous (Changed Value)</string> <string>Equal to Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Greater Than Previous</string> <string>Not Equal to Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Greater or Equal to Previous</string> <string>Less Than Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Less Than Previous</string> <string>Less or Equal to Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Less or Equal to Previous</string> <string>Greater Than Value</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text"> <property name="text">
<string>Any Value</string> <string>Greater or Equal to Value</string>
</property> </property>
</item> </item>
</widget> </widget>
@ -446,6 +446,48 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QTextEdit" name="cheatEngineAddress">
<property name="enabled">
<bool>true</bool>
</property>
<property name="maximumSize">
<size>
<width>833</width>
<height>40</height>
</size>
</property>
<property name="inputMethodHints">
<set>Qt::ImhNone</set>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="acceptRichText">
<bool>false</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextEditable</set>
</property>
<property name="placeholderText">
<string notr="true"/>
</property>
<property name="text">
<string>cheat engine address string</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer_2"> <spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">

View File

@ -2165,82 +2165,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Gleich...</translation> <translation>Gleich...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Ungleich...</translation> <translation>Ungleich...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Größer als...</translation> <translation>Größer als...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Größer gleich...</translation> <translation>Größer gleich...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Kleiner als...</translation> <translation>Kleiner als...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Kleiner gleich...</translation> <translation>Kleiner gleich...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Erhöht durch...</translation> <translation>Erhöht durch...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Verringert durch...</translation> <translation>Verringert durch...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Geändert durch...</translation> <translation>Geändert durch...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Gleich zum Vorherigen (unveränderter Wert)</translation> <translation>Gleich zum Vorherigen (unveränderter Wert)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Ungleich zum Vorherigen (geänderter Wert)</translation> <translation>Ungleich zum Vorherigen (geänderter Wert)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Größer zum Vorherigen</translation> <translation>Größer zum Vorherigen</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Größer gleich zum Vorherigen</translation> <translation>Größer gleich zum Vorherigen</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Kleiner zum Vorherigen</translation> <translation>Kleiner zum Vorherigen</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Kleiner gleich zum Vorherigen</translation> <translation>Kleiner gleich zum Vorherigen</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Beliebiger Wert</translation> <translation>Beliebiger Wert</translation>
</message> </message>
<message> <message>

View File

@ -2179,82 +2179,82 @@ Mensajes sin leer: {}</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Igual a...</translation> <translation>Igual a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Distinto a...</translation> <translation>Distinto a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Mayor que...</translation> <translation>Mayor que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Mayor o igual que...</translation> <translation>Mayor o igual que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Menor que...</translation> <translation>Menor que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Menor o igual que...</translation> <translation>Menor o igual que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Incrementado por...</translation> <translation>Incrementado por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Disminuido por...</translation> <translation>Disminuido por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Reemplazado por...</translation> <translation>Reemplazado por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Igual a valor anterior (sin cambios)</translation> <translation>Igual a valor anterior (sin cambios)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Distinto a valor anterior (con cambios)</translation> <translation>Distinto a valor anterior (con cambios)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Mayor que valor previo</translation> <translation>Mayor que valor previo</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Mayor o igual a valor anterior</translation> <translation>Mayor o igual a valor anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Menor que valor anterior</translation> <translation>Menor que valor anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Menor o igual a valor anterior</translation> <translation>Menor o igual a valor anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Cualquier valor</translation> <translation>Cualquier valor</translation>
</message> </message>
<message> <message>

View File

@ -2172,82 +2172,82 @@ Mensajes sin leer: {}</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Igual a...</translation> <translation>Igual a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Distinto a...</translation> <translation>Distinto a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Mayor que...</translation> <translation>Mayor que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Mayor o igual...</translation> <translation>Mayor o igual...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Menor que...</translation> <translation>Menor que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Menor o igual...</translation> <translation>Menor o igual...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Incrementado por...</translation> <translation>Incrementado por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Decrementado por...</translation> <translation>Decrementado por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Reemplazado por...</translation> <translation>Reemplazado por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Igual a valor previo (sin cambios)</translation> <translation>Igual a valor previo (sin cambios)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Distinto a valor previo (con cambios)</translation> <translation>Distinto a valor previo (con cambios)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Mayor que valor previo</translation> <translation>Mayor que valor previo</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Mayor o igual a valor previo</translation> <translation>Mayor o igual a valor previo</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Menor a valor previo</translation> <translation>Menor a valor previo</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Menor o igual a valor previo</translation> <translation>Menor o igual a valor previo</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Cualquier valor</translation> <translation>Cualquier valor</translation>
</message> </message>
<message> <message>

View File

@ -2167,82 +2167,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Équivaut à...</translation> <translation>Équivaut à...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>N&apos;équivaut pas à...</translation> <translation>N&apos;équivaut pas à...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Supérieur à...</translation> <translation>Supérieur à...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Supérieur ou égal...</translation> <translation>Supérieur ou égal...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Inférieur à...</translation> <translation>Inférieur à...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Inférieur ou égal...</translation> <translation>Inférieur ou égal...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Augmenté par...</translation> <translation>Augmenté par...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Diminué par...</translation> <translation>Diminué par...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Changé par...</translation> <translation>Changé par...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Équivaut au précédent (valeur inchangée)</translation> <translation>Équivaut au précédent (valeur inchangée)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Non-équivalent au précédent (valeur changée)</translation> <translation>Non-équivalent au précédent (valeur changée)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Supérieur au précédent</translation> <translation>Supérieur au précédent</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Supérieur ou égal au précédent</translation> <translation>Supérieur ou égal au précédent</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Inférieur au précédent</translation> <translation>Inférieur au précédent</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Inférieur ou égal ou précédent</translation> <translation>Inférieur ou égal ou précédent</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Toute valeur</translation> <translation>Toute valeur</translation>
</message> </message>
<message> <message>

View File

@ -2164,82 +2164,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>

View File

@ -2167,82 +2167,82 @@ Pesan belum dibaca: {}</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>

View File

@ -2170,82 +2170,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Uguale a...</translation> <translation>Uguale a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Non uguale a...</translation> <translation>Non uguale a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Maggiore di...</translation> <translation>Maggiore di...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Maggiore o uguale a...</translation> <translation>Maggiore o uguale a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Minore di...</translation> <translation>Minore di...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Minore o uguale a...</translation> <translation>Minore o uguale a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Aumentato di...</translation> <translation>Aumentato di...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Diminuito di...</translation> <translation>Diminuito di...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Cambiato di...</translation> <translation>Cambiato di...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Uguale al precedente (valore non cambiato)</translation> <translation>Uguale al precedente (valore non cambiato)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Non uguale al precedente (valore cambiato)</translation> <translation>Non uguale al precedente (valore cambiato)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Maggiore del precedente</translation> <translation>Maggiore del precedente</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Maggiore o uguale al precedente</translation> <translation>Maggiore o uguale al precedente</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Minore del precedente</translation> <translation>Minore del precedente</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Minore o uguale al precedente</translation> <translation>Minore o uguale al precedente</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Qualsiasi valore</translation> <translation>Qualsiasi valore</translation>
</message> </message>
<message> <message>

View File

@ -2164,57 +2164,57 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>&quot;&quot;</translation> <translation>&quot;&quot;</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation> ()</translation> <translation> ()</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation> ()</translation> <translation> ()</translation>
</message> </message>
<message> <message>
@ -2224,27 +2224,27 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>

View File

@ -2178,57 +2178,57 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation> ...</translation> <translation> ...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation> ...</translation> <translation> ...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation> ...</translation> <translation> ...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation> ...</translation> <translation> ...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation> ( )</translation> <translation> ( )</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation> ( )</translation> <translation> ( )</translation>
</message> </message>
<message> <message>
@ -2238,27 +2238,27 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>

View File

@ -2166,82 +2166,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>

View File

@ -12474,83 +12474,83 @@ Czy na pewno chcesz kontynuować?</translation>
<translation>Operator:</translation> <translation>Operator:</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="155"/> <location filename="../memoryscannerwindow.ui" line="205"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Jest równy...</translation> <translation>Jest równy...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="160"/> <location filename="../memoryscannerwindow.ui" line="210"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Nie jest równy...</translation> <translation>Nie jest równy...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="165"/> <location filename="../memoryscannerwindow.ui" line="225"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Większy niż...</translation> <translation>Większy niż...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="170"/> <location filename="../memoryscannerwindow.ui" line="230"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Większy lub równy...</translation> <translation>Większy lub równy...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="175"/> <location filename="../memoryscannerwindow.ui" line="215"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Mniejszy niż...</translation> <translation>Mniejszy niż...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="180"/> <location filename="../memoryscannerwindow.ui" line="220"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Mniejszy lub równy...</translation> <translation>Mniejszy lub równy...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="185"/> <location filename="../memoryscannerwindow.ui" line="195"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Zwiększony o...</translation> <translation>Zwiększony o...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="190"/> <location filename="../memoryscannerwindow.ui" line="190"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Zmniejszony o...</translation> <translation>Zmniejszony o...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="195"/> <location filename="../memoryscannerwindow.ui" line="200"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Zmieniony o...</translation> <translation>Zmieniony o...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="200"/> <location filename="../memoryscannerwindow.ui" line="185"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Równy poprzedniej (niezmieniona wartość)</translation> <translation>Równy poprzedniej (niezmieniona wartość)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="205"/> <location filename="../memoryscannerwindow.ui" line="180"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Nie jest równy poprzedniej (zmieniona wartość)</translation> <translation>Nie jest równy poprzedniej (zmieniona wartość)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="210"/> <location filename="../memoryscannerwindow.ui" line="170"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Większy niż poprzedni</translation> <translation>Większy niż poprzedni</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="215"/> <location filename="../memoryscannerwindow.ui" line="175"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Większy lub równy poprzedniemu</translation> <translation>Większy lub równy poprzedniemu</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="220"/> <location filename="../memoryscannerwindow.ui" line="160"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Mniejszy niż poprzedni</translation> <translation>Mniejszy niż poprzedni</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="225"/> <location filename="../memoryscannerwindow.ui" line="165"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Mniejszy lub równy poprzedniemu</translation> <translation>Mniejszy lub równy poprzedniemu</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="230"/> <location filename="../memoryscannerwindow.ui" line="155"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Dowolna wartość</translation> <translation>Dowolna wartość</translation>
</message> </message>
<message> <message>

View File

@ -12461,83 +12461,83 @@ Tem certeza de que deseja continuar?</translation>
<translation>Operador:</translation> <translation>Operador:</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="155"/> <location filename="../memoryscannerwindow.ui" line="205"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Equivale a...</translation> <translation>Equivale a...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="160"/> <location filename="../memoryscannerwindow.ui" line="210"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Diferente de...</translation> <translation>Diferente de...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="165"/> <location filename="../memoryscannerwindow.ui" line="225"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Maior que...</translation> <translation>Maior que...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="170"/> <location filename="../memoryscannerwindow.ui" line="230"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Maior ou igual...</translation> <translation>Maior ou igual...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="175"/> <location filename="../memoryscannerwindow.ui" line="215"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Menor que...</translation> <translation>Menor que...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="180"/> <location filename="../memoryscannerwindow.ui" line="220"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Menor ou igual...</translation> <translation>Menor ou igual...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="185"/> <location filename="../memoryscannerwindow.ui" line="195"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Aumentado por...</translation> <translation>Aumentado por...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="190"/> <location filename="../memoryscannerwindow.ui" line="190"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Diminuir por...</translation> <translation>Diminuir por...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="195"/> <location filename="../memoryscannerwindow.ui" line="200"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Alterado por...</translation> <translation>Alterado por...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="200"/> <location filename="../memoryscannerwindow.ui" line="185"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Igual ao anteriror (valor inalterado)</translation> <translation>Igual ao anteriror (valor inalterado)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="205"/> <location filename="../memoryscannerwindow.ui" line="180"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Diferente do anterior (valor alterado)</translation> <translation>Diferente do anterior (valor alterado)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="210"/> <location filename="../memoryscannerwindow.ui" line="170"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Maior do que o anterior</translation> <translation>Maior do que o anterior</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="215"/> <location filename="../memoryscannerwindow.ui" line="175"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Maior ou igual ao anterior</translation> <translation>Maior ou igual ao anterior</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="220"/> <location filename="../memoryscannerwindow.ui" line="160"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Menor que o anterior</translation> <translation>Menor que o anterior</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="225"/> <location filename="../memoryscannerwindow.ui" line="165"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Menor ou igual ao anterior</translation> <translation>Menor ou igual ao anterior</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="230"/> <location filename="../memoryscannerwindow.ui" line="155"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Qualquer valor</translation> <translation>Qualquer valor</translation>
</message> </message>
<message> <message>

View File

@ -2165,82 +2165,82 @@ Unread messages: {}</source>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Igual a...</translation> <translation>Igual a...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Diferente de...</translation> <translation>Diferente de...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Maior Que...</translation> <translation>Maior Que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Maior ou Igual...</translation> <translation>Maior ou Igual...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Menor Que...</translation> <translation>Menor Que...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Menor ou Igual...</translation> <translation>Menor ou Igual...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Aumentado Por...</translation> <translation>Aumentado Por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Diminuido Por...</translation> <translation>Diminuido Por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Mudado Por...</translation> <translation>Mudado Por...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Igual ao Anteriror (Valor Inalterado)</translation> <translation>Igual ao Anteriror (Valor Inalterado)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Diferente do Anterior (Valor Alterado)</translation> <translation>Diferente do Anterior (Valor Alterado)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Maior Que o Anterior</translation> <translation>Maior Que o Anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Maior ou Igual ao Anterior</translation> <translation>Maior ou Igual ao Anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Menor que o Anterior</translation> <translation>Menor que o Anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Menor ou Igual ao Anterior</translation> <translation>Menor ou Igual ao Anterior</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Qualquer Valor</translation> <translation>Qualquer Valor</translation>
</message> </message>
<message> <message>

View File

@ -12675,83 +12675,83 @@ Are you sure you want to continue?</source>
<translation type="unfinished">Оператор:</translation> <translation type="unfinished">Оператор:</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="155"/> <location filename="../memoryscannerwindow.ui" line="205"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation type="unfinished">Равно...</translation> <translation type="unfinished">Равно...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="160"/> <location filename="../memoryscannerwindow.ui" line="210"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation type="unfinished">Не равно...</translation> <translation type="unfinished">Не равно...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="165"/> <location filename="../memoryscannerwindow.ui" line="225"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation type="unfinished">Больше, чем...</translation> <translation type="unfinished">Больше, чем...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="170"/> <location filename="../memoryscannerwindow.ui" line="230"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation type="unfinished">Больше или равно...</translation> <translation type="unfinished">Больше или равно...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="175"/> <location filename="../memoryscannerwindow.ui" line="215"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation type="unfinished">Меньше, чем...</translation> <translation type="unfinished">Меньше, чем...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="180"/> <location filename="../memoryscannerwindow.ui" line="220"/>
<source>Less or Equal...</source> <source>Less or Equal Value</source>
<translation type="unfinished">Меньше или равно...</translation> <translation type="unfinished">Меньше или равно...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="185"/> <location filename="../memoryscannerwindow.ui" line="195"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation type="unfinished">Увеличилось на...</translation> <translation type="unfinished">Увеличилось на...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="190"/> <location filename="../memoryscannerwindow.ui" line="190"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation type="unfinished">Уменьшилось на...</translation> <translation type="unfinished">Уменьшилось на...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="195"/> <location filename="../memoryscannerwindow.ui" line="200"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation type="unfinished">Изменилось на...</translation> <translation type="unfinished">Изменилось на...</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="200"/> <location filename="../memoryscannerwindow.ui" line="185"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation type="unfinished">Равно предыдущему (неизменное значение)</translation> <translation type="unfinished">Равно предыдущему (неизменное значение)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="205"/> <location filename="../memoryscannerwindow.ui" line="180"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation type="unfinished">Не равно предыдущему (измененное значение)</translation> <translation type="unfinished">Не равно предыдущему (измененное значение)</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="210"/> <location filename="../memoryscannerwindow.ui" line="170"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation type="unfinished">Больше, чем предыдущий</translation> <translation type="unfinished">Больше, чем предыдущий</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="215"/> <location filename="../memoryscannerwindow.ui" line="175"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation type="unfinished">Больше или равно предыдущему</translation> <translation type="unfinished">Больше или равно предыдущему</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="220"/> <location filename="../memoryscannerwindow.ui" line="160"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation type="unfinished">Меньше, чем предыдущий</translation> <translation type="unfinished">Меньше, чем предыдущий</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="225"/> <location filename="../memoryscannerwindow.ui" line="165"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation type="unfinished">Меньше или равно предыдущему</translation> <translation type="unfinished">Меньше или равно предыдущему</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="230"/> <location filename="../memoryscannerwindow.ui" line="155"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation type="unfinished">Любое значение</translation> <translation type="unfinished">Любое значение</translation>
</message> </message>
<message> <message>

View File

@ -2178,82 +2178,82 @@ Okunmamış Mesajlar: {}</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="296"/> <location filename="../cheatmanagerdialog.ui" line="296"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation>Eşittir Şuna...</translation> <translation>Eşittir Şuna...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="301"/> <location filename="../cheatmanagerdialog.ui" line="301"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation>Eşit Değildir Şuna...</translation> <translation>Eşit Değildir Şuna...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="306"/> <location filename="../cheatmanagerdialog.ui" line="306"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation>Büyüktür Den...</translation> <translation>Büyüktür Den...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="311"/> <location filename="../cheatmanagerdialog.ui" line="311"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation>Büyük yada Eşittir...</translation> <translation>Büyük yada Eşittir...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="316"/> <location filename="../cheatmanagerdialog.ui" line="316"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation>Azdır...</translation> <translation>Azdır...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="321"/> <location filename="../cheatmanagerdialog.ui" line="321"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation>Az yada Eşittir...</translation> <translation>Az yada Eşittir...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="326"/> <location filename="../cheatmanagerdialog.ui" line="326"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation>Yükselir Den...</translation> <translation>Yükselir Den...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="331"/> <location filename="../cheatmanagerdialog.ui" line="331"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation>Azalır dan...</translation> <translation>Azalır dan...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="336"/> <location filename="../cheatmanagerdialog.ui" line="336"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation>Değiştirilir den...</translation> <translation>Değiştirilir den...</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="341"/> <location filename="../cheatmanagerdialog.ui" line="341"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation>Öncekine Eşit: (Değişmemiş Veri)</translation> <translation>Öncekine Eşit: (Değişmemiş Veri)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="346"/> <location filename="../cheatmanagerdialog.ui" line="346"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation>Öncekine Eşit Değil (Değişmiş Veri)</translation> <translation>Öncekine Eşit Değil (Değişmiş Veri)</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="351"/> <location filename="../cheatmanagerdialog.ui" line="351"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation>Öncekinden Büyük</translation> <translation>Öncekinden Büyük</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="356"/> <location filename="../cheatmanagerdialog.ui" line="356"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation>Öncekinden Eşit yada Büyük</translation> <translation>Öncekinden Eşit yada Büyük</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="361"/> <location filename="../cheatmanagerdialog.ui" line="361"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation>Öncekinden Az</translation> <translation>Öncekinden Az</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="366"/> <location filename="../cheatmanagerdialog.ui" line="366"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation>Öncekinden Eşit yada Az</translation> <translation>Öncekinden Eşit yada Az</translation>
</message> </message>
<message> <message>
<location filename="../cheatmanagerdialog.ui" line="371"/> <location filename="../cheatmanagerdialog.ui" line="371"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation>Herhangi Bir Değer</translation> <translation>Herhangi Bir Değer</translation>
</message> </message>
<message> <message>

View File

@ -12476,83 +12476,83 @@ The saves will not be recoverable.</source>
<translation>:</translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="155"/> <location filename="../memoryscannerwindow.ui" line="205"/>
<source>Equal to...</source> <source>Equal to Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="160"/> <location filename="../memoryscannerwindow.ui" line="210"/>
<source>Not Equal to...</source> <source>Not Equal to Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="165"/> <location filename="../memoryscannerwindow.ui" line="225"/>
<source>Greater Than...</source> <source>Greater Than Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="170"/> <location filename="../memoryscannerwindow.ui" line="230"/>
<source>Greater or Equal...</source> <source>Greater or Equal to Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="175"/> <location filename="../memoryscannerwindow.ui" line="215"/>
<source>Less Than...</source> <source>Less Than Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="180"/> <location filename="../memoryscannerwindow.ui" line="220"/>
<source>Less or Equal...</source> <source>Less or Equal to Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="185"/> <location filename="../memoryscannerwindow.ui" line="195"/>
<source>Increased By...</source> <source>Increased By Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="190"/> <location filename="../memoryscannerwindow.ui" line="190"/>
<source>Decreased By...</source> <source>Decreased By Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="195"/> <location filename="../memoryscannerwindow.ui" line="200"/>
<source>Changed By...</source> <source>Changed By Value</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="200"/> <location filename="../memoryscannerwindow.ui" line="185"/>
<source>Equal to Previous (Unchanged Value)</source> <source>Equal to Previous Result (Unchanged Value)</source>
<translation> ()</translation> <translation> ()</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="205"/> <location filename="../memoryscannerwindow.ui" line="180"/>
<source>Not Equal to Previous (Changed Value)</source> <source>Not Equal to Previous Result (Changed Value)</source>
<translation> ()</translation> <translation> ()</translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="210"/> <location filename="../memoryscannerwindow.ui" line="170"/>
<source>Greater Than Previous</source> <source>Greater Than Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="215"/> <location filename="../memoryscannerwindow.ui" line="175"/>
<source>Greater or Equal to Previous</source> <source>Greater or Equal to Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="220"/> <location filename="../memoryscannerwindow.ui" line="160"/>
<source>Less Than Previous</source> <source>Less Than Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="225"/> <location filename="../memoryscannerwindow.ui" line="165"/>
<source>Less or Equal to Previous</source> <source>Less or Equal to Previous Result</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../memoryscannerwindow.ui" line="230"/> <location filename="../memoryscannerwindow.ui" line="155"/>
<source>Any Value</source> <source>Any Value ('New Search' or 'Reset Result Value')</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>

View File

@ -1488,7 +1488,7 @@ bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, s32* v
if (!visible) if (!visible)
return false; return false;
const std::string value_text(StringUtil::StdStringFromFormat(format, *value)); const SmallString value_text = SmallString::from_sprintf(format, *value);
const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str())); const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str()));
const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f);
@ -1521,7 +1521,8 @@ bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, s32* v
bool changed = false; bool changed = false;
ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f)); ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::PushFont(g_large_font); ImGui::PushFont(g_large_font);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f));
@ -1560,7 +1561,7 @@ bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, float*
if (!visible) if (!visible)
return false; return false;
const std::string value_text(StringUtil::StdStringFromFormat(format, *value)); const SmallString value_text = SmallString::from_sprintf(format, *value);
const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str())); const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str()));
const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f);
@ -1593,7 +1594,8 @@ bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, float*
bool changed = false; bool changed = false;
ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f)); ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::PushFont(g_large_font); ImGui::PushFont(g_large_font);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f));
@ -2127,8 +2129,9 @@ void ImGuiFullscreen::DrawFileSelector()
if (!s_file_selector_open) if (!s_file_selector_open)
return; return;
ImGui::SetNextWindowSize(LayoutScale(1000.0f, 680.0f)); ImGui::SetNextWindowSize(LayoutScale(1000.0f, 650.0f));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::OpenPopup(s_file_selector_title.c_str()); ImGui::OpenPopup(s_file_selector_title.c_str());
FileSelectorItem* selected = nullptr; FileSelectorItem* selected = nullptr;
@ -2278,7 +2281,8 @@ void ImGuiFullscreen::DrawChoiceDialog()
title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) * title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) *
static_cast<float>(s_choice_dialog_options.size())); static_cast<float>(s_choice_dialog_options.size()));
ImGui::SetNextWindowSize(ImVec2(width, height)); ImGui::SetNextWindowSize(ImVec2(width, height));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::OpenPopup(s_choice_dialog_title.c_str()); ImGui::OpenPopup(s_choice_dialog_title.c_str());
bool is_open = !WantsToCloseMenu(); bool is_open = !WantsToCloseMenu();
@ -2381,7 +2385,8 @@ void ImGuiFullscreen::DrawInputDialog()
return; return;
ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::OpenPopup(s_input_dialog_title.c_str()); ImGui::OpenPopup(s_input_dialog_title.c_str());
ImGui::PushFont(g_large_font); ImGui::PushFont(g_large_font);
@ -2536,7 +2541,8 @@ void ImGuiFullscreen::DrawMessageDialog()
const char* win_id = s_message_dialog_title.empty() ? "##messagedialog" : s_message_dialog_title.c_str(); const char* win_id = s_message_dialog_title.empty() ? "##messagedialog" : s_message_dialog_title.c_str();
ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f));
ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos((ImGui::GetIO().DisplaySize - LayoutScale(0.0f, LAYOUT_FOOTER_HEIGHT)) * 0.5f,
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
ImGui::OpenPopup(win_id); ImGui::OpenPopup(win_id);
ImGui::PushFont(g_large_font); ImGui::PushFont(g_large_font);
@ -2557,7 +2563,7 @@ void ImGuiFullscreen::DrawMessageDialog()
if (ImGui::BeginPopupModal(win_id, &is_open, flags)) if (ImGui::BeginPopupModal(win_id, &is_open, flags))
{ {
BeginMenuButtons(); BeginMenuButtons();
QueueResetFocus(); ResetFocusHere();
ImGui::TextWrapped("%s", s_message_dialog_message.c_str()); ImGui::TextWrapped("%s", s_message_dialog_message.c_str());
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(20.0f)); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(20.0f));

View File

@ -561,19 +561,20 @@ ImFont* ImGuiManager::AddFixedFont(float size)
bool ImGuiManager::AddIconFonts(float size) bool ImGuiManager::AddIconFonts(float size)
{ {
static constexpr ImWchar range_fa[] = { static constexpr ImWchar range_fa[] = {
0xe086, 0xe086, 0xf002, 0xf002, 0xf005, 0xf005, 0xf007, 0xf007, 0xf00c, 0xf00e, 0xf011, 0xf011, 0xf013, 0xf013, 0xe06f, 0xe06f, 0xe086, 0xe086, 0xf002, 0xf002, 0xf005, 0xf005, 0xf007, 0xf007, 0xf00c, 0xf00e, 0xf011, 0xf011,
0xf017, 0xf017, 0xf019, 0xf019, 0xf01c, 0xf01c, 0xf021, 0xf021, 0xf023, 0xf023, 0xf025, 0xf025, 0xf027, 0xf028, 0xf013, 0xf013, 0xf017, 0xf017, 0xf019, 0xf019, 0xf01c, 0xf01c, 0xf021, 0xf021, 0xf023, 0xf023, 0xf025, 0xf025,
0xf02e, 0xf02e, 0xf030, 0xf030, 0xf03a, 0xf03a, 0xf03d, 0xf03d, 0xf049, 0xf04c, 0xf050, 0xf050, 0xf05e, 0xf05e, 0xf027, 0xf028, 0xf02e, 0xf02e, 0xf030, 0xf030, 0xf03a, 0xf03a, 0xf03d, 0xf03d, 0xf049, 0xf04c, 0xf050, 0xf050,
0xf062, 0xf063, 0xf067, 0xf067, 0xf071, 0xf071, 0xf075, 0xf075, 0xf077, 0xf078, 0xf07b, 0xf07c, 0xf084, 0xf085, 0xf05e, 0xf05e, 0xf062, 0xf063, 0xf067, 0xf067, 0xf071, 0xf071, 0xf075, 0xf075, 0xf077, 0xf078, 0xf07b, 0xf07c,
0xf091, 0xf091, 0xf0a0, 0xf0a0, 0xf0ac, 0xf0ad, 0xf0c5, 0xf0c5, 0xf0c7, 0xf0c9, 0xf0cb, 0xf0cb, 0xf0d0, 0xf0d0, 0xf084, 0xf085, 0xf091, 0xf091, 0xf0a0, 0xf0a0, 0xf0ac, 0xf0ad, 0xf0c5, 0xf0c5, 0xf0c7, 0xf0c9, 0xf0cb, 0xf0cb,
0xf0dc, 0xf0dc, 0xf0e2, 0xf0e2, 0xf0e7, 0xf0e7, 0xf0eb, 0xf0eb, 0xf0f1, 0xf0f1, 0xf0f3, 0xf0f3, 0xf0fe, 0xf0fe, 0xf0d0, 0xf0d0, 0xf0dc, 0xf0dc, 0xf0e2, 0xf0e2, 0xf0e7, 0xf0e7, 0xf0eb, 0xf0eb, 0xf0f1, 0xf0f1, 0xf0f3, 0xf0f3,
0xf110, 0xf110, 0xf119, 0xf119, 0xf11b, 0xf11c, 0xf140, 0xf140, 0xf14a, 0xf14a, 0xf15b, 0xf15b, 0xf15d, 0xf15d, 0xf0fe, 0xf0fe, 0xf110, 0xf110, 0xf119, 0xf119, 0xf11b, 0xf11c, 0xf140, 0xf140, 0xf14a, 0xf14a, 0xf15b, 0xf15b,
0xf191, 0xf192, 0xf1ab, 0xf1ab, 0xf1dd, 0xf1de, 0xf1e6, 0xf1e6, 0xf1eb, 0xf1eb, 0xf1f8, 0xf1f8, 0xf1fc, 0xf1fc, 0xf15d, 0xf15d, 0xf191, 0xf192, 0xf1ab, 0xf1ab, 0xf1dd, 0xf1de, 0xf1e6, 0xf1e6, 0xf1eb, 0xf1eb, 0xf1f8, 0xf1f8,
0xf242, 0xf242, 0xf245, 0xf245, 0xf26c, 0xf26c, 0xf279, 0xf279, 0xf2d0, 0xf2d0, 0xf2db, 0xf2db, 0xf2f2, 0xf2f2, 0xf1fc, 0xf1fc, 0xf240, 0xf240, 0xf242, 0xf242, 0xf245, 0xf245, 0xf26c, 0xf26c, 0xf279, 0xf279, 0xf2d0, 0xf2d0,
0xf3c1, 0xf3c1, 0xf3fd, 0xf3fd, 0xf410, 0xf410, 0xf466, 0xf466, 0xf4ce, 0xf4ce, 0xf500, 0xf500, 0xf51f, 0xf51f, 0xf2db, 0xf2db, 0xf2f2, 0xf2f2, 0xf3c1, 0xf3c1, 0xf3fd, 0xf3fd, 0xf410, 0xf410, 0xf466, 0xf466, 0xf4ce, 0xf4ce,
0xf538, 0xf538, 0xf545, 0xf545, 0xf547, 0xf548, 0xf57a, 0xf57a, 0xf5a2, 0xf5a2, 0xf5aa, 0xf5aa, 0xf5e7, 0xf5e7, 0xf500, 0xf500, 0xf51f, 0xf51f, 0xf538, 0xf538, 0xf545, 0xf545, 0xf547, 0xf548, 0xf57a, 0xf57a, 0xf5a2, 0xf5a2,
0xf65d, 0xf65e, 0xf6a9, 0xf6a9, 0xf6cf, 0xf6cf, 0xf794, 0xf794, 0xf7c2, 0xf7c2, 0xf807, 0xf807, 0xf815, 0xf815, 0xf5aa, 0xf5aa, 0xf5e7, 0xf5e7, 0xf65d, 0xf65e, 0xf6a9, 0xf6a9, 0xf6cf, 0xf6cf, 0xf70c, 0xf70c, 0xf794, 0xf794,
0xf818, 0xf818, 0xf84c, 0xf84c, 0xf8cc, 0xf8cc, 0x0, 0x0}; 0xf7a0, 0xf7a0, 0xf7c2, 0xf7c2, 0xf807, 0xf807, 0xf815, 0xf815, 0xf818, 0xf818, 0xf84c, 0xf84c, 0xf8cc, 0xf8cc,
0x0, 0x0};
static constexpr ImWchar range_pf[] = { static constexpr ImWchar range_pf[] = {
0x2196, 0x2199, 0x219e, 0x21a1, 0x21b0, 0x21b3, 0x21ba, 0x21c3, 0x21c7, 0x21ca, 0x21d0, 0x21d4, 0x21dc, 0x21dd, 0x2196, 0x2199, 0x219e, 0x21a1, 0x21b0, 0x21b3, 0x21ba, 0x21c3, 0x21c7, 0x21ca, 0x21d0, 0x21d4, 0x21dc, 0x21dd,
0x21e0, 0x21e3, 0x21ed, 0x21ee, 0x21f7, 0x21f8, 0x21fa, 0x21fb, 0x227a, 0x227f, 0x2284, 0x2284, 0x235e, 0x235e, 0x21e0, 0x21e3, 0x21ed, 0x21ee, 0x21f7, 0x21f8, 0x21fa, 0x21fb, 0x227a, 0x227f, 0x2284, 0x2284, 0x235e, 0x235e,