From f4792a897dcbd3b454257a7ec988606fb8d47167 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Fri, 7 Nov 2025 00:17:09 +0900 Subject: [PATCH] [App] Make all file pickers default to last recently opened directory --- src/xenia/app/emulator_window.cc | 37 ++++++++++++++++++++++++++++++++ src/xenia/app/emulator_window.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 80f2b4003..c459daf2b 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -1178,6 +1178,12 @@ void EmulatorWindow::FileOpen() { file_picker->set_type(ui::FilePicker::Type::kFile); file_picker->set_multi_selection(false); file_picker->set_title("Select Content Package"); + + auto initial_dir = GetFilePickerInitialDirectory(); + if (!initial_dir.empty()) { + file_picker->set_initial_directory(initial_dir); + } + file_picker->set_extensions({ {"Supported Files", "*.iso;*.xex;*.zar;*.*"}, {"Disc Image (*.iso)", "*.iso"}, @@ -1208,6 +1214,12 @@ void EmulatorWindow::InstallContent() { file_picker->set_type(ui::FilePicker::Type::kFile); file_picker->set_multi_selection(true); file_picker->set_title("Select Content Package(s)"); + + auto initial_dir = GetFilePickerInitialDirectory(); + if (!initial_dir.empty()) { + file_picker->set_initial_directory(initial_dir); + } + file_picker->set_extensions({ {"All Files (*.*)", "*.*"}, }); @@ -1256,6 +1268,12 @@ void EmulatorWindow::ExtractZarchive() { file_picker->set_type(ui::FilePicker::Type::kFile); file_picker->set_multi_selection(true); file_picker->set_title("Select Zar Package"); + + auto initial_dir = GetFilePickerInitialDirectory(); + if (!initial_dir.empty()) { + file_picker->set_initial_directory(initial_dir); + } + file_picker->set_extensions({ {"Zarchive Files (*.zar)", "*.zar"}, }); @@ -1343,6 +1361,11 @@ void EmulatorWindow::CreateZarchive() { file_picker->set_multi_selection(true); file_picker->set_title("Select Contents"); + auto initial_dir = GetFilePickerInitialDirectory(); + if (!initial_dir.empty()) { + file_picker->set_initial_directory(initial_dir); + } + if (file_picker->Show(window_.get())) { content_dirs = file_picker->selected_files(); } @@ -2757,6 +2780,20 @@ void EmulatorWindow::FillRecentlyLaunchedTitlesMenu( } } +std::filesystem::path EmulatorWindow::GetFilePickerInitialDirectory() const { + // Return the directory of the most recently played game if available + if (!recently_launched_titles_.empty()) { + const auto& recent_path = recently_launched_titles_[0].path_to_file; + if (std::filesystem::exists(recent_path)) { + auto parent_dir = recent_path.parent_path(); + if (!parent_dir.empty() && std::filesystem::exists(parent_dir)) { + return parent_dir; + } + } + } + return std::filesystem::path(); +} + void EmulatorWindow::LoadRecentlyLaunchedTitles() { // Clear existing titles before loading recently_launched_titles_.clear(); diff --git a/src/xenia/app/emulator_window.h b/src/xenia/app/emulator_window.h index 8c783c019..02e98b41a 100644 --- a/src/xenia/app/emulator_window.h +++ b/src/xenia/app/emulator_window.h @@ -251,6 +251,9 @@ class EmulatorWindow { void FillRecentlyLaunchedTitlesMenu(xe::ui::MenuItem* recent_menu); void LoadRecentlyLaunchedTitles(); + // Get initial directory for file pickers based on recently played games + std::filesystem::path GetFilePickerInitialDirectory() const; + void ClearDialogs(); Emulator* emulator_;