blob: 6fb65d4b2e43ad9979a1ab2c816a1742e26bfdd5 [file] [log] [blame]
/*
* Copyright © 2014 Lars Uebernickel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Authors: Lars Uebernickel <lars@uebernic.de>
*/
#include "config.h"
#include "glistmodel.h"
G_DEFINE_INTERFACE (GListModel, g_list_model, G_TYPE_OBJECT);
/**
* SECTION:glistmodel
* @title: GListModel
* @short_description: An interface describing a dynamic list of objects
* @include: gio/gio.h
*
* #GListModel is a dynamic list of #GObjects.
*/
/**
* GListModel:
* @get_item_type: the virtual function pointer for g_list_model_get_item_type()
* @get_n_items: the virtual function pointer for g_list_model_get_n_items()
* @get_item: the virtual function pointer for g_list_model_get_item()
*
* The virtual function table for #GListModel.
*
* Since: 2.42
*/
static guint g_list_model_changed_signal;
static void
g_list_model_default_init (GListModelInterface *iface)
{
/**
* GListModel::items-changed
* @list: the #GListModel that changed
* @position: the position at which @list changed
* @removed: the number of items removed
* @added: the number of items added
*
* This signal is emitted whenever items were added or removed to
* @list. At @position, @removed items were removed and @added items
* were added in their place.
*
* Since: 2.42
*/
g_list_model_changed_signal = g_signal_new ("items-changed",
G_TYPE_LIST_MODEL,
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_generic,
G_TYPE_NONE,
3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT);
}
/**
* g_list_model_get_item_type:
* @list: a @GListModel
*
* Gets the type of the items in @list. All items returned from
* g_list_model_get_type() are of that type.
*
* Returns: the #GType of the items contained in @list.
*
* Since: 2.42
*/
GType
g_list_model_get_item_type (GListModel *list)
{
g_return_val_if_fail (G_IS_LIST_MODEL (list), G_TYPE_NONE);
return G_LIST_MODEL_GET_IFACE (list)->get_item_type (list);
}
/**
* g_list_model_get_n_items:
* @list: a @GListModel
*
* Gets the number of items in @list.
*
* Returns: the number of items in @list.
*
* Since: 2.42
*/
guint
g_list_model_get_n_items (GListModel *list)
{
g_return_if_fail (G_IS_LIST_MODEL (list));
return G_LIST_MODEL_GET_IFACE (list)->get_n_items (list);
}
/**
* g_list_model_get_item:
* @list: a @GListModel
* @position: the position of the item to fetch
*
* Get the item at @position. If @position is greater than the number of
* items in @list, %NULL is returned.
*
* %NULL is never returned for an index that is smaller than the length
* of the list.
*
* Returns: (transfer full) (allow-none) (type GObject): the item at
* @position.
*
* Since: 2.42
*/
gpointer
g_list_model_get_item (GListModel *list,
guint position)
{
g_return_val_if_fail (G_IS_LIST_MODEL (list), NULL);
return G_LIST_MODEL_GET_IFACE (list)->get_item (list, position);
}
/**
* g_list_model_items_changed:
* @list: a @GListModel
* @position: the position at which @list changed
* @removed: the number of items removed
* @added: the number of items added
*
* Emits the #GListModel::items-changed signal on @list.
*
* This function should only be called by classes implementing
* #GListModel. It has to be called after the internal representation
* of @list has been updated, because handlers connected to this signal
* might query the new state of the list.
*
* Implementations may not emit this signal in response to a call to the
* #GListModel API.
*
* Since: 2.42
*/
void
g_list_model_items_changed (GListModel *list,
guint position,
guint removed,
guint added)
{
g_return_if_fail (G_IS_LIST_MODEL (list));
g_signal_emit (list, g_list_model_changed_signal, 0, position, removed, added);
}