diff --git a/source/interface_derived.cpp b/source/interface_derived.cpp index c63a3aec..b1e24cd9 100644 --- a/source/interface_derived.cpp +++ b/source/interface_derived.cpp @@ -30,6 +30,7 @@ const int TIMER_LENGTH = 5 * 1000 * 60; constexpr std::string_view config_name = "com.ravbug.unityhubnative.config"; constexpr std::string_view config_sortCol = "sortColIndex"; constexpr std::string_view config_sortAscending = "sortAscending"; +constexpr std::string_view config_columnWidth = "projectColumnWidth"; //Declare events here wxBEGIN_EVENT_TABLE(MainFrameDerived, wxFrame) @@ -43,6 +44,7 @@ EVT_MENU(wxID_REFRESH, MainFrameDerived::OnReloadData) EVT_MENU(wxID_UNINDENT, MainFrameDerived::OnSource) EVT_MENU(wxID_TOP, MainFrameDerived::OnUpdate) EVT_MENU(wxID_EXIT, MainFrameDerived::OnQuit) +EVT_CLOSE(MainFrameDerived::OnClose) EVT_BUTTON(wxID_ADD,MainFrameDerived::OnAddProject) EVT_BUTTON(wxID_NEW,MainFrameDerived::OnCreateProject) EVT_BUTTON(wxID_FIND,MainFrameDerived::OnLocateInstall) @@ -61,6 +63,7 @@ EVT_LIST_ITEM_SELECTED(wxID_HARDDISK, MainFrameDerived::OnSelectProject) EVT_LIST_ITEM_DESELECTED(wxID_HARDDISK, MainFrameDerived::OnDeselectProject) EVT_LIST_DELETE_ITEM(wxID_HARDDISK, MainFrameDerived::OnDeselectProject) EVT_LIST_COL_CLICK(wxID_HARDDISK, MainFrameDerived::OnColumnClick) +EVT_LIST_COL_END_DRAG(wxID_HARDDISK, MainFrameDerived::OnColumnResized) EVT_LISTBOX(wxID_FLOPPY, MainFrameDerived::OnSelectEditor) EVT_LISTBOX(wxID_HOME, MainFrameDerived::OnSelectEditorPath) @@ -78,7 +81,7 @@ MainFrameDerived::MainFrameDerived() : MainFrame(NULL){ // load prefs wxConfig config(config_name.data()); sortColumn = std::clamp(config.ReadLong(config_sortCol.data(), 0), 0, 3); - sortAscending = config.ReadBool(config_sortAscending.data(), false); + sortAscending = config.ReadBool(config_sortAscending.data(), true); //set up project list columns { @@ -87,6 +90,22 @@ MainFrameDerived::MainFrameDerived() : MainFrame(NULL){ projectsList->AppendColumn(str,wxLIST_FORMAT_LEFT); } } + //restore column widths if the user resized them in a previous session + { + const int cols = projectsList->GetColumnCount(); + std::vector widths(cols); + bool allRead = true; + for (int i = 0; i < cols && allRead; i++){ + allRead = config.Read(std::format("{}{}", config_columnWidth, i), &widths[i]); + } + if (allRead){ + for (int i = 0; i < cols; i++){ + projectsList->SetColumnWidth(i, widths[i]); + } + customColumnWidths = true; + } + } + projectsList->ShowSortIndicator(sortColumn, sortAscending); //make the data folder if it does not already exist (with readwrite for all groups) #if defined __APPLE__ || defined __linux__ int status = mkdir(datapath.c_str(),S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); @@ -163,6 +182,24 @@ void MainFrameDerived::OnQuit(wxCommandEvent&) Close(); } +void MainFrameDerived::OnClose(wxCloseEvent& event){ + wxConfig config(config_name.data()); + + // save column widths only if the user resized them, otherwise keep autosizing + for (int i = 0; i < projectsList->GetColumnCount(); i++){ + const auto key = std::format("{}{}", config_columnWidth, i); + if (customColumnWidths){ + config.Write(key, projectsList->GetColumnWidth(i)); + } + else{ + config.DeleteEntry(key); + } + } + + // let the default handler destroy the window + event.Skip(); +} + /** Loads the data in the main view. If anything is currently loaded, it will be cleared and re-loaded */ @@ -607,10 +644,12 @@ void MainFrameDerived::AddProject(const project& p, const std::string& filter, b projectsList->SetItem(itemIndex, 2, p.modifyDateString()); projectsList->SetItem(itemIndex, 3, p.path.string()); - //resize columns - int cols = projectsList->GetColumnCount(); - for (int j = 0; j < cols; j++){ - projectsList->SetColumnWidth(j, wxLIST_AUTOSIZE_USEHEADER); + //resize columns, unless the user has set their widths + if (!customColumnWidths){ + int cols = projectsList->GetColumnCount(); + for (int j = 0; j < cols; j++){ + projectsList->SetColumnWidth(j, wxLIST_AUTOSIZE_USEHEADER); + } } // Sort the list to place the new item in the correct position @@ -747,9 +786,13 @@ void MainFrameDerived::OnColumnClick(wxListEvent& event) { } SortProjects(); - // update UI - const bool ascending = projectsList->GetUpdatedAscendingSortIndicator(col); - projectsList->ShowSortIndicator(col, ascending); + // update UI + projectsList->ShowSortIndicator(sortColumn, sortAscending); +} + +void MainFrameDerived::OnColumnResized(wxListEvent& event) { + customColumnWidths = true; + event.Skip(); } // Sort comparison function diff --git a/source/interface_derived.hpp b/source/interface_derived.hpp index c53ef312..9b7e420b 100644 --- a/source/interface_derived.hpp +++ b/source/interface_derived.hpp @@ -61,6 +61,7 @@ class MainFrameDerived : public MainFrame{ void OnSelectEditorPath(wxCommandEvent&); void OnQuit(wxCommandEvent&); + void OnClose(wxCloseEvent&); wxWindow* const projectActionItems[3]{ revealProjBtn, @@ -92,6 +93,8 @@ class MainFrameDerived : public MainFrame{ // Sorting state int sortColumn = 0; // Default sort by name (column 0) bool sortAscending = true; // Default ascending + // Set once the user resizes a column; disables autosizing and persists the widths + bool customColumnWidths = false; //window events void OnAbout(wxCommandEvent& event); @@ -184,6 +187,7 @@ class MainFrameDerived : public MainFrame{ this->LoadEditorVersions(); } void OnColumnClick(wxListEvent& event); + void OnColumnResized(wxListEvent& event); static int wxCALLBACK CompareItems(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData); void SortProjects(); wxDECLARE_EVENT_TABLE();