|
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 |
}
|