Thanks! Somehow I got the impression that the ColumnView would construct SortListModels on its own, but looking back at the documentation I'm not sure where I heard that.
Here is a working solution: #include <gtkmm.h> > #include <giomm.h> > > class MyWindow : public Gtk::Window { > private: > > Gtk::ColumnView _columnView; > > public: > > MyWindow() { > > auto listModel = Gio::ListStore<Gio::File>::create(); > auto sortListModel = Gtk::SortListModel::create(listModel, > _columnView.get_sorter()); > _columnView.set_model(Gtk::SingleSelection::create(sortListModel)); > > auto files = Gio::File::create_for_path(".")->enumerate_children(); > Glib::RefPtr<Gio::FileInfo> fileInfo; > while ((fileInfo = files->next_file())) { > > listModel->append(Gio::File::create_for_path(fileInfo->get_name())); > } > > auto factory = Gtk::SignalListItemFactory::create(); > factory->signal_setup().connect([](auto listItem) { > listItem->set_child(*Gtk::make_managed<Gtk::Label>("_", > Gtk::Align::START)); > }); > factory->signal_bind().connect([](auto listItem) { > auto data = > std::dynamic_pointer_cast<Gio::File>(listItem->get_item()); > auto label = dynamic_cast<Gtk::Label *>(listItem->get_child()); > if (data && label) > label->set_text(data->get_path()); > }); > > auto column = Gtk::ColumnViewColumn::create("File Paths", factory); > column->set_sorter(Gtk::StringSorter::create( > Gtk::ClosureExpression<Glib::ustring>::create([](auto > item) { > auto data = std::dynamic_pointer_cast<Gio::File>(item); > return data->get_basename(); > }) > )); > _columnView.append_column(column); > > _columnView.sort_by_column(column, Gtk::SortType::ASCENDING); > set_child(_columnView); > }; > }; > > int main(int argc, char *argv[]) { > auto app = Gtk::Application::create("org.gtkmm.examples.base"); > return app->make_window_and_run<MyWindow>(argc, argv); > } > I appreciate your help! Jackson On Tue, Aug 23, 2022 at 9:38 PM Andrew Potter <agpot...@gmail.com> wrote: > The documentation at > https://docs.gtk.org/gtk4/method.ColumnView.get_sorter.html suggests you > need a SortListModel > > On Tue, Aug 23, 2022 at 4:32 AM Jackson Campolattaro via gtkmm-list < > gtkmm-list@gnome.org> wrote: > >> Hello, >> >> I'm trying to use the Gtk ColumnView to show a custom ListModel in sorted >> order. I noticed that when I set a simple sorter for a column and then sort >> by that column, the order isn't changed. The UI allows me to switch between >> ascending and descending, but doing so doesn't reverse the list. >> >> I've created a simplified example, which is supposed to show the file >> paths in the current directory in alphabetical order, but doesn't: >> >> #include <gtkmm.h> >>> #include <giomm.h> >>> >>> class MyWindow : public Gtk::Window { >>> private: >>> >>> Glib::RefPtr<Gio::ListStore<Gio::File>> _listModel; >>> Glib::RefPtr<Gtk::SingleSelection> _selectionModel; >>> >>> Gtk::ColumnView _columnView; >>> >>> public: >>> MyWindow() { >>> >>> _listModel = Gio::ListStore<Gio::File>::create(); >>> _selectionModel = Gtk::SingleSelection::create(_listModel); >>> _columnView.set_model(_selectionModel); >>> >>> auto files = >>> Gio::File::create_for_path(".")->enumerate_children(); >>> Glib::RefPtr<Gio::FileInfo> fileInfo; >>> while ((fileInfo = files->next_file())) { >>> >>> _listModel->append(Gio::File::create_for_path(fileInfo->get_name())); >>> } >>> >>> auto _factory = Gtk::SignalListItemFactory::create(); >>> _factory->signal_setup().connect([](auto listItem) { >>> >>> listItem->set_child(*Gtk::make_managed<Gtk::Label>("Placeholder!")); >>> }); >>> _factory->signal_bind().connect([](auto listItem) { >>> auto data = >>> std::dynamic_pointer_cast<Gio::File>(listItem->get_item()); >>> auto label = dynamic_cast<Gtk::Label >>> *>(listItem->get_child()); >>> if (data && label) { >>> label->set_text(data->get_path()); >>> label->set_xalign(0); >>> } >>> }); >>> >>> auto column = Gtk::ColumnViewColumn::create("File Paths", >>> _factory); >>> _columnView.append_column(column); >>> >>> column->set_sorter(Gtk::StringSorter::create( >>> Gtk::ClosureExpression<Glib::ustring>::create([](auto >>> item) { >>> auto data = >>> std::dynamic_pointer_cast<Gio::File>(item); >>> return data->get_path(); >>> }) >>> )); >>> _columnView.sort_by_column(column, Gtk::SortType::ASCENDING); >>> >>> set_child(_columnView); >>> }; >>> }; >>> >>> int main(int argc, char *argv[]) { >>> auto app = Gtk::Application::create("org.gtkmm.examples.base"); >>> return app->make_window_and_run<MyWindow>(argc, argv); >>> } >>> >> >> Perhaps this is a bug, but before I report it I wanted to make sure I'm >> not doing something wrong. >> >> Thanks, >> >> Jackson >> _______________________________________________ >> gtkmm-list mailing list >> gtkmm-list@gnome.org >> https://mail.gnome.org/mailman/listinfo/gtkmm-list >> > -- Jackson Campolattaro Masters Student at TU Delft
_______________________________________________ gtkmm-list mailing list gtkmm-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtkmm-list