[dasher] Create module settings dialogues only when required
- From: Patrick Welche <pwelche src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dasher] Create module settings dialogues only when required
- Date: Tue, 18 Jan 2011 17:19:41 +0000 (UTC)
commit 919a6b2f0c1665169d4dca1246ce2b03dd37710b
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date: Thu Dec 30 22:39:49 2010 +0000
Create module settings dialogues only when required
=> controls show param-values at dialog display time, rather than app startup
tidy gtk_list_store, removing mutable ref to dialogue for current filter (!)
TODO ModuleSettingsWindow objects need to be killed after dialog is closed.
Src/Gtk2/Preferences.cpp | 88 ++++++++++++++++++-----------------
Src/Gtk2/module_settings_window.cpp | 5 ++-
2 files changed, 49 insertions(+), 44 deletions(-)
---
diff --git a/Src/Gtk2/Preferences.cpp b/Src/Gtk2/Preferences.cpp
index abba068..1410ef7 100644
--- a/Src/Gtk2/Preferences.cpp
+++ b/Src/Gtk2/Preferences.cpp
@@ -123,7 +123,6 @@ static void dasher_preferences_dialogue_class_init(DasherPreferencesDialogueClas
static void dasher_preferences_dialogue_init(DasherPreferencesDialogue *pMain);
static void dasher_preferences_dialogue_destroy(GObject *pObject);
-static GtkWidget *dasher_preferences_dialogue_get_helper(DasherPreferencesDialogue *pSelf, int iParameter, const gchar *szValue);
static void dasher_preferences_dialogue_initialise_tables(DasherPreferencesDialogue *pSelf);
static void dasher_preferences_dialogue_refresh_widget(DasherPreferencesDialogue *pSelf, gint iParameter);
static void dasher_preferences_dialogue_populate_list(DasherPreferencesDialogue *pSelf, GtkTreeView *pView, int iParameter, GtkWidget *pHelper);
@@ -420,17 +419,18 @@ extern "C" void outline_button_toggled(GtkWidget *widget, gpointer user_data) {
}
// --- Generic string options ---
-
+//pHelper, if provided, is a button to open a module settings dialog
+// for parameters specific to the item selected in the list (i.e. GtkTreeView), if any.
void dasher_preferences_dialogue_populate_list(DasherPreferencesDialogue *pSelf, GtkTreeView *pView, int iParameter, GtkWidget *pHelper) {
DasherPreferencesDialoguePrivate *pPrivate = DASHER_PREFERENCES_DIALOGUE_PRIVATE(pSelf);
- // TODO: Need to kill helpers on list depopulation
-
const gchar *szCurrentValue(dasher_app_settings_get_string(pPrivate->pAppSettings, iParameter));
GArray *pFilterArray = dasher_app_settings_get_allowed_values(pPrivate->pAppSettings, iParameter);
- GtkListStore *pStore = gtk_list_store_new(6, G_TYPE_INT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
+ //for each item in the list: the dasher Parameters.h number (i.e. same for all items); the "helper" button (as above, also the same for all items);
+ // the text to display (and perhaps pass to SetStringParameter).
+ GtkListStore *pStore = gtk_list_store_new(3, G_TYPE_INT, G_TYPE_POINTER, G_TYPE_STRING);
gtk_tree_view_set_model(pView, GTK_TREE_MODEL(pStore));
GtkCellRenderer *pRenderer;
@@ -441,10 +441,10 @@ void dasher_preferences_dialogue_populate_list(DasherPreferencesDialogue *pSelf,
gtk_tree_view_append_column(pView, pColumn);
GtkTreeIter oIter;
- // GtkTreeIter oSelectedIter;
+ //doing this before we add the items, means the callback will be invoked when we set
+ // the selection (below), which'll enable/disable the pHelper button appropriately
GtkTreeSelection *pSelection = gtk_tree_view_get_selection(pView);
-
- GtkWidget **pHelperWindowRef = new GtkWidget *;
+ g_signal_connect(pSelection, "changed", (GCallback)on_list_selection, 0);
for(unsigned int i(0); i < pFilterArray->len; ++i) {
const gchar *szCurrentFilter = g_array_index(pFilterArray, gchar *, i);
@@ -452,30 +452,19 @@ void dasher_preferences_dialogue_populate_list(DasherPreferencesDialogue *pSelf,
strcpy(szName, szCurrentFilter);
gtk_list_store_append(pStore, &oIter);
- GtkWidget *pHelperWindow;
-
- if(pHelper) {
- pHelperWindow = dasher_preferences_dialogue_get_helper(pSelf, iParameter, szName);
- g_signal_connect(G_OBJECT(pHelper), "clicked", G_CALLBACK(show_helper_window), pHelperWindowRef);
- }
- else
- pHelperWindow = NULL;
-
- // This is potentially horrible - maybe rethink in the future;
- gtk_list_store_set(pStore, &oIter, 0, iParameter, 1, pHelper, 2, szName, 3, szName, 4, pHelperWindow, 5, pHelperWindowRef, -1);
+
+ gtk_list_store_set(pStore, &oIter, 0, iParameter, 1, pHelper, 2, szName, -1);
delete[] szName;
if(!strcmp(szCurrentFilter, szCurrentValue)) {
gtk_tree_selection_select_iter(pSelection, &oIter);
- if(pHelper) {
- gtk_widget_set_sensitive(GTK_WIDGET(pHelper), pHelperWindow != NULL);
- *pHelperWindowRef = pHelperWindow;
- }
}
}
- g_signal_connect(pSelection, "changed", (GCallback)on_list_selection, 0);
+ if(pHelper) {
+ g_signal_connect(G_OBJECT(pHelper), "clicked", G_CALLBACK(show_helper_window), pView);
+ }
}
// TODO: In class
@@ -489,31 +478,21 @@ extern "C" void on_list_selection(GtkTreeSelection *pSelection, gpointer pUserDa
if(gtk_tree_selection_get_selected(pSelection, &pModel, &oIter)) {
int iParameter;
gpointer pHelper;
- gpointer pHelperWindow;
- gpointer pHelperWindowRef;
gchar *szValue;
- gtk_tree_model_get(pModel, &oIter, 0, &iParameter, 1, &pHelper, 2, &szValue, 4, &pHelperWindow, 5, &pHelperWindowRef, -1);
+ gtk_tree_model_get(pModel, &oIter, 0, &iParameter, 1, &pHelper, 2, &szValue, -1);
dasher_app_settings_set_string(pPrivate->pAppSettings, iParameter, szValue);
- g_free(szValue);
if(pHelper) {
- gtk_widget_set_sensitive(GTK_WIDGET(pHelper), pHelperWindow != NULL);
- *((GtkWidget **)pHelperWindowRef) = (GtkWidget *)pHelperWindow;
+ //check if input filter/device has any settings...
+ SModuleSettings *pSettings;
+ int iCount;
+ bool bHasSettings = dasher_app_settings_get_module_settings(pPrivate->pAppSettings, szValue, &pSettings, &iCount);
+ gtk_widget_set_sensitive(GTK_WIDGET(pHelper), bHasSettings);
}
- }
-}
-GtkWidget *dasher_preferences_dialogue_get_helper(DasherPreferencesDialogue *pSelf, int iParameter, const gchar *szValue) {
- DasherPreferencesDialoguePrivate *pPrivate = DASHER_PREFERENCES_DIALOGUE_PRIVATE(pSelf);
-
- SModuleSettings *pSettings;
- int iCount;
-
- if(!dasher_app_settings_get_module_settings(pPrivate->pAppSettings, szValue, &pSettings, &iCount))
- return NULL;
-
- return module_settings_window_new(pPrivate->pAppSettings, szValue, pSettings, iCount);
+ g_free(szValue);
+ }
}
// --- Special Cases ---
@@ -941,7 +920,30 @@ extern "C" void uniform_changed(GtkHScale *hscale) {
}
extern "C" gboolean show_helper_window(GtkWidget *pWidget, gpointer *pUserData) {
- gtk_window_present(GTK_WINDOW(*pUserData));
+ DasherPreferencesDialoguePrivate *pPrivate = DASHER_PREFERENCES_DIALOGUE_PRIVATE(g_pPreferencesDialogue);
+ GtkTreeView *pView = GTK_TREE_VIEW(pUserData);
+ GtkTreeSelection *pSelection = gtk_tree_view_get_selection(pView);
+
+ GtkTreeIter oIter;
+ GtkTreeModel *pModel;
+
+ if(!gtk_tree_selection_get_selected(pSelection, &pModel, &oIter))
+ DASHER_ASSERT(false); //button should not be sensitive if nothing selected
+
+ int iParameter;
+ gchar *szValue;
+ gtk_tree_model_get(pModel, &oIter, 0, &iParameter, 2, &szValue, -1);
+
+ SModuleSettings *pSettings;
+ int iCount;
+ if (!dasher_app_settings_get_module_settings(pPrivate->pAppSettings, szValue, &pSettings, &iCount))
+ DASHER_ASSERT(false); //button should only be sensitive if item has settings
+
+ GtkWidget *pWindow = module_settings_window_new(pPrivate->pAppSettings, szValue, pSettings, iCount);
+ g_free(szValue);
+
+ gtk_window_present(GTK_WINDOW(pWindow));
+
return FALSE;
}
diff --git a/Src/Gtk2/module_settings_window.cpp b/Src/Gtk2/module_settings_window.cpp
index bc42ac4..dfc6eff 100644
--- a/Src/Gtk2/module_settings_window.cpp
+++ b/Src/Gtk2/module_settings_window.cpp
@@ -263,7 +263,10 @@ module_settings_window_handle_string_changed(ModuleSettingsWindow *pSelf, GtkEdi
static gboolean
module_settings_window_handle_close(ModuleSettingsWindow *pSelf) {
- gtk_widget_hide(GTK_WIDGET(&(pSelf->window)));
+ gtk_widget_destroy(GTK_WIDGET(&(pSelf->window)));
+ //TODO what do we need to do to free/unref the ModuleSettingsWindow object?
+ // gtk_object_unref(GTK_OBJECT(pSelf)); prints error/diagnostics that the pointer is not a GtkObject (?!)
+ // trying to "delete pSelf;" aborts immediately...?
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]