mirror of https://github.com/GNOME/gimp.git
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:
parent
bfd91ebdb7
commit
34ad9dad1a
|
@ -6,11 +6,11 @@
|
|||
# you quit GIMP. If this file isn't found, defaults are used.
|
||||
|
||||
(session-info "dock" "dock"
|
||||
(position 428 198)
|
||||
(size 210 523)
|
||||
(position 566 171)
|
||||
(size 210 535)
|
||||
(open-on-exit)
|
||||
(aux-info
|
||||
(show-image-menu "true")
|
||||
(show-image-menu "false")
|
||||
(follow-active-image "true"))
|
||||
(dock
|
||||
(book
|
||||
|
@ -21,13 +21,13 @@
|
|||
(dockable "gimp-undo-history"
|
||||
(tab-style icon)))
|
||||
(book
|
||||
(position 259)
|
||||
(position 289)
|
||||
(current-page 0)
|
||||
(dockable "gimp-brush-grid"
|
||||
(tab-style preview)))))
|
||||
(session-info "dock" "dock"
|
||||
(position 184 358)
|
||||
(size 200 300)
|
||||
(position 141 291)
|
||||
(size 406 300)
|
||||
(open-on-exit)
|
||||
(aux-info
|
||||
(show-image-menu "false")
|
||||
|
@ -36,9 +36,14 @@
|
|||
(book
|
||||
(current-page 0)
|
||||
(dockable "gimp-tool-options"
|
||||
(tab-style icon))))
|
||||
(dock
|
||||
(book
|
||||
(current-page 0)
|
||||
(dockable "gimp-device-status"
|
||||
(tab-style icon)))))
|
||||
(session-info "dock" "dock"
|
||||
(position 769 64)
|
||||
(position 795 43)
|
||||
(size 200 265)
|
||||
(open-on-exit)
|
||||
(aux-info
|
||||
|
@ -52,8 +57,8 @@
|
|||
(dockable "gimp-gradient-list"
|
||||
(tab-style preview)))))
|
||||
(session-info "dock" "dock"
|
||||
(position 714 320)
|
||||
(size 200 401)
|
||||
(position 803 344)
|
||||
(size 200 404)
|
||||
(open-on-exit)
|
||||
(aux-info
|
||||
(show-image-menu "true")
|
||||
|
@ -74,15 +79,16 @@
|
|||
(current-data "Standard")
|
||||
(zoom-factor "2.80"))))))
|
||||
(session-info "toolbox" "dock"
|
||||
(position 44 104)
|
||||
(size 102 526)
|
||||
(open-on-exit))
|
||||
(position 13 37)
|
||||
(size 102 520)
|
||||
(open-on-exit)
|
||||
(dock))
|
||||
(session-info "toplevel" "gimp-file-open-dialog"
|
||||
(position 392 140)
|
||||
(size 902 816))
|
||||
(session-info "display" "gimp-empty-image-window"
|
||||
(position 178 35)
|
||||
(size 563 190))
|
||||
(position 140 32)
|
||||
(size 610 190))
|
||||
|
||||
(last-tip-shown 0)
|
||||
|
||||
|
|
|
@ -44,36 +44,61 @@ enum
|
|||
|
||||
/* public functions */
|
||||
|
||||
GimpSessionInfoDock *
|
||||
gimp_session_info_dock_new (void)
|
||||
{
|
||||
return g_slice_new0 (GimpSessionInfoDock);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_dock_serialize (GimpConfigWriter *writer,
|
||||
GList *books)
|
||||
gimp_session_info_dock_free (GimpSessionInfoDock *dock_info)
|
||||
{
|
||||
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;
|
||||
|
||||
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");
|
||||
|
||||
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_config_writer_close (writer);
|
||||
}
|
||||
|
||||
GTokenType
|
||||
gimp_session_info_dock_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfo *info)
|
||||
gimp_session_info_dock_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoDock **dock_info)
|
||||
{
|
||||
GTokenType token;
|
||||
|
||||
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",
|
||||
GINT_TO_POINTER (SESSION_INFO_BOOK));
|
||||
|
||||
*dock_info = gimp_session_info_dock_new ();
|
||||
|
||||
token = G_TOKEN_LEFT_PAREN;
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
@ -126,24 +151,28 @@ gimp_session_info_dock_deserialize (GScanner *scanner,
|
|||
return token;
|
||||
}
|
||||
|
||||
GList *
|
||||
GimpSessionInfoDock *
|
||||
gimp_session_info_dock_from_widget (GimpDock *dock)
|
||||
{
|
||||
GList *list;
|
||||
GList *infos = NULL;
|
||||
GimpSessionInfoDock *dock_info = NULL;
|
||||
GList *list = 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))
|
||||
{
|
||||
GimpSessionInfoBook *book;
|
||||
|
||||
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
|
||||
|
@ -172,10 +201,10 @@ gimp_session_info_dock_paned_map (GtkWidget *paned,
|
|||
}
|
||||
|
||||
void
|
||||
gimp_session_info_dock_restore (GList *books,
|
||||
GimpDialogFactory *factory,
|
||||
GdkScreen *screen,
|
||||
GimpDockWindow *dock_window)
|
||||
gimp_session_info_dock_restore (GimpSessionInfoDock *dock_info,
|
||||
GimpDialogFactory *factory,
|
||||
GdkScreen *screen,
|
||||
GimpDockWindow *dock_window)
|
||||
{
|
||||
GtkWidget *dock = NULL;
|
||||
GList *iter = NULL;
|
||||
|
@ -196,7 +225,12 @@ gimp_session_info_dock_restore (GList *books,
|
|||
GIMP_DOCK (dock),
|
||||
-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;
|
||||
GtkWidget *dockbook;
|
||||
|
|
|
@ -22,18 +22,29 @@
|
|||
#define __GIMP_SESSION_INFO_DOCK_H__
|
||||
|
||||
|
||||
void gimp_session_info_dock_serialize (GimpConfigWriter *writer,
|
||||
GList *books);
|
||||
GTokenType gimp_session_info_dock_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfo *info);
|
||||
/**
|
||||
* GimpSessionInfoDock:
|
||||
*
|
||||
* Contains information about a dock in the interface.
|
||||
*/
|
||||
struct _GimpSessionInfoDock
|
||||
{
|
||||
/* list of GimpSessionInfoBook */
|
||||
GList *books;
|
||||
};
|
||||
|
||||
GList * gimp_session_info_dock_from_widget (GimpDock *dock);
|
||||
|
||||
void gimp_session_info_dock_restore (GList *books,
|
||||
GimpDialogFactory *factory,
|
||||
GdkScreen *screen,
|
||||
GimpDockWindow *dock_window);
|
||||
GimpSessionInfoDock * gimp_session_info_dock_new (void);
|
||||
void gimp_session_info_dock_free (GimpSessionInfoDock *dock_info);
|
||||
void gimp_session_info_dock_serialize (GimpConfigWriter *writer,
|
||||
GimpSessionInfoDock *dock);
|
||||
GTokenType gimp_session_info_dock_deserialize (GScanner *scanner,
|
||||
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__ */
|
||||
|
|
|
@ -45,8 +45,8 @@ struct _GimpSessionInfoPrivate
|
|||
*/
|
||||
GimpDialogFactoryEntry *factory_entry;
|
||||
|
||||
/* list of GimpSessionInfoBook */
|
||||
GList *books;
|
||||
/* list of GimpSessionInfoDock */
|
||||
GList *docks;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -131,6 +131,7 @@ gimp_session_info_serialize (GimpConfig *config,
|
|||
gpointer data)
|
||||
{
|
||||
GimpSessionInfo *info = GIMP_SESSION_INFO (config);
|
||||
GList *iter = NULL;
|
||||
|
||||
gimp_config_writer_open (writer, "position");
|
||||
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)
|
||||
gimp_session_info_aux_serialize (writer, info->p->aux_info);
|
||||
|
||||
if (info->p->books)
|
||||
gimp_session_info_dock_serialize (writer, info->p->books);
|
||||
for (iter = info->p->docks; iter; iter = g_list_next (iter))
|
||||
gimp_session_info_dock_serialize (writer, iter->data);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -274,18 +275,24 @@ gimp_session_info_deserialize (GimpConfig *config,
|
|||
break;
|
||||
|
||||
case SESSION_INFO_DOCK:
|
||||
if (info->p->factory_entry)
|
||||
goto error;
|
||||
{
|
||||
GimpSessionInfoDock *dock_info = NULL;
|
||||
|
||||
g_scanner_set_scope (scanner, scope_id + 1);
|
||||
token = gimp_session_info_dock_deserialize (scanner, scope_id + 1,
|
||||
info);
|
||||
if (info->p->factory_entry)
|
||||
goto error;
|
||||
|
||||
if (token == G_TOKEN_LEFT_PAREN)
|
||||
g_scanner_set_scope (scanner, scope_id);
|
||||
else
|
||||
goto error;
|
||||
g_scanner_set_scope (scanner, scope_id + 1);
|
||||
token = gimp_session_info_dock_deserialize (scanner, scope_id + 1,
|
||||
&dock_info);
|
||||
|
||||
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;
|
||||
|
||||
default:
|
||||
|
@ -386,6 +393,7 @@ gimp_session_info_restore (GimpSessionInfo *info,
|
|||
else
|
||||
{
|
||||
GtkWidget *dock_window = NULL;
|
||||
GList *iter = NULL;
|
||||
|
||||
GIMP_LOG (DIALOG_FACTORY, "restoring dock window (info %p)",
|
||||
info);
|
||||
|
@ -395,10 +403,24 @@ gimp_session_info_restore (GimpSessionInfo *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_dock_restore (info->p->books,
|
||||
factory,
|
||||
screen,
|
||||
GIMP_DOCK_WINDOW (dock_window));
|
||||
/* If we have docks, proceed as usual. If we don't have docks,
|
||||
* assume it is the toolbox and restore the dock anyway
|
||||
*/
|
||||
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));
|
||||
}
|
||||
|
@ -615,11 +637,18 @@ gimp_session_info_get_info (GimpSessionInfo *info)
|
|||
(info->p->factory_entry &&
|
||||
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;
|
||||
}
|
||||
|
||||
if (info->p->books)
|
||||
if (info->p->docks)
|
||||
{
|
||||
g_list_foreach (info->p->books,
|
||||
(GFunc) gimp_session_info_book_free, NULL);
|
||||
g_list_free (info->p->books);
|
||||
info->p->books = NULL;
|
||||
g_list_foreach (info->p->docks,
|
||||
(GFunc) gimp_session_info_dock_free, NULL);
|
||||
g_list_free (info->p->docks);
|
||||
info->p->docks = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -229,6 +229,7 @@ typedef struct _GimpUIConfigurer GimpUIConfigurer;
|
|||
|
||||
typedef struct _GimpSessionInfo GimpSessionInfo;
|
||||
typedef struct _GimpSessionInfoBook GimpSessionInfoBook;
|
||||
typedef struct _GimpSessionInfoDock GimpSessionInfoDock;
|
||||
typedef struct _GimpSessionInfoDockable GimpSessionInfoDockable;
|
||||
typedef struct _GimpSessionInfoAux GimpSessionInfoAux;
|
||||
|
||||
|
|
Loading…
Reference in New Issue