Rename to fbui_real_sensitize_items. Now we queue a change and set up a

2001-08-21  Peter Williams  <peterw@ximian.com>

	* folder-browser-ui.c (fbui_sensitize_items): Rename to
	fbui_real_sensitize_items. Now we queue a change and set up a timeout,
	making sure weed out redundant changes, fixing flicker.
	(fbui_sensitize_timeout): New function. The timeout.
	(fbui_real_sensitize_items): Semi-new function. Rename of old
	fbui_sensitize_items.
	(folder_browser_ui_set_selection_state): Pass the FB instead of only
	the UIC to sensitize_items.
	(folder_browser_ui_message_loaded): Same.

	* folder-browser.c (folder_browser_destroy): Kill the new timeout if
	it is registered.

	* folder-browser.h: Add some members to FolderBrowser for keeping
	track of the queue of changes.

svn path=/trunk/; revision=12343
This commit is contained in:
Peter Williams
2001-08-21 16:00:41 +00:00
committed by Peter Williams
parent 6ddfda7a02
commit ee5591ab84
4 changed files with 90 additions and 11 deletions

View File

@ -1,3 +1,21 @@
2001-08-21 Peter Williams <peterw@ximian.com>
* folder-browser-ui.c (fbui_sensitize_items): Rename to
fbui_real_sensitize_items. Now we queue a change and set up a timeout,
making sure weed out redundant changes, fixing flicker.
(fbui_sensitize_timeout): New function. The timeout.
(fbui_real_sensitize_items): Semi-new function. Rename of old
fbui_sensitize_items.
(folder_browser_ui_set_selection_state): Pass the FB instead of only
the UIC to sensitize_items.
(folder_browser_ui_message_loaded): Same.
* folder-browser.c (folder_browser_destroy): Kill the new timeout if
it is registered.
* folder-browser.h: Add some members to FolderBrowser for keeping
track of the queue of changes.
2001-08-20 Iain Holmes <iain@ximian.com>
* mail-config.druid: Fix the jumping around.

View File

@ -399,8 +399,13 @@ folder_browser_ui_rm_all (FolderBrowser *fb)
bonobo_ui_component_unset_container (uic);
}
struct sensitize_data {
const char **items;
gboolean enable;
};
static void
fbui_sensitize_items (BonoboUIComponent *uic, const char **items, gboolean enable)
fbui_real_sensitize_items (BonoboUIComponent *uic, const char **items, gboolean enable)
{
int i;
char name_buf[256]; /* this should really be large enough */
@ -417,6 +422,59 @@ fbui_sensitize_items (BonoboUIComponent *uic, const char **items, gboolean enabl
}
}
static gboolean
fbui_sensitize_timeout (gpointer data)
{
FolderBrowser *fb = FOLDER_BROWSER (data);
BonoboUIComponent *uic = fb->uicomp;
GSList *iter;
struct sensitize_data *sd;
for (iter = fb->sensitize_changes; iter; iter = iter->next) {
sd = (struct sensitize_data *) iter->data;
fbui_real_sensitize_items (uic, sd->items, sd->enable);
g_free (sd);
}
g_slist_free (fb->sensitize_changes);
fb->sensitize_changes = NULL;
fb->sensitize_timeout_id = 0;
return FALSE;
}
static void
fbui_sensitize_items (FolderBrowser *fb, const char **items, gboolean enable)
{
struct sensitize_data *sd;
GSList *iter;
/* If we're already updating these items, save an update by
* changing the item in the list. */
for (iter = fb->sensitize_changes; iter; iter = iter->next) {
sd = (struct sensitize_data *) iter->data;
if (sd->items == items)
break;
}
if (iter == NULL) {
sd = g_new (struct sensitize_data, 1);
sd->items = items;
sd->enable = enable;
fb->sensitize_changes = g_slist_prepend (fb->sensitize_changes, sd);
} else {
/* Redundant, but shuts up the compiler. */
sd = (struct sensitize_data *) iter->data;
sd->enable = enable;
}
if (fb->sensitize_timeout_id == 0)
fb->sensitize_timeout_id = g_timeout_add (90, fbui_sensitize_timeout, fb);
}
static const char *message_pane_enables[] = {
/* these only work if there's a message in the message pane
* (preview pane). This state is independent of how many are
@ -430,8 +488,6 @@ static const char *message_pane_enables[] = {
void
folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelectionState state)
{
BonoboUIComponent *uic = fb->uicomp;
/* We'd like to keep the number of changes to be minimal cause
* this is a lot of corba traffic. So we break these sets of commands into bits:
*
@ -484,21 +540,21 @@ folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelection
switch (state) {
case FB_SELSTATE_NONE:
fbui_sensitize_items (uic, none_disables, FALSE);
fbui_sensitize_items (fb, none_disables, FALSE);
if (fb->selection_state != FB_SELSTATE_MULTIPLE)
fbui_sensitize_items (uic, multiple_disables, FALSE);
fbui_sensitize_items (fb, multiple_disables, FALSE);
break;
case FB_SELSTATE_SINGLE:
if (fb->selection_state != FB_SELSTATE_UNDEFINED)
fbui_sensitize_items (uic, multiple_disables, TRUE);
fbui_sensitize_items (fb, multiple_disables, TRUE);
if (fb->selection_state == FB_SELSTATE_NONE)
fbui_sensitize_items (uic, none_disables, TRUE);
fbui_sensitize_items (fb, none_disables, TRUE);
break;
case FB_SELSTATE_MULTIPLE:
if (fb->selection_state == FB_SELSTATE_NONE)
fbui_sensitize_items (uic, none_disables, TRUE);
fbui_sensitize_items (fb, none_disables, TRUE);
else
fbui_sensitize_items (uic, multiple_disables, FALSE);
fbui_sensitize_items (fb, multiple_disables, FALSE);
break;
case FB_SELSTATE_UNDEFINED:
printf ("changing to undefined selection state? hah!\n");
@ -506,7 +562,7 @@ folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelection
}
if (fb->loaded_uid == NULL)
fbui_sensitize_items (uic, message_pane_enables, FALSE);
fbui_sensitize_items (fb, message_pane_enables, FALSE);
fb->selection_state = state;
}
@ -517,5 +573,5 @@ folder_browser_ui_message_loaded (FolderBrowser *fb)
BonoboUIComponent *uic = fb->uicomp;
if (fb->loaded_uid == NULL && uic)
fbui_sensitize_items (uic, message_pane_enables, TRUE);
fbui_sensitize_items (fb, message_pane_enables, TRUE);
}

View File

@ -117,6 +117,9 @@ folder_browser_destroy (GtkObject *object)
if (folder_browser->search_full)
gtk_object_unref (GTK_OBJECT (folder_browser->search_full));
if (folder_browser->sensitize_timeout_id)
g_source_remove (folder_browser->sensitize_timeout_id);
if (folder_browser->shell != CORBA_OBJECT_NIL)
CORBA_Object_release (folder_browser->shell, &ev);

View File

@ -71,6 +71,8 @@ struct _FolderBrowser {
gboolean pref_master;
FolderBrowserSelectionState selection_state;
GSList *sensitize_changes;
int sensitize_timeout_id;
/* View collection and the menu handler object */
GalViewCollection *view_collection;