/*
* GNOME Logs - View and search logs
* Copyright (C) 2013, 2014, 2015 Red Hat, Inc.
*
* 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 .
*/
#include "config.h"
#include "gl-eventtoolbar.h"
#include
#include "gl-enums.h"
#include "gl-eventviewlist.h"
#include "gl-util.h"
struct _GlEventToolbar
{
/*< private >*/
GtkWidget parent_instance;
};
typedef struct
{
GtkWidget *current_boot;
GtkWidget *output_button;
GtkWidget *menu_button;
GtkWidget *search_button;
GtkWidget *headerbar;
GlEventToolbarMode mode;
} GlEventToolbarPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GlEventToolbar, gl_event_toolbar, GTK_TYPE_WIDGET)
static void
gl_event_toolbar_update_boot_menu_label (GlEventToolbar *toolbar,
const gchar *latest_boot)
{
GlEventToolbarPrivate *priv;
GMenuModel *boot_menu;
GMenuModel *section;
GMenuItem *menu_item;
priv = gl_event_toolbar_get_instance_private (toolbar);
boot_menu = gtk_menu_button_get_menu_model (GTK_MENU_BUTTON (priv->menu_button));
section = g_menu_model_get_item_link (boot_menu, 0, "section");
if (g_menu_model_get_n_items (section) < 0)
{
menu_item = g_menu_item_new_from_model (section, 0);
g_menu_item_set_label (menu_item, latest_boot);
g_menu_remove (G_MENU (section), 0);
g_menu_insert_item (G_MENU (section), 0, menu_item);
g_object_unref (menu_item);
}
}
void
gl_event_toolbar_change_current_boot (GlEventToolbar *toolbar,
const gchar *current_boot,
const gchar *latest_boot)
{
GlEventToolbarPrivate *priv;
priv = gl_event_toolbar_get_instance_private (toolbar);
/* set text to priv->current_boot */
gtk_label_set_text (GTK_LABEL (priv->current_boot), current_boot);
gl_event_toolbar_update_boot_menu_label (toolbar, latest_boot);
}
void
gl_event_toolbar_add_boots (GlEventToolbar *toolbar,
GArray *boot_ids)
{
GtkWidget *grid;
GtkWidget *title_label;
GtkWidget *arrow;
GMenu *boot_menu;
GMenu *section;
GlEventToolbarPrivate *priv;
GtkStyleContext *context;
gint i;
gchar *current_boot = NULL;
priv = gl_event_toolbar_get_instance_private (toolbar);
boot_menu = g_menu_new ();
section = g_menu_new ();
for (i = MAX (boot_ids->len, 5) - 5; i < boot_ids->len; i++)
{
gchar *boot_match;
gchar *time_display;
GlJournalBootID *boot_id;
GMenuItem *item;
GVariant *variant;
boot_id = &g_array_index (boot_ids, GlJournalBootID, i);
boot_match = boot_id->boot_match;
time_display = gl_util_boot_time_to_display (boot_id->realtime_first,
boot_id->realtime_last);
if (i == boot_ids->len - 1)
{
current_boot = g_strdup (time_display);
}
item = g_menu_item_new (time_display, NULL);
variant = g_variant_new_string (boot_match);
g_menu_item_set_action_and_target_value (item, "win.view-boot",
variant);
g_menu_prepend_item (section, item);
g_free (time_display);
g_object_unref (item);
}
/* Translators: Boot refers to a single run (or bootup) of the system */
g_menu_prepend_section (boot_menu, _("Boot"), G_MENU_MODEL (section));
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->menu_button),
G_MENU_MODEL (boot_menu));
grid = gtk_grid_new ();
gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
gtk_menu_button_set_child (GTK_MENU_BUTTON (priv->menu_button), grid);
title_label = gtk_label_new (_("Logs"));
context = gtk_widget_get_style_context (GTK_WIDGET (title_label));
gtk_style_context_add_class (context, "title");
gtk_grid_attach (GTK_GRID (grid), title_label, 0, 0, 1, 1);
gtk_label_set_label (GTK_LABEL (priv->current_boot), current_boot);
context = gtk_widget_get_style_context (GTK_WIDGET (priv->current_boot));
gtk_style_context_add_class (context, "caption");
gtk_style_context_add_class (context, "dim-label");
gtk_grid_attach (GTK_GRID (grid), priv->current_boot, 0, 1, 1, 1);
arrow = gtk_image_new_from_icon_name ("pan-down-symbolic");
gtk_grid_attach (GTK_GRID (grid), arrow, 1, 0, 1, 2);
adw_header_bar_set_title_widget (ADW_HEADER_BAR (priv->headerbar),
priv->menu_button);
g_free (current_boot);
}
static void
gl_event_toolbar_dispose (GObject *object)
{
GlEventToolbar *list = GL_EVENT_TOOLBAR (object);
GlEventToolbarPrivate *priv = gl_event_toolbar_get_instance_private (list);
gtk_widget_unparent (priv->headerbar);
G_OBJECT_CLASS (gl_event_toolbar_parent_class)->dispose (object);
}
static void
gl_event_toolbar_class_init (GlEventToolbarClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
gobject_class->dispose = gl_event_toolbar_dispose;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/Logs/gl-eventtoolbar.ui");
gtk_widget_class_bind_template_child_private (widget_class, GlEventToolbar,
output_button);
gtk_widget_class_bind_template_child_private (widget_class, GlEventToolbar,
menu_button);
gtk_widget_class_bind_template_child_private (widget_class, GlEventToolbar,
search_button);
gtk_widget_class_bind_template_child_private (widget_class, GlEventToolbar,
headerbar);
}
static void
gl_event_toolbar_init (GlEventToolbar *toolbar)
{
GlEventToolbarPrivate *priv;
priv = gl_event_toolbar_get_instance_private (toolbar);
gtk_widget_init_template (GTK_WIDGET (toolbar));
priv->current_boot = gtk_label_new (NULL);
}
GtkWidget *
gl_event_toolbar_new (void)
{
return g_object_new (GL_TYPE_EVENT_TOOLBAR, NULL);
}