Merge pull request #20173 from hrydgard/more-minor-ui

More minor UI fixes
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2025-03-29 00:40:50 +01:00
commit 182174cb78
15 files changed
+121 -72

No files matched your search

+9
View File
@@ -412,6 +412,15 @@ void DrawBuffer::DrawImage4Grid(ImageID atlas_image, float x1, float y1, float x
float vm = (v2 + v1) * 0.5f;
float iw2 = (image->w * 0.5f) * corner_scale;
float ih2 = (image->h * 0.5f) * corner_scale;
// Automatically reduce corner scale radius if it can't fit.
if (iw2 > (x2 - x1) * 0.5f) {
iw2 = (x2 - x1) * 0.5f;
}
if (ih2 > (y2 - y1) * 0.5f) {
ih2 = (y2 - y1) * 0.5f;
}
float xa = x1 + iw2;
float xb = x2 - iw2;
float ya = y1 + ih2;
+3 -3
View File
@@ -113,7 +113,7 @@ std::string SanitizeString(std::string_view input, StringRestriction restriction
std::string sanitized;
sanitized.reserve(input.size());
bool lastWasLineBreak = false;
for (auto c : input) {
for (char c : input) {
switch (restriction) {
case StringRestriction::None:
sanitized.push_back(c);
@@ -127,15 +127,15 @@ std::string SanitizeString(std::string_view input, StringRestriction restriction
}
break;
case StringRestriction::NoLineBreaksOrSpecials:
if (c >= 32) {
if ((uint8_t)c >= 32) {
sanitized.push_back(c);
lastWasLineBreak = false;
} else if (c == 10 || c == 13) {
// Collapse line breaks/feeds to single spaces.
if (!lastWasLineBreak) {
sanitized.push_back(' ');
lastWasLineBreak = true;
}
lastWasLineBreak = true;
}
}
}
+15 -12
View File
@@ -61,19 +61,22 @@ void PopupContextMenuScreen::CreatePopupContents(UI::ViewGroup *parent) {
auto category = GetI18NCategory(category_);
for (size_t i = 0; i < itemCount_; i++) {
Choice *choice;
if (items_[i].imageID) {
Choice *choice = new Choice(category->T(items_[i].text), ImageID(items_[i].imageID));
parent->Add(choice);
if (enabled_[i]) {
choice->OnClick.Add([=](EventParams &p) {
TriggerFinish(DR_OK);
p.a = (uint32_t)i;
OnChoice.Dispatch(p);
return EVENT_DONE;
});
} else {
choice->SetEnabled(false);
}
choice = new Choice(category->T(items_[i].text), ImageID(items_[i].imageID));
} else {
choice = new Choice(category->T(items_[i].text));
}
parent->Add(choice);
if (enabled_[i]) {
choice->OnClick.Add([=](EventParams &p) {
TriggerFinish(DR_OK);
p.a = (uint32_t)i;
OnChoice.Dispatch(p);
return EVENT_DONE;
});
} else {
choice->SetEnabled(false);
}
}
+4 -2
View File
@@ -273,8 +273,10 @@ void ScreenManager::sendMessage(UIMessage message, const char *value) {
backgroundScreen_->sendMessage(message, value);
}
if (!stack_.empty()) {
stack_.back().screen->sendMessage(message, value);
// NOTE: Changed this to send the message to all screens, instead of just the top one,
// to allow EmuScreen to receive messages from popup menus. Hope this didn't break anything..
for (auto &iter : stack_) {
iter.screen->sendMessage(message, value);
}
}
-1
View File
@@ -165,7 +165,6 @@ public:
bool key(const KeyInput &key);
void axis(const AxisInput *axes, size_t count);
// Generic facility for gross hacks :P
void sendMessage(UIMessage message, const char *value);
const Screen *topScreen() const {
+1 -1
View File
@@ -164,7 +164,7 @@ void ViewGroup::Draw(UIContext &dc) {
if (hasDropShadow_) {
// Darken things behind.
dc.FillRect(UI::Drawable(0x60000000), dc.GetBounds().Expand(dropShadowExpand_));
float dropsize = 30.0f;
const float dropsize = 30.0f;
dc.Draw()->DrawImage4Grid(dc.theme->dropShadow4Grid,
bounds_.x - dropsize, bounds_.y,
bounds_.x2() + dropsize, bounds_.y2()+dropsize*1.5f, 0xDF000000, 3.0f);
+14 -14
View File
@@ -570,6 +570,8 @@ static void NotifyUserIfSlow() {
}
void __DisplayFlip(int cyclesLate) {
_dbg_assert_(gpu);
__DisplaySetFramerate();
flippedThisFrame = true;
@@ -585,21 +587,19 @@ void __DisplayFlip(int cyclesLate) {
bool fastForwardSkipFlip = g_Config.iFastForwardMode != (int)FastForwardMode::CONTINUOUS;
if (gpu) {
Draw::DrawContext *draw = gpu->GetDrawContext();
if (draw) {
g_frameTiming.presentMode = ComputePresentMode(draw, &g_frameTiming.presentInterval);
if (!draw->GetDeviceCaps().presentInstantModeChange && g_frameTiming.presentMode == Draw::PresentMode::FIFO) {
// Some backends can't just flip into MAILBOX/IMMEDIATE mode instantly.
// Vulkan doesn't support the interval setting, so we force skipping the flip.
// TODO: We'll clean this up in a more backend-independent way later.
fastForwardSkipFlip = true;
}
} else {
g_frameTiming.presentMode = Draw::PresentMode::FIFO;
g_frameTiming.presentInterval = 1;
Draw::DrawContext *draw = gpu->GetDrawContext();
if (draw) {
g_frameTiming.presentMode = ComputePresentMode(draw, &g_frameTiming.presentInterval);
if (!draw->GetDeviceCaps().presentInstantModeChange && g_frameTiming.presentMode == Draw::PresentMode::FIFO) {
// Some backends can't just flip into MAILBOX/IMMEDIATE mode instantly.
// Vulkan doesn't support the interval setting, so we force skipping the flip.
// TODO: We'll clean this up in a more backend-independent way later.
fastForwardSkipFlip = true;
}
} else {
// Surely can never get here?
g_frameTiming.presentMode = Draw::PresentMode::FIFO;
g_frameTiming.presentInterval = 1;
}
if (!g_Config.bSkipBufferEffects) {
+7 -3
View File
@@ -218,8 +218,6 @@ bool CPU_Init(std::string *errorString, FileLoader *loadedFile, IdentifiedFileTy
g_symbolMap = new SymbolMap();
g_lua.Init();
// Default memory settings
// Seems to be the safest place currently..
Memory::g_MemorySize = Memory::RAM_NORMAL_SIZE; // 32 MB of ram by default
@@ -233,6 +231,8 @@ bool CPU_Init(std::string *errorString, FileLoader *loadedFile, IdentifiedFileTy
MIPSAnalyst::Reset();
Replacement_Init();
g_lua.Init();
bool allowPlugins = true;
std::string geDumpDiscID;
@@ -242,6 +242,7 @@ bool CPU_Init(std::string *errorString, FileLoader *loadedFile, IdentifiedFileTy
case IdentifiedFileType::PSP_DISC_DIRECTORY:
if (!MountGameISO(loadedFile)) {
*errorString = "Failed to mount ISO file - invalid format?";
CPU_Shutdown();
return false;
}
if (LoadParamSFOFromDisc()) {
@@ -271,8 +272,10 @@ bool CPU_Init(std::string *errorString, FileLoader *loadedFile, IdentifiedFileTy
allowPlugins = false;
break;
default:
// Can we even get here?
// Can we even get here? Yes, by drag-dropping files while a game is underway.
// Should check earlier.
ERROR_LOG(Log::Loader, "CPU_Init didn't recognize file. %s", errorString->c_str());
CPU_Shutdown();
return false;
}
@@ -285,6 +288,7 @@ bool CPU_Init(std::string *errorString, FileLoader *loadedFile, IdentifiedFileTy
if (!Memory::Init()) {
// We're screwed.
*errorString = "Memory init failed";
CPU_Shutdown();
return false;
}
+1 -1
View File
@@ -325,7 +325,7 @@ void DisplayLayoutScreen::CreateViews() {
settingsVisible_.resize(g_Config.vPostShaderNames.size());
}
static ContextMenuItem postShaderContextMenu[] = {
static const ContextMenuItem postShaderContextMenu[] = {
{ "Move Up", "I_ARROW_UP" },
{ "Move Down", "I_ARROW_DOWN" },
{ "Remove", "I_TRASHCAN" },
+16 -23
View File
@@ -255,7 +255,6 @@ void EmuScreen::bootGame(const Path &filename) {
return;
if (PSP_IsInited()) {
bootPending_ = false;
invalid_ = false;
bootComplete();
return;
}
@@ -266,8 +265,7 @@ void EmuScreen::bootGame(const Path &filename) {
bootPending_ = !PSP_InitUpdate(&error_string);
if (!bootPending_) {
invalid_ = !PSP_IsInited();
if (invalid_) {
if (!PSP_IsInited()) {
errorMessage_ = error_string;
ERROR_LOG(Log::Boot, "isIniting bootGame error: %s", errorMessage_.c_str());
return;
@@ -283,8 +281,6 @@ void EmuScreen::bootGame(const Path &filename) {
if (!bootAllowStorage(filename))
return;
invalid_ = true;
// We don't want to boot with the wrong game specific config, so wait until info is ready.
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(nullptr, filename, GameInfoFlags::PARAM_SFO);
if (!info->Ready(GameInfoFlags::PARAM_SFO)) {
@@ -362,7 +358,6 @@ void EmuScreen::bootGame(const Path &filename) {
std::string error_string;
if (!PSP_InitStart(coreParam, &error_string)) {
bootPending_ = false;
invalid_ = true;
errorMessage_ = error_string;
ERROR_LOG(Log::Boot, "InitStart bootGame error: %s", errorMessage_.c_str());
}
@@ -463,7 +458,7 @@ EmuScreen::~EmuScreen() {
g_Config.TimeTracker().Stop(gameID);
// If we were invalid, it would already be shutdown.
if (!invalid_ || bootPending_) {
if (!bootPending_) {
PSP_Shutdown();
}
@@ -552,12 +547,10 @@ void EmuScreen::sendMessage(UIMessage message, const char *value) {
PSP_Shutdown();
bootPending_ = false;
stopRender_ = true;
invalid_ = true;
System_Notify(SystemNotification::DISASSEMBLY);
} else if (message == UIMessage::REQUEST_GAME_RESET) {
PSP_Shutdown();
bootPending_ = true;
invalid_ = true;
System_Notify(SystemNotification::DISASSEMBLY);
std::string resetError;
@@ -1372,12 +1365,6 @@ void EmuScreen::update() {
}
}
if (bootPending_) {
// Keep trying the boot until bootPending_ is lifted.
// It may be delayed due to RetroAchievements or any other cause.
bootGame(gamePath_);
}
// Simply forcibly update to the current screen size every frame. Doesn't cost much.
// If bounds is set to be smaller than the actual pixel resolution of the display, respect that.
// TODO: Should be able to use g_dpi_scale here instead. Might want to store the dpi scale in the UI context too.
@@ -1388,7 +1375,7 @@ void EmuScreen::update() {
PSP_CoreParameter().pixelHeight = g_display.pixel_yres * bounds.h / g_display.dp_yres;
#endif
if (!invalid_) {
if (PSP_IsInited()) {
UpdateUIState(coreState != CORE_RUNTIME_ERROR ? UISTATE_INGAME : UISTATE_EXCEPTION);
}
@@ -1410,7 +1397,7 @@ void EmuScreen::update() {
screenManager()->push(new GamePauseScreen(gamePath_));
}
if (invalid_)
if (!PSP_IsInited())
return;
double now = time_now_d();
@@ -1451,7 +1438,6 @@ void EmuScreen::update() {
bool EmuScreen::checkPowerDown() {
if (PSP_IsRebooting()) {
bootPending_ = true;
invalid_ = true;
}
if (coreState == CORE_POWERDOWN && !PSP_IsIniting() && !PSP_IsRebooting()) {
@@ -1463,7 +1449,6 @@ bool EmuScreen::checkPowerDown() {
INFO_LOG(Log::System, "SELF-POWERDOWN!");
screenManager()->switchScreen(new MainScreen());
bootPending_ = false;
invalid_ = true;
return shutdown;
}
return false;
@@ -1481,7 +1466,7 @@ ScreenRenderRole EmuScreen::renderRole(bool isTop) const {
return false;
}
if (invalid_) {
if (!PSP_IsInited() && !bootPending_) {
return false;
}
@@ -1507,6 +1492,14 @@ void EmuScreen::darken() {
}
ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
// Moved from update, because we want it to be possible for booting to happen even when the screen
// is in the background, like when choosing Reset from the pause menu.
if (bootPending_) {
// Keep trying the boot until bootPending_ is lifted.
// It may be delayed due to RetroAchievements or any other cause.
bootGame(gamePath_);
}
ScreenRenderFlags flags = ScreenRenderFlags::NONE;
Draw::Viewport viewport{ 0.0f, 0.0f, (float)g_display.pixel_xres, (float)g_display.pixel_yres, 0.0f, 1.0f };
using namespace Draw;
@@ -1565,7 +1558,7 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
gpu->CopyDisplayToOutput(true);
PSP_EndHostFrame();
}
if (gpu->PresentedThisFrame()) {
if (gpu && gpu->PresentedThisFrame()) {
framebufferBound = true;
}
if (!framebufferBound) {
@@ -1589,7 +1582,7 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
return flags;
}
if (invalid_) {
if (!PSP_IsInited()) {
// It's possible this might be set outside PSP_RunLoopFor().
// In this case, we need to double check it here.
if (mode & ScreenRenderMode::TOP) {
@@ -1883,7 +1876,7 @@ void EmuScreen::renderUI() {
root_->Draw(*ctx);
}
if (!invalid_) {
if (!PSP_IsInited()) {
if ((DebugOverlay)g_Config.iDebugOverlay == DebugOverlay::CONTROL) {
DrawControlMapperOverlay(ctx, ctx->GetLayoutBounds(), controlMapper_);
}
-2
View File
@@ -100,8 +100,6 @@ private:
bool bootPending_ = true;
Path gamePath_;
// Something invalid was loaded, don't try to emulate
bool invalid_ = true;
bool quit_ = false;
bool stopRender_ = false;
std::string errorMessage_;
+37 -3
View File
@@ -540,6 +540,40 @@ void GamePauseScreen::CreateViews() {
return UI::EVENT_DONE;
});
Button *menuButton = middleColumn->Add(new Button("", ImageID("I_THREE_DOTS"), new LinearLayoutParams(64, 64)));
menuButton->OnClick.Add([this, menuButton](UI::EventParams &e) {
static const ContextMenuItem ingameContextMenu[] = {
{ "Reset" },
};
PopupContextMenuScreen *contextMenu = new UI::PopupContextMenuScreen(ingameContextMenu, ARRAY_SIZE(ingameContextMenu), I18NCat::DIALOG, menuButton);
screenManager()->push(contextMenu);
contextMenu->OnChoice.Add([=](EventParams &e) -> UI::EventReturn {
switch (e.a) {
case 0: // Reset
{
std::string confirmMessage = GetConfirmExitMessage();
if (!confirmMessage.empty()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new PromptScreen(gamePath_, confirmMessage, di->T("Reset"), di->T("Cancel"), [=](bool result) {
if (result) {
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
}
}));
} else {
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
break;
}
}
default:
break;
}
return UI::EVENT_DONE;
});
return UI::EVENT_DONE;
});
// What's this for?
rightColumnHolder->Add(new Spacer(10.0f));
}
@@ -561,9 +595,10 @@ void GamePauseScreen::dialogFinished(const Screen *dialog, DialogResult dr) {
} else {
if (tag == "Game") {
g_BackgroundAudio.SetGame(Path());
} else if (tag != "ContextMenuPopup") {
// There may have been changes to our savestates, so let's recreate.
RecreateViews();
}
// There may have been changes to our savestates, so let's recreate.
RecreateViews();
}
}
@@ -609,7 +644,6 @@ std::string GetConfirmExitMessage() {
// No need to ask for this type of confirmation for dumps.
return confirmMessage;
}
auto di = GetI18NCategory(I18NCat::DIALOG);
confirmMessage = ApplySafeSubstitutions(di->T("You haven't saved your progress for %1."), NiceTimeFormat((int)unsavedSeconds));
confirmMessage += '\n';
+8 -4
View File
@@ -825,7 +825,7 @@ namespace MainWindow
};
}
bool ConfirmExit(HWND hWnd) {
bool ConfirmAction(HWND hWnd, bool actionIsReset) {
const GlobalUIState state = GetUIState();
if (state == UISTATE_MENU || state == UISTATE_EXIT) {
return true;
@@ -837,8 +837,12 @@ namespace MainWindow
}
auto di = GetI18NCategory(I18NCat::DIALOG);
auto mm = GetI18NCategory(I18NCat::MAINMENU);
confirmExitMessage += '\n';
confirmExitMessage += di->T("Are you sure you want to exit?");
if (!actionIsReset) {
confirmExitMessage += '\n';
confirmExitMessage += di->T("Are you sure you want to exit?");
} else {
// Reset is bit rarer, let's just omit the extra message for now.
}
return IDYES == MessageBox(hWnd, ConvertUTF8ToWString(confirmExitMessage).c_str(), ConvertUTF8ToWString(mm->T("Exit")).c_str(), MB_YESNO | MB_ICONQUESTION);
}
@@ -1121,7 +1125,7 @@ namespace MainWindow
case WM_CLOSE:
{
if (ConfirmExit(hWnd)) {
if (ConfirmAction(hWnd, false)) {
DestroyWindow(hWnd);
}
return 0;
+2 -1
View File
@@ -83,7 +83,8 @@ namespace MainWindow
void SetWindowSize(int zoom);
void RunCallbackInWndProc(void (*callback)(void *window, void *userdata), void *userdata);
void SetKeepScreenBright(bool keepBright);
bool ConfirmExit(HWND hWnd);
bool ConfirmAction(HWND hWnd, bool actionIsReset);
}
#endif
+4 -2
View File
@@ -513,7 +513,9 @@ namespace MainWindow {
break;
case ID_EMULATION_RESET:
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
if (MainWindow::ConfirmAction(hWnd, true)) {
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
}
break;
case ID_EMULATION_SWITCH_UMD:
@@ -756,7 +758,7 @@ namespace MainWindow {
case ID_OPTIONS_FRAMESKIPTYPE_PRCNT: setFrameSkippingType(FRAMESKIPTYPE_PRCNT); break;
case ID_FILE_EXIT:
if (MainWindow::ConfirmExit(hWnd)) {
if (MainWindow::ConfirmAction(hWnd, false)) {
DestroyWindow(hWnd);
}
break;