.. index:: pair: class; EE::UI::Models::ObservableListModel .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model: template class EE::UI::Models::ObservableListModel ================================================== .. toctree:: :hidden: Overview ~~~~~~~~ One-column model adapter for an :ref:`ObservableVector `. :ref:`More...` .. ref-code-block:: cpp :class: doxyrest-overview-code-block #include template class ObservableListModel: public :ref:`EE::UI::Models::Model` { public: // typedefs typedef std::function<:ref:`Variant`(const T&, :ref:`ModelRole`)> :ref:`Formatter`; typedef std::function :ref:`Predicate`; // construction :ref:`ObservableListModel`(:ref:`ObservableVector`& source, :ref:`Formatter` formatter = {}); :target:`~ObservableListModel`(); // methods static std::shared_ptr :ref:`create`(:ref:`ObservableVector`& source); static std::shared_ptr :ref:`create`(:ref:`ObservableVector`& source, :ref:`Formatter` formatter); virtual size_t :ref:`rowCount`(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const; virtual size_t :ref:`columnCount`(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const; virtual :ref:`ModelIndex` :ref:`index`(int row, int column = 0, const :ref:`ModelIndex`& parent = :ref:`ModelIndex`()) const; virtual :ref:`Variant` :ref:`data`(const :ref:`ModelIndex`& index, :ref:`ModelRole` role = :ref:`ModelRole::Display`) const; void :ref:`setFilter`(:ref:`Predicate` predicate); void :ref:`clearFilter`(); std::optional :ref:`sourceRow`(const :ref:`ModelIndex`& index) const; const T* :ref:`at`(const :ref:`ModelIndex`& index) const; }; Inherited Members ----------------- .. ref-code-block:: cpp :class: doxyrest-overview-inherited-code-block public: // typedefs typedef std::function<:ref:`Variant`(const :ref:`ModelIndex`&, const void*:ref:`data`)> :ref:`ModelStyler`; // enums enum :ref:`UpdateFlag`; // structs struct :ref:`Operation`; // classes class :ref:`Client`; // methods virtual bool :ref:`hasChildren`(const :ref:`ModelIndex`& modelIndex = :ref:`ModelIndex`()) const; virtual size_t :ref:`rowCount`(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const = 0; virtual size_t :ref:`columnCount`(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const = 0; virtual std::string :ref:`columnName`(const size_t&) const; virtual std::string :ref:`rowName`(const size_t&) const; virtual :ref:`Variant` :ref:`data`(const :ref:`ModelIndex`&, :ref:`ModelRole` = :ref:`ModelRole::Display`) const = 0; virtual void :ref:`update`(); virtual :ref:`ModelIndex` :ref:`parentIndex`(const :ref:`ModelIndex`&) const; virtual :ref:`ModelIndex` :ref:`index`(int row, int column = 0, const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const; virtual :ref:`ModelIndex` :ref:`sibling`(int row, int column, const :ref:`ModelIndex`& parent) const; virtual void :ref:`setData`(const :ref:`ModelIndex`&, const :ref:`Variant`&); virtual size_t :ref:`treeColumn`() const; virtual bool :ref:`acceptsDrag`(const :ref:`ModelIndex`&, const std::string& dataType); virtual bool :ref:`isColumnSortable`(const size_t&) const; virtual std::string :ref:`dragDataType`() const; virtual bool :ref:`isEditable`(const :ref:`ModelIndex`&) const; virtual bool :ref:`isValid`(const :ref:`ModelIndex`& index) const; virtual int :ref:`keyColumn`() const; virtual :ref:`SortOrder` :ref:`sortOrder`() const; virtual bool :ref:`isSortable`(); virtual void :ref:`sort`(const size_t&, const :ref:`SortOrder`&); virtual bool :ref:`classModelRoleEnabled`(); virtual bool :ref:`tooltipModelRoleEnabled`(); void :ref:`registerView`(:ref:`UIAbstractView`*); void :ref:`unregisterView`(:ref:`UIAbstractView`*); void :ref:`registerClient`(:ref:`Client`*); void :ref:`unregisterClient`(:ref:`Client`*); void :ref:`refreshView`() const; void :ref:`setOnUpdate`(const std::function& onUpdate); virtual void :ref:`invalidate`(unsigned int flags = Model::UpdateFlag::InvalidateAllIndexes); std::weak_ptr<:ref:`PersistentHandle`> :ref:`registerPersistentIndex`(:ref:`ModelIndex` const&); void :ref:`beginInsertRows`(:ref:`ModelIndex` const& parent, int first, int last); void :ref:`beginInsertColumns`(:ref:`ModelIndex` const& parent, int first, int last); void :ref:`beginMoveRows`(:ref:`ModelIndex` const& sourceParent, int first, int last, :ref:`ModelIndex` const& targetParent, int target_index); void :ref:`beginMoveColumns`(:ref:`ModelIndex` const& sourceParent, int first, int last, :ref:`ModelIndex` const& targetParent, int target_index); bool :ref:`beginDeleteRows`(:ref:`ModelIndex` const& parent, int first, int last); bool :ref:`beginDeleteRows`(:ref:`ModelIndex` const& index); bool :ref:`beginDeleteColumns`(:ref:`ModelIndex` const& parent, int first, int last); void :ref:`endInsertRows`(); void :ref:`endInsertColumns`(); void :ref:`endMoveRows`(); void :ref:`endMoveColumns`(); void :ref:`endDeleteRows`(); void :ref:`endDeleteColumns`(); :ref:`Mutex`& :ref:`resourceMutex`(); void :ref:`acquireResourceMutex`(); void :ref:`releaseResourceMutex`(); :ref:`Uint32` :ref:`subscribeModelStyler`(const :ref:`ModelStyler`& styler); void :ref:`unsubscribeModelStyler`(:ref:`Uint32` id); .. _details-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model: Detailed Documentation ~~~~~~~~~~~~~~~~~~~~~~ One-column model adapter for an :ref:`ObservableVector `. Unfiltered sources preserve incremental model notifications. A filtered projection rebuilds its row mapping when source membership can change. Custom formatters allow domain types to remain independent from :ref:`Variant `. The model retains the source storage, so it remains safe when a view outlives the :ref:`ObservableVector ` wrapper. Mutations naturally stop when that wrapper is destroyed. Filtering changes model row numbers. Use :ref:`sourceRow() ` or :ref:`at() ` before mutating the source from a selection in the filtered view. .. ref-code-block:: cpp ObservableVector people; auto model = ObservableListModel::create( people, []( const Person& person, ModelRole role ) { return role == ModelRole::Display ? Variant( person.name ) : Variant{}; } ); model->setFilter( []( const Person& person ) { return person.active; } ); Typedefs -------- .. index:: pair: typedef; Formatter .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1a3e161f014d54e6afa865fea618bf6384: .. ref-code-block:: cpp :class: doxyrest-title-code-block typedef std::function<:ref:`Variant`(const T&, :ref:`ModelRole`)> Formatter Converts one source item and role into model data. .. index:: pair: typedef; Predicate .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1a8dd3e764f532e406287709cbf8b2a2b4: .. ref-code-block:: cpp :class: doxyrest-title-code-block typedef std::function Predicate Returns true when a source item belongs in the visible projection. Construction ------------ .. index:: pair: function; ObservableListModel .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1a04b8ad877618c3c37fdfe0bbb2c5fe19: .. ref-code-block:: cpp :class: doxyrest-title-code-block ObservableListModel(:ref:`ObservableVector`& source, :ref:`Formatter` formatter = {}) Creates an adapter over ``source``, optionally using ``formatter`` for all roles. The source storage is retained for the model's lifetime. Methods ------- .. index:: pair: function; create .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1ab8c344590492b831475e78b430f7b16e: .. ref-code-block:: cpp :class: doxyrest-title-code-block static std::shared_ptr create(:ref:`ObservableVector`& source) Creates a one-column adapter using :ref:`Variant ` 's standard conversion for Display data. .. index:: pair: function; create .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1aa2f3c60b5e75fab7c23db52fd4467426: .. ref-code-block:: cpp :class: doxyrest-title-code-block static std::shared_ptr create(:ref:`ObservableVector`& source, :ref:`Formatter` formatter) Creates a one-column adapter whose :ref:`data() ` is supplied by ``formatter``. .. index:: pair: function; rowCount .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1a204044875261e1537859e8f9368890f5: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual size_t rowCount(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const .. rubric:: Returns: The number of visible rows in the current projection. .. index:: pair: function; columnCount .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1af817ad935ceaf460e7c7c4d5a854cbc2: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual size_t columnCount(const :ref:`ModelIndex`& = :ref:`ModelIndex`()) const .. rubric:: Returns: One; :ref:`ObservableListModel ` is a flat, one-column model. .. index:: pair: function; index .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1aa5c472f781face45990dbaa144fcb893: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`ModelIndex` index(int row, int column = 0, const :ref:`ModelIndex`& parent = :ref:`ModelIndex`()) const .. rubric:: Returns: A valid index for a visible row in column zero, or an invalid index. .. index:: pair: function; data .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1aaef7bc6988921afaa781e5f08b974568: .. ref-code-block:: cpp :class: doxyrest-title-code-block virtual :ref:`Variant` data(const :ref:`ModelIndex`& index, :ref:`ModelRole` role = :ref:`ModelRole::Display`) const .. rubric:: Returns: Formatted data for ``index`` and ``role``, or an empty :ref:`Variant ` when unavailable. .. index:: pair: function; setFilter .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1a784286e3caae69e1d425d966bf1a3b33: .. ref-code-block:: cpp :class: doxyrest-title-code-block void setFilter(:ref:`Predicate` predicate) Replaces the visible filter and invalidates all model indexes. An empty predicate is equivalent to no filter. While filtered, source mutations rebuild the projection and invalidate indexes instead of emitting incremental row notifications. .. index:: pair: function; clearFilter .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1aaeda3d3e07bf73f6edf832bec821c298: .. ref-code-block:: cpp :class: doxyrest-title-code-block void clearFilter() Removes the active filter and exposes all source rows. .. index:: pair: function; sourceRow .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1acf17f4742f202d3e2c2c7ca2f7e7bd65: .. ref-code-block:: cpp :class: doxyrest-title-code-block std::optional sourceRow(const :ref:`ModelIndex`& index) const .. rubric:: Returns: The :ref:`ObservableVector ` row represented by ``index``, or std::nullopt for an invalid or foreign index. .. index:: pair: function; at .. _doxid-class_e_e_1_1_u_i_1_1_models_1_1_observable_list_model_1aa4143a36be897ba4f2ca2d43f30ff415: .. ref-code-block:: cpp :class: doxyrest-title-code-block const T* at(const :ref:`ModelIndex`& index) const .. warning:: The pointer is invalidated by mutations that reallocate or remove vector elements. .. rubric:: Returns: The source item represented by ``index``, or nullptr for an invalid or foreign index.