app: Session manage multi-column dock windows

Introduce GimpSessionInfoDock and session manage multi-column dock
windows. We are still backwards compatible with sessionrc, the only
difference is that a "session-info" entry now can have multiple "dock"
entries.

Also make ond dock window multi-column in the regression test
app/tests/test-session-management.c and adjust positions and image
selection menus a bit.
This commit is contained in:
Martin Nordholts 2009-12-06 14:49:13 +01:00
parent bfd91ebdb7
commit 34ad9dad1a
6 changed files with 150 additions and 69 deletions

View File

@ -6,11 +6,11 @@
# you quit GIMP. If this file isn't found, defaults are used. # you quit GIMP. If this file isn't found, defaults are used.
(session-info "dock" "dock" (session-info "dock" "dock"
(position 428 198) (position 566 171)
(size 210 523) (size 210 535)
(open-on-exit) (open-on-exit)
(aux-info (aux-info
(show-image-menu "true") (show-image-menu "false")
(follow-active-image "true")) (follow-active-image "true"))
(dock (dock
(book (book
@ -21,13 +21,13 @@
(dockable "gimp-undo-history" (dockable "gimp-undo-history"
(tab-style icon))) (tab-style icon)))
(book (book
(position 259) (position 289)
(current-page 0) (current-page 0)
(dockable "gimp-brush-grid" (dockable "gimp-brush-grid"
(tab-style preview))))) (tab-style preview)))))
(session-info "dock" "dock" (session-info "dock" "dock"
(position 184 358) (position 141 291)
(size 200 300) (size 406 300)
(open-on-exit) (open-on-exit)
(aux-info (aux-info
(show-image-menu "false") (show-image-menu "false")
@ -36,9 +36,14 @@
(book (book
(current-page 0) (current-page 0)
(dockable "gimp-tool-options" (dockable "gimp-tool-options"
(tab-style icon))))
(dock
(book
(current-page 0)
(dockable "gimp-device-status"
(tab-style icon))))) (tab-style icon)))))
(session-info "dock" "dock" (session-info "dock" "dock"
(position 769 64) (position 795 43)
(size 200 265) (size 200 265)
(open-on-exit) (open-on-exit)
(aux-info (aux-info
@ -52,8 +57,8 @@
(dockable "gimp-gradient-list" (dockable "gimp-gradient-list"
(tab-style preview))))) (tab-style preview)))))
(session-info "dock" "dock" (session-info "dock" "dock"
(position 714 320) (position 803 344)
(size 200 401) (size 200 404)
(open-on-exit) (open-on-exit)
(aux-info (aux-info
(show-image-menu "true") (show-image-menu "true")
@ -74,15 +79,16 @@
(current-data "Standard") (current-data "Standard")
(zoom-factor "2.80")))))) (zoom-factor "2.80"))))))
(session-info "toolbox" "dock" (session-info "toolbox" "dock"
(position 44 104) (position 13 37)
(size 102 526) (size 102 520)
(open-on-exit)) (open-on-exit)
(dock))
(session-info "toplevel" "gimp-file-open-dialog" (session-info "toplevel" "gimp-file-open-dialog"
(position 392 140) (position 392 140)
(size 902 816)) (size 902 816))
(session-info "display" "gimp-empty-image-window" (session-info "display" "gimp-empty-image-window"
(position 178 35) (position 140 32)
(size 563 190)) (size 610 190))
(last-tip-shown 0) (last-tip-shown 0)

View File

@ -44,36 +44,61 @@ enum
/* public functions */ /* public functions */
GimpSessionInfoDock *
gimp_session_info_dock_new (void)
{
return g_slice_new0 (GimpSessionInfoDock);
}
void void
gimp_session_info_dock_serialize (GimpConfigWriter *writer, gimp_session_info_dock_free (GimpSessionInfoDock *dock_info)
GList *books) {
g_return_if_fail (dock_info != NULL);
if (dock_info->books)
{
g_list_foreach (dock_info->books,
(GFunc) gimp_session_info_book_free,
NULL);
g_list_free (dock_info->books);
dock_info->books = NULL;
}
g_slice_free (GimpSessionInfoDock, dock_info);
}
void
gimp_session_info_dock_serialize (GimpConfigWriter *writer,
GimpSessionInfoDock *dock_info)
{ {
GList *list; GList *list;
g_return_if_fail (writer != NULL); g_return_if_fail (writer != NULL);
g_return_if_fail (books != NULL); g_return_if_fail (dock_info != NULL);
gimp_config_writer_open (writer, "dock"); gimp_config_writer_open (writer, "dock");
for (list = books; list; list = g_list_next (list)) for (list = dock_info->books; list; list = g_list_next (list))
gimp_session_info_book_serialize (writer, list->data); gimp_session_info_book_serialize (writer, list->data);
gimp_config_writer_close (writer); gimp_config_writer_close (writer);
} }
GTokenType GTokenType
gimp_session_info_dock_deserialize (GScanner *scanner, gimp_session_info_dock_deserialize (GScanner *scanner,
gint scope, gint scope,
GimpSessionInfo *info) GimpSessionInfoDock **dock_info)
{ {
GTokenType token; GTokenType token;
g_return_val_if_fail (scanner != NULL, G_TOKEN_LEFT_PAREN); g_return_val_if_fail (scanner != NULL, G_TOKEN_LEFT_PAREN);
g_return_val_if_fail (info != NULL, G_TOKEN_LEFT_PAREN); g_return_val_if_fail (dock_info != NULL, G_TOKEN_LEFT_PAREN);
g_scanner_scope_add_symbol (scanner, scope, "book", g_scanner_scope_add_symbol (scanner, scope, "book",
GINT_TO_POINTER (SESSION_INFO_BOOK)); GINT_TO_POINTER (SESSION_INFO_BOOK));
*dock_info = gimp_session_info_dock_new ();
token = G_TOKEN_LEFT_PAREN; token = G_TOKEN_LEFT_PAREN;
while (g_scanner_peek_next_token (scanner) == token) while (g_scanner_peek_next_token (scanner) == token)
@ -98,7 +123,7 @@ gimp_session_info_dock_deserialize (GScanner *scanner,
if (token == G_TOKEN_LEFT_PAREN) if (token == G_TOKEN_LEFT_PAREN)
{ {
info->p->books = g_list_append (info->p->books, book); (*dock_info)->books = g_list_append ((*dock_info)->books, book);
g_scanner_set_scope (scanner, scope); g_scanner_set_scope (scanner, scope);
} }
else else
@ -126,24 +151,28 @@ gimp_session_info_dock_deserialize (GScanner *scanner,
return token; return token;
} }
GList * GimpSessionInfoDock *
gimp_session_info_dock_from_widget (GimpDock *dock) gimp_session_info_dock_from_widget (GimpDock *dock)
{ {
GList *list; GimpSessionInfoDock *dock_info = NULL;
GList *infos = NULL; GList *list = NULL;
g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL); g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
dock_info = gimp_session_info_dock_new ();
for (list = gimp_dock_get_dockbooks (dock); list; list = g_list_next (list)) for (list = gimp_dock_get_dockbooks (dock); list; list = g_list_next (list))
{ {
GimpSessionInfoBook *book; GimpSessionInfoBook *book;
book = gimp_session_info_book_from_widget (list->data); book = gimp_session_info_book_from_widget (list->data);
infos = g_list_prepend (infos, book); dock_info->books = g_list_prepend (dock_info->books, book);
} }
return g_list_reverse (infos); dock_info->books = g_list_reverse (dock_info->books);
return dock_info;
} }
static void static void
@ -172,10 +201,10 @@ gimp_session_info_dock_paned_map (GtkWidget *paned,
} }
void void
gimp_session_info_dock_restore (GList *books, gimp_session_info_dock_restore (GimpSessionInfoDock *dock_info,
GimpDialogFactory *factory, GimpDialogFactory *factory,
GdkScreen *screen, GdkScreen *screen,
GimpDockWindow *dock_window) GimpDockWindow *dock_window)
{ {
GtkWidget *dock = NULL; GtkWidget *dock = NULL;
GList *iter = NULL; GList *iter = NULL;
@ -196,7 +225,12 @@ gimp_session_info_dock_restore (GList *books,
GIMP_DOCK (dock), GIMP_DOCK (dock),
-1); -1);
for (iter = books; iter; iter = g_list_next (iter)) /* Note that if it is a toolbox, we will get here even though we
* don't have any books
*/
for (iter = dock_info ? dock_info->books : NULL;
iter;
iter = g_list_next (iter))
{ {
GimpSessionInfoBook *book_info = iter->data; GimpSessionInfoBook *book_info = iter->data;
GtkWidget *dockbook; GtkWidget *dockbook;

View File

@ -22,18 +22,29 @@
#define __GIMP_SESSION_INFO_DOCK_H__ #define __GIMP_SESSION_INFO_DOCK_H__
void gimp_session_info_dock_serialize (GimpConfigWriter *writer, /**
GList *books); * GimpSessionInfoDock:
GTokenType gimp_session_info_dock_deserialize (GScanner *scanner, *
gint scope, * Contains information about a dock in the interface.
GimpSessionInfo *info); */
struct _GimpSessionInfoDock
{
/* list of GimpSessionInfoBook */
GList *books;
};
GList * gimp_session_info_dock_from_widget (GimpDock *dock); GimpSessionInfoDock * gimp_session_info_dock_new (void);
void gimp_session_info_dock_free (GimpSessionInfoDock *dock_info);
void gimp_session_info_dock_restore (GList *books, void gimp_session_info_dock_serialize (GimpConfigWriter *writer,
GimpDialogFactory *factory, GimpSessionInfoDock *dock);
GdkScreen *screen, GTokenType gimp_session_info_dock_deserialize (GScanner *scanner,
GimpDockWindow *dock_window); gint scope,
GimpSessionInfoDock **info);
GimpSessionInfoDock * gimp_session_info_dock_from_widget (GimpDock *dock);
void gimp_session_info_dock_restore (GimpSessionInfoDock *dock_info,
GimpDialogFactory *factory,
GdkScreen *screen,
GimpDockWindow *dock_window);
#endif /* __GIMP_SESSION_INFO_DOCK_H__ */ #endif /* __GIMP_SESSION_INFO_DOCK_H__ */

View File

@ -45,8 +45,8 @@ struct _GimpSessionInfoPrivate
*/ */
GimpDialogFactoryEntry *factory_entry; GimpDialogFactoryEntry *factory_entry;
/* list of GimpSessionInfoBook */ /* list of GimpSessionInfoDock */
GList *books; GList *docks;
}; };

View File

@ -131,6 +131,7 @@ gimp_session_info_serialize (GimpConfig *config,
gpointer data) gpointer data)
{ {
GimpSessionInfo *info = GIMP_SESSION_INFO (config); GimpSessionInfo *info = GIMP_SESSION_INFO (config);
GList *iter = NULL;
gimp_config_writer_open (writer, "position"); gimp_config_writer_open (writer, "position");
gimp_config_writer_printf (writer, "%d %d", info->p->x, info->p->y); gimp_config_writer_printf (writer, "%d %d", info->p->x, info->p->y);
@ -156,8 +157,8 @@ gimp_session_info_serialize (GimpConfig *config,
if (info->p->aux_info) if (info->p->aux_info)
gimp_session_info_aux_serialize (writer, info->p->aux_info); gimp_session_info_aux_serialize (writer, info->p->aux_info);
if (info->p->books) for (iter = info->p->docks; iter; iter = g_list_next (iter))
gimp_session_info_dock_serialize (writer, info->p->books); gimp_session_info_dock_serialize (writer, iter->data);
return TRUE; return TRUE;
} }
@ -274,18 +275,24 @@ gimp_session_info_deserialize (GimpConfig *config,
break; break;
case SESSION_INFO_DOCK: case SESSION_INFO_DOCK:
if (info->p->factory_entry) {
goto error; GimpSessionInfoDock *dock_info = NULL;
g_scanner_set_scope (scanner, scope_id + 1); if (info->p->factory_entry)
token = gimp_session_info_dock_deserialize (scanner, scope_id + 1, goto error;
info);
if (token == G_TOKEN_LEFT_PAREN) g_scanner_set_scope (scanner, scope_id + 1);
g_scanner_set_scope (scanner, scope_id); token = gimp_session_info_dock_deserialize (scanner, scope_id + 1,
else &dock_info);
goto error;
if (token == G_TOKEN_LEFT_PAREN)
{
g_scanner_set_scope (scanner, scope_id);
info->p->docks = g_list_append (info->p->docks, dock_info);
}
else
goto error;
}
break; break;
default: default:
@ -386,6 +393,7 @@ gimp_session_info_restore (GimpSessionInfo *info,
else else
{ {
GtkWidget *dock_window = NULL; GtkWidget *dock_window = NULL;
GList *iter = NULL;
GIMP_LOG (DIALOG_FACTORY, "restoring dock window (info %p)", GIMP_LOG (DIALOG_FACTORY, "restoring dock window (info %p)",
info); info);
@ -395,10 +403,24 @@ gimp_session_info_restore (GimpSessionInfo *info,
if (dock_window && info->p->aux_info) if (dock_window && info->p->aux_info)
gimp_session_info_aux_set_list (GTK_WIDGET (dock_window), info->p->aux_info); gimp_session_info_aux_set_list (GTK_WIDGET (dock_window), info->p->aux_info);
gimp_session_info_dock_restore (info->p->books, /* If we have docks, proceed as usual. If we don't have docks,
factory, * assume it is the toolbox and restore the dock anyway
screen, */
GIMP_DOCK_WINDOW (dock_window)); if (info->p->docks)
{
for (iter = info->p->docks; iter; iter = g_list_next (iter))
gimp_session_info_dock_restore ((GimpSessionInfoDock *)iter->data,
factory,
screen,
GIMP_DOCK_WINDOW (dock_window));
}
else
{
gimp_session_info_dock_restore (NULL,
factory,
screen,
GIMP_DOCK_WINDOW (dock_window));
}
gtk_widget_show (GTK_WIDGET (dock_window)); gtk_widget_show (GTK_WIDGET (dock_window));
} }
@ -615,11 +637,18 @@ gimp_session_info_get_info (GimpSessionInfo *info)
(info->p->factory_entry && (info->p->factory_entry &&
info->p->factory_entry->dockable)) info->p->factory_entry->dockable))
{ {
GimpDock *dock = NULL; GList *iter = NULL;
dock = gimp_dock_window_get_dock (GIMP_DOCK_WINDOW (info->p->widget)); for (iter = gimp_dock_window_get_docks (GIMP_DOCK_WINDOW (info->p->widget));
iter;
iter = g_list_next (iter))
{
GimpDock *dock = GIMP_DOCK (iter->data);
info->p->books = gimp_session_info_dock_from_widget (dock); info->p->docks =
g_list_append (info->p->docks,
gimp_session_info_dock_from_widget (dock));
}
} }
} }
@ -636,12 +665,12 @@ gimp_session_info_clear_info (GimpSessionInfo *info)
info->p->aux_info = NULL; info->p->aux_info = NULL;
} }
if (info->p->books) if (info->p->docks)
{ {
g_list_foreach (info->p->books, g_list_foreach (info->p->docks,
(GFunc) gimp_session_info_book_free, NULL); (GFunc) gimp_session_info_dock_free, NULL);
g_list_free (info->p->books); g_list_free (info->p->docks);
info->p->books = NULL; info->p->docks = NULL;
} }
} }

View File

@ -229,6 +229,7 @@ typedef struct _GimpUIConfigurer GimpUIConfigurer;
typedef struct _GimpSessionInfo GimpSessionInfo; typedef struct _GimpSessionInfo GimpSessionInfo;
typedef struct _GimpSessionInfoBook GimpSessionInfoBook; typedef struct _GimpSessionInfoBook GimpSessionInfoBook;
typedef struct _GimpSessionInfoDock GimpSessionInfoDock;
typedef struct _GimpSessionInfoDockable GimpSessionInfoDockable; typedef struct _GimpSessionInfoDockable GimpSessionInfoDockable;
typedef struct _GimpSessionInfoAux GimpSessionInfoAux; typedef struct _GimpSessionInfoAux GimpSessionInfoAux;