reapack

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

commit 1e7a26d986ef051b363078f35945708b195f76be
parent 7dec49c069cc8fbd36ebd95055e9fbbc53765fd1
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Tue, 21 Jun 2016 00:59:10 -0400

listview: support custom sort functions

Diffstat:
Msrc/listview.cpp | 11+++++++++--
Msrc/listview.hpp | 27+++++++++++++++++----------
2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/listview.cpp b/src/listview.cpp @@ -51,7 +51,7 @@ void ListView::setExStyle(const int style, const bool enable) ListView_SetExtendedListViewStyleEx(handle(), style, enable ? style : 0); } -void ListView::addColumn(const Column &col) +int ListView::addColumn(const Column &col) { LVCOLUMN item{}; @@ -63,8 +63,11 @@ void ListView::addColumn(const Column &col) item.pszText = const_cast<auto_char *>(col.label.c_str()); } - ListView_InsertColumn(handle(), columnCount(), &item); + const int index = columnCount(); + ListView_InsertColumn(handle(), index, &item); m_cols.push_back(col); + + return index; } int ListView::addRow(const Row &content) @@ -138,7 +141,11 @@ void ListView::sort() static const auto compare = [](LPARAM aRow, LPARAM bRow, LPARAM param) { ListView *view = reinterpret_cast<ListView *>(param); + const int column = view->m_sort->column; + const auto it = view->m_sortFuncs.find(column); + if(it != view->m_sortFuncs.end()) + return it->second((int)aRow, (int)bRow); auto_string a = view->m_rows[aRow][column]; boost::algorithm::to_lower(a); diff --git a/src/listview.hpp b/src/listview.hpp @@ -22,6 +22,7 @@ #include <boost/optional.hpp> #include <boost/signals2.hpp> +#include <functional> #include <vector> #include "encoding.hpp" @@ -44,11 +45,13 @@ public: bool test(ColumnFlag f) const { return (flags & f) != 0; } }; + typedef std::vector<Column> Columns; typedef std::vector<auto_string> Row; typedef boost::signals2::signal<void ()> VoidSignal; typedef boost::signals2::signal<bool (Menu &, int index)> MenuSignal; + typedef std::function<int (int, int)> SortCallback; ListView(const Columns &, HWND handle); @@ -56,25 +59,29 @@ public: const Row &row(int index) const { return m_rows[index]; } void replaceRow(int index, const Row &); void removeRow(int index); - void resizeColumn(int index, int width); - int columnWidth(int index) const; - void sort(); - void sortByColumn(int index, SortOrder order = AscendingOrder, bool user = false); + int rowCount() const { return (int)m_rows.size(); } + bool empty() const { return rowCount() < 1; } void clear(); + int currentIndex() const; + int itemUnderMouse() const; + void setSelected(int index, bool select); void select(int index) { setSelected(index, true); } void unselect(int index) { setSelected(index, false); } void selectAll() { select(-1); } void unselectAll() { unselect(-1); } - int selectionSize() const; bool hasSelection() const { return selectionSize() > 0; } - int currentIndex() const; std::vector<int> selection(bool sort = true) const; - int itemUnderMouse() const; - int rowCount() const { return (int)m_rows.size(); } + + int addColumn(const Column &); + void resizeColumn(int index, int width); + int columnWidth(int index) const; int columnCount() const { return (int)m_cols.size(); } - bool empty() const { return rowCount() < 1; } + + void sort(); + void sortByColumn(int index, SortOrder order = AscendingOrder, bool user = false); + void setSortCallback(int i, const SortCallback &cb) { m_sortFuncs[i] = cb; } bool restore(const std::string &, int userVersion); std::string save() const; @@ -99,7 +106,6 @@ private: static int adjustWidth(int); void setExStyle(int style, bool enable); - void addColumn(const Column &); void setSortArrow(bool); void handleDoubleClick(); void handleColumnClick(LPARAM lpnmlistview); @@ -112,6 +118,7 @@ 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;