reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit b9cfa90c2fef557af85c089b2624b2210b7a3056
parent 1f302a47b52ed102e764abf9733b983cfdaa3df4
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sat, 26 Aug 2017 12:34:33 -0400

listview: refactor sort callbacks

Diffstat:
Msrc/about.cpp | 40++++++++++++++++++++++------------------
Msrc/about.hpp | 2++
Msrc/browser.cpp | 13+++++--------
Msrc/listview.cpp | 13++++++-------
Msrc/listview.hpp | 10++--------
5 files changed, 37 insertions(+), 41 deletions(-)

diff --git a/src/about.cpp b/src/about.cpp @@ -304,16 +304,10 @@ void AboutIndexDelegate::init(About *dialog) dialog->menu()->addRow({make_autostring(cat->name())}); dialog->list()->addColumn({AUTO_STR("Package"), 382}); - dialog->list()->addColumn({AUTO_STR("Version"), 80}); + dialog->list()->addColumn({AUTO_STR("Version"), 80, + 0, bind(&AboutIndexDelegate::sortByVersion, this, _1, _2)}); dialog->list()->addColumn({AUTO_STR("Author"), 90}); - dialog->list()->setSortCallback(1, [&] (const int a, const int b) { - auto pkgA = (const Package *)dialog->list()->row(a).userData(); - auto pkgB = (const Package *)dialog->list()->row(b).userData(); - - return pkgA->lastVersion()->name().compare(pkgB->lastVersion()->name()); - }); - initInstalledFiles(); } @@ -383,7 +377,7 @@ void AboutIndexDelegate::updateList(const int index) const auto_string &author = make_autostring(lastVer->displayAuthor()); ListView::Row row{name, version, author}; - row.setUserData((void *)pkg); + row.userData = (void *)pkg; m_dialog->list()->addRow(row); } } @@ -399,6 +393,14 @@ bool AboutIndexDelegate::fillContextMenu(Menu &menu, const int index) const return true; } +int AboutIndexDelegate::sortByVersion(const int a, const int b) const +{ + auto pkgA = (const Package *)m_dialog->list()->row(a).userData; + auto pkgB = (const Package *)m_dialog->list()->row(b).userData; + + return pkgA->lastVersion()->name().compare(pkgB->lastVersion()->name()); +} + void AboutIndexDelegate::onCommand(const int id) { switch(id) { @@ -421,7 +423,7 @@ const Package *AboutIndexDelegate::currentPackage() const if(index < 0) return nullptr; else - return (const Package *)m_dialog->list()->row(index).userData(); + return (const Package *)m_dialog->list()->row(index).userData; } void AboutIndexDelegate::findInBrowser() @@ -533,7 +535,8 @@ void AboutPackageDelegate::init(About *dialog) dialog->tabs()->addTab({AUTO_STR("Contents"), {dialog->menu()->handle(), dialog->list()->handle()}}); - dialog->menu()->addColumn({AUTO_STR("Version"), 142}); + dialog->menu()->addColumn({AUTO_STR("Version"), 142, + 0, bind(&AboutPackageDelegate::sortByVersion, this, _1, _2)}); dialog->list()->addColumn({AUTO_STR("File"), 474}); dialog->list()->addColumn({AUTO_STR("Action List"), 84}); @@ -546,10 +549,6 @@ void AboutPackageDelegate::init(About *dialog) dialog->menu()->select(index); } - dialog->menu()->setSortCallback(0, [&] (const int a, const int b) { - return m_package->version(a)->name().compare(m_package->version(b)->name()); - }); - dialog->menu()->sortByColumn(0, ListView::DescendingOrder); if(!dialog->menu()->hasSelection()) @@ -599,7 +598,7 @@ void AboutPackageDelegate::updateList(const int index) ListView::Row row{ make_autostring(src->targetPath().join()), make_autostring(actionList)}; - row.setUserData((void *)src); + row.userData = (void *)src; m_dialog->list()->addRow(row); } } @@ -609,7 +608,7 @@ bool AboutPackageDelegate::fillContextMenu(Menu &menu, const int index) const if(index < 0) return false; - auto src = (const Source *)m_dialog->list()->row(index).userData(); + auto src = (const Source *)m_dialog->list()->row(index).userData; menu.addAction(AUTO_STR("Copy source URL"), ACTION_COPY_URL); menu.setEnabled(m_current.size() > 0 && FS::exists(src->targetPath()), @@ -618,6 +617,11 @@ bool AboutPackageDelegate::fillContextMenu(Menu &menu, const int index) const return true; } +int AboutPackageDelegate::sortByVersion(const int a, const int b) const +{ + return m_package->version(a)->name().compare(m_package->version(b)->name()); +} + void AboutPackageDelegate::onCommand(const int id) { switch(id) { @@ -640,7 +644,7 @@ const Source *AboutPackageDelegate::currentSource() const if(index < 0) return nullptr; else - return (const Source *)m_dialog->list()->row(index).userData(); + return (const Source *)m_dialog->list()->row(index).userData; } void AboutPackageDelegate::copySourceUrl() diff --git a/src/about.hpp b/src/about.hpp @@ -113,6 +113,7 @@ private: void findInBrowser(); void aboutPackage(); void install(); + int sortByVersion(int, int) const; IndexPtr m_index; @@ -138,6 +139,7 @@ private: const Source *currentSource() const; void copySourceUrl(); void locate(); + int sortByVersion(int, int) const; const Package *m_package; VersionName m_current; diff --git a/src/browser.cpp b/src/browser.cpp @@ -79,19 +79,16 @@ void Browser::onInit() {AUTO_STR("Status"), 23, ListView::NoLabelFlag}, {AUTO_STR("Package"), 345}, {AUTO_STR("Category"), 105}, - {AUTO_STR("Version"), 55}, + {AUTO_STR("Version"), 55, 0, bind(&Browser::sortByVersion, this, _1, _2)}, {AUTO_STR("Author"), 95}, {AUTO_STR("Type"), 70}, {AUTO_STR("Repository"), 120, ListView::CollapseFlag}, - {AUTO_STR("Last Update"), 105}, + {AUTO_STR("Last Update"), 105, 0, bind(&Browser::sortByLastUpdate, this, _1, _2)}, }); m_list->onActivate([=] { aboutPackage(m_list->itemUnderMouse()); }); m_list->onSelect(bind(&Browser::onSelection, this)); m_list->onContextMenu(bind(&Browser::fillContextMenu, this, _1, _2)); - - m_list->setSortCallback(3, bind(&Browser::sortByVersion, this, _1, _2)); - m_list->setSortCallback(7, bind(&Browser::sortByLastUpdate, this, _1, _2)); m_list->sortByColumn(1); Dialog::onInit(); @@ -686,7 +683,7 @@ void Browser::fillList() const vector<int> selectedIndexes = m_list->selection(); vector<const Entry *> oldSelection(selectedIndexes.size()); for(size_t i = 0; i < selectedIndexes.size(); i++) - oldSelection[i] = (Entry *)m_list->row(selectedIndexes[i]).userData(); + oldSelection[i] = (Entry *)m_list->row(selectedIndexes[i]).userData; m_list->clear(); @@ -725,7 +722,7 @@ ListView::Row Browser::makeRow(const Entry &entry) const make_autostring(version), make_autostring(author), make_autostring(type), make_autostring(remote), make_autostring(date), }; - row.setUserData((void *)&entry); + row.userData = (void *)&entry; return row; } @@ -842,7 +839,7 @@ auto Browser::getEntry(const int index) -> Entry * if(index < 0) return nullptr; else - return (Entry *)m_list->row(index).userData(); + return (Entry *)m_list->row(index).userData; } void Browser::aboutPackage(const int index, const bool focus) diff --git a/src/listview.cpp b/src/listview.cpp @@ -147,16 +147,16 @@ void ListView::sort() int ret; - const int column = view->m_sort->column; - const auto it = view->m_sortFuncs.find(column); + const int columnIndex = view->m_sort->column; + const Column &column = view->m_cols[columnIndex]; - if(it != view->m_sortFuncs.end()) - ret = it->second((int)aRow, (int)bRow); + if(column.sortCallback) + ret = column.sortCallback((int)aRow, (int)bRow); else { - auto_string a = view->m_rows[aRow][column]; + auto_string a = view->m_rows[aRow][columnIndex]; boost::algorithm::to_lower(a); - auto_string b = view->m_rows[bRow][column]; + auto_string b = view->m_rows[bRow][columnIndex]; boost::algorithm::to_lower(b); ret = a.compare(b); @@ -233,7 +233,6 @@ void ListView::reset() m_customizable = false; m_sort = boost::none; m_defaultSort = boost::none; - m_sortFuncs.clear(); } void ListView::setSelected(const int index, const bool select) diff --git a/src/listview.hpp b/src/listview.hpp @@ -43,6 +43,7 @@ public: auto_string label; int width; int flags; + std::function<int (int, int)> sortCallback; bool test(ColumnFlag f) const { return (flags & f) != 0; } }; @@ -53,16 +54,11 @@ public: public: using std::vector<auto_string>::vector; - void setUserData(void *ptr) { m_userData = ptr; } - void *userData() const { return m_userData; }; - - private: - void *m_userData; // TODO: use lParam/LVIF_PARAM? + void *userData; }; typedef boost::signals2::signal<void ()> VoidSignal; typedef boost::signals2::signal<bool (Menu &, int index)> MenuSignal; - typedef std::function<int (int, int)> SortCallback; ListView(HWND handle, const Columns & = {}); @@ -96,7 +92,6 @@ public: void sort(); void sortByColumn(int index, SortOrder order = AscendingOrder, bool user = false); - void setSortCallback(int i, const SortCallback &cb) { m_sortFuncs[i] = cb; } void restoreState(Serializer::Data &); void saveState(Serializer::Data &) const; @@ -133,7 +128,6 @@ private: std::vector<Row> m_rows; boost::optional<Sort> m_sort; boost::optional<Sort> m_defaultSort; - std::map<int, SortCallback> m_sortFuncs; VoidSignal m_onSelect; VoidSignal m_onActivate;