diff options
Diffstat (limited to 'src/gtkext/dockstation.c')
-rw-r--r-- | src/gtkext/dockstation.c | 427 |
1 files changed, 374 insertions, 53 deletions
diff --git a/src/gtkext/dockstation.c b/src/gtkext/dockstation.c index 093f120..359e3a1 100644 --- a/src/gtkext/dockstation.c +++ b/src/gtkext/dockstation.c @@ -28,6 +28,25 @@ +/* --------------------------- INTERFACE DU COMPOSANT GTK --------------------------- */ + + +/* Liste des propriétés */ + +typedef enum _DockStationProperty { + + PROP_0, /* Réservé */ + + /* Interface GtkOrientable */ + PROP_ORIENTATION, + + N_PROPERTIES = PROP_ORIENTATION + +} DockStationProperty; + +//static GParamSpec *_dock_station_properties[N_PROPERTIES] = { NULL, }; + + /* Procède à l'initialisation de l'afficheur concentré. */ static void gtk_dock_station_class_init(GtkDockStationClass *); @@ -35,16 +54,31 @@ static void gtk_dock_station_class_init(GtkDockStationClass *); static void gtk_dock_station_init(GtkDockStation *); /* Supprime toutes les références externes. */ -static void gtk_dock_station_dispose(GtkDockStation *); +static void gtk_dock_station_dispose(GObject *); /* Procède à la libération totale de la mémoire. */ -static void gtk_dock_station_finalize(GtkDockStation *); +static void gtk_dock_station_finalize(GObject *); + + + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + +/* Met à jour une propriété d'instance GObject. */ +static void gtk_dock_station_set_property(GObject *, guint, const GValue *, GParamSpec *); +/* Fournit la valeur d'une propriété d'instance GObject. */ +static void gtk_dock_station_get_property(GObject *, guint, GValue *, GParamSpec *); + + + +/* ---------------------------------------------------------------------------------- */ +/* INTERFACE DU COMPOSANT GTK */ +/* ---------------------------------------------------------------------------------- */ /* Détermine le type du composant d'affichage concentré. */ -G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_WIDGET) +G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_GRID) /****************************************************************************** @@ -62,28 +96,47 @@ G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_WIDGET) static void gtk_dock_station_class_init(GtkDockStationClass *class) { GObjectClass *object; /* Autre version de la classe */ + GtkWidgetClass *widget; /* Classe de haut niveau */ object = G_OBJECT_CLASS(class); - object->dispose = (GObjectFinalizeFunc/* ! */)gtk_dock_station_dispose; - object->finalize = (GObjectFinalizeFunc)gtk_dock_station_finalize; + object->dispose = gtk_dock_station_dispose; + object->finalize = gtk_dock_station_finalize; + object->set_property = gtk_dock_station_set_property; + object->get_property = gtk_dock_station_get_property; - g_signal_new("dock-widget", + //g_object_class_install_properties(object, N_PROPERTIES, _dock_station_properties); + g_object_class_override_property(object, PROP_ORIENTATION, "orientation"); + + widget = GTK_WIDGET_CLASS(class); + + gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gtkext/dockstation.ui"); + + //gtk_widget_class_bind_template_callback_full(widget, BUILDER_CB(gtk_status_stack_on_zoom_icon_press)); + + gtk_widget_class_bind_template_child(widget, GtkDockStation, tabs); + gtk_widget_class_bind_template_child(widget, GtkDockStation, toolbar); + gtk_widget_class_bind_template_child(widget, GtkDockStation, sep1); + gtk_widget_class_bind_template_child(widget, GtkDockStation, stack); + gtk_widget_class_bind_template_child(widget, GtkDockStation, sep2); + + g_signal_new("panel-docked", GTK_TYPE_DOCK_STATION, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GtkDockStationClass, dock_widget), + G_STRUCT_OFFSET(GtkDockStationClass, panel_docked), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_WIDGET); - g_signal_new("undock-widget", + g_signal_new("panel-undocked", GTK_TYPE_DOCK_STATION, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GtkDockStationClass, undock_widget), + G_STRUCT_OFFSET(GtkDockStationClass, panel_undocked), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_WIDGET); + /* g_signal_new("switch-widget", GTK_TYPE_DOCK_STATION, G_SIGNAL_RUN_LAST, @@ -107,6 +160,7 @@ static void gtk_dock_station_class_init(GtkDockStationClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_WIDGET); + */ } @@ -125,57 +179,66 @@ static void gtk_dock_station_class_init(GtkDockStationClass *class) static void gtk_dock_station_init(GtkDockStation *station) { -#if 0 + gtk_widget_init_template(GTK_WIDGET(station)); - GtkNotebook *notebook; /* Autre version du composant */ - GtkWidget *hbox; /* Division supérieure */ - GtkWidget *button; /* Bouton de contrôle */ + station->orientation = GTK_ORIENTATION_HORIZONTAL; - notebook = GTK_NOTEBOOK(station); + station->def_panel = NULL; - gtk_notebook_set_show_border(notebook, FALSE); - gtk_notebook_set_scrollable(notebook, TRUE); +} - /* Définition de la zone de contrôle */ - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_widget_set_valign(hbox, GTK_ALIGN_CENTER); - gtk_widget_set_margin_end(hbox, 8); - gtk_widget_show(hbox); +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ - button = qck_create_toggle_button_with_named_img(G_OBJECT(station), "search", - "edit-find-symbolic", GTK_ICON_SIZE_MENU, NULL, - G_CALLBACK(on_toggle_revealer), station); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); +static void gtk_dock_station_dispose(GObject *object) +{ + GtkDockStation *station; /* Version spécialisée */ - button = qck_create_button_with_named_img(G_OBJECT(station), "menu", - "go-down-symbolic", GTK_ICON_SIZE_MENU, NULL, - G_CALLBACK(on_click_for_menu), station); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + station = GTK_DOCK_STATION(object); - button = qck_create_button_with_named_img(G_OBJECT(station), "close", - "window-close-symbolic", GTK_ICON_SIZE_MENU, NULL, - G_CALLBACK(on_click_for_close), station); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_dispose_template(GTK_WIDGET(object), GTK_TYPE_DOCK_STATION); - gtk_notebook_set_action_widget(notebook, hbox, GTK_PACK_END); + g_clear_object(&station->def_panel); - g_signal_connect(notebook, "switch-page", - G_CALLBACK(gtk_dock_station_switch_panel), station); + G_OBJECT_CLASS(gtk_dock_station_parent_class)->dispose(object); + +} -#endif + +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_dock_station_finalize(GObject *object) +{ + G_OBJECT_CLASS(gtk_dock_station_parent_class)->finalize(object); } /****************************************************************************** * * -* Paramètres : station = instance d'objet GLib à traiter. * +* Paramètres : - * * * -* Description : Supprime toutes les références externes. * +* Description : Crée un nouveau composant pour support d'affichage concentré.* * * * Retour : - * * * @@ -183,18 +246,23 @@ static void gtk_dock_station_init(GtkDockStation *station) * * ******************************************************************************/ -static void gtk_dock_station_dispose(GtkDockStation *station) +GtkWidget *gtk_dock_station_new(void) { - G_OBJECT_CLASS(gtk_dock_station_parent_class)->dispose(G_OBJECT(station)); + GtkWidget *result; /* Instance à retourner */ + + result = g_object_new(GTK_TYPE_DOCK_STATION, NULL); + + return result; } /****************************************************************************** * * -* Paramètres : station = instance d'objet GLib à traiter. * +* Paramètres : station = station d'accueil pour panneau à compléter. * +* panel = nouveau panneau à afficher. * * * -* Description : Procède à la libération totale de la mémoire. * +* Description : Ajoute un panneau à un groupe de tuiles. * * * * Retour : - * * * @@ -202,18 +270,33 @@ static void gtk_dock_station_dispose(GtkDockStation *station) * * ******************************************************************************/ -static void gtk_dock_station_finalize(GtkDockStation *station) +void gtk_dock_station_add_panel(GtkDockStation *station, GtkTiledPanel *panel) { - G_OBJECT_CLASS(gtk_dock_station_parent_class)->finalize(G_OBJECT(station)); + GtkStackPage *page; /* Nouvelle page insérée */ + + page = gtk_stack_add_child(station->stack, GTK_WIDGET(panel)); + + if (0) // TODO + gtk_stack_page_set_title(page, "settings"); + + else + gtk_stack_page_set_icon_name(page, "logs-symbolic"); + + gtk_stack_set_visible_child(station->stack, GTK_WIDGET(panel)); + + + g_signal_emit_by_name(station, "panel-docked", panel); + } /****************************************************************************** * * -* Paramètres : - * +* Paramètres : station = station d'accueil pour panneau à compléter. * +* panel = nouveau panneau à afficher. * * * -* Description : Crée un nouveau composant pour support d'affichage concentré.* +* Description : Ajoute un panneau à conserver à un groupe de tuiles. * * * * Retour : - * * * @@ -221,17 +304,255 @@ static void gtk_dock_station_finalize(GtkDockStation *station) * * ******************************************************************************/ -GtkWidget *gtk_dock_station_new(void) +void gtk_dock_station_keep_panel(GtkDockStation *station, GtkTiledPanel *panel) { - GtkWidget *result; /* Instance à retourner */ + bool visible; /* Visibilité des barres */ + + g_clear_object(&station->def_panel); + + if (panel != NULL) + { + station->def_panel = panel; + ref_object(panel); + + if (gtk_stack_get_page(station->stack, GTK_WIDGET(panel)) == NULL) + gtk_dock_station_add_panel(station, panel); + + } + + visible = (station->def_panel == NULL); + + gtk_widget_set_visible(station->tabs, visible); + gtk_widget_set_visible(station->toolbar, visible); + gtk_widget_set_visible(station->sep1, visible); + gtk_widget_set_visible(station->sep2, visible && station->orientation == GTK_ORIENTATION_HORIZONTAL); + +} - result = g_object_new(GTK_TYPE_DOCK_STATION, NULL); + +/****************************************************************************** +* * +* Paramètres : station = station d'accueil pour panneau à consulter. * +* * +* Description : Indique si la station d'accueil contient au moins un panneau.* +* * +* Retour : true si aucun panneau n'est intégré, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_dock_station_is_empty(const GtkDockStation *station) +{ + bool result; /* Bilan à retourner */ + GtkSelectionModel *model; /* Modèle pour la pile */ + guint count; /* Nombre de panneaux présents */ + + model = gtk_stack_get_pages(station->stack); + + count = g_list_model_get_n_items(G_LIST_MODEL(model)); + + result = (count == 0); + + unref_object(model); return result; } +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à mamnipuler. * +* prop_id = identifiant de la propriété visée. * +* value = valeur à prendre en compte. * +* pspec = définition de la propriété. * +* * +* Description : Met à jour une propriété d'instance GObject. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_dock_station_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GtkDockStation *station; /* Version spécialisée */ + GtkOrientation orientation; /* Spécification d'orientation */ + GtkLayoutManager *layout; /* Gestionnaire de disposition */ + GtkLayoutChild *child_layout; /* Disposition de composant */ + + station = GTK_DOCK_STATION(object); + + switch (prop_id) + { + case PROP_ORIENTATION: + + orientation = g_value_get_enum(value); + + if (station->orientation != orientation) + { + station->orientation = orientation; + + gtk_orientable_set_orientation(GTK_ORIENTABLE(station->tabs), orientation); + gtk_orientable_set_orientation(GTK_ORIENTABLE(station->toolbar), orientation); + + layout = gtk_widget_get_layout_manager(GTK_WIDGET(object)); + + if (orientation == GTK_ORIENTATION_VERTICAL) + { + g_object_set(G_OBJECT(station->tabs), + "halign", GTK_ALIGN_START, + "valign", GTK_ALIGN_CENTER, + NULL); + + g_object_set(G_OBJECT(station->toolbar), + "halign", GTK_ALIGN_END, + "valign", GTK_ALIGN_CENTER, + NULL); + + child_layout = gtk_layout_manager_get_layout_child(layout, station->toolbar); + + g_object_set(G_OBJECT(child_layout), + "column", 1, + "row", 0, + NULL); + + child_layout = gtk_layout_manager_get_layout_child(layout, station->sep1); + + g_object_set(G_OBJECT(child_layout), + "column", 0, + "row", 1, + "column-span", 2, + NULL); + + gtk_widget_set_visible(station->sep2, FALSE); + + child_layout = gtk_layout_manager_get_layout_child(layout, GTK_WIDGET(station->stack)); + + g_object_set(G_OBJECT(child_layout), + "column", 0, + "row", 2, + "column-span", 2, + NULL); + + } + else + { + g_object_set(G_OBJECT(station->tabs), + "halign", GTK_ALIGN_START, + "valign", GTK_ALIGN_START, + NULL); + + g_object_set(G_OBJECT(station->toolbar), + "halign", GTK_ALIGN_END, + "valign", GTK_ALIGN_START, + NULL); + + child_layout = gtk_layout_manager_get_layout_child(layout, station->sep1); + + g_object_set(G_OBJECT(child_layout), + "column", 1, + "row", 0, + "column-span", 1, + NULL); + + child_layout = gtk_layout_manager_get_layout_child(layout, GTK_WIDGET(station->stack)); + + g_object_set(G_OBJECT(child_layout), + "column", 2, + "row", 0, + "column-span", 1, + NULL); + + gtk_widget_set_visible(station->sep2, TRUE); + + child_layout = gtk_layout_manager_get_layout_child(layout, station->sep2); + + g_object_set(G_OBJECT(child_layout), + "column", 3, + "row", 0, + NULL); + + child_layout = gtk_layout_manager_get_layout_child(layout, station->toolbar); + + g_object_set(G_OBJECT(child_layout), + "column", 4, + "row", 0, + NULL); + + } + + g_object_notify_by_pspec(object, pspec); + + } + + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + + } + +} + + +/****************************************************************************** +* * +* Paramètres : object = instance d'objet GLib à mamnipuler. * +* prop_id = identifiant de la propriété visée. * +* value = valeur à transmettre. [OUT] * +* pspec = définition de la propriété. * +* * +* Description : Fournit la valeur d'une propriété d'instance GObject. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_dock_station_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GtkDockStation *station; /* Version spécialisée */ + + station = GTK_DOCK_STATION(object); + + switch (prop_id) + { + case PROP_ORIENTATION: + g_value_set_enum(value, station->orientation); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + + } + +} + + + + + + + + + + + + + + + |