diff --git a/src/core/fullscreenui_achievements.cpp b/src/core/fullscreenui_achievements.cpp index 92a995379..4751ec0fd 100644 --- a/src/core/fullscreenui_achievements.cpp +++ b/src/core/fullscreenui_achievements.cpp @@ -2541,7 +2541,7 @@ void FullscreenUI::DrawAchievement(const rc_client_achievement_t* cheevo, const // unofficial can't be unlocked so don't show the percentage if (!is_unofficial) { - text.append(" | "); + text.append(" \u2022 "); text.append_format(TRANSLATE_FS("Achievements", "{:.1f}% of players have this achievement"), rarity_to_display); } diff --git a/src/core/fullscreenui_game_list.cpp b/src/core/fullscreenui_game_list.cpp index 8728614cf..ea2db74fc 100644 --- a/src/core/fullscreenui_game_list.cpp +++ b/src/core/fullscreenui_game_list.cpp @@ -475,9 +475,14 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size) if (!compact_mode) { if (entry->serial.empty()) - summary.format("{} | {} MB", Path::GetFileName(entry->path), to_mb(entry->file_size)); + { + summary.format("{} \u2022 {} MB", Path::GetFileName(entry->path), to_mb(entry->file_size)); + } else - summary.format("{} | {} | {} MB", entry->serial, Path::GetFileName(entry->path), to_mb(entry->file_size)); + { + summary.format("{} \u2022 {} \u2022 {} MB", entry->serial, Path::GetFileName(entry->path), + to_mb(entry->file_size)); + } } const MenuButtonBounds mbb(entry->GetDisplayTitle(show_localized_titles), {}, summary, row_left_margin); @@ -1103,7 +1108,7 @@ void FullscreenUI::HandleSelectDiscForDiscSet(const GameDatabase::DiscSetEntry* for (u32 i = 0; i < static_cast(entries.size()); i++) { const GameList::Entry* const entry = entries[i]; - std::string title = fmt::format(ICON_FA_COMPACT_DISC " {} {} | {}##{}", FSUI_VSTR("Disc"), + std::string title = fmt::format(ICON_FA_COMPACT_DISC " {} {} \u2022 {}##{}", FSUI_VSTR("Disc"), entry->disc_set_index + 1, Path::GetFileName(entry->path), i); options.emplace_back(std::move(title), false); paths.push_back(entry->path); diff --git a/src/core/fullscreenui_settings.cpp b/src/core/fullscreenui_settings.cpp index 3d6f9c1cb..2f31ab557 100644 --- a/src/core/fullscreenui_settings.cpp +++ b/src/core/fullscreenui_settings.cpp @@ -2481,6 +2481,8 @@ void FullscreenUI::DrawSummarySettingsTrackList() void FullscreenUI::PopulateImageTrackList() { +#define DOT_SEP " \u2022 " + s_settings_locals.image_track_list.clear(); s_settings_locals.image_track_summary.clear(); @@ -2498,14 +2500,16 @@ void FullscreenUI::PopulateImageTrackList() for (u32 track = 1; track <= num_tracks; track++) { const CDImage::TrackMode mode = image->GetTrackMode(static_cast(track)); - s_settings_locals.image_track_list.push_back( - {fmt::format(FSUI_FSTR("{} | Start: {} | Length: {}"), CDImage::GetTrackModeDisplayName(mode), - image->GetTrackStartMSFPosition(static_cast(track)).ToString(), - image->GetTrackMSFLength(static_cast(track)).ToString()), - {}, - {}, - mode == CDImage::TrackMode::Audio}); + SmallString summary; + summary.assign(CDImage::GetTrackModeDisplayName(mode)); + summary.append(DOT_SEP); + summary.append_format(FSUI_FSTR("Start: {}"), image->GetTrackStartMSFPosition(static_cast(track)).ToString()); + summary.append(DOT_SEP); + summary.append_format(FSUI_FSTR("Length: {}"), image->GetTrackMSFLength(static_cast(track)).ToString()); + s_settings_locals.image_track_list.push_back({std::string(summary), {}, {}, mode == CDImage::TrackMode::Audio}); } + +#undef DOT_SEP } void FullscreenUI::StartImageVerification() @@ -5113,6 +5117,8 @@ void FullscreenUI::DrawPostProcessingSettingsPage() if (opt.ShouldHide()) continue; +#define DOT_SEP " \u2022 " + switch (opt.type) { case PostProcessing::ShaderOption::Type::Bool: @@ -5135,8 +5141,14 @@ void FullscreenUI::DrawPostProcessingSettingsPage() case PostProcessing::ShaderOption::Type::Float: { tstr.format(ICON_FA_RULER_VERTICAL " {}###{}", opt.ui_name, opt.name); - str.format(FSUI_FSTR("Value: {} | Default: {} | Minimum: {} | Maximum: {}"), opt.value[0].float_value, - opt.default_value[0].float_value, opt.min_value[0].float_value, opt.max_value[0].float_value); + str.format(FSUI_FSTR("Value: {}"), opt.value[0].float_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Default: {}"), opt.default_value[0].float_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Minimum: {}"), opt.min_value[0].float_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Maximum: {}"), opt.max_value[0].float_value); + str.append(DOT_SEP); if (MenuButton(tstr, str)) OpenFixedPopupDialog(tstr); @@ -5203,8 +5215,14 @@ void FullscreenUI::DrawPostProcessingSettingsPage() case PostProcessing::ShaderOption::Type::Int: { tstr.format(ICON_FA_RULER_VERTICAL " {}##{}", opt.ui_name, opt.name); - str.format(FSUI_FSTR("Value: {} | Default: {} | Minimum: {} | Maximum: {}"), opt.value[0].int_value, - opt.default_value[0].int_value, opt.min_value[0].int_value, opt.max_value[0].int_value); + str.format(FSUI_FSTR("Value: {}"), opt.value[0].int_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Default: {}"), opt.default_value[0].int_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Minimum: {}"), opt.min_value[0].int_value); + str.append(DOT_SEP); + str.append_format(FSUI_FSTR("Maximum: {}"), opt.max_value[0].int_value); + str.append(DOT_SEP); if (MenuButton(tstr, str)) OpenFixedPopupDialog(tstr); @@ -5268,6 +5286,8 @@ void FullscreenUI::DrawPostProcessingSettingsPage() default: break; } + +#undef DOT_SEP } ImGui::PopID(); diff --git a/src/core/fullscreenui_strings.h b/src/core/fullscreenui_strings.h index 9157a3a88..0c001801b 100644 --- a/src/core/fullscreenui_strings.h +++ b/src/core/fullscreenui_strings.h @@ -226,6 +226,7 @@ TRANSLATE_NOOP("FullscreenUI", "Default Value"); TRANSLATE_NOOP("FullscreenUI", "Default View"); TRANSLATE_NOOP("FullscreenUI", "Default: Disabled"); TRANSLATE_NOOP("FullscreenUI", "Default: Enabled"); +TRANSLATE_NOOP("FullscreenUI", "Default: {}"); TRANSLATE_NOOP("FullscreenUI", "Deinterlacing Mode"); TRANSLATE_NOOP("FullscreenUI", "Delete"); TRANSLATE_NOOP("FullscreenUI", "Delete And Boot"); @@ -470,6 +471,7 @@ TRANSLATE_NOOP("FullscreenUI", "Leaderboard Notifications"); TRANSLATE_NOOP("FullscreenUI", "Leaderboard Trackers"); TRANSLATE_NOOP("FullscreenUI", "Leaderboards"); TRANSLATE_NOOP("FullscreenUI", "Left: "); +TRANSLATE_NOOP("FullscreenUI", "Length: {}"); TRANSLATE_NOOP("FullscreenUI", "Light"); TRANSLATE_NOOP("FullscreenUI", "Line Detection"); TRANSLATE_NOOP("FullscreenUI", "List Compact Mode"); @@ -504,6 +506,7 @@ TRANSLATE_NOOP("FullscreenUI", "Makes games run closer to their console framerat TRANSLATE_NOOP("FullscreenUI", "Maximum (Safer)"); TRANSLATE_NOOP("FullscreenUI", "Maximum Read Speedup Cycles"); TRANSLATE_NOOP("FullscreenUI", "Maximum Seek Speedup Cycles"); +TRANSLATE_NOOP("FullscreenUI", "Maximum: {}"); TRANSLATE_NOOP("FullscreenUI", "Memory Card Busy"); TRANSLATE_NOOP("FullscreenUI", "Memory Card Directory"); TRANSLATE_NOOP("FullscreenUI", "Memory Card Port {}"); @@ -515,6 +518,7 @@ TRANSLATE_NOOP("FullscreenUI", "Merge Multi-Disc Games"); TRANSLATE_NOOP("FullscreenUI", "Merges multi-disc games into one item in the game list."); TRANSLATE_NOOP("FullscreenUI", "Message Location"); TRANSLATE_NOOP("FullscreenUI", "Minimal Output Latency"); +TRANSLATE_NOOP("FullscreenUI", "Minimum: {}"); TRANSLATE_NOOP("FullscreenUI", "Move Cursor"); TRANSLATE_NOOP("FullscreenUI", "Move Down"); TRANSLATE_NOOP("FullscreenUI", "Move Up"); @@ -822,6 +826,7 @@ TRANSLATE_NOOP("FullscreenUI", "Start Game"); TRANSLATE_NOOP("FullscreenUI", "Start In Big Picture Mode"); TRANSLATE_NOOP("FullscreenUI", "Start a game from a disc in your PC's DVD drive."); TRANSLATE_NOOP("FullscreenUI", "Start the console without any disc inserted."); +TRANSLATE_NOOP("FullscreenUI", "Start: {}"); TRANSLATE_NOOP("FullscreenUI", "Starts the application in Big Picture Mode instead of the desktop interface."); TRANSLATE_NOOP("FullscreenUI", "Stores the current settings to a controller preset."); TRANSLATE_NOOP("FullscreenUI", "Stretch Mode"); @@ -910,7 +915,7 @@ TRANSLATE_NOOP("FullscreenUI", "Uses separate game settings for each disc of mul TRANSLATE_NOOP("FullscreenUI", "Uses the software renderer when creating rewind states to prevent additional VRAM usage. Especially useful when upscaling."); TRANSLATE_NOOP("FullscreenUI", "Utilizes the chosen frame rate regardless of the game's setting."); TRANSLATE_NOOP("FullscreenUI", "Value Range"); -TRANSLATE_NOOP("FullscreenUI", "Value: {} | Default: {} | Minimum: {} | Maximum: {}"); +TRANSLATE_NOOP("FullscreenUI", "Value: {}"); TRANSLATE_NOOP("FullscreenUI", "Verify"); TRANSLATE_NOOP("FullscreenUI", "Verifying Image"); TRANSLATE_NOOP("FullscreenUI", "Vertex Cache"); @@ -952,6 +957,5 @@ TRANSLATE_NOOP("FullscreenUI", "{} is not a valid disc image."); TRANSLATE_NOOP("FullscreenUI", "{} of {}"); TRANSLATE_NOOP("FullscreenUI", "{} pinned."); TRANSLATE_NOOP("FullscreenUI", "{} unpinned."); -TRANSLATE_NOOP("FullscreenUI", "{} | Start: {} | Length: {}"); // TRANSLATION-STRING-AREA-END #endif diff --git a/src/core/gpu_backend.cpp b/src/core/gpu_backend.cpp index 396a523b1..ff33266d8 100644 --- a/src/core/gpu_backend.cpp +++ b/src/core/gpu_backend.cpp @@ -611,24 +611,25 @@ void GPUBackend::HandleSubmitFrameCommand(const GPUBackendFramePresentationParam RestoreDeviceContext(); } -#define BOLD(text) "\x02" text "\x01" - void GPUBackend::GetStatsString(SmallStringBase& str) const { +#define BOLD(text) "\x02" text "\x01" +#define DOT_SEP " \u2022 " + if (IsUsingHardwareBackend()) { if (g_gpu_settings.gpu_pgxp_depth_buffer) { - str.format(BOLD("{}{} HW") " | {} " BOLD("P") " | {} " BOLD("DC") " | {} " BOLD("RB") " | {} " BOLD( - "C") " | {} " BOLD("W") " | {}% " BOLD("U") " | {} " BOLD("DBC"), + str.format(BOLD("{}{} HW") DOT_SEP "{} " BOLD("P") DOT_SEP "{} " BOLD("DC") DOT_SEP "{} " BOLD("RB") DOT_SEP + "{} " BOLD("C") DOT_SEP "{} " BOLD("W") DOT_SEP "{}% " BOLD("U") DOT_SEP "{} " BOLD("DBC"), GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()), g_gpu_settings.gpu_use_thread ? "-MT" : "", s_stats.num_primitives, s_stats.host_num_draws, s_stats.host_num_downloads, s_stats.num_copies, s_stats.num_writes, s_stats.gpu_busy_pct, s_stats.num_depth_buffer_clears); } else { - str.format(BOLD("{}{} HW") " | {} " BOLD("P") " | {} " BOLD("DC") " | {} " BOLD("RB") " | {} " BOLD( - "C") " | {} " BOLD("W") " | {}% " BOLD("U"), + str.format(BOLD("{}{} HW") DOT_SEP "{} " BOLD("P") DOT_SEP "{} " BOLD("DC") DOT_SEP "{} " BOLD("RB") DOT_SEP + "{} " BOLD("C") DOT_SEP "{} " BOLD("W") DOT_SEP "{}% " BOLD("U"), GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()), g_gpu_settings.gpu_use_thread ? "-MT" : "", s_stats.num_primitives, s_stats.host_num_draws, s_stats.host_num_downloads, s_stats.num_copies, s_stats.num_writes, s_stats.gpu_busy_pct); @@ -636,10 +637,10 @@ void GPUBackend::GetStatsString(SmallStringBase& str) const } else { - str.format( - BOLD("{}{} SW") " | {} " BOLD("P") " | {} " BOLD("R") " | {} " BOLD("C") " | {} " BOLD("W") " | {}% " BOLD("U"), - GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()), g_gpu_settings.gpu_use_thread ? "-MT" : "", - s_stats.num_primitives, s_stats.num_reads, s_stats.num_copies, s_stats.num_writes, s_stats.gpu_busy_pct); + str.format(BOLD("{}{} SW") DOT_SEP "{} " BOLD("P") DOT_SEP "{} " BOLD("R") DOT_SEP "{} " BOLD("C") DOT_SEP + "{} " BOLD("W") DOT_SEP "{}% " BOLD("U"), + GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()), g_gpu_settings.gpu_use_thread ? "-MT" : "", + s_stats.num_primitives, s_stats.num_reads, s_stats.num_copies, s_stats.num_writes, s_stats.gpu_busy_pct); } } @@ -648,13 +649,14 @@ void GPUBackend::GetMemoryStatsString(SmallStringBase& str) const const u32 vram_usage_mb = static_cast((g_gpu_device->GetVRAMUsage() + (1048576 - 1)) / 1048576); const u32 stream_kb = static_cast((s_stats.host_buffer_streamed + (1024 - 1)) / 1024); - str.format("{}MB " BOLD("VRAM") " | {}KB " BOLD("STR") " | {} " BOLD("B") " | {} " BOLD("RP") " | {} " BOLD( - "TC") " | {} " BOLD("TU"), + str.format("{}MB " BOLD("VRAM") DOT_SEP "{}KB " BOLD("STR") DOT_SEP "{} " BOLD("B") DOT_SEP "{} " BOLD("RP") DOT_SEP + "{} " BOLD("TC") DOT_SEP "{} " BOLD("TU"), vram_usage_mb, stream_kb, s_stats.host_num_barriers, s_stats.host_num_render_passes, s_stats.host_num_copies, s_stats.host_num_uploads); -} +#undef DOT_SEP #undef BOLD +} void GPUBackend::ResetStatistics() { diff --git a/src/core/imgui_overlays.cpp b/src/core/imgui_overlays.cpp index 2a5052b9b..f72c1c186 100644 --- a/src/core/imgui_overlays.cpp +++ b/src/core/imgui_overlays.cpp @@ -387,6 +387,7 @@ void ImGuiManager::DrawPerformanceOverlay(const GPUBackend* gpu, float& position { #define BOLD(text) "\x02" text "\x01" #define COLOR(text) "\x04" text "\x03" +#define DOT_SEP " \u2022 " if (!(g_gpu_settings.display_show_fps || g_gpu_settings.display_show_speed || g_gpu_settings.display_show_gpu_stats || g_gpu_settings.display_show_resolution || g_gpu_settings.display_show_latency_stats || @@ -415,15 +416,15 @@ void ImGuiManager::DrawPerformanceOverlay(const GPUBackend* gpu, float& position const float vps = PerformanceCounters::GetVPS(); if (vps < 100.0f) - text.append_format(COLOR("{:.2f}") " " BOLD("FPS") " | " COLOR("{:.2f}") " " BOLD("VPS"), fps, vps); + text.append_format(COLOR("{:.2f}") " " BOLD("FPS") DOT_SEP COLOR("{:.2f}") " " BOLD("VPS"), fps, vps); else if (vps < 1000.0f) - text.append_format(COLOR("{:.1f}") " " BOLD("FPS") " | " COLOR("{:.1f}") " " BOLD("VPS"), fps, vps); + text.append_format(COLOR("{:.1f}") " " BOLD("FPS") DOT_SEP COLOR("{:.1f}") " " BOLD("VPS"), fps, vps); else - text.append_format(COLOR("{:.0f}") " " BOLD("FPS") " | " COLOR("{:.0f}") " " BOLD("VPS"), fps, vps); + text.append_format(COLOR("{:.0f}") " " BOLD("FPS") DOT_SEP COLOR("{:.0f}") " " BOLD("VPS"), fps, vps); } if (g_gpu_settings.display_show_speed) { - text.append_format("{}" COLOR("{}%") " ", text.empty() ? "" : " | ", static_cast(std::round(speed))); + text.append_format("{}" COLOR("{}%") " ", text.empty() ? "" : DOT_SEP, static_cast(std::round(speed))); const float target_speed = System::GetTargetSpeed(); if (target_speed <= 0.0f) @@ -464,10 +465,10 @@ void ImGuiManager::DrawPerformanceOverlay(const GPUBackend* gpu, float& position const bool interlaced = GPU::IsInterlacedDisplayEnabled(); const bool progressive_forced = GPU::IsProgressiveDisplayScanForced(); const bool pal = GPU::IsInPALMode(); - text.format("{}x{} " BOLD("{} {}") " | {}x " BOLD("IR") "{}", display_width * resolution_scale, + text.format("{}x{} " BOLD("{} {}") DOT_SEP "{}x " BOLD("IR") "{}", display_width * resolution_scale, display_height * resolution_scale, pal ? "PAL" : "NTSC", interlaced ? "Interlaced" : (progressive_forced ? "Forced-Progressive" : "Progressive"), - resolution_scale, pgxp ? " | " BOLD("PGXP") : ""); + resolution_scale, pgxp ? DOT_SEP BOLD("PGXP") : ""); DrawPerformanceStat(dl, position_y, fixed_font, fixed_font_size, FIXED_BOLD_WEIGHT, 0, rbound, text); position_y += spacing; } @@ -481,7 +482,7 @@ void ImGuiManager::DrawPerformanceOverlay(const GPUBackend* gpu, float& position if (g_gpu_settings.display_show_cpu_usage) { - text.format(" {:.2f}ms " BOLD("Min") " | {:.2f}ms " BOLD("Avg") " | {:.2f}ms " BOLD("Max"), + text.format(" {:.2f}ms " BOLD("Min") DOT_SEP "{:.2f}ms " BOLD("Avg") DOT_SEP "{:.2f}ms " BOLD("Max"), PerformanceCounters::GetMinimumFrameTime(), PerformanceCounters::GetAverageFrameTime(), PerformanceCounters::GetMaximumFrameTime()); DrawPerformanceStat(dl, position_y, fixed_font, fixed_font_size, FIXED_BOLD_WEIGHT, 0, rbound, text); @@ -568,6 +569,7 @@ void ImGuiManager::DrawPerformanceOverlay(const GPUBackend* gpu, float& position DrawStatusIndicators(dl, position_y, ui_font, status_size, rbound, text, true); } +#undef DOT_SEP #undef COLOR #undef BOLD } diff --git a/src/core/system.cpp b/src/core/system.cpp index 2bdabb084..c365c6255 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -3682,11 +3682,13 @@ void System::FormatLatencyStats(SmallStringBase& str) Timer::ConvertValueToMilliseconds(static_cast(s_state.runahead_frames) * s_state.frame_period)); #define BOLD(text) "\x02" text "\x01" +#define DOT_SEP " \u2022 " - str.format("{}ms " BOLD("AL") " | {:.0f}ms " BOLD("AF") " | {:.0f}ms " BOLD("PF") " | {:.0f}ms " BOLD( - "IL") " | {} " BOLD("QF"), + str.format("{}ms " BOLD("AL") DOT_SEP "{:.0f}ms " BOLD("AF") DOT_SEP "{:.0f}ms " BOLD("PF") DOT_SEP + "{:.0f}ms " BOLD("IL") DOT_SEP "{} " BOLD("QF"), audio_latency, active_frame_time, pre_frame_time, input_latency, queued_frame_count); +#undef DOT_SEP #undef BOLD } diff --git a/src/duckstation-qt/gamesummarywidget.cpp b/src/duckstation-qt/gamesummarywidget.cpp index 60d1a512a..b027acbfd 100644 --- a/src/duckstation-qt/gamesummarywidget.cpp +++ b/src/duckstation-qt/gamesummarywidget.cpp @@ -144,7 +144,7 @@ void GameSummaryWidget::populateUi(const GameList::Entry* entry) if (entry->IsDiscOrDiscSet()) { m_ui.hashes->setText(QtUtils::StringViewToQString(SmallString::from_format( - "HASH-{:016X} | RA: {}", entry->hash, Achievements::GameHashToString(entry->achievements_hash)))); + "HASH-{:016X} \u2022 RA: {}", entry->hash, Achievements::GameHashToString(entry->achievements_hash)))); } else { diff --git a/src/util/imgui_manager.cpp b/src/util/imgui_manager.cpp index a6b1ebb00..626d0e123 100644 --- a/src/util/imgui_manager.cpp +++ b/src/util/imgui_manager.cpp @@ -168,8 +168,8 @@ static constexpr const std::array TEXT_FONT_FILENAMES = { static constexpr const char* DEFAULT_TEXT_FONT_NAME = TEXT_FONT_NAMES[0]; #define ENUMERATE_FIXED_FONT_NAMES(X) \ - X("GoogleSansCode", "Google Sans Code", "GoogleSansCode-VariableFont_wght.ttf") \ X("RobotoMono", "Roboto Mono", "RobotoMono-VariableFont_wght.ttf") \ + X("GoogleSansCode", "Google Sans Code", "GoogleSansCode-VariableFont_wght.ttf") \ X("KodeMono", "Kode Mono", "KodeMono-VariableFont_wght.ttf") \ X("Bitcount", "Bitcount", "BitcountPropSingle-VariableFont_CRSV,ELSH,ELXP,slnt,wght.ttf")