From 47fe9f9e83b34d20c11b99218cb14638c0127e24 Mon Sep 17 00:00:00 2001 From: Yevgen Muntyan <17531749+muntyan@users.noreply.github.com> Date: Wed, 4 Jul 2007 21:16:49 -0500 Subject: [PATCH] Load and initialize prefs pages on demand, to make prefs dialog appear faster --- moo/mooedit/glade/mooeditprefs-file.glade | 169 +++ moo/mooedit/glade/mooeditprefs-font.glade | 92 ++ moo/mooedit/glade/mooeditprefs-general.glade | 333 +++++ moo/mooedit/glade/mooeditprefs-langs.glade | 277 +++++ moo/mooedit/glade/mooeditprefs-view.glade | 242 ++++ moo/mooedit/glade/mooeditprefs.glade | 1155 ------------------ moo/mooedit/mooeditprefspage.c | 476 ++++++-- moo/mooutils/mooprefsdialog.c | 44 +- 8 files changed, 1511 insertions(+), 1277 deletions(-) create mode 100644 moo/mooedit/glade/mooeditprefs-file.glade create mode 100644 moo/mooedit/glade/mooeditprefs-font.glade create mode 100644 moo/mooedit/glade/mooeditprefs-general.glade create mode 100644 moo/mooedit/glade/mooeditprefs-langs.glade create mode 100644 moo/mooedit/glade/mooeditprefs-view.glade delete mode 100644 moo/mooedit/glade/mooeditprefs.glade diff --git a/moo/mooedit/glade/mooeditprefs-file.glade b/moo/mooedit/glade/mooeditprefs-file.glade new file mode 100644 index 00000000..95a44fbb --- /dev/null +++ b/moo/mooedit/glade/mooeditprefs-file.glade @@ -0,0 +1,169 @@ + + + + + + + + True + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + 1 + 2 + + + True + 1 + Encodings to autodetect: + + + GTK_FILL + + 3 + + + + + True + encodings + Comma-separated list of encodings to try when opening a file. 'LOCALE' means current locale encoding. + + + 1 + 2 + + + + + + + + + + True + Loading + + + label_item + + + + + False + False + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + 3 + 2 + + + True + Remove trailing spaces + True + True + strip + + + 2 + 1 + 2 + + + + + Make backups + True + True + make_backups + + + 2 + 2 + 3 + + + + + True + 1 + Encoding for new files: + + + GTK_FILL + + 3 + + + + + True + + + True + + + + + 1 + 2 + + + + + + + + + + True + Saving + + + label_item + + + + + False + False + 1 + + + + + + + + + diff --git a/moo/mooedit/glade/mooeditprefs-font.glade b/moo/mooedit/glade/mooeditprefs-font.glade new file mode 100644 index 00000000..8d166f95 --- /dev/null +++ b/moo/mooedit/glade/mooeditprefs-font.glade @@ -0,0 +1,92 @@ + + + + + + + + True + + + True + Use default theme font + True + True + use_default_font + + + False + False + + + + + True + 2 + 2 + + + True + Font: + !use_default_font + + + + + + + + + True + True + True + font + !use_default_font + + + 1 + 2 + + + + + + True + 0 + Color scheme: + + + 1 + 2 + + + + + + + True + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + + False + 1 + + + + + + diff --git a/moo/mooedit/glade/mooeditprefs-general.glade b/moo/mooedit/glade/mooeditprefs-general.glade new file mode 100644 index 00000000..225e56f3 --- /dev/null +++ b/moo/mooedit/glade/mooeditprefs-general.glade @@ -0,0 +1,333 @@ + + + + + + + + True + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + Smart Home and End + True + False + True + smart_home_end + + + False + False + + + + + True + 0 + Tab key: + + + False + False + 1 + + + + + True + 6 + + + True + + + True + True + tab_key_action + do-nothing + + + True + Moves input focus + + + + + + + True + True + tab_inserts_tab + tab_key_action + indent + + + True + Indents text + + + + + 1 + + + + + True + True + tab_inserts_tab + tab_key_action + find-placeholder + + + True + Moves cursor to next placeholder + + + + + 2 + + + + + + + 2 + + + + + + + + + True + Keyboard + + + label_item + + + + + False + False + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + True + auto_indent + + + True + Enable auto indentation + + + + + False + False + + + + + True + Use spaces to indent + True + False + True + spaces_instead_of_tabs + + + False + False + 1 + + + + + True + 6 + + + True + 3 + + + True + Indent width, spaces: + tabswidth_spin + + + False + False + + + + + True + 4 1 100 1 10 10 + 1 + True + indent_width + + + False + 1 + + + + + + + 2 + + + + + True + True + backspace_indents + + + True + Backspace key indents + + + + + 3 + + + + + + + + + True + Indentation + + + label_item + + + + + False + False + 1 + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + 3 + + + True + Default language: + + + False + False + + + + + True + + + 1 + + + + + False + False + + + + + + + + + + + + + + + True + Misc + True + + + label_item + + + + + False + False + 2 + + + + + + + + + diff --git a/moo/mooedit/glade/mooeditprefs-langs.glade b/moo/mooedit/glade/mooeditprefs-langs.glade new file mode 100644 index 00000000..2a5485a8 --- /dev/null +++ b/moo/mooedit/glade/mooeditprefs-langs.glade @@ -0,0 +1,277 @@ + + + + + + + + True + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + 4 + 2 + + + True + + + 1 + 2 + + + + + + True + 1 + Language: + + + GTK_FILL + + + + + + True + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + 1 + Extensions: + + + 2 + 3 + GTK_FILL + + + + + + True + 1 + Mime types: + + + 1 + 2 + GTK_FILL + + + + + + True + 1 + Options: + + + 3 + 4 + GTK_FILL + + + + + + True + True + strip: bool; use-tabs: bool; indent-width: integer; tab-width: integer + + + 1 + 2 + 3 + 4 + + + + + + + + + + True + Language-specific options + + + label_item + + + + + False + False + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_ETCHED_IN + + + 400 + 200 + True + True + True + False + + + + + + + True + + + True + False + + + True + gtk-new + + + + + False + False + + + + + True + False + + + True + gtk-delete + + + + + False + False + 1 + + + + + True + + + True + gtk-go-down + + + + + False + False + 2 + + + + + True + + + True + gtk-go-up + + + + + False + False + 3 + + + + + False + False + 1 + + + + + + + + + True + File filters + + + label_item + + + + + 1 + + + + + + diff --git a/moo/mooedit/glade/mooeditprefs-view.glade b/moo/mooedit/glade/mooeditprefs-view.glade new file mode 100644 index 00000000..0b7cf6c5 --- /dev/null +++ b/moo/mooedit/glade/mooeditprefs-view.glade @@ -0,0 +1,242 @@ + + + + + + + + True + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + Enable text wrapping + True + True + wrapping_enable + + + False + False + + + + + True + Do not split words + True + True + wrapping_dont_split_words + enable_wrapping + + + False + False + 1 + + + + + + + + + True + Text wrapping + + + label_item + + + + + False + False + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + Enable syntax highlighting + True + True + enable_highlighting + + + False + False + + + + + True + Highlight matching brackets + True + True + highlight_matching_brackets + + + False + False + 1 + + + + + True + Highlight mismatching brackets + True + True + highlight_mismatching_brackets + + + False + False + 2 + + + + + True + Highlight current line + True + True + highlight_current_line + + + False + False + 3 + + + + + + + + + True + Highlighting + + + label_item + + + + + False + False + 1 + + + + + True + 3 + 0 + + + True + 3 + 3 + 3 + + + True + + + True + Show line numbers + True + True + show_line_numbers + + + False + False + + + + + True + Show tabs + True + True + show_tabs + + + False + False + 1 + + + + + True + Show trailing spaces + True + True + show_trailing_spaces + + + False + False + 2 + + + + + + + + + True + Misc + + + label_item + + + + + False + False + 2 + + + + + + diff --git a/moo/mooedit/glade/mooeditprefs.glade b/moo/mooedit/glade/mooeditprefs.glade deleted file mode 100644 index 07263d72..00000000 --- a/moo/mooedit/glade/mooeditprefs.glade +++ /dev/null @@ -1,1155 +0,0 @@ - - - - - - True - window1 - - - True - - - True - - - True - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - Smart Home and End - True - False - True - smart_home_end - - - False - False - - - - - True - 0 - Tab key: - - - False - False - 1 - - - - - True - 6 - - - True - - - True - True - tab_key_action - do-nothing - - - True - Moves input focus - - - - - - - True - True - tab_inserts_tab - tab_key_action - indent - - - True - Indents text - - - - - 1 - - - - - True - True - tab_inserts_tab - tab_key_action - find-placeholder - - - True - Moves cursor to next placeholder - - - - - 2 - - - - - - - 2 - - - - - - - - - True - Keyboard - - - label_item - - - - - False - False - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - True - auto_indent - - - True - Enable auto indentation - - - - - False - False - - - - - True - Use spaces to indent - True - False - True - spaces_instead_of_tabs - - - False - False - 1 - - - - - True - 6 - - - True - 3 - - - True - Indent width, spaces: - tabswidth_spin - - - False - False - - - - - True - 4 1 100 1 10 10 - 1 - True - indent_width - - - False - 1 - - - - - - - 2 - - - - - True - True - backspace_indents - - - True - Backspace key indents - - - - - 3 - - - - - - - - - True - Indentation - - - label_item - - - - - False - False - 1 - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - 3 - - - True - Default language: - - - False - False - - - - - True - - - 1 - - - - - False - False - - - - - - - - - - - - - - - True - Misc - True - - - label_item - - - - - False - False - 2 - - - - - - - - False - - - - - True - General - - - tab - False - False - - - - - True - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - Enable text wrapping - True - True - wrapping_enable - - - False - False - - - - - True - Do not split words - True - True - wrapping_dont_split_words - enable_wrapping - - - False - False - 1 - - - - - - - - - True - Text wrapping - - - label_item - - - - - False - False - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - Enable syntax highlighting - True - True - enable_highlighting - - - False - False - - - - - True - Highlight matching brackets - True - True - highlight_matching_brackets - - - False - False - 1 - - - - - True - Highlight mismatching brackets - True - True - highlight_mismatching_brackets - - - False - False - 2 - - - - - True - Highlight current line - True - True - highlight_current_line - - - False - False - 3 - - - - - - - - - True - Highlighting - - - label_item - - - - - False - False - 1 - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - Show line numbers - True - True - show_line_numbers - - - False - False - - - - - True - Show tabs - True - True - show_tabs - - - False - False - 1 - - - - - True - Show trailing spaces - True - True - show_trailing_spaces - - - False - False - 2 - - - - - - - - - True - Misc - - - label_item - - - - - False - False - 2 - - - - - 1 - False - - - - - True - View - - - tab - 1 - False - False - - - - - True - - - True - Use default theme font - True - True - use_default_font - - - False - False - - - - - True - 2 - 2 - - - True - Font: - !use_default_font - - - - - - - - - True - True - True - font - !use_default_font - - - 1 - 2 - - - - - - True - 0 - Color scheme: - - - 1 - 2 - - - - - - - True - - - 1 - 2 - 1 - 2 - GTK_FILL - - - - - - False - 1 - - - - - 2 - False - - - - - True - Font and colors - - - tab - 2 - False - False - - - - - True - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - 1 - 2 - - - True - 1 - Encodings to autodetect: - - - GTK_FILL - - 3 - - - - - True - encodings - Comma-separated list of encodings to try when opening a file. 'LOCALE' means current locale encoding. - - - 1 - 2 - - - - - - - - - - True - Loading - - - label_item - - - - - False - False - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - 3 - 2 - - - True - Remove trailing spaces - True - True - strip - - - 2 - 1 - 2 - - - - - Make backups - True - True - make_backups - - - 2 - 2 - 3 - - - - - True - 1 - Encoding for new files: - - - GTK_FILL - - 3 - - - - - True - - - True - - - - - 1 - 2 - - - - - - - - - - True - Saving - - - label_item - - - - - False - False - 1 - - - - - - - - 3 - False - - - - - True - Loading and saving - - - tab - 3 - False - False - - - - - True - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - 4 - 2 - - - True - - - 1 - 2 - - - - - - True - 1 - Language: - - - GTK_FILL - - - - - - True - True - - - 1 - 2 - 2 - 3 - - - - - - True - True - - - 1 - 2 - 1 - 2 - - - - - - True - 1 - Extensions: - - - 2 - 3 - GTK_FILL - - - - - - True - 1 - Mime types: - - - 1 - 2 - GTK_FILL - - - - - - True - 1 - Options: - - - 3 - 4 - GTK_FILL - - - - - - True - True - strip: bool; use-tabs: bool; indent-width: integer; tab-width: integer - - - 1 - 2 - 3 - 4 - - - - - - - - - - True - Language-specific options - - - label_item - - - - - False - False - - - - - True - 3 - 0 - - - True - 3 - 3 - 3 - - - True - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_ETCHED_IN - - - 400 - 200 - True - True - True - False - - - - - - - True - - - True - False - - - True - gtk-new - - - - - False - False - - - - - True - False - - - True - gtk-delete - - - - - False - False - 1 - - - - - True - - - True - gtk-go-down - - - - - False - False - 2 - - - - - True - - - True - gtk-go-up - - - - - False - False - 3 - - - - - False - False - 1 - - - - - - - - - True - File filters - - - label_item - - - - - 1 - - - - - 4 - False - - - - - True - Languages and files - - - tab - 4 - False - False - - - - - - - - diff --git a/moo/mooedit/mooeditprefspage.c b/moo/mooedit/mooeditprefspage.c index f8b3eb1d..9fc9538a 100644 --- a/moo/mooedit/mooeditprefspage.c +++ b/moo/mooedit/mooeditprefspage.c @@ -15,7 +15,11 @@ #include "mooedit/mooedit-private.h" #include "mooedit/mooeditor-private.h" #include "mooedit/mooeditprefs.h" -#include "mooedit/mooeditprefs-glade.h" +#include "mooedit/mooeditprefs-general-glade.h" +#include "mooedit/mooeditprefs-view-glade.h" +#include "mooedit/mooeditprefs-font-glade.h" +#include "mooedit/mooeditprefs-file-glade.h" +#include "mooedit/mooeditprefs-langs-glade.h" #include "mooedit/moolangmgr.h" #include "mooedit/mooeditfiltersettings.h" #include "mooutils/mooprefsdialog.h" @@ -29,10 +33,14 @@ #include -static void prefs_page_init (MooPrefsDialogPage *page); -static void prefs_page_apply (MooPrefsDialogPage *page); -static void prefs_page_apply_lang_prefs (MooPrefsDialogPage *page); -static void apply_filter_settings (MooPrefsDialogPage *page); +typedef struct PrefsPage PrefsPage; + + +static void moo_edit_prefs_page_init (MooPrefsDialogPage *page); +static void moo_edit_prefs_page_apply (MooPrefsDialogPage *page); + +static void prefs_page_apply_lang_prefs (PrefsPage *page); +static void apply_filter_settings (PrefsPage *page); static void scheme_combo_init (GtkComboBox *combo, MooEditor *editor); @@ -44,12 +52,12 @@ static void scheme_combo_set_scheme (GtkComboBox *combo, MooTextStyleScheme *scheme); static void default_lang_combo_init (GtkComboBox *combo, - MooPrefsDialogPage *page); + PrefsPage *page); static void default_lang_combo_set_lang (GtkComboBox *combo, const char *id); static void lang_combo_init (GtkComboBox *combo, - MooPrefsDialogPage *page); + PrefsPage *page); static void filter_treeview_init (MooGladeXML *xml); @@ -58,52 +66,282 @@ static GtkTreeModel *create_lang_model (MooEditor *editor); static void save_encoding_combo_init (MooGladeXML *xml); static void save_encoding_combo_apply (MooGladeXML *xml); -static MooEditor *page_get_editor (MooPrefsDialogPage *page); -static GtkTreeModel *page_get_lang_model (MooPrefsDialogPage *page); -static MooTextStyleScheme *page_get_scheme (MooPrefsDialogPage *page); -static char *page_get_default_lang (MooPrefsDialogPage *page); +static GtkTreeModel *page_get_lang_model (PrefsPage *page); +static MooTextStyleScheme *page_get_scheme (PrefsPage *page); +static char *page_get_default_lang (PrefsPage *page); +static void page_font_init_xml (MooGladeXML *xml); +static void page_general_init (PrefsPage *page); +static void page_general_apply (PrefsPage *page); +static void page_font_init (PrefsPage *page); +static void page_font_apply (PrefsPage *page); +static void page_file_init (PrefsPage *page); +static void page_file_apply (PrefsPage *page); +static void page_langs_init (PrefsPage *page); +static void page_langs_apply (PrefsPage *page); + + +typedef struct { + const char *label; + const char *ui; + void (*init_xml) (MooGladeXML *xml); + void (*init) (PrefsPage *page); + void (*apply) (PrefsPage *page); +} PrefsPageInfo; + +struct PrefsPage { + MooEditor *editor; + MooLangMgr *lang_mgr; + MooPrefsDialogPage *master; + MooPrefsDialogPage *page; + gboolean initialized; + void (*init) (PrefsPage *page); + void (*apply) (PrefsPage *page); +}; + +typedef struct { + MooEditor *editor; + MooLangMgr *lang_mgr; + PrefsPage **pages; + guint n_pages; + GtkNotebook *notebook; +} PrefsPageData; + + +static void +prefs_page_data_free (PrefsPageData *data) +{ + guint i; + + for (i = 0; i < data->n_pages; ++i) + { + PrefsPage *page = data->pages[i]; + g_object_unref (page->editor); + g_object_unref (page->lang_mgr); + g_free (page); + } + + g_object_unref (data->editor); + g_object_unref (data->lang_mgr); + g_free (data->pages); + g_free (data); +} + +static void +init_page (PrefsPageData *data, + guint page_num) +{ + PrefsPage *page; + + g_return_if_fail (page_num < data->n_pages); + + page = data->pages[page_num]; + + if (!page->initialized) + { + page->initialized = TRUE; + + g_signal_emit_by_name (page->page, "init"); + + if (page->init) + page->init (page); + } +} + +static void +notebook_switch_page (G_GNUC_UNUSED GtkNotebook *notebook, + G_GNUC_UNUSED GtkNotebookPage *nb_page, + guint page_num, + MooPrefsDialogPage *prefs_page) +{ + PrefsPageData *data; + + data = g_object_get_data (G_OBJECT (prefs_page), "prefs-page-data"); + g_return_if_fail (data != NULL); + + init_page (data, page_num); +} + +static void +moo_edit_prefs_page_destroy (GtkWidget *page) +{ + PrefsPageData *data; + + data = g_object_get_data (G_OBJECT (page), "prefs-page-data"); + + if (data) + { + g_signal_handlers_disconnect_by_func (data->notebook, (gpointer) notebook_switch_page, page); + g_object_set_data (G_OBJECT (page), "prefs-page-data", NULL); + } +} GtkWidget * moo_edit_prefs_page_new (MooEditor *editor) { - MooPrefsDialogPage *page; - GtkComboBox *scheme_combo, *default_lang_combo, *lang_combo; - MooGladeXML *xml; + GtkWidget *prefs_page; + PrefsPageData *data; + guint i; + + const PrefsPageInfo prefs_pages[] = { + {N_("General"), MOO_EDIT_PREFS_GENERAL_GLADE_UI, NULL, page_general_init, page_general_apply}, + {N_("View"), MOO_EDIT_PREFS_VIEW_GLADE_UI, NULL, NULL, NULL}, + {N_("Font and colors"), MOO_EDIT_PREFS_FONT_GLADE_UI, page_font_init_xml, page_font_init, page_font_apply}, + {N_("Loading and saving"), MOO_EDIT_PREFS_FILE_GLADE_UI, NULL, page_file_init, page_file_apply}, + {N_("Languages and files"), MOO_EDIT_PREFS_LANGS_GLADE_UI, NULL, page_langs_init, page_langs_apply} + }; g_return_val_if_fail (MOO_IS_EDITOR (editor), NULL); _moo_edit_init_config (); - xml = moo_glade_xml_new_empty (GETTEXT_PACKAGE); + prefs_page = moo_prefs_dialog_page_new ("Editor", GTK_STOCK_EDIT); + + data = g_new0 (PrefsPageData, 1); + data->pages = g_new0 (PrefsPage*, G_N_ELEMENTS (prefs_pages)); + g_object_set_data_full (G_OBJECT (prefs_page), "prefs-page-data", data, + (GDestroyNotify) prefs_page_data_free); + + data->notebook = GTK_NOTEBOOK (gtk_notebook_new ()); + gtk_widget_show (GTK_WIDGET (data->notebook)); + gtk_container_add (GTK_CONTAINER (prefs_page), GTK_WIDGET (data->notebook)); + + data->editor = g_object_ref (editor); + data->lang_mgr = g_object_ref (moo_editor_get_lang_mgr (editor)); + + for (i = 0; i < G_N_ELEMENTS (prefs_pages); i++) + { + PrefsPage *page; + const PrefsPageInfo *info; + MooGladeXML *xml; + + info = &prefs_pages[i]; + page = g_new0 (PrefsPage, 1); + page->init = info->init; + page->apply = info->apply; + page->master = MOO_PREFS_DIALOG_PAGE (prefs_page); + data->pages[data->n_pages] = page; + + xml = moo_glade_xml_new_empty (GETTEXT_PACKAGE); + if (info->init_xml) + info->init_xml (xml); + page->page = moo_prefs_dialog_page_new_from_xml (NULL, NULL, + xml, + info->ui, + "page", + MOO_EDIT_PREFS_PREFIX); + g_object_unref (xml); + + gtk_notebook_append_page (data->notebook, + GTK_WIDGET (page->page), + gtk_label_new (_(info->label))); + + page->editor = g_object_ref (editor); + page->lang_mgr = g_object_ref (moo_editor_get_lang_mgr (editor)); + + data->n_pages++; + } + + g_signal_connect (data->notebook, "switch-page", G_CALLBACK (notebook_switch_page), prefs_page); + g_signal_connect (prefs_page, "init", G_CALLBACK (moo_edit_prefs_page_init), NULL); + g_signal_connect (prefs_page, "apply", G_CALLBACK (moo_edit_prefs_page_apply), NULL); + g_signal_connect (prefs_page, "destroy", G_CALLBACK (moo_edit_prefs_page_destroy), NULL); + + return prefs_page; +} + + +static void +page_font_init_xml (MooGladeXML *xml) +{ moo_glade_xml_map_id (xml, "fontbutton", MOO_TYPE_FONT_BUTTON); moo_glade_xml_set_property (xml, "fontbutton", "monospace", "True"); - page = moo_prefs_dialog_page_new_from_xml ("Editor", GTK_STOCK_EDIT, xml, - MOO_EDIT_PREFS_GLADE_UI, "page", - MOO_EDIT_PREFS_PREFIX); - g_object_unref (xml); +} - g_object_set_data_full (G_OBJECT (page), "moo-editor", - g_object_ref (editor), g_object_unref); - g_object_set_data_full (G_OBJECT (page), "moo-lang-mgr", - g_object_ref (moo_editor_get_lang_mgr (editor)), - g_object_unref); - g_signal_connect (page, "init", G_CALLBACK (prefs_page_init), NULL); - g_signal_connect (page, "apply", G_CALLBACK (prefs_page_apply), NULL); +static void +page_general_init (PrefsPage *page) +{ + GtkComboBox *default_lang_combo; + const char *lang; - scheme_combo = moo_glade_xml_get_widget (page->xml, "color_scheme_combo"); - scheme_combo_init (scheme_combo, editor); - default_lang_combo = moo_glade_xml_get_widget (page->xml, "default_lang_combo"); + default_lang_combo = moo_glade_xml_get_widget (page->page->xml, "default_lang_combo"); default_lang_combo_init (default_lang_combo, page); - lang_combo = moo_glade_xml_get_widget (page->xml, "lang_combo"); + + lang = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG)); + default_lang_combo_set_lang (default_lang_combo, lang); +} + +static void +page_general_apply (PrefsPage *page) +{ + char *lang = page_get_default_lang (page); + moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG), lang); + g_free (lang); +} + + +static void +page_font_init (PrefsPage *page) +{ + MooTextStyleScheme *scheme; + GtkComboBox *scheme_combo; + + scheme = moo_lang_mgr_get_active_scheme (page->lang_mgr); + g_return_if_fail (scheme != NULL); + + scheme_combo = moo_glade_xml_get_widget (page->page->xml, "color_scheme_combo"); + scheme_combo_init (scheme_combo, page->editor); + + scheme_combo_set_scheme (scheme_combo, scheme); +} + +static void +page_font_apply (PrefsPage *page) +{ + MooTextStyleScheme *scheme; + + scheme = page_get_scheme (page); + g_return_if_fail (scheme != NULL); + moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_COLOR_SCHEME), + moo_text_style_scheme_get_id (scheme)); + g_object_unref (scheme); +} + + +static void +page_file_init (PrefsPage *page) +{ + save_encoding_combo_init (page->page->xml); +} + +static void +page_file_apply (PrefsPage *page) +{ + save_encoding_combo_apply (page->page->xml); +} + + +static void +page_langs_init (PrefsPage *page) +{ + GtkComboBox *lang_combo; + MooTreeHelper *helper; + + lang_combo = moo_glade_xml_get_widget (page->page->xml, "lang_combo"); lang_combo_init (lang_combo, page); - filter_treeview_init (page->xml); + filter_treeview_init (page->page->xml); - save_encoding_combo_init (page->xml); + helper = g_object_get_data (G_OBJECT (page->page), "moo-tree-helper"); + _moo_tree_helper_update_widgets (helper); +} - return GTK_WIDGET (page); +static void +page_langs_apply (PrefsPage *page) +{ + prefs_page_apply_lang_prefs (page); + apply_filter_settings (page); } @@ -159,50 +397,63 @@ scheme_combo_data_func (G_GNUC_UNUSED GtkCellLayout *layout, static void -prefs_page_init (MooPrefsDialogPage *page) +moo_edit_prefs_page_init (MooPrefsDialogPage *page) { - MooEditor *editor; - MooLangMgr *mgr; - MooTextStyleScheme *scheme; - GtkComboBox *scheme_combo, *default_lang_combo; - MooTreeHelper *helper; - const char *lang; + PrefsPageData *data; + int current_page; - editor = page_get_editor (page); - mgr = moo_editor_get_lang_mgr (editor); - scheme = moo_lang_mgr_get_active_scheme (mgr); - g_return_if_fail (scheme != NULL); + data = g_object_get_data (G_OBJECT (page), "prefs-page-data"); + g_return_if_fail (data != NULL); - scheme_combo = moo_glade_xml_get_widget (page->xml, "color_scheme_combo"); - scheme_combo_set_scheme (scheme_combo, scheme); + current_page = gtk_notebook_get_current_page (data->notebook); + init_page (data, current_page); - default_lang_combo = moo_glade_xml_get_widget (page->xml, "default_lang_combo"); - lang = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG)); - default_lang_combo_set_lang (default_lang_combo, lang); - - helper = g_object_get_data (G_OBJECT (page), "moo-tree-helper"); - _moo_tree_helper_update_widgets (helper); -} - - -static MooEditor* -page_get_editor (MooPrefsDialogPage *page) -{ - return g_object_get_data (G_OBJECT (page), "moo-editor"); +// MooEditor *editor; +// MooLangMgr *mgr; +// MooTextStyleScheme *scheme; +// GtkComboBox *scheme_combo, *default_lang_combo, *lang_combo; +// MooTreeHelper *helper; +// const char *lang; +// +// editor = page_get_editor (page); +// mgr = moo_editor_get_lang_mgr (editor); +// scheme = moo_lang_mgr_get_active_scheme (mgr); +// g_return_if_fail (scheme != NULL); +// +// scheme_combo = moo_glade_xml_get_widget (page->xml, "color_scheme_combo"); +// scheme_combo_init (scheme_combo, editor); +// default_lang_combo = moo_glade_xml_get_widget (page->xml, "default_lang_combo"); +// default_lang_combo_init (default_lang_combo, page); +// lang_combo = moo_glade_xml_get_widget (page->xml, "lang_combo"); +// lang_combo_init (lang_combo, page); +// +// filter_treeview_init (page->xml); +// +// save_encoding_combo_init (page->xml); +// +// scheme_combo = moo_glade_xml_get_widget (page->xml, "color_scheme_combo"); +// scheme_combo_set_scheme (scheme_combo, scheme); +// +// default_lang_combo = moo_glade_xml_get_widget (page->xml, "default_lang_combo"); +// lang = moo_prefs_get_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG)); +// default_lang_combo_set_lang (default_lang_combo, lang); +// +// helper = g_object_get_data (G_OBJECT (page), "moo-tree-helper"); +// _moo_tree_helper_update_widgets (helper); } static GtkTreeModel * -page_get_lang_model (MooPrefsDialogPage *page) +page_get_lang_model (PrefsPage *page) { GtkTreeModel *model; - model = g_object_get_data (G_OBJECT (page), "moo-lang-model"); + model = g_object_get_data (G_OBJECT (page->master), "moo-lang-model"); if (!model) { - model = create_lang_model (page_get_editor (page)); - g_object_set_data_full (G_OBJECT (page), "moo-lang-model", + model = create_lang_model (page->editor); + g_object_set_data_full (G_OBJECT (page->master), "moo-lang-model", model, g_object_unref); } @@ -238,14 +489,14 @@ scheme_combo_set_scheme (GtkComboBox *combo, static MooTextStyleScheme * -page_get_scheme (MooPrefsDialogPage *page) +page_get_scheme (PrefsPage *page) { GtkTreeModel *model; GtkTreeIter iter; MooTextStyleScheme *scheme = NULL; GtkComboBox *combo; - combo = moo_glade_xml_get_widget (page->xml, "color_scheme_combo"); + combo = moo_glade_xml_get_widget (page->page->xml, "color_scheme_combo"); g_return_val_if_fail (combo != NULL, NULL); if (!gtk_combo_box_get_active_iter (combo, &iter)) @@ -262,30 +513,47 @@ page_get_scheme (MooPrefsDialogPage *page) static void -prefs_page_apply (MooPrefsDialogPage *page) +moo_edit_prefs_page_apply (MooPrefsDialogPage *page) { - MooTextStyleScheme *scheme; - char *lang; - MooEditor *editor; + PrefsPageData *data; + guint i; - editor = page_get_editor (page); - g_return_if_fail (editor != NULL); + data = g_object_get_data (G_OBJECT (page), "prefs-page-data"); + g_return_if_fail (data != NULL); - scheme = page_get_scheme (page); - g_return_if_fail (scheme != NULL); - moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_COLOR_SCHEME), - moo_text_style_scheme_get_id (scheme)); - g_object_unref (scheme); + for (i = 0; i < data->n_pages; ++i) + { + PrefsPage *prefs_page = data->pages[i]; - lang = page_get_default_lang (page); - moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG), lang); - g_free (lang); + if (prefs_page->initialized) + { + g_signal_emit_by_name (prefs_page->page, "apply"); - save_encoding_combo_apply (page->xml); + if (prefs_page->apply) + prefs_page->apply (prefs_page); + } + } - prefs_page_apply_lang_prefs (page); - apply_filter_settings (page); - moo_editor_apply_prefs (editor); + moo_editor_apply_prefs (data->editor); + +// editor = page_get_editor (page); +// g_return_if_fail (editor != NULL); +// +// scheme = page_get_scheme (page); +// g_return_if_fail (scheme != NULL); +// moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_COLOR_SCHEME), +// moo_text_style_scheme_get_id (scheme)); +// g_object_unref (scheme); +// +// lang = page_get_default_lang (page); +// moo_prefs_set_string (moo_edit_setting (MOO_EDIT_PREFS_DEFAULT_LANG), lang); +// g_free (lang); +// +// save_encoding_combo_apply (page->xml); +// +// prefs_page_apply_lang_prefs (page); +// apply_filter_settings (page); +// moo_editor_apply_prefs (editor); } @@ -468,8 +736,8 @@ set_sensitive (G_GNUC_UNUSED GtkCellLayout *cell_layout, } static void -default_lang_combo_init (GtkComboBox *combo, - MooPrefsDialogPage *page) +default_lang_combo_init (GtkComboBox *combo, + PrefsPage *page) { GtkTreeModel *model; GtkCellRenderer *cell; @@ -548,14 +816,14 @@ default_lang_combo_set_lang (GtkComboBox *combo, static char * -page_get_default_lang (MooPrefsDialogPage *page) +page_get_default_lang (PrefsPage *page) { GtkTreeModel *model; GtkTreeIter iter; char *lang = NULL; GtkComboBox *combo; - combo = moo_glade_xml_get_widget (page->xml, "default_lang_combo"); + combo = moo_glade_xml_get_widget (page->page->xml, "default_lang_combo"); g_return_val_if_fail (combo != NULL, NULL); if (!gtk_combo_box_get_active_iter (combo, &iter)) @@ -576,7 +844,7 @@ page_get_default_lang (MooPrefsDialogPage *page) */ static void -helper_update_widgets (MooPrefsDialogPage *page, +helper_update_widgets (PrefsPage *page, GtkTreeModel *model, G_GNUC_UNUSED GtkTreePath *path, GtkTreeIter *iter) @@ -588,10 +856,10 @@ helper_update_widgets (MooPrefsDialogPage *page, g_return_if_fail (iter != NULL); - extensions = moo_glade_xml_get_widget (page->xml, "extensions"); - mimetypes = moo_glade_xml_get_widget (page->xml, "mimetypes"); - label_mimetypes = moo_glade_xml_get_widget (page->xml, "label_mimetypes"); - config = moo_glade_xml_get_widget (page->xml, "config"); + extensions = moo_glade_xml_get_widget (page->page->xml, "extensions"); + mimetypes = moo_glade_xml_get_widget (page->page->xml, "mimetypes"); + label_mimetypes = moo_glade_xml_get_widget (page->page->xml, "label_mimetypes"); + config = moo_glade_xml_get_widget (page->page->xml, "config"); gtk_tree_model_get (model, iter, COLUMN_LANG, &lang, @@ -619,7 +887,7 @@ helper_update_widgets (MooPrefsDialogPage *page, static void -helper_update_model (MooPrefsDialogPage *page, +helper_update_model (PrefsPage *page, GtkTreeModel *model, G_GNUC_UNUSED GtkTreePath *path, GtkTreeIter *iter) @@ -627,11 +895,11 @@ helper_update_model (MooPrefsDialogPage *page, GtkEntry *extensions, *mimetypes, *config; const char *ext, *mime, *conf; - extensions = moo_glade_xml_get_widget (page->xml, "extensions"); + extensions = moo_glade_xml_get_widget (page->page->xml, "extensions"); ext = gtk_entry_get_text (extensions); - mimetypes = moo_glade_xml_get_widget (page->xml, "mimetypes"); + mimetypes = moo_glade_xml_get_widget (page->page->xml, "mimetypes"); mime = gtk_entry_get_text (mimetypes); - config = moo_glade_xml_get_widget (page->xml, "config"); + config = moo_glade_xml_get_widget (page->page->xml, "config"); conf = gtk_entry_get_text (config); gtk_tree_store_set (GTK_TREE_STORE (model), iter, @@ -642,8 +910,8 @@ helper_update_model (MooPrefsDialogPage *page, static void -lang_combo_init (GtkComboBox *combo, - MooPrefsDialogPage *page) +lang_combo_init (GtkComboBox *combo, + PrefsPage *page) { GtkTreeModel *model; GtkCellRenderer *cell; @@ -668,7 +936,7 @@ lang_combo_init (GtkComboBox *combo, helper = _moo_tree_helper_new (GTK_WIDGET (combo), NULL, NULL, NULL, NULL); g_return_if_fail (helper != NULL); - g_object_set_data_full (G_OBJECT (page), "moo-tree-helper", + g_object_set_data_full (G_OBJECT (page->page), "moo-tree-helper", helper, g_object_unref); g_signal_connect_swapped (helper, "update-widgets", G_CALLBACK (helper_update_widgets), page); @@ -716,19 +984,19 @@ apply_one_lang (GtkTreeModel *model, static void -prefs_page_apply_lang_prefs (MooPrefsDialogPage *page) +prefs_page_apply_lang_prefs (PrefsPage *page) { GtkTreeModel *model; MooTreeHelper *helper; MooLangMgr *mgr; - helper = g_object_get_data (G_OBJECT (page), "moo-tree-helper"); + helper = g_object_get_data (G_OBJECT (page->page), "moo-tree-helper"); _moo_tree_helper_update_model (helper, NULL, NULL); model = page_get_lang_model (page); g_return_if_fail (model != NULL); - mgr = moo_editor_get_lang_mgr (page_get_editor (page)); + mgr = moo_editor_get_lang_mgr (page->editor); gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc) apply_one_lang, mgr); _moo_lang_mgr_save_config (mgr); _moo_edit_update_lang_config (); @@ -899,13 +1167,13 @@ prepend_filter_and_config (GtkTreeModel *model, } static void -apply_filter_settings (MooPrefsDialogPage *page) +apply_filter_settings (PrefsPage *page) { GtkTreeView *filter_treeview; GSList *strings = NULL; GtkTreeModel *model; - filter_treeview = moo_glade_xml_get_widget (page->xml, "filter_treeview"); + filter_treeview = moo_glade_xml_get_widget (page->page->xml, "filter_treeview"); g_return_if_fail (filter_treeview != NULL); model = gtk_tree_view_get_model (filter_treeview); diff --git a/moo/mooutils/mooprefsdialog.c b/moo/mooutils/mooprefsdialog.c index 7e8bd7bd..87c11c4a 100644 --- a/moo/mooutils/mooprefsdialog.c +++ b/moo/mooutils/mooprefsdialog.c @@ -38,13 +38,13 @@ static void moo_prefs_dialog_destroy (GtkObject *object); static void moo_prefs_dialog_response (GtkDialog *dialog, int response); -static void moo_prefs_dialog_init_sig (MooPrefsDialog *dialog); static void moo_prefs_dialog_apply (MooPrefsDialog *dialog); static void setup_pages_list (MooPrefsDialog *dialog); static void pages_list_selection_changed (MooPrefsDialog *dialog, GtkTreeSelection *selection); +static void init_page (MooPrefsDialogPage *page); enum { @@ -77,7 +77,6 @@ static void moo_prefs_dialog_class_init (MooPrefsDialogClass *klass) gtkobject_class->destroy = moo_prefs_dialog_destroy; dialog_class->response = moo_prefs_dialog_response; - klass->init = moo_prefs_dialog_init_sig; klass->apply = moo_prefs_dialog_apply; g_object_class_install_property (gobject_class, @@ -249,6 +248,9 @@ pages_list_selection_changed (MooPrefsDialog *dialog, MooPrefsDialogPage *page = NULL; gtk_tree_model_get (model, &iter, PAGE_COLUMN, &page, -1); g_return_if_fail (page != NULL); + + init_page (page); + gtk_notebook_set_current_page (dialog->notebook, gtk_notebook_page_num (dialog->notebook, GTK_WIDGET (page))); g_object_unref (page); @@ -265,6 +267,24 @@ pages_list_selection_changed (MooPrefsDialog *dialog, } +static gboolean +page_initialized (MooPrefsDialogPage *page) +{ + return g_object_get_data (G_OBJECT (page), "moo-prefs-dialog-page-initialized") != NULL; +} + +static void +init_page (MooPrefsDialogPage *page) +{ + if (!g_object_get_data (G_OBJECT (page), "moo-prefs-dialog-page-initialized")) + { + g_object_set_data (G_OBJECT (page), "moo-prefs-dialog-page-initialized", + GINT_TO_POINTER (1)); + g_signal_emit_by_name (page, "init"); + } +} + + static void moo_prefs_dialog_set_property (GObject *object, guint prop_id, @@ -372,20 +392,6 @@ get_nth_page (MooPrefsDialog *dialog, } -static void -moo_prefs_dialog_init_sig (MooPrefsDialog *dialog) -{ - int n, i; - - g_return_if_fail (MOO_IS_PREFS_DIALOG (dialog)); - - n = get_n_pages (dialog); - - for (i = 0; i < n; ++i) - g_signal_emit_by_name (get_nth_page (dialog, i), "init"); -} - - static void moo_prefs_dialog_apply (MooPrefsDialog *dialog) { @@ -408,8 +414,10 @@ moo_prefs_dialog_apply (MooPrefsDialog *dialog) { MooPrefsDialogPage *page = list->data; - if (!(GTK_OBJECT_FLAGS (page) & GTK_IN_DESTRUCTION) && page->auto_apply) - g_signal_emit_by_name (page, "apply"); + if (!(GTK_OBJECT_FLAGS (page) & GTK_IN_DESTRUCTION) && + page->auto_apply && + page_initialized (page)) + g_signal_emit_by_name (page, "apply"); g_object_unref (page); list = g_slist_delete_link (list, list);