Blame src/dh-preferences.c

Packit 116408
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
Packit 116408
/*
Packit 116408
 * Copyright (C) 2004-2008 Imendio AB
Packit 116408
 * Copyright (C) 2010 Lanedo GmbH
Packit 116408
 * Copyright (C) 2012 Thomas Bechtold <toabctl@gnome.org>
Packit 116408
 *
Packit 116408
 * This program is free software; you can redistribute it and/or
Packit 116408
 * modify it under the terms of the GNU General Public License as
Packit 116408
 * published by the Free Software Foundation; either version 2 of the
Packit 116408
 * License, or (at your option) any later version.
Packit 116408
 *
Packit 116408
 * This program is distributed in the hope that it will be useful,
Packit 116408
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 116408
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 116408
 * General Public License for more details.
Packit 116408
 *
Packit 116408
 * You should have received a copy of the GNU General Public License
Packit 116408
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit 116408
 */
Packit 116408
Packit 116408
#include "config.h"
Packit 116408
#include "dh-preferences.h"
Packit 116408
Packit 116408
#include <string.h>
Packit 116408
Packit 116408
#include "dh-book.h"
Packit 116408
#include "dh-book-manager.h"
Packit 116408
#include "dh-util.h"
Packit 116408
#include "dh-settings.h"
Packit 116408
Packit 116408
static GtkWidget *prefs_dialog = NULL;
Packit 116408
Packit 116408
enum {
Packit 116408
        COLUMN_ENABLED = 0,
Packit 116408
        COLUMN_TITLE,
Packit 116408
        COLUMN_BOOK,
Packit 116408
        COLUMN_WEIGHT,
Packit 116408
        COLUMN_INCONSISTENT,
Packit 116408
        N_COLUMNS
Packit 116408
};
Packit 116408
Packit 116408
typedef struct {
Packit 116408
        /* Fonts tab */
Packit 116408
        GtkCheckButton *system_fonts_button;
Packit 116408
        GtkGrid *fonts_grid;
Packit 116408
        GtkFontButton *variable_font_button;
Packit 116408
        GtkFontButton *fixed_font_button;
Packit 116408
        guint      use_system_fonts_id;
Packit 116408
        guint      system_var_id;
Packit 116408
        guint      system_fixed_id;
Packit 116408
        guint      var_id;
Packit 116408
        guint      fixed_id;
Packit 116408
Packit 116408
        /* Book Shelf tab */
Packit 116408
        GtkCellRendererToggle *bookshelf_enabled_toggle;
Packit 116408
        GtkListStore *bookshelf_store;
Packit 116408
        GtkCheckButton *bookshelf_group_by_language_button;
Packit 116408
} DhPreferencesPrivate;
Packit 116408
Packit 116408
G_DEFINE_TYPE_WITH_PRIVATE (DhPreferences, dh_preferences, GTK_TYPE_DIALOG)
Packit 116408
Packit 116408
static void
Packit 116408
dh_preferences_response (GtkDialog *dlg,
Packit 116408
                         gint       response_id)
Packit 116408
{
Packit 116408
        gtk_widget_destroy (GTK_WIDGET (dlg));
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_preferences_class_init (DhPreferencesClass *klass)
Packit 116408
{
Packit 116408
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 116408
        GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
Packit 116408
Packit 116408
        dialog_class->response = dh_preferences_response;
Packit 116408
Packit 116408
        /* Bind class to template */
Packit 116408
        gtk_widget_class_set_template_from_resource (widget_class,
Packit 116408
                                                     "/org/gnome/devhelp/dh-preferences.ui");
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, system_fonts_button);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, fonts_grid);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, variable_font_button);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, fixed_font_button);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, bookshelf_store);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, bookshelf_group_by_language_button);
Packit 116408
        gtk_widget_class_bind_template_child_private (widget_class, DhPreferences, bookshelf_enabled_toggle);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_clean_store (DhPreferences *prefs)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
Packit 116408
        gtk_list_store_clear (priv->bookshelf_store);
Packit 116408
}
Packit 116408
Packit 116408
/* Tries to find, starting at 'first' (if given):
Packit 116408
 *  - An exact match of the book
Packit 116408
 *  - The book which should be just after our given book:
Packit 116408
 *      - If first is set, the next book must be in the same language group
Packit 116408
 *         as the given book.
Packit 116408
 *      - If first is NOT set, we don't care about language groups as we're
Packit 116408
 *         iterating from the beginning of the list.
Packit 116408
 *  - Both.
Packit 116408
 */
Packit 116408
static void
Packit 116408
preferences_bookshelf_find_book (DhPreferences     *prefs,
Packit 116408
                                 DhBook            *book,
Packit 116408
                                 const GtkTreeIter *first,
Packit 116408
                                 GtkTreeIter       *exact_iter,
Packit 116408
                                 gboolean          *exact_found,
Packit 116408
                                 GtkTreeIter       *next_iter,
Packit 116408
                                 gboolean          *next_found)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        GtkTreeIter loop_iter;
Packit 116408
Packit 116408
        g_assert ((exact_iter && exact_found) || (next_iter && next_found));
Packit 116408
Packit 116408
        /* Reset all flags to not found */
Packit 116408
        if (exact_found)
Packit 116408
                *exact_found = FALSE;
Packit 116408
        if (next_found)
Packit 116408
                *next_found = FALSE;
Packit 116408
Packit 116408
        /* Setup iteration start */
Packit 116408
        if (!first) {
Packit 116408
                /* If no first given, start iterating from the start of the model */
Packit 116408
                if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->bookshelf_store), &loop_iter)) {
Packit 116408
                        /* Store is empty, not found */
Packit 116408
                        return;
Packit 116408
                }
Packit 116408
        } else {
Packit 116408
                loop_iter = *first;
Packit 116408
        }
Packit 116408
Packit 116408
        do {
Packit 116408
                DhBook *in_list_book = NULL;
Packit 116408
Packit 116408
                gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                    &loop_iter,
Packit 116408
                                    COLUMN_BOOK, &in_list_book,
Packit 116408
                                    -1);
Packit 116408
Packit 116408
                /* We may have reached the start of the next language group here */
Packit Service 308146
                if (exact_found && first && !in_list_book) {
Packit 116408
                        *next_iter = loop_iter;
Packit 116408
                        *next_found = TRUE;
Packit 116408
                        return;
Packit 116408
                }
Packit 116408
Packit 116408
                /* We can compare pointers directly as we're playing with references
Packit 116408
                 * of the same object */
Packit Service 308146
                if (exact_iter && exact_found &&
Packit 116408
                    in_list_book == book) {
Packit 116408
                        *exact_iter = loop_iter;
Packit 116408
                        *exact_found = TRUE;
Packit 116408
                        if (!next_iter) {
Packit 116408
                                /* If we were not requested to look for the next one, end here */
Packit 116408
                                g_object_unref (in_list_book);
Packit 116408
                                return;
Packit 116408
                        }
Packit Service 308146
                } else if (next_iter && next_found &&
Packit 116408
                           dh_book_cmp_by_title (in_list_book, book) > 0) {
Packit 116408
                        *next_iter = loop_iter;
Packit 116408
                        *next_found = TRUE;
Packit 116408
                        g_object_unref (in_list_book);
Packit 116408
                        return;
Packit 116408
                }
Packit 116408
Packit 116408
                if (in_list_book)
Packit 116408
                        g_object_unref (in_list_book);
Packit 116408
        } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                           &loop_iter));
Packit 116408
}
Packit 116408
Packit 116408
/* Tries to find:
Packit 116408
 *  - An exact match of the language group
Packit 116408
 *  - The language group which should be just after our given language group.
Packit 116408
 *  - Both.
Packit 116408
 */
Packit 116408
static void
Packit 116408
preferences_bookshelf_find_language_group (DhPreferences *prefs,
Packit 116408
                                           const gchar   *language,
Packit 116408
                                           GtkTreeIter   *exact_iter,
Packit 116408
                                           gboolean      *exact_found,
Packit 116408
                                           GtkTreeIter   *next_iter,
Packit 116408
                                           gboolean      *next_found)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        GtkTreeIter loop_iter;
Packit 116408
Packit 116408
        g_assert ((exact_iter && exact_found) || (next_iter && next_found));
Packit 116408
Packit 116408
        /* Reset all flags to not found */
Packit 116408
        if (exact_found)
Packit 116408
                *exact_found = FALSE;
Packit 116408
        if (next_found)
Packit 116408
                *next_found = FALSE;
Packit 116408
Packit 116408
        if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                            &loop_iter)) {
Packit 116408
                /* Store is empty, not found */
Packit 116408
                return;
Packit 116408
        }
Packit 116408
Packit 116408
        do {
Packit 116408
                DhBook *book = NULL;
Packit 116408
                gchar  *title = NULL;
Packit 116408
Packit 116408
                /* Look for language titles, which are those where there
Packit 116408
                 * is no book object associated in the row */
Packit 116408
                gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                    &loop_iter,
Packit 116408
                                    COLUMN_TITLE, &title,
Packit 116408
                                    COLUMN_BOOK,  &book,
Packit 116408
                                    -1);
Packit 116408
Packit 116408
                /* If we got a book, it's not a language row */
Packit 116408
                if (book) {
Packit 116408
                        g_free (title);
Packit 116408
                        g_object_unref (book);
Packit 116408
                        continue;
Packit 116408
                }
Packit 116408
Packit Service 308146
                if (exact_iter && exact_found &&
Packit 116408
                    g_ascii_strcasecmp (title, language) == 0) {
Packit 116408
                        /* Exact match found! */
Packit 116408
                        *exact_iter = loop_iter;
Packit 116408
                        *exact_found = TRUE;
Packit 116408
                        if (!next_iter) {
Packit 116408
                                /* If we were not requested to look for the next one, end here */
Packit 116408
                                g_free (title);
Packit 116408
                                return;
Packit 116408
                        }
Packit Service 308146
                } else if (next_iter && next_found &&
Packit 116408
                           g_ascii_strcasecmp (title, language) > 0) {
Packit 116408
                        *next_iter = loop_iter;
Packit 116408
                        *next_found = TRUE;
Packit 116408
                        /* There's no way to have an exact match after the next, so end here */
Packit 116408
                        g_free (title);
Packit 116408
                        return;
Packit 116408
                }
Packit 116408
Packit 116408
                g_free (title);
Packit 116408
        } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                           &loop_iter));
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_add_book_to_store (DhPreferences *prefs,
Packit 116408
                                         DhBook        *book,
Packit 116408
                                         gboolean       group_by_language)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        GtkTreeIter  book_iter;
Packit 116408
Packit 116408
        /* If grouping by language we need to add the language categories */
Packit 116408
        if (group_by_language) {
Packit 116408
                gchar       *indented_title;
Packit 116408
                GtkTreeIter  language_iter;
Packit 116408
                gboolean     language_iter_found;
Packit 116408
                GtkTreeIter  next_language_iter;
Packit 116408
                gboolean     next_language_iter_found;
Packit 116408
                const gchar *language_title;
Packit 116408
                gboolean     first_in_language = FALSE;
Packit 116408
Packit 116408
                language_title = dh_book_get_language (book);
Packit 116408
Packit 116408
                /* Look for the proper language group */
Packit 116408
                preferences_bookshelf_find_language_group (prefs,
Packit 116408
                                                           language_title,
Packit 116408
                                                           &language_iter,
Packit 116408
                                                           &language_iter_found,
Packit 116408
                                                           &next_language_iter,
Packit 116408
                                                           &next_language_iter_found);
Packit 116408
                /* New language group needs to be created? */
Packit 116408
                if (!language_iter_found) {
Packit 116408
                        if (!next_language_iter_found) {
Packit 116408
                                gtk_list_store_append (priv->bookshelf_store,
Packit 116408
                                                       &language_iter);
Packit 116408
                        } else {
Packit 116408
                                gtk_list_store_insert_before (priv->bookshelf_store,
Packit 116408
                                                              &language_iter,
Packit 116408
                                                              &next_language_iter);
Packit 116408
                        }
Packit 116408
Packit 116408
                        gtk_list_store_set (priv->bookshelf_store,
Packit 116408
                                            &language_iter,
Packit 116408
                                            COLUMN_ENABLED,      dh_book_get_enabled (book),
Packit 116408
                                            COLUMN_TITLE,        language_title,
Packit 116408
                                            COLUMN_BOOK,         NULL,
Packit 116408
                                            COLUMN_WEIGHT,       PANGO_WEIGHT_BOLD,
Packit 116408
                                            COLUMN_INCONSISTENT, FALSE,
Packit 116408
                                            -1);
Packit 116408
Packit 116408
                        first_in_language = TRUE;
Packit 116408
                }
Packit 116408
Packit 116408
                /* If we got to add first book in a given language group, just append it. */
Packit 116408
                if (first_in_language) {
Packit 116408
                        gtk_list_store_insert_after (priv->bookshelf_store,
Packit 116408
                                                     &book_iter,
Packit 116408
                                                     &language_iter);
Packit 116408
                } else {
Packit 116408
                        GtkTreeIter first_book_iter;
Packit 116408
                        GtkTreeIter next_book_iter;
Packit 116408
                        gboolean    next_book_iter_found;
Packit 116408
                        gboolean    language_inconsistent = FALSE;
Packit 116408
                        gboolean    language_enabled = FALSE;
Packit 116408
Packit 116408
                        /* We may need to reset the inconsistent status of the language item */
Packit 116408
                        gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                            &language_iter,
Packit 116408
                                            COLUMN_ENABLED, &language_enabled,
Packit 116408
                                            COLUMN_INCONSISTENT, &language_inconsistent,
Packit 116408
                                            -1);
Packit 116408
                        /* If inconsistent already, do nothing */
Packit 116408
                        if (!language_inconsistent) {
Packit 116408
                                if (language_enabled != dh_book_get_enabled (book)) {
Packit 116408
                                        gtk_list_store_set (priv->bookshelf_store,
Packit 116408
                                                            &language_iter,
Packit 116408
                                                            COLUMN_INCONSISTENT, TRUE,
Packit 116408
                                                            -1);
Packit 116408
                                }
Packit 116408
                        }
Packit 116408
Packit 116408
                        /* The language will have at least one book, so we move iter to it */
Packit 116408
                        first_book_iter = language_iter;
Packit 116408
                        gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->bookshelf_store), &first_book_iter);
Packit 116408
Packit 116408
                        /* Find next possible book in language group */
Packit 116408
                        preferences_bookshelf_find_book (prefs,
Packit 116408
                                                         book,
Packit 116408
                                                         &first_book_iter,
Packit 116408
                                                         NULL,
Packit 116408
                                                         NULL,
Packit 116408
                                                         &next_book_iter,
Packit 116408
                                                         &next_book_iter_found);
Packit 116408
                        if (!next_book_iter_found) {
Packit 116408
                                gtk_list_store_append (priv->bookshelf_store,
Packit 116408
                                                       &book_iter);
Packit 116408
                        } else {
Packit 116408
                                gtk_list_store_insert_before (priv->bookshelf_store,
Packit 116408
                                                              &book_iter,
Packit 116408
                                                              &next_book_iter);
Packit 116408
                        }
Packit 116408
                }
Packit 116408
Packit 116408
                /* Add new item with indented title */
Packit 116408
                indented_title = g_strdup_printf ("     %s", dh_book_get_title (book));
Packit 116408
                gtk_list_store_set (priv->bookshelf_store,
Packit 116408
                                    &book_iter,
Packit 116408
                                    COLUMN_ENABLED,      dh_book_get_enabled (book),
Packit 116408
                                    COLUMN_TITLE,        indented_title,
Packit 116408
                                    COLUMN_BOOK,         book,
Packit 116408
                                    COLUMN_WEIGHT,       PANGO_WEIGHT_NORMAL,
Packit 116408
                                    COLUMN_INCONSISTENT, FALSE,
Packit 116408
                                    -1);
Packit 116408
                g_free (indented_title);
Packit 116408
        } else {
Packit 116408
                /* No language grouping, just order by book title */
Packit 116408
                GtkTreeIter next_book_iter;
Packit 116408
                gboolean    next_book_iter_found;
Packit 116408
Packit 116408
                preferences_bookshelf_find_book (prefs,
Packit 116408
                                                 book,
Packit 116408
                                                 NULL,
Packit 116408
                                                 NULL,
Packit 116408
                                                 NULL,
Packit 116408
                                                 &next_book_iter,
Packit 116408
                                                 &next_book_iter_found);
Packit 116408
                if (!next_book_iter_found) {
Packit 116408
                        gtk_list_store_append (priv->bookshelf_store,
Packit 116408
                                               &book_iter);
Packit 116408
                } else {
Packit 116408
                        gtk_list_store_insert_before (priv->bookshelf_store,
Packit 116408
                                                      &book_iter,
Packit 116408
                                                      &next_book_iter);
Packit 116408
                }
Packit 116408
Packit 116408
                gtk_list_store_set (priv->bookshelf_store,
Packit 116408
                                    &book_iter,
Packit 116408
                                    COLUMN_ENABLED,  dh_book_get_enabled (book),
Packit 116408
                                    COLUMN_TITLE,    dh_book_get_title (book),
Packit 116408
                                    COLUMN_BOOK,     book,
Packit 116408
                                    COLUMN_WEIGHT,   PANGO_WEIGHT_NORMAL,
Packit 116408
                                    -1);
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_populate_store (DhPreferences *prefs)
Packit 116408
{
Packit 116408
        DhBookManager *book_manager;
Packit 116408
        GList *l;
Packit 116408
        gboolean group_by_language;
Packit 116408
Packit 116408
        book_manager = dh_book_manager_get_singleton ();
Packit 116408
        group_by_language = dh_book_manager_get_group_by_language (book_manager);
Packit 116408
Packit 116408
        /* This list already comes ordered, but we don't care */
Packit 116408
        for (l = dh_book_manager_get_books (book_manager);
Packit 116408
             l;
Packit 116408
             l = g_list_next (l)) {
Packit 116408
                preferences_bookshelf_add_book_to_store (prefs,
Packit 116408
                                                         DH_BOOK (l->data),
Packit 116408
                                                         group_by_language);
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_group_by_language_cb (GObject       *object,
Packit 116408
                                            GParamSpec    *pspec,
Packit 116408
                                            DhPreferences *prefs)
Packit 116408
{
Packit 116408
        preferences_bookshelf_clean_store (prefs);
Packit 116408
        preferences_bookshelf_populate_store (prefs);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_set_language_inconsistent (DhPreferences *prefs,
Packit 116408
                                                 const gchar *language)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        GtkTreeIter loop_iter;
Packit 116408
        GtkTreeIter language_iter;
Packit 116408
        gboolean    language_iter_found;
Packit 116408
        gboolean    one_book_enabled = FALSE;
Packit 116408
        gboolean    one_book_disabled = FALSE;
Packit 116408
Packit 116408
        preferences_bookshelf_find_language_group (prefs,
Packit 116408
                                                   language,
Packit 116408
                                                   &language_iter,
Packit 116408
                                                   &language_iter_found,
Packit 116408
                                                   NULL,
Packit 116408
                                                   NULL);
Packit 116408
        if (!language_iter_found) {
Packit 116408
                return;
Packit 116408
        }
Packit 116408
Packit 116408
        loop_iter = language_iter;
Packit 116408
        while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                         &loop_iter)) {
Packit 116408
                DhBook   *book;
Packit 116408
                gboolean  enabled;
Packit 116408
Packit 116408
                gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                    &loop_iter,
Packit 116408
                                    COLUMN_BOOK,       &book,
Packit 116408
                                    COLUMN_ENABLED,    &enabled,
Packit 116408
                                    -1);
Packit 116408
                if (!book) {
Packit 116408
                        /* Reached next language group */
Packit 116408
                        break;
Packit 116408
                }
Packit 116408
                g_object_unref (book);
Packit 116408
Packit 116408
                if (enabled)
Packit 116408
                        one_book_enabled = TRUE;
Packit 116408
                else
Packit 116408
                        one_book_disabled = TRUE;
Packit 116408
Packit 116408
                if (one_book_enabled == one_book_disabled)
Packit 116408
                        break;
Packit 116408
        }
Packit 116408
Packit 116408
        /* If at least one book is enabled AND another book is disabled,
Packit 116408
         * we need to set inconsistent state */
Packit 116408
        if (one_book_enabled == one_book_disabled) {
Packit 116408
                gtk_list_store_set (priv->bookshelf_store, &language_iter,
Packit 116408
                                    COLUMN_INCONSISTENT, TRUE,
Packit 116408
                                    -1);
Packit 116408
                return;
Packit 116408
        }
Packit 116408
Packit 116408
        gtk_list_store_set (priv->bookshelf_store, &language_iter,
Packit 116408
                            COLUMN_ENABLED, one_book_enabled,
Packit 116408
                            COLUMN_INCONSISTENT, FALSE,
Packit 116408
                            -1);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_book_deleted_cb (DhBookManager *book_manager,
Packit 116408
                                       DhBook        *book,
Packit 116408
                                       DhPreferences *prefs)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        GtkTreeIter  exact_iter;
Packit 116408
        gboolean     exact_iter_found;
Packit 116408
Packit 116408
        preferences_bookshelf_find_book (prefs,
Packit 116408
                                         book,
Packit 116408
                                         NULL,
Packit 116408
                                         &exact_iter,
Packit 116408
                                         &exact_iter_found,
Packit 116408
                                         NULL,
Packit 116408
                                         NULL);
Packit 116408
        if (exact_iter_found) {
Packit 116408
                gtk_list_store_remove (priv->bookshelf_store, &exact_iter);
Packit 116408
                preferences_bookshelf_set_language_inconsistent (prefs, dh_book_get_language (book));
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_book_created_cb (DhBookManager *book_manager,
Packit 116408
                                       DhBook        *book,
Packit 116408
                                       DhPreferences *prefs)
Packit 116408
{
Packit 116408
        gboolean group_by_language;
Packit 116408
Packit 116408
        group_by_language = dh_book_manager_get_group_by_language (book_manager);
Packit 116408
        preferences_bookshelf_add_book_to_store (prefs, book, group_by_language);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
preferences_bookshelf_tree_selection_toggled_cb (GtkCellRendererToggle *cell_renderer,
Packit 116408
                                                 gchar                 *path,
Packit 116408
                                                 DhPreferences         *prefs)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv = dh_preferences_get_instance_private (prefs);
Packit 116408
        DhBookManager *book_manager;
Packit 116408
        GtkTreeIter iter;
Packit 116408
Packit 116408
        book_manager = dh_book_manager_get_singleton ();
Packit 116408
Packit 116408
        if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                                 &iter,
Packit 116408
                                                 path)) {
Packit 116408
                gpointer book = NULL;
Packit 116408
                gboolean enabled;
Packit 116408
Packit 116408
                gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                    &iter,
Packit 116408
                                    COLUMN_BOOK,       &book,
Packit 116408
                                    COLUMN_ENABLED,    &enabled,
Packit 116408
                                    -1);
Packit 116408
Packit 116408
                if (book) {
Packit 116408
                        /* Update book conf */
Packit 116408
                        dh_book_set_enabled (book, !enabled);
Packit 116408
Packit 116408
                        gtk_list_store_set (priv->bookshelf_store, &iter,
Packit 116408
                                            COLUMN_ENABLED, !enabled,
Packit 116408
                                            -1);
Packit 116408
                        /* Now we need to look for the language group of this item,
Packit 116408
                         * in order to set the inconsistent state if applies */
Packit 116408
                        if (dh_book_manager_get_group_by_language (book_manager)) {
Packit 116408
                                preferences_bookshelf_set_language_inconsistent (prefs, dh_book_get_language (book));
Packit 116408
                        }
Packit 116408
Packit 116408
                } else {
Packit 116408
                        GtkTreeIter loop_iter;
Packit 116408
Packit 116408
                        /* We should only reach this if we are grouping by language */
Packit 116408
                        g_assert (dh_book_manager_get_group_by_language (book_manager) == TRUE);
Packit 116408
Packit 116408
                        /* Set new status in the language group item */
Packit 116408
                        gtk_list_store_set (priv->bookshelf_store, &iter,
Packit 116408
                                            COLUMN_ENABLED,      !enabled,
Packit 116408
                                            COLUMN_INCONSISTENT, FALSE,
Packit 116408
                                            -1);
Packit 116408
Packit 116408
                        /* And set new status in all books of the same language */
Packit 116408
                        loop_iter = iter;
Packit 116408
                        while (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                                         &loop_iter)) {
Packit 116408
                                gtk_tree_model_get (GTK_TREE_MODEL (priv->bookshelf_store),
Packit 116408
                                                    &loop_iter,
Packit 116408
                                                    COLUMN_BOOK, &book,
Packit 116408
                                                    -1);
Packit 116408
                                if (!book) {
Packit 116408
                                        /* Found next language group, finish */
Packit 116408
                                        return;
Packit 116408
                                }
Packit 116408
Packit 116408
                                /* Update book conf */
Packit 116408
                                dh_book_set_enabled (book, !enabled);
Packit 116408
Packit 116408
                                gtk_list_store_set (priv->bookshelf_store,
Packit 116408
                                                    &loop_iter,
Packit 116408
                                                    COLUMN_ENABLED, !enabled,
Packit 116408
                                                    -1);
Packit 116408
                        }
Packit 116408
                }
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_preferences_init (DhPreferences *prefs)
Packit 116408
{
Packit 116408
        DhPreferencesPrivate *priv;
Packit 116408
        DhBookManager *book_manager;
Packit 116408
        DhSettings *settings;
Packit 116408
        GSettings *settings_fonts;
Packit 116408
        GSettings *settings_contents;
Packit 116408
Packit 116408
        priv = dh_preferences_get_instance_private (prefs);
Packit 116408
Packit 116408
        gtk_widget_init_template (GTK_WIDGET (prefs));
Packit 116408
Packit 116408
        book_manager = dh_book_manager_get_singleton ();
Packit 116408
Packit 116408
        g_signal_connect_object (book_manager,
Packit 116408
                                 "book-created",
Packit 116408
                                 G_CALLBACK (preferences_bookshelf_book_created_cb),
Packit 116408
                                 prefs,
Packit 116408
                                 0);
Packit 116408
Packit 116408
        g_signal_connect_object (book_manager,
Packit 116408
                                 "book-deleted",
Packit 116408
                                 G_CALLBACK (preferences_bookshelf_book_deleted_cb),
Packit 116408
                                 prefs,
Packit 116408
                                 0);
Packit 116408
Packit 116408
        g_signal_connect_object (book_manager,
Packit 116408
                                 "notify::group-by-language",
Packit 116408
                                 G_CALLBACK (preferences_bookshelf_group_by_language_cb),
Packit 116408
                                 prefs,
Packit 116408
                                 0);
Packit 116408
Packit 116408
        /* setup GSettings bindings */
Packit 116408
        settings = dh_settings_get_singleton ();
Packit 116408
        settings_fonts = dh_settings_peek_fonts_settings (settings);
Packit 116408
        settings_contents = dh_settings_peek_contents_settings (settings);
Packit 116408
        g_settings_bind (settings_fonts, "use-system-fonts",
Packit 116408
                         priv->system_fonts_button, "active",
Packit 116408
                         G_SETTINGS_BIND_DEFAULT);
Packit 116408
        g_settings_bind (settings_fonts, "use-system-fonts",
Packit 116408
                         priv->fonts_grid, "sensitive",
Packit 116408
                         G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN);
Packit 116408
        g_settings_bind (settings_fonts, "fixed-font",
Packit 116408
                         priv->fixed_font_button, "font-name",
Packit 116408
                         G_SETTINGS_BIND_DEFAULT);
Packit 116408
        g_settings_bind (settings_fonts, "variable-font",
Packit 116408
                         priv->variable_font_button, "font-name",
Packit 116408
                         G_SETTINGS_BIND_DEFAULT);
Packit 116408
Packit 116408
        g_settings_bind (settings_contents, "group-books-by-language",
Packit 116408
                         priv->bookshelf_group_by_language_button, "active",
Packit 116408
                         G_SETTINGS_BIND_DEFAULT);
Packit 116408
Packit 116408
        g_signal_connect (priv->bookshelf_enabled_toggle,
Packit 116408
                          "toggled",
Packit 116408
                          G_CALLBACK (preferences_bookshelf_tree_selection_toggled_cb),
Packit 116408
                          prefs);
Packit 116408
Packit 116408
        preferences_bookshelf_populate_store (prefs);
Packit 116408
}
Packit 116408
Packit 116408
void
Packit 116408
dh_preferences_show_dialog (GtkWindow *parent)
Packit 116408
{
Packit 116408
        g_return_if_fail (GTK_IS_WINDOW (parent));
Packit 116408
Packit 116408
        if (prefs_dialog == NULL) {
Packit 116408
                prefs_dialog = GTK_WIDGET (g_object_new (DH_TYPE_PREFERENCES,
Packit 116408
                                                         "use-header-bar", 1,
Packit 116408
                                                         NULL));
Packit 116408
                g_signal_connect (prefs_dialog,
Packit 116408
                                  "destroy",
Packit 116408
                                  G_CALLBACK (gtk_widget_destroyed),
Packit 116408
                                  &prefs_dialog);
Packit 116408
        }
Packit 116408
Packit 116408
        if (parent != gtk_window_get_transient_for (GTK_WINDOW (prefs_dialog))) {
Packit 116408
                gtk_window_set_transient_for (GTK_WINDOW (prefs_dialog),
Packit 116408
                                              parent);
Packit 116408
                gtk_window_set_destroy_with_parent (GTK_WINDOW (prefs_dialog), TRUE);
Packit 116408
        }
Packit 116408
Packit 116408
        gtk_window_present (GTK_WINDOW (prefs_dialog));
Packit 116408
}