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:
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;