Bug 667169 - Single window mode: allow tabs position setting.

This commit is contained in:
Jehan 2013-09-15 22:56:17 +12:00
parent 6ee77e5635
commit b2e40c4ca7
12 changed files with 206 additions and 7 deletions

View File

@ -110,7 +110,10 @@ static const GimpActionEntry windows_actions[] =
NC_("windows-action", "Previous Image"), "<alt><shift>Tab",
NC_("windows-action", "Switch to the previous image"),
G_CALLBACK (windows_show_display_previous_cmd_callback),
NULL }
NULL },
{ "windows-tab-position", NULL, NC_("windows-action",
"_Tabs Position") },
};
static const GimpToggleActionEntry windows_toggle_actions[] =
@ -130,6 +133,28 @@ static const GimpToggleActionEntry windows_toggle_actions[] =
GIMP_HELP_WINDOWS_USE_SINGLE_WINDOW_MODE }
};
static const GimpRadioActionEntry windows_tabs_position_actions[] =
{
{ "windows-tabs-position-top", GTK_STOCK_GOTO_TOP,
NC_("windows-tabs-position-action", "_Top"), NULL,
NC_("windows-tabs-position-action", "Position the tabs to the top"),
GIMP_POSITION_TOP, GIMP_HELP_WINDOWS_TABS_POSITION_TOP },
{ "windows-tabs-position-bottom", GTK_STOCK_GOTO_BOTTOM,
NC_("windows-tabs-position-action", "_Bottom"), NULL,
NC_("windows-tabs-position-action", "Position the tabs to the bottom"),
GIMP_POSITION_BOTTOM, GIMP_HELP_WINDOWS_TABS_POSITION_BOTTOM },
{ "windows-tabs-position-left", GTK_STOCK_GOTO_FIRST,
NC_("windows-tabs-position-action", "_Left"), NULL,
NC_("windows-tabs-position-action", "Position the tabs to the left"),
GIMP_POSITION_LEFT, GIMP_HELP_WINDOWS_TABS_POSITION_LEFT },
{ "windows-tabs-position-right", GTK_STOCK_GOTO_LAST,
NC_("windows-tabs-position-action", "_Right"), NULL,
NC_("windows-tabs-position-action", "Position the tabs to the right"),
GIMP_POSITION_RIGHT, GIMP_HELP_WINDOWS_TABS_POSITION_RIGHT },
};
void
windows_actions_setup (GimpActionGroup *group)
@ -144,6 +169,12 @@ windows_actions_setup (GimpActionGroup *group)
windows_toggle_actions,
G_N_ELEMENTS (windows_toggle_actions));
gimp_action_group_add_radio_actions (group, "windows-tabs-position-action",
windows_tabs_position_actions,
G_N_ELEMENTS (windows_tabs_position_actions),
NULL, 0,
G_CALLBACK (windows_set_tabs_position_cmd_callback));
gimp_action_group_set_action_hide_empty (group, "windows-docks-menu", FALSE);
g_signal_connect_object (group->gimp->displays, "add",
@ -210,6 +241,7 @@ windows_actions_update (GimpActionGroup *group,
gpointer data)
{
GimpGuiConfig *config = GIMP_GUI_CONFIG (group->gimp->config);
const gchar *action = NULL;
#define SET_ACTIVE(action,condition) \
gimp_action_group_set_action_active (group, action, (condition) != 0)
@ -217,6 +249,27 @@ windows_actions_update (GimpActionGroup *group,
SET_ACTIVE ("windows-use-single-window-mode", config->single_window_mode);
SET_ACTIVE ("windows-hide-docks", config->hide_docks);
switch (config->tabs_position)
{
case GIMP_POSITION_TOP:
action = "windows-tabs-position-top";
break;
case GIMP_POSITION_BOTTOM:
action = "windows-tabs-position-bottom";
break;
case GIMP_POSITION_LEFT:
action = "windows-tabs-position-left";
break;
case GIMP_POSITION_RIGHT:
action = "windows-tabs-position-right";
break;
default:
action = "windows-tabs-position-top";
break;
}
gimp_action_group_set_action_active (group, action, TRUE);
#undef SET_ACTIVE
}

View File

@ -65,6 +65,23 @@ windows_hide_docks_cmd_callback (GtkAction *action,
NULL);
}
void
windows_set_tabs_position_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data)
{
GimpPosition value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
Gimp *gimp;
return_if_no_gimp (gimp, data);
if (GIMP_GUI_CONFIG (gimp->config)->tabs_position == value)
return;
g_object_set (gimp->config,
"tabs-position", value,
NULL);
}
void
windows_use_single_window_mode_cmd_callback (GtkAction *action,
gpointer data)

View File

@ -21,6 +21,9 @@
void windows_hide_docks_cmd_callback (GtkAction *action,
gpointer data);
void windows_set_tabs_position_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data);
void windows_use_single_window_mode_cmd_callback (GtkAction *action,
gpointer data);

View File

@ -250,6 +250,39 @@ gimp_handedness_get_type (void)
return type;
}
GType
gimp_position_get_type (void)
{
static const GEnumValue values[] =
{
{ GIMP_POSITION_TOP, "GIMP_POSITION_TOP", "top" },
{ GIMP_POSITION_BOTTOM, "GIMP_POSITION_BOTTOM", "bottom" },
{ GIMP_POSITION_LEFT, "GIMP_POSITION_LEFT", "left" },
{ GIMP_POSITION_RIGHT, "GIMP_POSITION_RIGHT", "right" },
{ 0, NULL, NULL }
};
static const GimpEnumDesc descs[] =
{
{ GIMP_POSITION_TOP, NC_("position", "Top"), NULL },
{ GIMP_POSITION_BOTTOM, NC_("position", "Bottom"), NULL },
{ GIMP_POSITION_LEFT, NC_("position", "Left"), NULL },
{ GIMP_POSITION_RIGHT, NC_("position", "Right"), NULL },
{ 0, NULL, NULL }
};
static GType type = 0;
if (G_UNLIKELY (! type))
{
type = g_enum_register_static ("GimpPosition", values);
gimp_type_set_translation_context (type, "position");
gimp_enum_set_value_descriptions (type, descs);
}
return type;
}
/* Generated data ends here */

View File

@ -112,5 +112,16 @@ typedef enum
GIMP_HANDEDNESS_RIGHT /*< desc="Right-handed" >*/
} GimpHandedness;
#define GIMP_TYPE_POSITION (gimp_position_get_type ())
GType gimp_position_get_type (void) G_GNUC_CONST;
typedef enum
{
GIMP_POSITION_TOP, /*< desc="Top" >*/
GIMP_POSITION_BOTTOM, /*< desc="Bottom" >*/
GIMP_POSITION_LEFT, /*< desc="Left" >*/
GIMP_POSITION_RIGHT /*< desc="Right" >*/
} GimpPosition;
#endif /* __CONFIG_ENUMS_H__ */

View File

@ -74,6 +74,7 @@ enum
PROP_HIDE_DOCKS,
PROP_SINGLE_WINDOW_MODE,
PROP_TABS_POSITION,
PROP_LAST_TIP_SHOWN,
/* ignored, only for backward compatibility: */
@ -266,6 +267,11 @@ gimp_gui_config_class_init (GimpGuiConfigClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
GIMP_PARAM_STATIC_STRINGS));
GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_TABS_POSITION,
"tabs-position", WINDOWS_TABS_POSITION,
GIMP_TYPE_POSITION,
GIMP_POSITION_TOP,
GIMP_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_LAST_TIP_SHOWN,
g_param_spec_int ("last-tip-shown",
NULL, NULL,
@ -445,6 +451,9 @@ gimp_gui_config_set_property (GObject *object,
case PROP_SINGLE_WINDOW_MODE:
gui_config->single_window_mode = g_value_get_boolean (value);
break;
case PROP_TABS_POSITION:
gui_config->tabs_position = g_value_get_enum (value);
break;
case PROP_LAST_TIP_SHOWN:
gui_config->last_tip_shown = g_value_get_int (value);
break;
@ -567,6 +576,9 @@ gimp_gui_config_get_property (GObject *object,
case PROP_SINGLE_WINDOW_MODE:
g_value_set_boolean (value, gui_config->single_window_mode);
break;
case PROP_TABS_POSITION:
g_value_set_enum (value, gui_config->tabs_position);
break;
case PROP_LAST_TIP_SHOWN:
g_value_set_int (value, gui_config->last_tip_shown);
break;

View File

@ -70,6 +70,7 @@ struct _GimpGuiConfig
/* saved in sessionrc */
gboolean hide_docks;
gboolean single_window_mode;
GimpPosition tabs_position;
gint last_tip_shown;
};

View File

@ -366,6 +366,9 @@ N_("Show a tooltip when the pointer hovers over an item.")
#define SINGLE_WINDOW_MODE_BLURB \
N_("Use GIMP in a single-window mode.")
#define WINDOWS_TABS_POSITION \
N_("Choose the position of the tabs.")
#define HIDE_DOCKS_BLURB \
N_("Hide docks and other windows, leaving only image windows.")

View File

@ -409,6 +409,8 @@ gimp_image_window_constructed (GObject *object)
gtk_notebook_set_scrollable (GTK_NOTEBOOK (private->notebook), TRUE);
gtk_notebook_set_show_border (GTK_NOTEBOOK (private->notebook), FALSE);
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (private->notebook), FALSE);
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (private->notebook), GTK_POS_TOP);
gtk_paned_pack1 (GTK_PANED (private->right_hpane), private->notebook,
TRUE, TRUE);
g_signal_connect (private->notebook, "switch-page",
@ -437,6 +439,9 @@ gimp_image_window_constructed (GObject *object)
g_signal_connect_object (config, "notify::hide-docks",
G_CALLBACK (gimp_image_window_config_notify),
window, G_CONNECT_SWAPPED);
g_signal_connect_object (config, "notify::tabs-position",
G_CALLBACK (gimp_image_window_config_notify),
window, G_CONNECT_SWAPPED);
gimp_image_window_session_update (window,
NULL /*new_display*/,
@ -1524,12 +1529,14 @@ gimp_image_window_update_tabs (GimpImageWindow *window)
{
GimpImageWindowPrivate *private;
GimpGuiConfig *config;
GtkPositionType position;
g_return_if_fail (GIMP_IS_IMAGE_WINDOW (window));
private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
config = GIMP_GUI_CONFIG (private->gimp->config);
/* Tab visibility. */
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (private->notebook),
config->single_window_mode &&
! config->hide_docks &&
@ -1537,6 +1544,28 @@ gimp_image_window_update_tabs (GimpImageWindow *window)
private->active_shell->display &&
gimp_display_get_image (private->active_shell->display)) ||
g_list_length (private->shells) > 1));
/* Tab position. */
switch (config->tabs_position)
{
case GIMP_POSITION_TOP:
position = GTK_POS_TOP;
break;
case GIMP_POSITION_BOTTOM:
position = GTK_POS_BOTTOM;
break;
case GIMP_POSITION_LEFT:
position = GTK_POS_LEFT;
break;
case GIMP_POSITION_RIGHT:
position = GTK_POS_RIGHT;
break;
default:
/* If we have any strange value, just reset to default. */
position = GTK_POS_TOP;
break;
}
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (private->notebook), position);
}
/* private functions */
@ -1567,14 +1596,20 @@ gimp_image_window_config_notify (GimpImageWindow *window,
/* Dock column visibility */
if (strcmp (pspec->name, "single-window-mode") == 0 ||
strcmp (pspec->name, "hide-docks") == 0)
strcmp (pspec->name, "hide-docks") == 0 ||
strcmp (pspec->name, "tabs-position") == 0)
{
gboolean show_docks = (config->single_window_mode &&
! config->hide_docks);
if (strcmp (pspec->name, "single-window-mode") == 0 ||
strcmp (pspec->name, "hide-docks") == 0)
{
gboolean show_docks = (config->single_window_mode &&
! config->hide_docks);
gimp_image_window_keep_canvas_pos (window);
gtk_widget_set_visible (private->left_docks, show_docks);
gtk_widget_set_visible (private->right_docks, show_docks);
}
gimp_image_window_keep_canvas_pos (window);
gtk_widget_set_visible (private->left_docks, show_docks);
gtk_widget_set_visible (private->right_docks, show_docks);
gimp_image_window_update_tabs (window);
}

View File

@ -60,6 +60,7 @@ enum
SESSION_INFO = 1,
HIDE_DOCKS,
SINGLE_WINDOW_MODE,
TABS_POSITION,
LAST_TIP_SHOWN
};
@ -114,6 +115,8 @@ session_init (Gimp *gimp)
GINT_TO_POINTER (HIDE_DOCKS));
g_scanner_scope_add_symbol (scanner, 0, "single-window-mode",
GINT_TO_POINTER (SINGLE_WINDOW_MODE));
g_scanner_scope_add_symbol (scanner, 0, "tabs-position",
GINT_TO_POINTER (TABS_POSITION));
g_scanner_scope_add_symbol (scanner, 0, "last-tip-shown",
GINT_TO_POINTER (LAST_TIP_SHOWN));
@ -252,6 +255,19 @@ session_init (Gimp *gimp)
"single-window-mode", single_window_mode,
NULL);
}
else if (scanner->value.v_symbol == GINT_TO_POINTER (TABS_POSITION))
{
gint tabs_position;
token = G_TOKEN_INT;
if (! gimp_scanner_parse_int (scanner, &tabs_position))
break;
g_object_set (gimp->config,
"tabs-position", tabs_position,
NULL);
}
else if (scanner->value.v_symbol == GINT_TO_POINTER (LAST_TIP_SHOWN))
{
gint last_tip_shown;
@ -365,6 +381,11 @@ session_save (Gimp *gimp,
"yes" : "no");
gimp_config_writer_close (writer);
gimp_config_writer_open (writer, "tabs-position");
gimp_config_writer_printf (writer, "%d",
GIMP_GUI_CONFIG (gimp->config)->tabs_position);
gimp_config_writer_close (writer);
gimp_config_writer_open (writer, "last-tip-shown");
gimp_config_writer_printf (writer, "%d",
GIMP_GUI_CONFIG (gimp->config)->last_tip_shown);

View File

@ -525,6 +525,10 @@
#define GIMP_HELP_WINDOWS_SHOW_DOCK "gimp-windows-show-dock"
#define GIMP_HELP_WINDOWS_HIDE_DOCKS "gimp-windows-hide-docks"
#define GIMP_HELP_WINDOWS_TABS_POSITION_TOP "gimp-windows-tabs-position-top"
#define GIMP_HELP_WINDOWS_TABS_POSITION_BOTTOM "gimp-windows-tabs-position-bottom"
#define GIMP_HELP_WINDOWS_TABS_POSITION_LEFT "gimp-windows-tabs-position-left"
#define GIMP_HELP_WINDOWS_TABS_POSITION_RIGHT "gimp-windows-tabs-position-right"
#define GIMP_HELP_WINDOWS_USE_SINGLE_WINDOW_MODE "gimp-windows-use-single-window-mode"
#define GIMP_HELP_WINDOWS_OPEN_RECENT_DOCK "gimp-windows-open-recent-dock"

View File

@ -733,6 +733,12 @@
</placeholder>
<separator />
<menuitem action="windows-hide-docks" />
<menu action="windows-tab-position" name="Position">
<menuitem action="windows-tabs-position-top" />
<menuitem action="windows-tabs-position-bottom" />
<menuitem action="windows-tabs-position-left" />
<menuitem action="windows-tabs-position-right" />
</menu>
<menuitem action="windows-use-single-window-mode" />
<separator />
</menu>