diff options
| author | Matthew Fennell <matthew@fennell.dev> | 2025-12-27 12:40:20 +0000 |
|---|---|---|
| committer | Matthew Fennell <matthew@fennell.dev> | 2025-12-27 12:40:20 +0000 |
| commit | 5d8e439bc597159e3c9f0a8b65c0ae869dead3a8 (patch) | |
| tree | ed28aefed8add0da1c55c08fdf80b23c4346e0dc /src/gui/gtd-panel.c | |
Import Upstream version 43.0upstream/latest
Diffstat (limited to 'src/gui/gtd-panel.c')
| -rw-r--r-- | src/gui/gtd-panel.c | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/src/gui/gtd-panel.c b/src/gui/gtd-panel.c new file mode 100644 index 0000000..5c1b5df --- /dev/null +++ b/src/gui/gtd-panel.c @@ -0,0 +1,313 @@ +/* gtd-panel.c + * + * Copyright (C) 2015 Georges Basile Stavracas Neto <georges.stavracas@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#define G_LOG_DOMAIN "GtdPanel" + +#include "gtd-panel.h" + +/** + * SECTION:gtd-panel + * @short_description: interface for panels + * @title:GtdPanel + * @stability:Unstable + * + * The #GtdPanel interface must be implemented by plugins that want + * a given widget to be shown as a panel in the main window. Examples + * of panels are the "Today" and "Scheduled" panels. + * + * A panel must have a unique name (see #GtdPanel:name) and a title. + * The title can change dynamically. Avoid long titles. + * + * The panel may also provide header widgets, which will be placed + * in the headerbar according to the #GtkWidget:halign property. See + * gtd_panel_get_header_widgets() for a detailed explanation. + * + * The #GtdPanel:icon and #GtdPanel:priority properties are used by + * the sidebar. The former is used to display the icon, and the latter + * is used to determine the position of the panel relative to the + * others panels. + * + * At last, a #GtdPanel implementation may provide a #GMenu that will + * be appended to the window menu. Alternatively, a #GtkPopover can + * also be set. Popovers are used when both a menu and a popover are + * provided. + */ + +G_DEFINE_INTERFACE (GtdPanel, gtd_panel, GTK_TYPE_WIDGET) + +static void +gtd_panel_default_init (GtdPanelInterface *iface) +{ + + /** + * GtdPanel::icon: + * + * The icon of the panel. + */ + g_object_interface_install_property (iface, + g_param_spec_object ("icon", + "Icon of the panel", + "The icon of the panel", + G_TYPE_ICON, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GtdPanel::name: + * + * The identifier name of the panel. It is used as the #GtkStack + * name, so be sure to use a specific name that won't collide with + * other plugins. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("name", + "The name of the panel", + "The identifier name of the panel", + NULL, + G_PARAM_READABLE)); + + /** + * GtdPanel::priority: + * + * The priority of the panel. + */ + g_object_interface_install_property (iface, + g_param_spec_uint ("priority", + "Priority of the panel", + "The priority of the panel", + 0, + G_MAXUINT32, + 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GtdPanel::subtitle: + * + * The subtitle of the panel. It usually is the counter of not + * completed tasks. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("subtitle", + "The subtitle of the panel", + "The user-visible subtitle of the panel", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GtdPanel::title: + * + * The user-visible title of the panel. It is used as the #GtkStack + * title. + */ + g_object_interface_install_property (iface, + g_param_spec_string ("title", + "The title of the panel", + "The user-visible title of the panel", + NULL, + G_PARAM_READABLE)); + + /** + * GtdPanel::menu: + * + * A #GMenu of entries of the window menu. + */ + g_object_interface_install_property (iface, + g_param_spec_object ("menu", + "The title of the panel", + "The user-visible title of the panel", + G_TYPE_MENU, + G_PARAM_READABLE)); + +} + +/** + * gtd_panel_get_panel_name: + * @panel: a #GtdPanel + * + * Retrieves the name of @panel + * + * Returns: (transfer none): the name of @panel + */ +const gchar* +gtd_panel_get_panel_name (GtdPanel *panel) +{ + g_return_val_if_fail (GTD_IS_PANEL (panel), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (panel)->get_panel_name, NULL); + + return GTD_PANEL_GET_IFACE (panel)->get_panel_name (panel); +} + +/** + * gtd_panel_get_panel_title: + * @panel: a #GtdPanel + * + * Retrieves the title of @panel + * + * Returns: (transfer none): the title of @panel + */ +const gchar* +gtd_panel_get_panel_title (GtdPanel *panel) +{ + g_return_val_if_fail (GTD_IS_PANEL (panel), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (panel)->get_panel_title, NULL); + + return GTD_PANEL_GET_IFACE (panel)->get_panel_title (panel); +} + +/** + * gtd_panel_get_header_widgets: + * @panel: a #GtdPanel + * + * Retrieves the list of widgets to be placed at headerbar. The + * position of the widget is determined by the #GtkWidget::halign + * property. + * + * Widgets with @GTK_ALIGN_START halign will be packed into the + * start of the headerbar, and @GTK_ALIGN_END at the end. Other + * values are silently ignored. + * + * Returns: (transfer container) (element-type Gtk.Widget): the list of #GtkWidget + */ +GList* +gtd_panel_get_header_widgets (GtdPanel *panel) +{ + g_return_val_if_fail (GTD_IS_PANEL (panel), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (panel)->get_header_widgets, NULL); + + return GTD_PANEL_GET_IFACE (panel)->get_header_widgets (panel); +} + +/** + * gtd_panel_get_menu: + * @panel: a #GtdPanel + * + * Retrieves the gear menu of @panel. + * + * Returns: (transfer none): a #GMenu + */ +const GMenu* +gtd_panel_get_menu (GtdPanel *panel) +{ + g_return_val_if_fail (GTD_IS_PANEL (panel), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (panel)->get_menu, NULL); + + return GTD_PANEL_GET_IFACE (panel)->get_menu (panel); +} + +/** + * gtd_panel_get_icon: + * @self: a #GtdPanel + * + * Retrieves the icon of @self. + * + * Returns: (transfer full)(nullable): a #GIcon + */ +GIcon* +gtd_panel_get_icon (GtdPanel *self) +{ + g_return_val_if_fail (GTD_IS_PANEL (self), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (self)->get_icon, NULL); + + return GTD_PANEL_GET_IFACE (self)->get_icon (self); +} + +/** + * gtd_panel_get_popover: + * @self: a #GtdPanel + * + * Retrieves the popover of @self. It is used as the + * window menu when available. + * + * Returns: (nullable)(transfer none): a #GtkPopover + */ +GtkPopover* +gtd_panel_get_popover (GtdPanel *self) +{ + g_return_val_if_fail (GTD_IS_PANEL (self), 0); + + if (GTD_PANEL_GET_IFACE (self)->get_popover) + return GTD_PANEL_GET_IFACE (self)->get_popover (self); + + return NULL; +} + +/** + * gtd_panel_get_priority: + * @self: a #GtdPanel + * + * Retrieves the priority of @self. This value is used to + * determine the position of the panel in the sidebar. + * + * Returns: the priority of @self + */ +guint32 +gtd_panel_get_priority (GtdPanel *self) +{ + g_return_val_if_fail (GTD_IS_PANEL (self), 0); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (self)->get_priority, 0); + + return GTD_PANEL_GET_IFACE (self)->get_priority (self); +} + +/** + * gtd_panel_get_subtitle: + * @self: a #GtdPanel + * + * Retrieves the subtitle of @panel + * + * Returns: (transfer full): the subtitle of @panel + */ +gchar* +gtd_panel_get_subtitle (GtdPanel *self) +{ + g_return_val_if_fail (GTD_IS_PANEL (self), NULL); + g_return_val_if_fail (GTD_PANEL_GET_IFACE (self)->get_icon, NULL); + + return GTD_PANEL_GET_IFACE (self)->get_subtitle (self); +} + +/** + * gtd_panel_activate: + * @self: a #GtdPanel + * @parameters: (nullable): parameters of the panel + * + * Activates the panel with @parameters. The passed parameters + * are in free form, to allow panels have any input they want. + * + * This is an optional vfunc. + */ +void +gtd_panel_activate (GtdPanel *self, + GVariant *parameters) +{ + + g_return_if_fail (GTD_IS_PANEL (self)); + + if (GTD_PANEL_GET_IFACE (self)->activate) + { + g_autofree gchar *formatted_params = NULL; + + if (parameters) + formatted_params = g_variant_print (parameters, TRUE); + + g_debug ("Activating %s with parameters %s", + G_OBJECT_TYPE_NAME (self), + formatted_params); + + GTD_PANEL_GET_IFACE (self)->activate (self, parameters); + } +} |
