[gnome-logs] Use a template for the event detail page



commit 1175656e402c2d494ea1036ea8af0802b833e15a
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun May 4 14:59:40 2014 +0200

    Use a template for the event detail page

 data/gl-eventviewdetail.ui        |  205 ++++++++++++++++++++++++++++++++
 data/org.gnome.Logs.gresource.xml |    1 +
 po/POTFILES.in                    |    1 +
 src/gl-eventviewdetail.c          |  231 +++++++++++++------------------------
 4 files changed, 286 insertions(+), 152 deletions(-)
---
diff --git a/data/gl-eventviewdetail.ui b/data/gl-eventviewdetail.ui
new file mode 100644
index 0000000..0c88797
--- /dev/null
+++ b/data/gl-eventviewdetail.ui
@@ -0,0 +1,205 @@
+<interface domain="gnome-logs">
+    <template class="GlEventViewDetail" parent="GtkBin">
+        <property name="visible">True</property>
+        <child>
+            <object class="GtkGrid" id="grid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                    <object class="GtkBox" id="top_box">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                            <object class="GtkBox" id="comm_box">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="spacing">12</property>
+                                <child>
+                                    <object class="GtkImage" id="comm_image">
+                                        <property name="visible">False</property>
+                                        <property name="no_show_all">True</property>
+                                        <property name="can_focus">False</property>
+                                    </object>
+                                </child>
+                                <child>
+                                    <object class="GtkLabel" id="comm_label">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="xalign">0</property>
+                                        <style>
+                                            <class name="detail-comm"/>
+                                        </style>
+                                    </object>
+                                    <packing>
+                                        <property name="pack_type">end</property>
+                                    </packing>
+                                </child>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkLabel" id="time_label">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="hexpand">True</property>
+                                <property name="xalign">1</property>
+                                <property name="selectable">True</property>
+                                <style>
+                                    <class name="detail-time"/>
+                                </style>
+                            </object>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">2</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="message_field_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Message</property>
+                        <style>
+                            <class name="detail-filed-label"/>
+                            <class name="dim-label"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="message_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="hexpand">True</property>
+                        <property name="xalign">0</property>
+                        <property name="wrap">True</property>
+                        <property name="selectable">True</property>
+                        <style>
+                            <class name="detail-message"/>
+                            <class name="event-monospace"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="audit_field_label">
+                        <property name="visible">False</property>
+                        <property name="no_show_all">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Audit Session</property>
+                        <style>
+                            <class name="detail-filed-label"/>
+                            <class name="dim-label"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">2</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="audit_label">
+                        <property name="visible">False</property>
+                        <property name="no_show_all">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="selectable">True</property>
+                        <style>
+                            <class name="detail-kernel_device"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">2</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="device_field_label">
+                        <property name="visible">False</property>
+                        <property name="no_show_all">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Kernel Device</property>
+                        <style>
+                            <class name="detail-filed-label"/>
+                            <class name="dim-label"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">3</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="device_label">
+                        <property name="visible">False</property>
+                        <property name="no_show_all">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="selectable">True</property>
+                        <style>
+                            <class name="detail-kernel_device"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">3</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="priority_field_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Priority</property>
+                        <style>
+                            <class name="detail-filed-label"/>
+                            <class name="dim-label"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">4</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="priority_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="selectable">True</property>
+                        <style>
+                            <class name="detail-priority"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">4</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkLabel" id="catalog_label">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <style>
+                            <class name="detail-catalog"/>
+                        </style>
+                    </object>
+                    <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">5</property>
+                    </packing>
+                </child>
+            </object>
+        </child>
+    </template>
+</interface>
diff --git a/data/org.gnome.Logs.gresource.xml b/data/org.gnome.Logs.gresource.xml
index 07ff551..03ec9ad 100644
--- a/data/org.gnome.Logs.gresource.xml
+++ b/data/org.gnome.Logs.gresource.xml
@@ -4,6 +4,7 @@
     <file preprocess='xml-stripblanks'>appmenu.ui</file>
     <file preprocess='xml-stripblanks'>gl-categorylist.ui</file>
     <file preprocess='xml-stripblanks'>gl-eventtoolbar.ui</file>
+    <file preprocess='xml-stripblanks'>gl-eventviewdetail.ui</file>
     <file>gl-style.css</file>
     <file preprocess='xml-stripblanks'>gl-window.ui</file>
   </gresource>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 75faadc..e4e5d9c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,6 +1,7 @@
 [type: gettext/glade]data/appmenu.ui
 [type: gettext/glade]data/gl-categorylist.ui
 [type: gettext/glade]data/gl-eventtoolbar.ui
+[type: gettext/glade]data/gl-eventviewdetail.ui
 data/org.gnome.Logs.appdata.xml.in
 data/org.gnome.Logs.desktop.in
 src/gl-application.c
diff --git a/src/gl-eventviewdetail.c b/src/gl-eventviewdetail.c
index 172afde..e19f3c1 100644
--- a/src/gl-eventviewdetail.c
+++ b/src/gl-eventviewdetail.c
@@ -35,196 +35,97 @@ typedef struct
 {
     GlJournalResult *result;
     GlUtilClockFormat clock_format;
+    GtkWidget *grid;
+    GtkWidget *comm_image;
+    GtkWidget *comm_label;
+    GtkWidget *time_label;
+    GtkWidget *message_label;
+    GtkWidget *audit_field_label;
+    GtkWidget *audit_label;
+    GtkWidget *device_field_label;
+    GtkWidget *device_label;
+    GtkWidget *priority_label;
+    GtkWidget *catalog_label;
 } GlEventViewDetailPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GlEventViewDetail, gl_event_view_detail, GTK_TYPE_BIN)
 
 static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
 
-static GtkWidget *
-create_widget_for_comm (const gchar *comm)
+static void
+gl_event_view_detail_create_detail (GlEventViewDetail *detail)
 {
-    if (comm && *comm)
+    GlEventViewDetailPrivate *priv;
+    GlJournalResult *result;
+    gchar *str;
+
+    priv = gl_event_view_detail_get_instance_private (detail);
+
+    result = priv->result;
+
+    /* Force LTR direction also for RTL languages */
+    gtk_widget_set_direction (priv->grid, GTK_TEXT_DIR_LTR);
+    gtk_widget_set_direction (priv->comm_label, GTK_TEXT_DIR_LTR);
+    gtk_widget_set_direction (priv->message_label, GTK_TEXT_DIR_LTR);
+    gtk_widget_set_direction (priv->audit_label, GTK_TEXT_DIR_LTR);
+    gtk_widget_set_direction (priv->device_label, GTK_TEXT_DIR_LTR);
+    gtk_widget_set_direction (priv->catalog_label, GTK_TEXT_DIR_LTR);
+
+    if (result->comm && *result->comm)
     {
         /* Command-line, look for a desktop file. */
-        gchar *str;
         GDesktopAppInfo *desktop;
 
         /* TODO: Use g_desktop_app_info_search? */
-        str = g_strconcat (comm, ".desktop", NULL);
+        str = g_strconcat (result->comm, ".desktop", NULL);
         desktop = g_desktop_app_info_new (str);
         g_free (str);
 
         if (desktop)
         {
-            GtkWidget *box;
             GIcon *icon;
-            GtkWidget *image;
-            GtkWidget *label;
-            GtkStyleContext *context;
-
-            box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
 
             icon = g_app_info_get_icon (G_APP_INFO (desktop));
-            image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DIALOG);
-            gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
-
-            label = gtk_label_new (g_app_info_get_name (G_APP_INFO (desktop)));
-            gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-            gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-            context = gtk_widget_get_style_context (label);
-            gtk_style_context_add_class (context, "detail-comm");
-            gtk_box_pack_end (GTK_BOX (box), label, TRUE, TRUE, 0);
+            gtk_image_set_from_gicon (GTK_IMAGE (priv->comm_image),
+                                      icon, GTK_ICON_SIZE_DIALOG);
+            gtk_widget_show (priv->comm_image);
+            gtk_label_set_text (GTK_LABEL (priv->comm_label),
+                                g_app_info_get_name (G_APP_INFO (desktop)));
 
             g_object_unref (desktop);
-
-            return box;
         }
         else
         {
-            GtkWidget *label;
-            GtkStyleContext *context;
-
-            label = gtk_label_new (comm);
-            gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-            gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-            context = gtk_widget_get_style_context (label);
-            gtk_style_context_add_class (context, "detail-comm");
-
-            return label;
+            gtk_label_set_text (GTK_LABEL (priv->comm_label), result->comm);
         }
     }
-    else
-    {
-        /* No command-line. */
-        return gtk_label_new (NULL);
-    }
-}
-
-static void
-gl_event_view_detail_create_detail (GlEventViewDetail *detail)
-{
-    GlEventViewDetailPrivate *priv;
-    GlJournalResult *result;
-    gchar *str;
-    gboolean rtl;
-    GtkWidget *box;
-    GtkWidget *description;
-    GtkWidget *grid;
-    GtkWidget *label;
-    GtkStyleContext *context;
-
-    priv = gl_event_view_detail_get_instance_private (detail);
-
-    result = priv->result;
-
-    rtl = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL;
-
-    box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-    description = create_widget_for_comm (result->comm);
-    gtk_box_pack_start (GTK_BOX (box), description, TRUE, TRUE, 0);
 
     str = gl_util_timestamp_to_display (result->timestamp, priv->clock_format);
-    label = gtk_label_new (str);
-    gtk_widget_set_hexpand (label, TRUE);
-    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-time");
-    gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
-    g_free (str);
-
-    grid = gtk_grid_new ();
-    gtk_grid_attach (GTK_GRID (grid), box, 0, 0, 2, 1);
-
-    label = gtk_label_new (_("Message"));
-    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-field-label");
-    gtk_style_context_add_class (context, "dim-label");
-    gtk_grid_attach (GTK_GRID (grid), label, rtl ? 1 : 0, 1, 1, 1);
-
-    label = gtk_label_new (result->message);
-    gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-    /* The message label expands, so that the field label column is as narrow
-     * as possible. */
-    gtk_widget_set_hexpand (label, TRUE);
-    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-    gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-message");
-    gtk_style_context_add_class (context, "event-monospace");
-    gtk_grid_attach (GTK_GRID (grid), label, rtl ? 0 : 1, 1, 1, 1);
-
-    /* TODO: Give a user-friendly representation of the priority. */
-    label = gtk_label_new (_("Priority"));
-    gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-field-label");
-    gtk_style_context_add_class (context, "dim-label");
-    gtk_grid_attach (GTK_GRID (grid), label, rtl ? 1 : 0, 2, 1, 1);
-
-    str = g_strdup_printf ("%d", result->priority);
-    label = gtk_label_new (str);
-    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-priority");
-    gtk_grid_attach (GTK_GRID (grid), label, rtl ? 0 : 1, 2, 1, 1);
+    gtk_label_set_text (GTK_LABEL (priv->time_label), str);
     g_free (str);
 
-    label = gtk_label_new (result->catalog);
-    gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-    gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-    context = gtk_widget_get_style_context (label);
-    gtk_style_context_add_class (context, "detail-catalog");
-    gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 2, 1);
+    gtk_label_set_text (GTK_LABEL (priv->message_label), result->message);
 
-    if (result->kernel_device && *result->kernel_device)
+    if (result->audit_session && *result->audit_session)
     {
-        gtk_grid_insert_row (GTK_GRID (grid), 2);
-
-        label = gtk_label_new (_("Kernel Device"));
-        gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-        context = gtk_widget_get_style_context (label);
-        gtk_style_context_add_class (context, "detail-field-label");
-        gtk_style_context_add_class (context, "dim-label");
-        gtk_grid_attach (GTK_GRID (grid), label, rtl ? 1 : 0, 2, 1, 1);
-
-        label = gtk_label_new (result->kernel_device);
-        gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-        context = gtk_widget_get_style_context (label);
-        gtk_style_context_add_class (context, "detail-kernel_device");
-        gtk_grid_attach (GTK_GRID (grid), label, rtl ? 0 : 1, 2, 1, 1);
+        gtk_label_set_text (GTK_LABEL (priv->audit_label), result->audit_session);
+        gtk_widget_show (priv->audit_field_label);
+        gtk_widget_show (priv->audit_label);
     }
 
-    if (result->audit_session && *result->audit_session)
+    if (result->kernel_device && *result->kernel_device)
     {
-        gtk_grid_insert_row (GTK_GRID (grid), 2);
-
-        label = gtk_label_new (_("Audit Session"));
-        gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
-        context = gtk_widget_get_style_context (label);
-        gtk_style_context_add_class (context, "detail-field-label");
-        gtk_style_context_add_class (context, "dim-label");
-        gtk_grid_attach (GTK_GRID (grid), label, rtl ? 1 : 0, 2, 1, 1);
-
-        label = gtk_label_new (result->audit_session);
-        gtk_widget_set_direction (label, GTK_TEXT_DIR_LTR);
-        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-        gtk_label_set_selectable (GTK_LABEL (label), TRUE);
-        context = gtk_widget_get_style_context (label);
-        gtk_style_context_add_class (context, "detail-kernel_device");
-        gtk_grid_attach (GTK_GRID (grid), label, rtl ? 0 : 1, 2, 1, 1);
+        gtk_label_set_text (GTK_LABEL (priv->device_label), result->kernel_device);
+        gtk_widget_show (priv->device_field_label);
+        gtk_widget_show (priv->device_label);
     }
 
-    gtk_widget_show_all (grid);
+    /* TODO: Give a user-friendly representation of the priority. */
+    str = g_strdup_printf ("%d", result->priority);
+    gtk_label_set_text (GTK_LABEL (priv->priority_label), str);
+    g_free (str);
 
-    gtk_container_add (GTK_CONTAINER (detail), grid);
+    gtk_label_set_text (GTK_LABEL (priv->catalog_label), result->catalog);
 }
 
 static void
@@ -297,6 +198,7 @@ static void
 gl_event_view_detail_class_init (GlEventViewDetailClass *klass)
 {
     GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
     gobject_class->constructed = gl_event_view_detail_constructed;
     gobject_class->finalize = gl_event_view_detail_finalize;
@@ -320,12 +222,37 @@ gl_event_view_detail_class_init (GlEventViewDetailClass *klass)
 
     g_object_class_install_properties (gobject_class, N_PROPERTIES,
                                        obj_properties);
+
+    gtk_widget_class_set_template_from_resource (widget_class,
+                                                 "/org/gnome/Logs/gl-eventviewdetail.ui");
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  grid);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  comm_image);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  comm_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  time_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  message_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  audit_field_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  audit_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  device_field_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  device_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  priority_label);
+    gtk_widget_class_bind_template_child_private (widget_class, GlEventViewDetail,
+                                                  catalog_label);
 }
 
 static void
 gl_event_view_detail_init (GlEventViewDetail *detail)
 {
-    /* See gl_event_view_detail_constructed (). */
+    gtk_widget_init_template (GTK_WIDGET (detail));
 }
 
 GtkWidget *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]