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

Reply via email to