LCOV - code coverage report
Current view: top level - src/libvalent/ui - valent-menu-stack.c (source / functions) Coverage Total Hit
Test: Code Coverage Lines: 53.6 % 56 30
Test Date: 2024-04-23 06:02:46 Functions: 63.6 % 11 7
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 39.3 % 28 11

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
       3                 :             : 
       4                 :             : #define G_LOG_DOMAIN "valent-menu-stack"
       5                 :             : 
       6                 :             : #include "config.h"
       7                 :             : 
       8                 :             : #include <gtk/gtk.h>
       9                 :             : 
      10                 :             : #include "valent-menu-list.h"
      11                 :             : #include "valent-menu-stack.h"
      12                 :             : 
      13                 :             : 
      14                 :             : struct _ValentMenuStack
      15                 :             : {
      16                 :             :   GtkWidget       parent_instance;
      17                 :             : 
      18                 :             :   GtkWidget      *stack;
      19                 :             :   ValentMenuList *main;
      20                 :             : };
      21                 :             : 
      22   [ +  +  +  - ]:          81 : G_DEFINE_FINAL_TYPE (ValentMenuStack, valent_menu_stack, GTK_TYPE_WIDGET)
      23                 :             : 
      24                 :             : enum {
      25                 :             :   PROP_0,
      26                 :             :   PROP_MENU_MODEL,
      27                 :             :   N_PROPERTIES
      28                 :             : };
      29                 :             : 
      30                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
      31                 :             : 
      32                 :             : 
      33                 :             : /*
      34                 :             :  * GObject
      35                 :             :  */
      36                 :             : static void
      37                 :           5 : valent_menu_stack_dispose (GObject *object)
      38                 :             : {
      39                 :           5 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
      40                 :             : 
      41         [ +  - ]:           5 :   g_clear_pointer (&self->stack, gtk_widget_unparent);
      42                 :             : 
      43                 :           5 :   G_OBJECT_CLASS (valent_menu_stack_parent_class)->dispose (object);
      44                 :           5 : }
      45                 :             : 
      46                 :             : static void
      47                 :           0 : valent_menu_stack_get_property (GObject    *object,
      48                 :             :                                 guint       prop_id,
      49                 :             :                                 GValue     *value,
      50                 :             :                                 GParamSpec *pspec)
      51                 :             : {
      52                 :           0 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
      53                 :             : 
      54         [ #  # ]:           0 :   switch (prop_id)
      55                 :             :     {
      56                 :           0 :     case PROP_MENU_MODEL:
      57                 :           0 :       g_value_set_object (value, valent_menu_stack_get_menu_model (self));
      58                 :           0 :       break;
      59                 :             : 
      60                 :           0 :     default:
      61                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      62                 :             :     }
      63                 :           0 : }
      64                 :             : 
      65                 :             : static void
      66                 :           0 : valent_menu_stack_set_property (GObject      *object,
      67                 :             :                                 guint         prop_id,
      68                 :             :                                 const GValue *value,
      69                 :             :                                 GParamSpec   *pspec)
      70                 :             : {
      71                 :           0 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
      72                 :             : 
      73         [ #  # ]:           0 :   switch (prop_id)
      74                 :             :     {
      75                 :           0 :     case PROP_MENU_MODEL:
      76                 :           0 :       valent_menu_stack_set_menu_model (self, g_value_get_object (value));
      77                 :           0 :       break;
      78                 :             : 
      79                 :           0 :     default:
      80                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      81                 :             :     }
      82                 :           0 : }
      83                 :             : 
      84                 :             : static void
      85                 :           3 : valent_menu_stack_class_init (ValentMenuStackClass *klass)
      86                 :             : {
      87                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
      88                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
      89                 :             : 
      90                 :           3 :   object_class->dispose = valent_menu_stack_dispose;
      91                 :           3 :   object_class->get_property = valent_menu_stack_get_property;
      92                 :           3 :   object_class->set_property = valent_menu_stack_set_property;
      93                 :             : 
      94                 :           3 :   gtk_widget_class_set_css_name (widget_class, "valent-menu-stack");
      95                 :           3 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
      96                 :             : 
      97                 :             :   /**
      98                 :             :    * ValentMenuStack:model:
      99                 :             :    *
     100                 :             :    * The `GMenuModel` for this `ValentMenuStack`.
     101                 :             :    */
     102                 :           6 :   properties [PROP_MENU_MODEL] =
     103                 :           3 :     g_param_spec_object ("menu-model", NULL, NULL,
     104                 :             :                          G_TYPE_MENU_MODEL,
     105                 :             :                          (G_PARAM_READWRITE |
     106                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
     107                 :             :                           G_PARAM_STATIC_STRINGS));
     108                 :             : 
     109                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
     110                 :           3 : }
     111                 :             : 
     112                 :             : static void
     113                 :           5 : valent_menu_stack_init (ValentMenuStack *self)
     114                 :             : {
     115                 :           5 :   self->stack = g_object_new (GTK_TYPE_STACK,
     116                 :             :                               "interpolate-size", TRUE,
     117                 :             :                               "transition-type",  GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT,
     118                 :             :                               "vhomogeneous",     FALSE,
     119                 :             :                               NULL);
     120                 :           5 :   gtk_widget_insert_before (self->stack, GTK_WIDGET (self), NULL);
     121                 :           5 : }
     122                 :             : 
     123                 :             : /**
     124                 :             :  * valent_menu_stack_new:
     125                 :             :  * @menu_model: (nullable): a `GMenuModel`
     126                 :             :  *
     127                 :             :  * Create a new `ValentMenuStack`.
     128                 :             :  *
     129                 :             :  * Returns: a `GtkWidget`
     130                 :             :  */
     131                 :             : GtkWidget *
     132                 :           0 : valent_menu_stack_new (GMenuModel *menu_model)
     133                 :             : {
     134                 :           0 :   return g_object_new (VALENT_TYPE_MENU_STACK,
     135                 :             :                        "menu-model", menu_model,
     136                 :             :                        NULL);
     137                 :             : }
     138                 :             : 
     139                 :             : /**
     140                 :             :  * valent_menu_stack_get_model:
     141                 :             :  * @stack: a `ValentMenuStack`
     142                 :             :  *
     143                 :             :  * Get the `GMenuModel` for @stack.
     144                 :             :  *
     145                 :             :  * Returns: (transfer none) (nullable): a `GMenuModel`
     146                 :             :  */
     147                 :             : GMenuModel *
     148                 :           0 : valent_menu_stack_get_menu_model (ValentMenuStack *stack)
     149                 :             : {
     150         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_MENU_STACK (stack), NULL);
     151                 :             : 
     152         [ #  # ]:           0 :   if (stack->main == NULL)
     153                 :             :     return NULL;
     154                 :             : 
     155                 :           0 :   return valent_menu_list_get_menu_model (stack->main);
     156                 :             : }
     157                 :             : 
     158                 :             : /**
     159                 :             :  * valent_menu_stack_set_model:
     160                 :             :  * @stack: a `ValentMenuStack`
     161                 :             :  * @menu_model: (nullable): a `GMenuModel`
     162                 :             :  *
     163                 :             :  * Set the `GMenuModel` for @stack to @menu_model.
     164                 :             :  */
     165                 :             : void
     166                 :           5 : valent_menu_stack_set_menu_model (ValentMenuStack *stack,
     167                 :             :                                   GMenuModel      *menu_model)
     168                 :             : {
     169         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MENU_STACK (stack));
     170   [ +  -  +  -  :           5 :   g_return_if_fail (menu_model == NULL || G_IS_MENU_MODEL (menu_model));
             +  -  -  + ]
     171                 :             : 
     172                 :             :   /* Destroy any existing menu lists */
     173         [ -  + ]:           5 :   if (stack->main != NULL)
     174                 :             :     {
     175                 :           0 :       gtk_stack_remove (GTK_STACK (stack->stack), GTK_WIDGET (stack->main));
     176                 :           0 :       stack->main = NULL;
     177                 :             :     }
     178                 :             : 
     179         [ +  - ]:           5 :   if (menu_model != NULL)
     180                 :             :     {
     181                 :           5 :       stack->main = valent_menu_list_new (NULL);
     182                 :           5 :       gtk_stack_add_named (GTK_STACK (stack->stack),
     183                 :             :                            GTK_WIDGET (stack->main),
     184                 :             :                            "main");
     185                 :           5 :       valent_menu_list_set_menu_model (stack->main, menu_model);
     186                 :             :     }
     187                 :             : }
     188                 :             : 
        

Generated by: LCOV version 2.0-1