From c0de9ee4602e86757985b19375cc301de9fff01d Mon Sep 17 00:00:00 2001 From: qPCR4vir Date: Tue, 13 Nov 2018 19:05:19 +0100 Subject: [PATCH] listbox::reorder_columns implemented by move_column --- include/nana/gui/widgets/listbox.hpp | 11 ++++++- source/gui/widgets/listbox.cpp | 44 ++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/include/nana/gui/widgets/listbox.hpp b/include/nana/gui/widgets/listbox.hpp index 7622f331..cae6ec92 100644 --- a/include/nana/gui/widgets/listbox.hpp +++ b/include/nana/gui/widgets/listbox.hpp @@ -1464,7 +1464,16 @@ the nana::detail::basic_window member pointer scheme /// Move column to view_position void move_column(size_type abs_pos, size_type view_pos); - void column_resizable(bool resizable); + /// Sort columns in range first_col to last_col inclusive using the values from a row + void reorder_columns(size_type first_col, + size_type last_col, + index_pair row, bool reverse, + std::function comp); + + void column_resizable(bool resizable); bool column_resizable() const; void column_movable(bool); bool column_movable() const; diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index fe0f96d0..e6c7e97a 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -6069,11 +6069,43 @@ namespace nana return _m_ess().content_view->scroll_operation(); } - /// Move column to view_position - void listbox::move_column(size_type abs_pos, size_type view_pos) - { - internal_scope_guard lock; - return _m_ess().header.move_to_view_pos(abs_pos, view_pos, true); - } + /// Move column to view_position + void listbox::move_column(size_type abs_pos, size_type view_pos) + { + internal_scope_guard lock; + return _m_ess().header.move_to_view_pos(abs_pos, view_pos, true); + } + + /// Sort columns in range first_col to last_col inclusive using a row + void listbox::reorder_columns(size_type first_col, + size_type last_col, + index_pair row, bool reverse, + std::function comp) + { + if (first_col<0 || last_col<=first_col) + return; + if (last_col >= column_size()) + return; + std::vector new_idx; + for(size_type i=first_col; i<=last_col; ++i) new_idx.push_back(i); + const item_proxy & ip_row=this->at(row); + internal_scope_guard lock; + const nana::any *pnany=_m_ess().lister.anyobj(row,false); + std::sort(new_idx.begin(), new_idx.end(), [&](size_type col1, + size_type col2) + { + return comp(ip_row.text(col1), col1, + ip_row.text(col2), col2, + pnany, reverse); + }); + for(size_t i=0; i