// This file Copyright © Mnemosyne LLC. // It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only), // or any future license endorsed by Mnemosyne LLC. // License text can be found in the licenses/ folder. #pragma once #include "FilterBase.hh" #include "FilterListModel.h" #if !GTKMM_CHECK_VERSION(4, 0, 0) #include "ListModelAdapter.h" #include "Utils.h" #endif template FilterListModel::FilterListModel(Glib::RefPtr const& model, Glib::RefPtr const& filter) #if GTKMM_CHECK_VERSION(4, 0, 0) : Gtk::FilterListModel(model, filter) #else : FilterListModel(gtr_ptr_static_cast(ListModelAdapter::create(model)), filter) #endif { } #if !GTKMM_CHECK_VERSION(4, 0, 0) template FilterListModel::FilterListModel(Glib::RefPtr const& model, Glib::RefPtr const& filter) : Gtk::TreeModelFilter(model) , matches_all_(filter->matches_all()) , matches_none_(filter->matches_none()) , signal_changed_tag_{ filter->signal_changed().connect( [this, filter](auto /*changes*/) { matches_all_ = filter->matches_all(); matches_none_ = filter->matches_none(); refilter(); }) } { static auto const& self_col = ItemT::get_columns().self; auto const filter_func = [this, filter](const_iterator const& iter) { if (matches_all_) { return true; } if (matches_none_) { return false; } auto const* const self = iter->get_value(self_col); g_return_val_if_fail(self != nullptr, false); return filter->match(*self); }; set_visible_func(filter_func); signal_row_inserted().connect([this](auto const& path, auto const& /*iter*/) { signal_items_changed_.emit(path.front(), 0, 1); }); signal_row_deleted().connect([this](auto const& path) { signal_items_changed_.emit(path.front(), 1, 0); }); } template FilterListModel::~FilterListModel() { signal_changed_tag_.disconnect(); } template guint FilterListModel::get_n_items() const { return children().size(); } template sigc::signal& FilterListModel::signal_items_changed() { return signal_items_changed_; } #endif template template Glib::RefPtr> FilterListModel::create( Glib::RefPtr const& model, Glib::RefPtr const& filter) { // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) return Glib::make_refptr_for_instance(new FilterListModel(model, filter)); }