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 <[email protected]> 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 <
> [email protected]> 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
>> [email protected]
>> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>>
>
--
Jackson Campolattaro
Masters Student at TU Delft
_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list