Re: Problem with sorting ColumnView



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 = "">            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 = "">
                    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 <agpotter 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 = "">            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 = "">                    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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]