Skip to content

Commit 88b4991

Browse files
authored
UI fixes: Rework savedata manager a bit, default keyboard focus to Cancel in confirmation dialogs (#19771)
* Savedata manager screen: Use TabbedUIDialogScreenWithGameBackground This fixes some minor UI issues on this screen. * PromptScreen (used for "Are you sure?"): Default keyboard focus to Cancel Fixes #19770
1 parent cc040ab commit 88b4991

File tree

7 files changed

+78
-66
lines changed

7 files changed

+78
-66
lines changed

Common/UI/ViewGroup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ class TabHolder : public LinearLayout {
309309

310310
void PersistData(PersistStatus status, std::string anonId, PersistMap &storage) override;
311311

312+
LinearLayout *Container() { return tabContainer_; }
313+
312314
private:
313315
void AddTabContents(std::string_view title, View *tabContents);
314316
EventReturn OnTabClick(EventParams &e);

UI/MiscScreens.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -528,28 +528,26 @@ void PromptScreen::CreateViews() {
528528
root_->Add(rightColumnItems);
529529

530530
Choice *yesButton = rightColumnItems->Add(new Choice(yesButtonText_));
531-
yesButton->OnClick.Handle(this, &PromptScreen::OnYes);
532-
root_->SetDefaultFocusView(yesButton);
531+
yesButton->OnClick.Add([this](UI::EventParams &e) {
532+
TriggerFinish(DR_OK);
533+
return UI::EVENT_DONE;
534+
});
533535
if (!noButtonText_.empty()) {
534-
rightColumnItems->Add(new Choice(noButtonText_))->OnClick.Handle(this, &PromptScreen::OnNo);
536+
Choice *noButton = rightColumnItems->Add(new Choice(noButtonText_));
537+
noButton->OnClick.Add([this](UI::EventParams &e) {
538+
TriggerFinish(DR_CANCEL);
539+
return UI::EVENT_DONE;
540+
});
541+
root_->SetDefaultFocusView(noButton);
535542
} else {
536543
// This is an information screen, not a question.
537544
// Sneak in the version of PPSSPP in the corner, for debug-reporting user screenshots.
538545
std::string version = System_GetProperty(SYSPROP_BUILD_VERSION);
539546
root_->Add(new TextView(version, 0, true, new AnchorLayoutParams(10.0f, NONE, NONE, 10.0f)));
547+
root_->SetDefaultFocusView(yesButton);
540548
}
541549
}
542550

543-
UI::EventReturn PromptScreen::OnYes(UI::EventParams &e) {
544-
TriggerFinish(DR_OK);
545-
return UI::EVENT_DONE;
546-
}
547-
548-
UI::EventReturn PromptScreen::OnNo(UI::EventParams &e) {
549-
TriggerFinish(DR_CANCEL);
550-
return UI::EVENT_DONE;
551-
}
552-
553551
void PromptScreen::TriggerFinish(DialogResult result) {
554552
if (callback_) {
555553
callback_(result == DR_OK || result == DR_YES);

UI/MiscScreens.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,6 @@ class PromptScreen : public UIDialogScreenWithGameBackground {
9797
const char *tag() const override { return "Prompt"; }
9898

9999
private:
100-
UI::EventReturn OnYes(UI::EventParams &e);
101-
UI::EventReturn OnNo(UI::EventParams &e);
102-
103100
std::string message_;
104101
std::string yesButtonText_;
105102
std::string noButtonText_;

UI/SavedataScreen.cpp

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -595,75 +595,80 @@ UI::EventReturn SavedataBrowser::SavedataButtonClick(UI::EventParams &e) {
595595
return UI::EVENT_DONE;
596596
}
597597

598-
SavedataScreen::SavedataScreen(const Path &gamePath) : UIDialogScreenWithGameBackground(gamePath) {
599-
}
600-
601598
SavedataScreen::~SavedataScreen() {
602599
if (g_gameInfoCache) {
603600
g_gameInfoCache->PurgeType(IdentifiedFileType::PPSSPP_SAVESTATE);
604601
g_gameInfoCache->PurgeType(IdentifiedFileType::PSP_SAVEDATA_DIRECTORY);
605602
}
606603
}
607604

608-
void SavedataScreen::CreateViews() {
609-
using namespace UI;
605+
void SavedataScreen::CreateSavedataTab(UI::ViewGroup *savedata) {
610606
auto sa = GetI18NCategory(I18NCat::SAVEDATA);
607+
using namespace UI;
611608
Path savedata_dir = GetSysDirectory(DIRECTORY_SAVEDATA);
612-
Path savestate_dir = GetSysDirectory(DIRECTORY_SAVESTATE);
613609

614-
gridStyle_ = false;
615-
root_ = new AnchorLayout();
616-
617-
// Make space for buttons.
618-
LinearLayout *main = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT, 0, 0, 0, 84.0f));
610+
ChoiceStrip *sortStrip = new ChoiceStrip(ORIENT_HORIZONTAL, new LinearLayoutParams(0.0f, UI::Gravity::G_CENTER));
611+
sortStrip->AddChoice(sa->T("Filename"));
612+
sortStrip->AddChoice(sa->T("Size"));
613+
sortStrip->AddChoice(sa->T("Date"));
614+
sortStrip->SetSelection((int)sortOption_, false);
615+
sortStrip->OnChoice.Add([this](UI::EventParams &e) {
616+
sortOption_ = SavedataSortOption(e.a);
617+
dataBrowser_->SetSortOption(sortOption_);
618+
return UI::EVENT_DONE;
619+
});
620+
savedata->Add(sortStrip);
619621

620-
TabHolder *tabs = new TabHolder(ORIENT_HORIZONTAL, 64, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 1.0f));
621-
tabs->SetTag("Savedata");
622-
ScrollView *scroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT));
623-
scroll->SetTag("SavedataBrowser");
624-
dataBrowser_ = scroll->Add(new SavedataBrowser(savedata_dir, new LayoutParams(FILL_PARENT, FILL_PARENT)));
622+
dataBrowser_ = savedata->Add(new SavedataBrowser(savedata_dir, new LayoutParams(FILL_PARENT, FILL_PARENT)));
625623
dataBrowser_->SetSortOption(sortOption_);
626624
if (!searchFilter_.empty())
627625
dataBrowser_->SetSearchFilter(searchFilter_);
628626
dataBrowser_->OnChoice.Handle(this, &SavedataScreen::OnSavedataButtonClick);
629627

630-
tabs->AddTab(sa->T("Save Data"), scroll);
631-
632-
ScrollView *scroll2 = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT));
633-
scroll2->SetTag("SavedataStatesBrowser");
634-
stateBrowser_ = scroll2->Add(new SavedataBrowser(savestate_dir));
635-
stateBrowser_->SetSortOption(sortOption_);
636-
if (!searchFilter_.empty())
637-
stateBrowser_->SetSearchFilter(searchFilter_);
638-
stateBrowser_->OnChoice.Handle(this, &SavedataScreen::OnSavedataButtonClick);
639-
tabs->AddTab(sa->T("Save States"), scroll2);
628+
}
640629

641-
main->Add(tabs);
630+
void SavedataScreen::CreateSavestateTab(UI::ViewGroup *savestate) {
631+
auto sa = GetI18NCategory(I18NCat::SAVEDATA);
632+
using namespace UI;
633+
Path savestate_dir = GetSysDirectory(DIRECTORY_SAVESTATE);
642634

643-
ChoiceStrip *sortStrip = new ChoiceStrip(ORIENT_HORIZONTAL, new AnchorLayoutParams(NONE, 0, 0, NONE));
635+
ChoiceStrip *sortStrip = new ChoiceStrip(ORIENT_HORIZONTAL);
644636
sortStrip->AddChoice(sa->T("Filename"));
645637
sortStrip->AddChoice(sa->T("Size"));
646638
sortStrip->AddChoice(sa->T("Date"));
647639
sortStrip->SetSelection((int)sortOption_, false);
648-
sortStrip->OnChoice.Handle<SavedataScreen>(this, &SavedataScreen::OnSortClick);
649-
650-
AddStandardBack(root_);
651-
if (System_GetPropertyBool(SYSPROP_HAS_TEXT_INPUT_DIALOG)) {
652-
auto di = GetI18NCategory(I18NCat::DIALOG);
653-
root_->Add(new Choice(di->T("Search"), "", false, new AnchorLayoutParams(WRAP_CONTENT, 64, NONE, NONE, 10, 10)))->OnClick.Handle<SavedataScreen>(this, &SavedataScreen::OnSearch);
654-
}
640+
sortStrip->OnChoice.Add([this](UI::EventParams &e) {
641+
sortOption_ = SavedataSortOption(e.a);
642+
stateBrowser_->SetSortOption(sortOption_);
643+
return UI::EVENT_DONE;
644+
});
645+
savestate->Add(sortStrip);
655646

656-
root_->Add(main);
657-
root_->Add(sortStrip);
647+
stateBrowser_ = savestate->Add(new SavedataBrowser(savestate_dir));
648+
stateBrowser_->SetSortOption(sortOption_);
649+
if (!searchFilter_.empty())
650+
stateBrowser_->SetSearchFilter(searchFilter_);
651+
stateBrowser_->OnChoice.Handle(this, &SavedataScreen::OnSavedataButtonClick);
658652
}
659653

660-
UI::EventReturn SavedataScreen::OnSortClick(UI::EventParams &e) {
661-
sortOption_ = SavedataSortOption(e.a);
654+
void SavedataScreen::CreateTabs() {
655+
using namespace UI;
656+
auto sa = GetI18NCategory(I18NCat::SAVEDATA);
657+
658+
LinearLayout *savedata = AddTab("SavedataBrowser", sa->T("Save Data"));
659+
CreateSavedataTab(savedata);
662660

663-
dataBrowser_->SetSortOption(sortOption_);
664-
stateBrowser_->SetSortOption(sortOption_);
661+
LinearLayout *savestate = AddTab("SavedataStatesBrowser", sa->T("Save States"));
662+
CreateSavestateTab(savestate);
663+
}
665664

666-
return UI::EVENT_DONE;
665+
void SavedataScreen::CreateExtraButtons(UI::LinearLayout *verticalLayout, int margins) {
666+
using namespace UI;
667+
if (System_GetPropertyBool(SYSPROP_HAS_TEXT_INPUT_DIALOG)) {
668+
auto di = GetI18NCategory(I18NCat::DIALOG);
669+
verticalLayout->Add(new Choice(di->T("Search"), "", false, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 0.0f, Margins(0, 0, margins, margins))))
670+
->OnClick.Handle<SavedataScreen>(this, &SavedataScreen::OnSearch);
671+
}
667672
}
668673

669674
UI::EventReturn SavedataScreen::OnSearch(UI::EventParams &e) {

UI/SavedataScreen.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "UI/MiscScreens.h"
3030
#include "UI/GameInfoCache.h"
31+
#include "UI/TabbedDialogScreen.h"
3132

3233
enum class SavedataSortOption {
3334
FILENAME,
@@ -66,10 +67,10 @@ class SavedataBrowser : public UI::LinearLayout {
6667
bool searchPending_ = false;
6768
};
6869

69-
class SavedataScreen : public UIDialogScreenWithGameBackground {
70+
class SavedataScreen : public TabbedUIDialogScreenWithGameBackground {
7071
public:
7172
// gamePath can be empty, in that case this screen will show all savedata in the save directory.
72-
SavedataScreen(const Path &gamePath);
73+
SavedataScreen(const Path &gamePath) : TabbedUIDialogScreenWithGameBackground(gamePath) {}
7374
~SavedataScreen();
7475

7576
void dialogFinished(const Screen *dialog, DialogResult result) override;
@@ -78,15 +79,22 @@ class SavedataScreen : public UIDialogScreenWithGameBackground {
7879
const char *tag() const override { return "Savedata"; }
7980

8081
protected:
82+
void CreateTabs() override;
83+
void CreateExtraButtons(UI::LinearLayout *verticalLayout, int margins) override;
84+
85+
bool ShowSearchControls() const override { return false; }
86+
87+
private:
8188
UI::EventReturn OnSavedataButtonClick(UI::EventParams &e);
82-
UI::EventReturn OnSortClick(UI::EventParams &e);
8389
UI::EventReturn OnSearch(UI::EventParams &e);
84-
void CreateViews() override;
8590

86-
bool gridStyle_;
91+
void CreateSavedataTab(UI::ViewGroup *savedata);
92+
void CreateSavestateTab(UI::ViewGroup *savestate);
93+
94+
bool gridStyle_ = false;
8795
SavedataSortOption sortOption_ = SavedataSortOption::FILENAME;
88-
SavedataBrowser *dataBrowser_;
89-
SavedataBrowser *stateBrowser_;
96+
SavedataBrowser *dataBrowser_ = nullptr;
97+
SavedataBrowser *stateBrowser_ = nullptr;
9098
std::string searchFilter_;
9199
};
92100

UI/TabbedDialogScreen.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ void TabbedUIDialogScreenWithGameBackground::CreateViews() {
4545
LinearLayout *verticalLayout = new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT));
4646
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 200, new LinearLayoutParams(1.0f));
4747
verticalLayout->Add(tabHolder_);
48+
CreateExtraButtons(verticalLayout, 0);
4849
verticalLayout->Add(new Choice(di->T("Back"), "", false, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, 0.0f, Margins(0))))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
4950
root_->Add(verticalLayout);
5051
} else {
5152
tabHolder_ = new TabHolder(ORIENT_VERTICAL, 200, new AnchorLayoutParams(10, 0, 10, 0, false));
53+
CreateExtraButtons(tabHolder_->Container(), 10);
5254
tabHolder_->AddBack(this);
5355
root_->Add(tabHolder_);
5456
}

UI/TabbedDialogScreen.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ class TabbedUIDialogScreenWithGameBackground : public UIDialogScreenWithGameBack
1414
UI::LinearLayout *AddTab(const char *tag, std::string_view title, bool isSearch = false);
1515
void CreateViews() override;
1616

17-
1817
protected:
1918
// Load data and define your tabs here.
2019
virtual void PreCreateViews() {}
2120
virtual void CreateTabs() = 0;
21+
virtual void CreateExtraButtons(UI::LinearLayout *verticalLayout, int margins) {}
2222
virtual bool ShowSearchControls() const { return true; }
2323

2424
void RecreateViews() override;

0 commit comments

Comments
 (0)