Mercurial > projects > package-update-indicator
diff pui-prefs-application.c @ 1:2f04ec9e0506
Add preferences application
Split settings into separate file.
author | Guido Berhoerster <guido+pui@berhoerster.name> |
---|---|
date | Fri, 08 Jun 2018 08:38:42 +0200 |
parents | |
children | 3d72ca76538d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pui-prefs-application.c Fri Jun 08 08:38:42 2018 +0200 @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2018 Guido Berhoerster <guido+pui@berhoerster.name> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <glib/gi18n.h> +#include <gio/gio.h> + +#include "pui-prefs-application.h" +#include "pui-settings.h" + +#define COLUMN_REFRESH_INTERVAL 2 + +struct _PuiPrefsApplication { + GtkApplication parent_instance; + GSettings *settings; +}; + +G_DEFINE_TYPE(PuiPrefsApplication, pui_prefs_application, GTK_TYPE_APPLICATION) + +static void pui_prefs_application_quit(GSimpleAction *, GVariant *, + gpointer); + +static const GActionEntry pui_prefs_application_actions[] = { + { "quit", pui_prefs_application_quit } +}; + +static void +pui_prefs_application_quit(GSimpleAction *simple, GVariant *parameter, + gpointer user_data) +{ + PuiPrefsApplication *self = user_data; + + g_application_quit(G_APPLICATION(self)); +} + +static gboolean +map_refresh_interval_to_index(GValue *value, GVariant *variant, + gpointer user_data) +{ + GtkTreeModel *tree_model = user_data; + guint32 setting_interval; + gint index; + gboolean iter_continue; + GtkTreeIter iter = { 0 }; + GValue model_value = G_VALUE_INIT; + guint model_interval; + + setting_interval = g_variant_get_uint32(variant); + + /* try to find a matching entry in the list */ + for (iter_continue = gtk_tree_model_get_iter_first(tree_model, &iter), + index = 0; iter_continue; + iter_continue = gtk_tree_model_iter_next(tree_model, &iter), + index++) { + gtk_tree_model_get_value(tree_model, &iter, + COLUMN_REFRESH_INTERVAL, &model_value); + model_interval = g_value_get_uint(&model_value); + g_value_unset(&model_value); + if (setting_interval == model_interval) { + g_debug("mapping refresh-interval %" G_GUINT32_FORMAT + " to index %d", setting_interval, index); + g_value_set_int(value, index); + + return (TRUE); + } + } + + g_debug("mapping refresh-interval %" G_GUINT32_FORMAT " to index -1", + setting_interval); + g_value_set_int(value, -1); + + return (TRUE); +} + +static GVariant * +map_index_to_refresh_interval(const GValue *value, + const GVariantType *expected_type, gpointer user_data) +{ + GtkTreeModel *tree_model = GTK_TREE_MODEL(user_data); + gint index; + GtkTreeIter iter = { 0 }; + GValue model_value = G_VALUE_INIT; + guint model_interval; + + index = g_value_get_int(value); + if (!gtk_tree_model_iter_nth_child(tree_model, &iter, NULL, index)) { + return (NULL); + } + + gtk_tree_model_get_value(tree_model, &iter, COLUMN_REFRESH_INTERVAL, + &model_value); + model_interval = g_value_get_uint(&model_value); + g_debug("mapping index %d to refresh-interval value %" G_GUINT32_FORMAT, + index, model_interval); + g_value_unset(&model_value); + + return (g_variant_new_uint32(model_interval)); +} + +static void +pui_prefs_application_startup(GApplication *application) +{ + PuiPrefsApplication *self = PUI_PREFS_APPLICATION(application); + GApplicationClass *application_class = + G_APPLICATION_CLASS(pui_prefs_application_parent_class); + GtkBuilder *builder; + GtkWidget *window; + GtkTreeModel *tree_model; + GtkWidget *update_command_entry; + GtkWidget *refresh_interval_combo_box; + + application_class->startup(application); + + /* create actions */ + g_action_map_add_action_entries(G_ACTION_MAP(self), + pui_prefs_application_actions, + G_N_ELEMENTS(pui_prefs_application_actions), self); + + /* get widgets from builder */ + builder = gtk_builder_new_from_resource("/org/guido-berhoerster/code/" + "package-update-indicator/preferences/pui-prefs-window.ui"); + window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); + gtk_application_add_window(GTK_APPLICATION(self), GTK_WINDOW(window)); + update_command_entry = GTK_WIDGET(gtk_builder_get_object(builder, + "update-command")); + refresh_interval_combo_box = GTK_WIDGET(gtk_builder_get_object(builder, + "refresh-interval")); + tree_model = + gtk_combo_box_get_model(GTK_COMBO_BOX(refresh_interval_combo_box)); + + /* bind settings to widgets */ + self->settings = pui_settings_new(); + g_settings_bind(self->settings, "update-command", + update_command_entry, "text", G_SETTINGS_BIND_DEFAULT); + g_settings_bind_with_mapping(self->settings, "refresh-interval", + refresh_interval_combo_box, "active", G_SETTINGS_BIND_DEFAULT, + map_refresh_interval_to_index, map_index_to_refresh_interval, + tree_model, NULL); + + /* show window */ + gtk_widget_show(window); + gtk_window_present(GTK_WINDOW(window)); + + g_object_unref(builder); +} + +static void +pui_prefs_application_activate(GApplication *application) { + GtkApplication *gtk_application = GTK_APPLICATION(application); + GApplicationClass *application_class = + G_APPLICATION_CLASS(pui_prefs_application_parent_class); + + /* raise window when activated */ + gtk_window_present(gtk_application_get_active_window(gtk_application)); + + application_class->activate(application); +} + +static void +pui_prefs_application_dispose(GObject *object) +{ + PuiPrefsApplication *self = PUI_PREFS_APPLICATION(object); + + if (self->settings != NULL) { + g_clear_object(&self->settings); + } + + G_OBJECT_CLASS(pui_prefs_application_parent_class)->dispose(object); +} + +static void +pui_prefs_application_class_init(PuiPrefsApplicationClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + GApplicationClass *application_class = G_APPLICATION_CLASS(klass); + + object_class->dispose = pui_prefs_application_dispose; + + application_class->startup = pui_prefs_application_startup; + application_class->activate = pui_prefs_application_activate; +} + +static void +pui_prefs_application_init(PuiPrefsApplication *self) +{ + /* do nothing, implementation required */ +} + +PuiPrefsApplication * +pui_prefs_application_new(void) +{ + return (g_object_new(PUI_TYPE_PREFS_APPLICATION, + "application-id", APPLICATION_ID, NULL)); +}