diff options
Diffstat (limited to 'gamelist.diff')
-rw-r--r-- | gamelist.diff | 462 |
1 files changed, 462 insertions, 0 deletions
diff --git a/gamelist.diff b/gamelist.diff new file mode 100644 index 000000000000..c5f03adcbb8d --- /dev/null +++ b/gamelist.diff @@ -0,0 +1,462 @@ +--- a/src/config/CemuConfig.cpp ++++ b/src/config/CemuConfig.cpp +@@ -89,12 +89,26 @@ void CemuConfig::Load(XMLConfigParser& parser) + auto gamelist = parser.get("GameList"); + game_list_style = gamelist.get("style", 0); + game_list_column_order = gamelist.get("order", ""); +- column_width.name = gamelist.get("name_width", -3); +- column_width.version = gamelist.get("version_width", -3); +- column_width.dlc = gamelist.get("dlc_width", -3); +- column_width.game_time = gamelist.get("game_time_width", -3); +- column_width.game_started = gamelist.get("game_started_width", -3); +- column_width.region = gamelist.get("region_width", -3); ++ ++ /* ++ * gamelist.get() relies on TinyXML that itself relies on sscanf to read ++ * data. sscanf does succeed when reading a negative number into a ++ * uint32, it's simply cast to an unsigned. This is not what we want ++ * so we read the signed integer and return the default column width if ++ * the value in the config is negative. ++ */ ++ auto loadColumnSize = [&gamelist] (const char *name, uint32 defaultWidth) { ++ sint64 val = gamelist.get(name, DefaultColumnSize::name); ++ if (val < 0 || val > (sint64) std::numeric_limits<uint32>::max) ++ return defaultWidth; ++ return static_cast<uint32>(val); ++ }; ++ column_width.name = loadColumnSize("name_width", DefaultColumnSize::name); ++ column_width.version = loadColumnSize("version_width", DefaultColumnSize::version); ++ column_width.dlc = loadColumnSize("dlc_width", DefaultColumnSize::dlc); ++ column_width.game_time = loadColumnSize("game_time_width", DefaultColumnSize::game_time); ++ column_width.game_started = loadColumnSize("game_started_width", DefaultColumnSize::game_started); ++ column_width.region = loadColumnSize("region_width", DefaultColumnSize::region); + + recent_launch_files.clear(); + auto launch_parser = parser.get("RecentLaunchFiles"); +--- a/src/config/CemuConfig.h ++++ b/src/config/CemuConfig.h +@@ -307,6 +307,16 @@ struct fmt::formatter<CrashDump> : formatter<string_view> { + } + }; + ++namespace DefaultColumnSize { ++ enum : uint32 { ++ name = 500u, ++ version = 60u, ++ dlc = 50u, ++ game_time = 140u, ++ game_started = 160u, ++ region = 80u, ++ }; ++}; + + struct CemuConfig + { +@@ -375,7 +385,12 @@ struct CemuConfig + std::string game_list_column_order; + struct + { +- int name = -3, version = -3, dlc = -3, game_time = -3, game_started = -3, region = -3; ++ uint32 name = DefaultColumnSize::name; ++ uint32 version = DefaultColumnSize::version; ++ uint32 dlc = DefaultColumnSize::dlc; ++ uint32 game_time = DefaultColumnSize::game_time; ++ uint32 game_started = DefaultColumnSize::game_started; ++ uint32 region = DefaultColumnSize::region; + } column_width{}; + + // graphics +--- a/src/gui/components/wxGameList.cpp ++++ b/src/gui/components/wxGameList.cpp +@@ -6,13 +6,14 @@ + + #include <numeric> + +-#include <wx/wupdlock.h> ++#include <wx/imaglist.h> + #include <wx/menu.h> + #include <wx/mstream.h> +-#include <wx/imaglist.h> +-#include <wx/textdlg.h> +-#include <wx/stattext.h> ++#include <wx/settings.h> + #include <wx/sizer.h> ++#include <wx/stattext.h> ++#include <wx/textdlg.h> ++#include <wx/wupdlock.h> + + #include <boost/algorithm/string.hpp> + #include <boost/tokenizer.hpp> +@@ -50,7 +51,16 @@ void _stripPathFilename(fs::path& path) + wxGameList::wxGameList(wxWindow* parent, wxWindowID id) + : wxListCtrl(parent, id, wxDefaultPosition, wxDefaultSize, GetStyleFlags(Style::kList)), m_style(Style::kList) + { +- CreateListColumns(); ++ const auto& config = GetConfig(); ++ ++ InsertColumn(ColumnHiddenName, "", wxLIST_FORMAT_LEFT, 0); ++ InsertColumn(ColumnIcon, "", wxLIST_FORMAT_LEFT, kListIconWidth + 8); ++ InsertColumn(ColumnName, _("Game"), wxLIST_FORMAT_LEFT, config.column_width.name); ++ InsertColumn(ColumnVersion, _("Version"), wxLIST_FORMAT_RIGHT, config.column_width.version); ++ InsertColumn(ColumnDLC, _("DLC"), wxLIST_FORMAT_RIGHT, config.column_width.dlc); ++ InsertColumn(ColumnGameTime, _("You've played"), wxLIST_FORMAT_LEFT, config.column_width.game_time); ++ InsertColumn(ColumnGameStarted, _("Last played"), wxLIST_FORMAT_LEFT, config.column_width.game_started); ++ InsertColumn(ColumnRegion, _("Region"), wxLIST_FORMAT_LEFT, config.column_width.region); + + const char transparent_bitmap[kIconWidth * kIconWidth * 4] = {0}; + wxBitmap blank(transparent_bitmap, kIconWidth, kIconWidth); +@@ -82,6 +92,7 @@ wxGameList::wxGameList(wxWindow* parent, wxWindowID id) + Bind(wxEVT_GAME_ENTRY_ADDED_OR_REMOVED, &wxGameList::OnGameEntryUpdatedByTitleId, this); + Bind(wxEVT_TIMER, &wxGameList::OnTimer, this); + Bind(wxEVT_LEAVE_WINDOW, &wxGameList::OnLeaveWindow, this); ++ Bind(wxEVT_SIZE, &wxGameList::OnWindowSize, this); + + Bind(wxEVT_LIST_COL_CLICK, &wxGameList::OnColumnClick, this); + Bind(wxEVT_LIST_COL_BEGIN_DRAG, &wxGameList::OnColumnBeginResize, this); +@@ -124,7 +135,7 @@ void wxGameList::LoadConfig() + if (!config.game_list_column_order.empty()) + { + wxArrayInt order; +- order.reserve(ColumnFavorite); ++ order.reserve(ColumnMax); + + const auto order_string = std::string_view(config.game_list_column_order).substr(1); + +@@ -135,10 +146,10 @@ void wxGameList::LoadConfig() + order.push_back(ConvertString<int>(token, 10)); + } + +- #ifdef wxHAS_LISTCTRL_COLUMN_ORDER +- if(order.GetCount() == ColumnFavorite) ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++ if(order.GetCount() == ColumnMax) + SetColumnsOrder(order); +- #endif ++#endif + } + } + +@@ -147,9 +158,9 @@ void wxGameList::SaveConfig(bool flush) + auto& config = GetConfig(); + + config.game_list_style = (int)m_style; +- #ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER + config.game_list_column_order = fmt::format("{}", GetColumnsOrder()); +- #endif ++#endif + + if (flush) + g_config.Save(); +@@ -355,61 +356,7 @@ void wxGameList::SortEntries(int column) + } + } + +-void wxGameList::CreateListColumns() +-{ +- DeleteAllColumns(); +- +- const auto& config = GetConfig(); +- wxListItem col0; +- col0.SetId(ColumnHiddenName); +- col0.SetWidth(0); +- InsertColumn(ColumnHiddenName, col0); +- +- wxListItem col1; +- col1.SetId(ColumnIcon); +- col1.SetWidth(kListIconWidth); +- InsertColumn(ColumnIcon, col1); +- +- wxListItem col2; +- col2.SetId(ColumnName); +- col2.SetText(_("Game")); +- col2.SetWidth(config.column_width.name); +- InsertColumn(ColumnName, col2); +- +- wxListItem col3; +- col3.SetId(ColumnVersion); +- col3.SetText(_("Version")); +- col3.SetWidth(config.column_width.version); +- col3.SetAlign(wxLIST_FORMAT_RIGHT); +- InsertColumn(ColumnVersion, col3); +- +- wxListItem col4; +- col4.SetId(ColumnDLC); +- col4.SetText(_("DLC")); +- col4.SetWidth(config.column_width.dlc); +- col4.SetAlign(wxLIST_FORMAT_RIGHT); +- InsertColumn(ColumnDLC, col4); +- +- wxListItem col5; +- col5.SetId(ColumnGameTime); +- col5.SetText(_("You've played")); +- col5.SetWidth(config.column_width.game_time); +- InsertColumn(ColumnGameTime, col5); +- +- wxListItem col6; +- col6.SetId(ColumnGameStarted); +- col6.SetText(_("Last played")); +- col6.SetWidth(config.column_width.game_started); +- InsertColumn(ColumnGameStarted, col6); +- +- wxListItem col7; +- col7.SetId(ColumnRegion); +- col7.SetText(_("Region")); +- col7.SetWidth(config.column_width.region); +- InsertColumn(ColumnRegion, col7); +-} +- +-void wxGameList::OnKeyDown(wxListEvent& event) ++void wxGameList::OnKeyDown(wxListEvent& event) + { + event.Skip(); + if (m_style != Style::kList) +@@ -642,6 +599,12 @@ void wxGameList::OnContextMenuSelected(wxCommandEvent& event) + } + } + ++void wxGameList::OnWindowSize(wxSizeEvent& event) ++{ ++ AdjustLastColumnWidth(); ++ event.Skip(); ++} ++ + void wxGameList::OnColumnClick(wxListEvent& event) + { + const int column = event.GetColumn(); +@@ -669,17 +632,16 @@ void wxGameList::OnColumnRightClick(wxListEvent& event) + menu.SetClientObject(new wxCustomData(column)); + + menu.Append(ResetWidth, _("Reset &width")); +- menu.Append(ResetOrder, _("Reset &order")) ; +- ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++ menu.Append(ResetOrder, _("Reset &order")); ++#endif + menu.AppendSeparator(); + menu.AppendCheckItem(ShowName, _("Show &name"))->Check(GetColumnWidth(ColumnName) > 0); + menu.AppendCheckItem(ShowVersion, _("Show &version"))->Check(GetColumnWidth(ColumnVersion) > 0); + menu.AppendCheckItem(ShowDlc, _("Show &dlc"))->Check(GetColumnWidth(ColumnDLC) > 0); + menu.AppendCheckItem(ShowGameTime, _("Show &game time"))->Check(GetColumnWidth(ColumnGameTime) > 0); + menu.AppendCheckItem(ShowLastPlayed, _("Show &last played"))->Check(GetColumnWidth(ColumnGameStarted) > 0); +- menu.AppendCheckItem(ColumnRegion, _("Show ®ion"))->Check(GetColumnWidth(ColumnRegion) > 0); +- //menu.AppendSeparator(); +- //menu.Append(ResetOrder, _("&Reset order")); ++ menu.AppendCheckItem(ShowRegion, _("Show ®ion"))->Check(GetColumnWidth(ColumnRegion) > 0); + + menu.Bind(wxEVT_COMMAND_MENU_SELECTED, + [this](wxCommandEvent& event) { +@@ -692,44 +654,44 @@ void wxGameList::OnColumnRightClick(wxListEvent& event) + switch (event.GetId()) + { + case ShowName: +- config.column_width.name = menu->IsChecked(ShowName) ? 500 : 0; ++ config.column_width.name = menu->IsChecked(ShowName) ? DefaultColumnSize::name : 0; + break; + case ShowVersion: +- config.column_width.version = menu->IsChecked(ShowVersion) ? 60 : 0; ++ config.column_width.version = menu->IsChecked(ShowVersion) ? DefaultColumnSize::version : 0; + break; + case ShowDlc: +- config.column_width.dlc = menu->IsChecked(ShowDlc) ? 50 : 0; ++ config.column_width.dlc = menu->IsChecked(ShowDlc) ? DefaultColumnSize::dlc : 0; + break; + case ShowGameTime: +- config.column_width.game_time = menu->IsChecked(ShowGameTime) ? 140 : 0; ++ config.column_width.game_time = menu->IsChecked(ShowGameTime) ? DefaultColumnSize::game_time : 0; + break; + case ShowLastPlayed: +- config.column_width.game_started = menu->IsChecked(ShowLastPlayed) ? 160 : 0; ++ config.column_width.game_started = menu->IsChecked(ShowLastPlayed) ? DefaultColumnSize::game_started : 0; + break; +- case ColumnRegion: +- config.column_width.region = menu->IsChecked(ColumnRegion) ? 80 : 0; ++ case ShowRegion: ++ config.column_width.region = menu->IsChecked(ShowRegion) ? DefaultColumnSize::region : 0; + break; + case ResetWidth: + { + switch (column) + { + case ColumnName: +- config.column_width.name = 500; ++ config.column_width.name = DefaultColumnSize::name; + break; + case ColumnVersion: +- config.column_width.version = 60; ++ config.column_width.version = DefaultColumnSize::version; + break; + case ColumnDLC: +- config.column_width.dlc = 50; ++ config.column_width.dlc = DefaultColumnSize::dlc; + break; + case ColumnGameTime: +- config.column_width.game_time = 140; ++ config.column_width.game_time = DefaultColumnSize::game_time; + break; + case ColumnGameStarted: +- config.column_width.game_started = 160; ++ config.column_width.game_started = DefaultColumnSize::game_started; + break; + case ColumnRegion: +- config.column_width.region = 80; ++ config.column_width.region = DefaultColumnSize::region; + break; + default: + return; +@@ -740,11 +702,11 @@ void wxGameList::OnColumnRightClick(wxListEvent& event) + case ResetOrder: + { + config.game_list_column_order.clear(); +- wxArrayInt order(ColumnFavorite); ++ wxArrayInt order(ColumnMax); + std::iota(order.begin(), order.end(), 0); +- #ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER + SetColumnsOrder(order); +- #endif ++#endif + Refresh(); + return; + } +@@ -758,31 +720,60 @@ void wxGameList::OnColumnRightClick(wxListEvent& event) + event.Skip(); + } + ++void wxGameList::AdjustLastColumnWidth() ++{ ++ int totalWidth = 0; ++ int lastColumn = 0; ++ size_t size; ++ ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++ wxArrayInt order = GetColumnsOrder(); ++ size = order.GetCount(); ++#else ++ std::vector<int> order(ColumnMax); ++ std::iota(order.begin(), order.end(), 0); ++ size = ColumnMax; ++#endif ++ for (size_t i = 0; i < size; ++i) { ++#ifdef wxHAS_LISTCTRL_COLUMN_ORDER ++ int colNum = order.Item(i); ++#else ++ int colNum = order[i]; ++#endif ++ int colWidth = GetColumnWidth(colNum); ++ if (colWidth > 0) { ++ totalWidth += colWidth; ++ lastColumn = colNum; ++ } ++ } ++ ++ totalWidth -= GetColumnWidth(lastColumn); ++ int colWidth = GetClientSize().GetWidth() - totalWidth; ++ if (colWidth > 50) ++ SetColumnWidth(lastColumn, colWidth); ++} ++ + void wxGameList::ApplyGameListColumnWidths() + { +- auto set_width = [this](int id, int width) +- { +- if (width == -3) +- wxAutosizeColumn(this, id); +- else +- this->SetColumnWidth(id, width); +- }; +- + const auto& config = GetConfig(); + wxWindowUpdateLocker lock(this); +- set_width(ColumnName, config.column_width.name); +- set_width(ColumnVersion, config.column_width.version); +- set_width(ColumnDLC, config.column_width.dlc); +- set_width(ColumnGameTime, config.column_width.game_time); +- set_width(ColumnGameStarted, config.column_width.game_started); +- set_width(ColumnRegion, config.column_width.region); ++ ++ SetColumnWidth(ColumnIcon, kListIconWidth + 8); ++ SetColumnWidth(ColumnName, config.column_width.name); ++ SetColumnWidth(ColumnVersion, config.column_width.version); ++ SetColumnWidth(ColumnDLC, config.column_width.dlc); ++ SetColumnWidth(ColumnGameTime, config.column_width.game_time); ++ SetColumnWidth(ColumnGameStarted, config.column_width.game_started); ++ SetColumnWidth(ColumnRegion, config.column_width.region); ++ ++ AdjustLastColumnWidth(); + } + + void wxGameList::OnColumnBeginResize(wxListEvent& event) + { + const int column = event.GetColumn(); + const int width = GetColumnWidth(column); +- if (width == 0) ++ if (width == 0 || column == ColumnIcon) + event.Veto(); + else + event.Skip(); +@@ -812,21 +803,18 @@ void wxGameList::OnColumnResize(wxListEvent& event) + case ColumnGameStarted: + config.column_width.game_started = width; + break; ++ case ColumnRegion: ++ config.column_width.region = width; ++ break; ++ + default: + return; + } ++ AdjustLastColumnWidth(); + + g_config.Save(); + } + +-void wxGameList::OnColumnDrag(wxListEvent& event) +-{ +- const auto column = event.GetColumn(); +- const auto width = GetColumnWidth(column); +- if (column == ColumnHiddenName || width == 0) +- event.Veto(); +-} +- + void wxGameList::OnClose(wxCloseEvent& event) + { + event.Skip(); +@@ -837,8 +825,6 @@ int wxGameList::FindInsertPosition(TitleId titleId) + { + SortData data{ this, s_last_column, s_direction }; + const auto itemCount = GetItemCount(); +- if (itemCount == 0) +- return 0; + // todo - optimize this with binary search + + for (int i = 0; i < itemCount; i++) +--- a/src/gui/components/wxGameList.h ++++ b/src/gui/components/wxGameList.h +@@ -74,7 +74,8 @@ private: + ColumnGameTime, + ColumnGameStarted, + ColumnRegion, +- ColumnFavorite ++ ++ ColumnMax + }; + + int s_last_column = ColumnName; +@@ -124,14 +125,13 @@ private: + std::map<TitleId, std::string> m_name_cache; + + // list mode +- void CreateListColumns(); +- ++ void OnWindowSize(wxSizeEvent& event); + void OnColumnClick(wxListEvent& event); + void OnColumnRightClick(wxListEvent& event); ++ void AdjustLastColumnWidth(); + void ApplyGameListColumnWidths(); + void OnColumnBeginResize(wxListEvent& event); + void OnColumnResize(wxListEvent& event); +- void OnColumnDrag(wxListEvent& event); + + // generic events + void OnKeyDown(wxListEvent& event); |