Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Виджет древовидного представления данных (TreeView)
Оригинал: Programming with gtkmm 3
Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Перевод: А.Панин
9.5. Сортировка
Классы стандартных моделей представления данных (Gtk::TreeStore и Gtk::ListStore) наследуются от класса Gtk::TreeSortable, следовательно они предоставляют функции сортировки. Например, можно вызвать метод set_sort_column() для сортировки модели на основе данных в определенном столбце. Или же можно передать имя функции обратного вызова методу set_sort_func() для реализации более сложного алгоритма сортировки.
Справочная информация для класса Gtk::TreeSortable
9.5.1. Сортировка по нажатию на заголовки столбцов
Gtk::TreeViewModel::set_sort_column() с передачей столбца модели, на основе данных из которого она должна быть отсортирована в момент нажатия на заголовок столбца виджета. Например, описанное действие могут быть осуществлено следующим образом:
Gtk::TreeView::Column* pColumn = treeview.get_column(0); if(pColumn) pColumn->set_sort_column(m_columns.m_col_id);
9.5.2. Независимо сортируемые представления одной и той же модели
Класс Gtk::TreeView на данный момент уже позволяет вам выводить данные одной и той же модели в двух виджетах древовидного представления. Если же вы хотите, чтобы один из этих виджетов использовался для вывода данных модели, отсортированных не так, как в другом виджете, вам придется использовать класс Gtk::TreeModelSort вместо простого вызова метода Gtk::TreeViewModel::set_sort_column(). Класс Gtk::TreeModelSort реализует модель, которая содержит другую модель, представляющую отсортированную версию оригинальной модели.
Glib::RefPtr<Gtk::TreeModelSort> sorted_model =
Gtk::TreeModelSort::create(model);
sorted_model-7gt;set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING);
treeview.set_model(sorted_model);
void ExampleWindow::on_button_delete()
{
Glib::RefPtr<Gtk::TreeSelection> refTreeSelection =
m_treeview.get_selection();
if(refTreeSelection)
{
Gtk::TreeModel::iterator sorted_iter =
m_refTreeSelection->get_selected();
if(sorted_iter)
{
Gtk::TreeModel::iterator iter =
m_refModelSort->convert_iter_to_child_iter(sorted_iter);
m_refModel->erase(iter);
}
}
}
Справочная информация для класса Gtk::TreeModelSort
9.6. Механизм захвата и перемещения элементов Drag and Drop
В рамках класса Gtk::TreeView реализован простой механизм захвата и перемещения элементов drag-and-drop, который используется при работе с моделями представлений данных на основе классов Gtk::ListStore и Gtk::TreeStore. В случае необходимости у вас есть возможность реализации более сложных механизмов захвата и перемещения элементов благодаря наличию обычного API Drag and Drop.
9.6.1. Перемещаемые строки
В том случае, если вы осуществляете вызов метода Gtk::TreeView::set_reorderable(), строки вашего виджета древовидного представления данных получают возможность перемещения в рамках самого представления. Эта возможность демонстрируется в примере работы с моделью представления данных.
Однако, эта возможность не позволяет вам обозначать элементы, которые могут быть захвачены, а также места, в которые эти элементы могут быть перемещены. Если у вас есть необходимость в регламентации описанных особенностей работы механизма захвата и перемещения, вы можете создать класс модели представления данных Gtk::TreeModel, унаследованный от класса Gtk::TreeStore или от класса Gtk::ListStore и перекрыть в потомке виртуальные методы Gtk::TreeDragSource::row_draggable() и Gtk::TreeDragDest::row_drop_possible(). После этого вы можете исследовать передаваемые с помощью экземпляров класса Gtk::TreeModel::Path пути и позволять или не позволять захват и перемещение элемента путем возврата логического значения true или false соответственно.
Такой подход продемонстрирован в примере использования механизма захвата и перемещения элементов (drag_and_drop).
9.7. Всплывающее контекстное меню
Многие люди сталкиваются с необходимостью реализации активируемых с помощью правой кнопки мыши всплывающих контекстных меню для виджетов древовидного представления данных, поэтому мы расскажем о реализации таких меню для сохранения вашего времени. За исключением одного или двух отличий эти меню полностью идентичны обычным контекстным меню, описанным в разделе "Меню".
9.7.1. Обработка сигнала "button_press_event"
Для выявления события нажатия правой кнопки мыши вам придется обрабатывать сигнал "button_press_event" и проверять то, какая из кнопок была нажата в действительности. Так как виджет древовидного представления данных в обычных условиях обрабатывает этот сигнал в полном объеме, вам придется либо перекрыть стандартный обработчик сигнала в унаследованном классе виджета древовидного представления данных, либо использовать функцию connect_notify() вместо connect(). Скорее всего, вы захотите также вызвать стандартный обработчик сигнала перед тем, как делать что-либо еще для того, чтобы нажатие правой кнопки мыши приводило в первую очередь к выбору строки.
Данный подход продемонстрирован в примере работы со специальными всплывающими меню.
Следующий раздел : 9.8. Примеры.
