diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 7e3aefbdd..793001d00 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -11,7 +11,6 @@ // Autogenerated by `xb premake`. #include "build/version.h" - #include "third_party/imgui/imgui.h" #include "xenia/base/clock.h" #include "xenia/base/cvar.h" @@ -22,13 +21,14 @@ #include "xenia/base/threading.h" #include "xenia/emulator.h" #include "xenia/gpu/graphics_system.h" - #include "xenia/ui/file_picker.h" #include "xenia/ui/imgui_dialog.h" #include "xenia/ui/imgui_drawer.h" -DECLARE_bool(debug); +#include +#include +DECLARE_bool(debug); DEFINE_int32(window_height, 720, "Window height", "UI"); DEFINE_int32(window_width, 1280, "Window width", "UI"); @@ -189,10 +189,37 @@ bool EmulatorWindow::Initialize() { // FIXME: This code is really messy. auto main_menu = MenuItem::Create(MenuItem::Type::kNormal); auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, L"&File"); + // Recent Sub tab + auto recent_list = MenuItem::Create(MenuItem::Type::kPopup, L"&Open Recent"); + //******Add Recent PATHS to menu*************************************** + std::string lines[10]; + std::ifstream recent_file_read("recent.txt"); + int i = 0; + // Convert from UTF-8 to wide using helper function xe::to_wstring() + if (recent_file_read.is_open()) { + while ((i < 10) && getline(recent_file_read, lines[i])) { + // Save paths to memory + global_recent_paths_[i] = xe::to_wstring(lines[i]); + // Add most recently opened files to menu + if (lines[i] != "" && lines[i] != "\n") { + recent_list->AddChild( + MenuItem::Create(MenuItem::Type::kString, global_recent_paths_[i], + std::bind(&EmulatorWindow::RecentList, this, i))); + } else { + break; + } + i++; + } + recent_file_read.close(); + } + //**************************************************************************** { file_menu->AddChild( MenuItem::Create(MenuItem::Type::kString, L"&Open...", L"Ctrl+O", std::bind(&EmulatorWindow::FileOpen, this))); + // Add Recent List Tab to file tab + file_menu->AddChild(std::move(recent_list)); + file_menu->AddChild( MenuItem::Create(MenuItem::Type::kString, L"Close", std::bind(&EmulatorWindow::FileClose, this))); @@ -312,6 +339,48 @@ void EmulatorWindow::FileDrop(wchar_t* filename) { } } +// Add new path to recent storage or prioritize if it already exist +void EmulatorWindow::RecentListUpdater(std::wstring path) { + //*******Save abs_path to recent as UTF-8****************************** + std::string u8_path = xe::to_string(path); + + // Write to 'recent.txt' file + std::string lines[10]; + int i = 0; + int path_poss = 0; + bool path_is_in = false; + // Open file "recent.txt" to read values + std::ifstream recent_file_read("recent.txt"); + if (recent_file_read.is_open()) { + // Loop until end of document or 10 lines are read, which ever comes first + while (getline(recent_file_read, lines[i]) && (i < 9)) { + if (u8_path.compare(lines[i]) == 0) { + path_is_in = true; + path_poss = i; + } + i++; + } + recent_file_read.close(); + } + // Move lines + if (!path_is_in) { + path_poss = 9; + } + for (i = path_poss; i > 0; i--) { + lines[i] = lines[i - 1]; + } + // Add all lines to file + lines[0] = u8_path; + std::ofstream recent_file_write("recent.txt"); + for (i = 0; i < 10; i++) { + if (lines[i] != "" && lines[i] != "\n") { + recent_file_write << lines[i] << std::endl; + } + } + recent_file_write.close(); + //***************************************************** +} + void EmulatorWindow::FileOpen() { std::wstring path; @@ -339,6 +408,8 @@ void EmulatorWindow::FileOpen() { // Normalize the path and make absolute. std::wstring abs_path = xe::to_absolute_path(path); + EmulatorWindow::RecentListUpdater(abs_path); + auto result = emulator_->LaunchPath(abs_path); if (XFAILED(result)) { // TODO: Display a message box. @@ -347,6 +418,19 @@ void EmulatorWindow::FileOpen() { } } +// Launch recently opened files +void EmulatorWindow::RecentList(int index) { + if (!global_recent_paths_[index].empty()) { + EmulatorWindow::RecentListUpdater(global_recent_paths_[index]); + + auto result = emulator_->LaunchPath(global_recent_paths_[index]); + if (XFAILED(result)) { + // TODO: Display a message box. + XELOGE("Failed to launch target: %.8X", result); + } + } +} + std::wstring EmulatorWindow::SwapNext() { std::wstring path = L""; diff --git a/src/xenia/app/emulator_window.h b/src/xenia/app/emulator_window.h index 960ac8151..03c2cf87f 100644 --- a/src/xenia/app/emulator_window.h +++ b/src/xenia/app/emulator_window.h @@ -46,6 +46,8 @@ class EmulatorWindow { void FileDrop(wchar_t* filename); void FileOpen(); + void RecentListUpdater(std::wstring path); + void RecentList(int index); void FileClose(); void ShowContentDirectory(); void CheckHideCursor(); @@ -62,6 +64,7 @@ class EmulatorWindow { std::unique_ptr loop_; std::unique_ptr window_; std::wstring base_title_; + std::wstring global_recent_paths_[10]; uint64_t cursor_hide_time_ = 0; };