[gthumb] added option to open files in fullscreen mode
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] added option to open files in fullscreen mode
- Date: Sat, 26 Dec 2015 21:18:24 +0000 (UTC)
commit 2e4660e98cc43c8a2c15788097c4f40cea665268
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Dec 26 11:28:58 2015 +0100
added option to open files in fullscreen mode
data/org.gnome.gthumb.gschema.xml.in | 9 +
data/ui/browser-preferences.ui | 16 ++
extensions/image_viewer/gth-image-viewer-page.c | 2 +
gthumb/dlg-preferences-browser.c | 15 ++
gthumb/gth-browser.c | 244 +++++++++++++++++------
gthumb/gth-browser.h | 2 +
gthumb/gth-grid-view.c | 13 +-
gthumb/gth-preferences.h | 4 +
gthumb/gth-window.c | 68 ++++++-
gthumb/gth-window.h | 4 +
gthumb/resources/gthumb.css | 8 +
11 files changed, 316 insertions(+), 69 deletions(-)
---
diff --git a/data/org.gnome.gthumb.gschema.xml.in b/data/org.gnome.gthumb.gschema.xml.in
index ba2f272..64b6eba 100644
--- a/data/org.gnome.gthumb.gschema.xml.in
+++ b/data/org.gnome.gthumb.gschema.xml.in
@@ -83,6 +83,9 @@
<key name="single-click-activation" type="b">
<default>true</default>
</key>
+ <key name="open-files-in-fullscreen" type="b">
+ <default>false</default>
+ </key>
<key name="sort-type" type="s">
<default>'file::mtime'</default>
</key>
@@ -132,6 +135,12 @@
<default>false</default>
<_description>Open files in the active window</_description>
</key>
+ <key name="fullscreen-sidebar" enum="org.gnome.gthumb.GthSidebarState">
+ <default>'hidden'</default>
+ </key>
+ <key name="fullscreen-thumbnails-visible" type="b">
+ <default>false</default>
+ </key>
</schema>
<schema id="org.gnome.gthumb.dialogs" path="/org/gnome/gthumb/dialogs/">
diff --git a/data/ui/browser-preferences.ui b/data/ui/browser-preferences.ui
index e085d64..f0ac661 100644
--- a/data/ui/browser-preferences.ui
+++ b/data/ui/browser-preferences.ui
@@ -124,6 +124,22 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkCheckButton" id="open_in_fullscreen_checkbutton">
+ <property name="label" translatable="yes">_Open files in fullscreen mode</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 3fdb238..cf84dfe 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -577,6 +577,8 @@ image_navigator_get_child_position_cb (GtkOverlay *overlay,
if (widget == self->priv->overview_revealer) {
allocation->x = main_alloc.width - allocation->width - OVERLAY_MARGIN;
allocation->y = OVERLAY_MARGIN;
+ if (gth_browser_get_is_fullscreen (self->priv->browser))
+ allocation->y += gtk_widget_get_allocated_height
(gth_browser_get_fullscreen_headerbar (self->priv->browser));
allocation_filled = TRUE;
}
diff --git a/gthumb/dlg-preferences-browser.c b/gthumb/dlg-preferences-browser.c
index 46c9485..2240708 100644
--- a/gthumb/dlg-preferences-browser.c
+++ b/gthumb/dlg-preferences-browser.c
@@ -106,6 +106,14 @@ click_behavior_changed_cb (GtkToggleButton *button,
}
+static void
+open_in_fullscreen_toggled_cb (GtkToggleButton *button,
+ BrowserData *data)
+{
+ g_settings_set_boolean (data->browser_settings, PREF_BROWSER_OPEN_FILES_IN_FULLSCREEN,
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("open_in_fullscreen_checkbutton"))));
+}
+
+
void
browser__dlg_preferences_construct_cb (GtkWidget *dialog,
GthBrowser *browser,
@@ -140,6 +148,9 @@ browser__dlg_preferences_construct_cb (GtkWidget *dialog,
else
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("double_click_radiobutton")),
TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("open_in_fullscreen_checkbutton")),
+ g_settings_get_boolean (data->browser_settings,
PREF_BROWSER_OPEN_FILES_IN_FULLSCREEN));
+
/* other */
gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("thumbnail_size_combobox")),
@@ -165,6 +176,10 @@ browser__dlg_preferences_construct_cb (GtkWidget *dialog,
"toggled",
G_CALLBACK (click_behavior_changed_cb),
data);
+ g_signal_connect (G_OBJECT (GET_WIDGET ("open_in_fullscreen_checkbutton")),
+ "toggled",
+ G_CALLBACK (open_in_fullscreen_toggled_cb),
+ data);
g_signal_connect (G_OBJECT (data->thumbnail_caption_chooser),
"changed",
G_CALLBACK (thumbnail_caption_chooser_changed_cb),
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index a5ee3e3..229e1d2 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -195,6 +195,7 @@ struct _GthBrowserPrivate {
gboolean fullscreen;
gboolean was_fullscreen;
GtkWidget *fullscreen_toolbar;
+ GtkWidget *fullscreen_headerbar;
GtkWidget *next_image_button;
GtkWidget *previous_image_button;
GList *viewer_controls;
@@ -204,13 +205,17 @@ struct _GthBrowserPrivate {
guint motion_signal;
gdouble last_mouse_x;
gdouble last_mouse_y;
+ gboolean view_files_in_fullscreen;
struct {
- int page;
- gboolean viewer_properties;
- gboolean viewer_tools;
- gboolean thumbnail_list;
- gboolean browser_properties;
+ int page;
+ gboolean thumbnail_list;
+ gboolean browser_properties;
+ GthSidebarState viewer_sidebar;
} before_fullscreen;
+ struct {
+ gboolean thumbnail_list;
+ GthSidebarState sidebar;
+ } fullscreen_state;
/* history */
@@ -2034,6 +2039,9 @@ _gth_browser_close_final_step (gpointer user_data)
}
g_settings_set_enum (browser->priv->browser_settings, PREF_BROWSER_VIEWER_SIDEBAR,
browser->priv->viewer_sidebar);
+
+ g_settings_set_enum (browser->priv->browser_settings, PREF_FULLSCREEN_SIDEBAR,
browser->priv->fullscreen_state.sidebar);
+ g_settings_set_boolean (browser->priv->browser_settings, PREF_FULLSCREEN_THUMBNAILS_VISIBLE,
browser->priv->fullscreen_state.thumbnail_list);
}
/**/
@@ -2289,7 +2297,8 @@ hide_mouse_pointer_cb (gpointer data)
/* do not hide the pointer if it's over a viewer control */
if (pointer_on_control (hmdata, browser->priv->fixed_viewer_controls)
- || pointer_on_control (hmdata, browser->priv->viewer_controls))
+ || pointer_on_control (hmdata, browser->priv->viewer_controls)
+ || pointer_on_widget (browser->priv->viewer_sidebar_alignment, hmdata->device))
{
return FALSE;
}
@@ -2649,12 +2658,7 @@ viewer_container_get_child_position_cb (GtkOverlay *overlay,
gtk_widget_get_preferred_width (widget, NULL, &allocation->width);
gtk_widget_get_preferred_height (widget, NULL, &allocation->height);
- if (widget == browser->priv->fullscreen_toolbar) {
- allocation->x = 0;
- allocation->y = 0;
- allocation_filled = TRUE;
- }
- else if (widget == browser->priv->previous_image_button) {
+ if (widget == browser->priv->previous_image_button) {
allocation->x = rtl ? main_alloc.width - allocation->width - OVERLAY_MARGIN :
OVERLAY_MARGIN;
allocation->y = (main_alloc.height - allocation->height) / 2;
@@ -3188,9 +3192,11 @@ _g_file_list_find_file_or_ancestor (GList *l,
}
-static void _gth_browser_load_file (GthBrowser *browser,
- GthFileData *file_data,
- gboolean view);
+static void _gth_browser_load_file_more_options (GthBrowser *browser,
+ GthFileData *file_data,
+ gboolean view,
+ gboolean fullscreen,
+ gboolean no_delay);
static void
@@ -3321,7 +3327,7 @@ folder_changed_cb (GthMonitor *monitor,
}
else {
gth_window_set_current_page (GTH_WINDOW (browser),
GTH_BROWSER_PAGE_BROWSER);
- _gth_browser_load_file (browser, NULL, FALSE);
+ _gth_browser_load_file_more_options (browser, NULL, FALSE, FALSE,
FALSE);
}
}
@@ -3677,6 +3683,24 @@ gth_file_list_button_press_cb (GtkWidget *widget,
}
return FALSE;
}
+ else if ((event->type == GDK_BUTTON_PRESS) && (event->button == 1) && (event->state & GDK_MOD1_MASK))
{
+ GtkWidget *file_view;
+ int pos;
+
+ file_view = gth_browser_get_file_list_view (browser);
+ pos = gth_file_view_get_at_position (GTH_FILE_VIEW (file_view), event->x, event->y);
+ if (pos >= 0) {
+ GtkTreeModel *file_store = gth_file_view_get_model (GTH_FILE_VIEW (file_view));
+ GtkTreeIter iter;
+
+ if (gth_file_store_get_nth_visible (GTH_FILE_STORE (file_store), pos, &iter)) {
+ GthFileData *file_data;
+
+ file_data = gth_file_store_get_file (GTH_FILE_STORE (file_store), &iter);
+ _gth_browser_load_file_more_options (browser, file_data, TRUE, !
browser->priv->view_files_in_fullscreen, TRUE);
+ }
+ }
+ }
else if ((event->type == GDK_2BUTTON_PRESS) && (event->button == 2)) {
gth_browser_fullscreen (browser);
return TRUE;
@@ -3796,7 +3820,7 @@ gth_file_view_file_activated_cb (GthFileView *file_view,
file_data = gth_file_store_get_file (file_store, &iter);
if (file_data != NULL)
- gth_browser_load_file (browser, file_data, TRUE);
+ _gth_browser_load_file_more_options (browser, file_data, TRUE,
browser->priv->view_files_in_fullscreen, TRUE);
}
}
@@ -4167,6 +4191,16 @@ pref_single_click_activation_changed (GSettings *settings,
}
+static void
+pref_open_files_in_fullscreen_changed (GSettings *settings,
+ const char *key,
+ gpointer user_data)
+{
+ GthBrowser *browser = user_data;
+ browser->priv->view_files_in_fullscreen = g_settings_get_boolean (settings, key);
+}
+
+
static gboolean
_gth_browser_realize (GtkWidget *browser,
gpointer *data)
@@ -4252,6 +4286,7 @@ gth_browser_init (GthBrowser *browser)
browser->priv->location_free_space = NULL;
browser->priv->recalc_location_free_space = TRUE;
browser->priv->fullscreen = FALSE;
+ browser->priv->fullscreen_headerbar = NULL;
browser->priv->was_fullscreen = FALSE;
browser->priv->viewer_controls = NULL;
browser->priv->fixed_viewer_controls = NULL;
@@ -4270,6 +4305,9 @@ gth_browser_init (GthBrowser *browser)
browser->priv->screen_profile = NULL;
browser->priv->folder_tree_last_dest_row = NULL;
browser->priv->folder_tree_open_folder_id = 0;
+ browser->priv->view_files_in_fullscreen = g_settings_get_boolean (browser->priv->browser_settings,
PREF_BROWSER_OPEN_FILES_IN_FULLSCREEN);;
+ browser->priv->fullscreen_state.sidebar = g_settings_get_enum (browser->priv->browser_settings,
PREF_FULLSCREEN_SIDEBAR);
+ browser->priv->fullscreen_state.thumbnail_list = g_settings_get_boolean
(browser->priv->browser_settings, PREF_FULLSCREEN_THUMBNAILS_VISIBLE);
browser_state_init (&browser->priv->state);
@@ -4340,6 +4378,7 @@ gth_browser_init (GthBrowser *browser)
gth_window_attach_content (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER,
browser->priv->viewer_thumbnails_pane);
browser->priv->viewer_sidebar_pane = gth_paned_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (browser->priv->viewer_sidebar_pane),
GTK_STYLE_CLASS_SIDEBAR);
gtk_widget_set_size_request (browser->priv->viewer_sidebar_pane, -1, MIN_VIEWER_SIZE);
gtk_widget_show (browser->priv->viewer_sidebar_pane);
if (browser->priv->viewer_thumbnails_orientation == GTK_ORIENTATION_HORIZONTAL)
@@ -4548,18 +4587,9 @@ gth_browser_init (GthBrowser *browser)
/* fullscreen toolbar */
- {
- GtkWidget *button;
-
- browser->priv->fullscreen_toolbar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
- gtk_overlay_add_overlay (GTK_OVERLAY (browser->priv->viewer_container),
browser->priv->fullscreen_toolbar);
-
- button = gtk_button_new_from_icon_name ("view-restore-symbolic", GTK_ICON_SIZE_BUTTON);
- gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "win.unfullscreen");
- gtk_style_context_add_class (gtk_widget_get_style_context (button), GTK_STYLE_CLASS_OSD);
- gtk_widget_show (button);
- gtk_box_pack_start (GTK_BOX (browser->priv->fullscreen_toolbar), button, FALSE, FALSE, 0);
- }
+ browser->priv->fullscreen_toolbar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_style_context_add_class (gtk_widget_get_style_context (browser->priv->fullscreen_toolbar),
GTK_STYLE_CLASS_BACKGROUND);
+ gth_window_add_overlay (GTH_WINDOW (browser), browser->priv->fullscreen_toolbar);
/* overlay commands */
@@ -5003,6 +5033,10 @@ gth_browser_init (GthBrowser *browser)
"changed::" PREF_BROWSER_SINGLE_CLICK_ACTIVATION,
G_CALLBACK (pref_single_click_activation_changed),
browser);
+ g_signal_connect (browser->priv->browser_settings,
+ "changed::" PREF_BROWSER_OPEN_FILES_IN_FULLSCREEN,
+ G_CALLBACK (pref_open_files_in_fullscreen_changed),
+ browser);
browser->priv->constructed = TRUE;
}
@@ -5778,6 +5812,12 @@ view_focused_image (GthBrowser *browser)
}
+static void _gth_browser_load_file_keep_view (GthBrowser *browser,
+ GthFileData *file_data,
+ gboolean view,
+ gboolean no_delay);
+
+
gboolean
gth_browser_show_next_image (GthBrowser *browser,
gboolean skip_broken,
@@ -5811,7 +5851,7 @@ gth_browser_show_next_image (GthBrowser *browser,
GthFileData *file_data;
file_data = gth_file_store_get_file (GTH_FILE_STORE (gth_file_view_get_model (view)),
&iter);
- gth_browser_load_file (browser, file_data, TRUE);
+ _gth_browser_load_file_keep_view (browser, file_data, TRUE, TRUE);
}
}
else
@@ -5854,7 +5894,7 @@ gth_browser_show_prev_image (GthBrowser *browser,
GthFileData *file_data;
file_data = gth_file_store_get_file (GTH_FILE_STORE (gth_file_view_get_model (view)),
&iter);
- gth_browser_load_file (browser, file_data, TRUE);
+ _gth_browser_load_file_keep_view (browser, file_data, TRUE, TRUE);
}
}
else
@@ -5887,7 +5927,7 @@ gth_browser_show_first_image (GthBrowser *browser,
return FALSE;
file_data = gth_file_store_get_file (GTH_FILE_STORE (gth_file_view_get_model (view)), &iter);
- gth_browser_load_file (browser, file_data, TRUE);
+ _gth_browser_load_file_keep_view (browser, file_data, TRUE, TRUE);
return TRUE;
}
@@ -5916,7 +5956,7 @@ gth_browser_show_last_image (GthBrowser *browser,
return FALSE;
file_data = gth_file_store_get_file (GTH_FILE_STORE (gth_file_view_get_model (view)), &iter);
- gth_browser_load_file (browser, file_data, TRUE);
+ _gth_browser_load_file_keep_view (browser, file_data, TRUE, TRUE);
return TRUE;
}
@@ -5930,6 +5970,7 @@ typedef struct {
GthBrowser *browser;
GthFileData *file_data;
gboolean view;
+ gboolean fullscreen;
GCancellable *cancellable;
} LoadFileData;
@@ -5949,7 +5990,8 @@ cancel_all_metadata_operations (GthBrowser *browser)
static LoadFileData *
load_file_data_new (GthBrowser *browser,
GthFileData *file_data,
- gboolean view)
+ gboolean view,
+ gboolean fullscreen)
{
LoadFileData *data;
@@ -5959,6 +6001,7 @@ load_file_data_new (GthBrowser *browser,
if (file_data != NULL)
data->file_data = gth_file_data_dup (file_data);
data->view = view;
+ data->fullscreen = fullscreen;
data->cancellable = g_cancellable_new ();
cancel_all_metadata_operations (browser);
@@ -6067,7 +6110,7 @@ file_metadata_ready_cb (GList *files,
* a different viewer_page. */
if (different_mime_type && (G_OBJECT_TYPE (browser->priv->viewer_page) == G_OBJECT_TYPE
(basic_viewer_page)))
- _gth_browser_load_file (browser, data->file_data, data->view);
+ _gth_browser_load_file_more_options (browser, data->file_data, data->view,
data->fullscreen, data->view);
else
gth_viewer_page_update_info (browser->priv->viewer_page, browser->priv->current_file);
}
@@ -6152,7 +6195,7 @@ gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
if (browser->priv->load_metadata_timeout != 0)
g_source_remove (browser->priv->load_metadata_timeout);
- data = load_file_data_new (browser, browser->priv->current_file, FALSE);
+ data = load_file_data_new (browser, browser->priv->current_file, FALSE, FALSE);
browser->priv->load_metadata_timeout = g_timeout_add_full (G_PRIORITY_DEFAULT,
LOAD_METADATA_DELAY,
load_metadata_cb,
@@ -6164,7 +6207,8 @@ gth_viewer_page_file_loaded_cb (GthViewerPage *viewer_page,
static void
_gth_browser_load_file (GthBrowser *browser,
GthFileData *file_data,
- gboolean view)
+ gboolean view,
+ gboolean fullcreen)
{
GList *scan;
@@ -6200,8 +6244,14 @@ _gth_browser_load_file (GthBrowser *browser,
}
}
- if (view)
- gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
+ if (view) {
+ if (fullcreen) {
+ if (! gth_browser_get_is_fullscreen (browser))
+ gth_browser_fullscreen (browser);
+ }
+ else
+ gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
+ }
if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER) {
int file_pos;
@@ -6249,7 +6299,7 @@ load_file__previuos_file_saved_cb (GthBrowser *browser,
LoadFileData *data = user_data;
if (! cancelled)
- _gth_browser_load_file (data->browser, data->file_data, data->view);
+ _gth_browser_load_file (data->browser, data->file_data, data->view, data->fullscreen);
load_file_data_unref (data);
}
@@ -6277,7 +6327,7 @@ load_file_delayed_cb (gpointer user_data)
data);
}
else
- _gth_browser_load_file (data->browser, data->file_data, data->view);
+ _gth_browser_load_file (data->browser, data->file_data, data->view, data->fullscreen);
load_file_data_unref (data);
@@ -6285,10 +6335,12 @@ load_file_delayed_cb (gpointer user_data)
}
-void
-gth_browser_load_file (GthBrowser *browser,
- GthFileData *file_data,
- gboolean view)
+static void
+_gth_browser_load_file_more_options (GthBrowser *browser,
+ GthFileData *file_data,
+ gboolean view,
+ gboolean fullscreen,
+ gboolean no_delay)
{
LoadFileData *data;
@@ -6304,8 +6356,8 @@ gth_browser_load_file (GthBrowser *browser,
browser->priv->load_metadata_timeout = 0;
}
- data = load_file_data_new (browser, file_data, view);
- if (view) {
+ data = load_file_data_new (browser, file_data, view, fullscreen);
+ if (no_delay) {
load_file_delayed_cb (data);
load_file_data_unref (data);
}
@@ -6319,6 +6371,33 @@ gth_browser_load_file (GthBrowser *browser,
}
+static void
+_gth_browser_load_file_keep_view (GthBrowser *browser,
+ GthFileData *file_data,
+ gboolean view,
+ gboolean no_delay)
+{
+ gboolean fullscreen;
+
+ if (browser->priv->view_files_in_fullscreen && gth_browser_get_is_fullscreen (browser))
+ view = FALSE;
+ else if (gth_window_get_current_page (GTH_WINDOW (browser)) == GTH_BROWSER_PAGE_VIEWER)
+ view = FALSE;
+ fullscreen = view && browser->priv->view_files_in_fullscreen;
+
+ _gth_browser_load_file_more_options (browser, file_data, view,
browser->priv->view_files_in_fullscreen, no_delay);
+}
+
+
+void
+gth_browser_load_file (GthBrowser *browser,
+ GthFileData *file_data,
+ gboolean view)
+{
+ _gth_browser_load_file_keep_view (browser, file_data, view, FALSE);
+}
+
+
void
gth_browser_show_file_properties (GthBrowser *browser)
{
@@ -6617,32 +6696,51 @@ gth_browser_fullscreen (GthBrowser *browser)
return;
}
+ if (browser->priv->current_file == NULL) {
+ if (! gth_browser_show_first_image (browser, FALSE, FALSE)) {
+ browser->priv->fullscreen = FALSE;
+ return;
+ }
+ }
+
browser->priv->was_fullscreen = FALSE;
browser->priv->fullscreen = TRUE;
+ if (browser->priv->fullscreen_headerbar == NULL) {
+ browser->priv->fullscreen_headerbar = gth_window_get_header_bar (GTH_WINDOW (browser));
+
+ gtk_widget_set_margin_top (browser->priv->viewer_sidebar_alignment,
+ gtk_widget_get_allocated_height
(browser->priv->fullscreen_headerbar));
+
+ g_object_ref (browser->priv->fullscreen_headerbar);
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent
(browser->priv->fullscreen_headerbar)), browser->priv->fullscreen_headerbar);
+ gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (browser->priv->fullscreen_headerbar),
FALSE);
+ gtk_box_pack_start (GTK_BOX (browser->priv->fullscreen_toolbar),
browser->priv->fullscreen_headerbar, TRUE, TRUE, 0);
+ g_object_unref (browser->priv->fullscreen_headerbar);
+ }
+
g_list_free (browser->priv->viewer_controls);
browser->priv->viewer_controls = g_list_append (NULL, browser->priv->fullscreen_toolbar);
browser->priv->before_fullscreen.page = gth_window_get_current_page (GTH_WINDOW (browser));
- browser->priv->before_fullscreen.viewer_properties = gth_window_get_action_state (GTH_WINDOW
(browser), "viewer-properties");
- browser->priv->before_fullscreen.viewer_tools = gth_window_get_action_state (GTH_WINDOW (browser),
"viewer-edit-file");
browser->priv->before_fullscreen.thumbnail_list = gth_window_get_action_state (GTH_WINDOW (browser),
"show-thumbnail-list");
browser->priv->before_fullscreen.browser_properties = gth_window_get_action_state (GTH_WINDOW
(browser), "browser-properties");
-
- if (browser->priv->current_file == NULL)
- if (! gth_browser_show_first_image (browser, FALSE, FALSE)) {
- browser->priv->fullscreen = FALSE;
- return;
- }
+ browser->priv->before_fullscreen.viewer_sidebar = browser->priv->viewer_sidebar;
gth_window_set_current_page (GTH_WINDOW (browser), GTH_BROWSER_PAGE_VIEWER);
- gth_browser_hide_sidebar (browser);
- _gth_browser_set_thumbnail_list_visibility (browser, FALSE);
+ if (browser->priv->fullscreen_state.sidebar == GTH_SIDEBAR_STATE_PROPERTIES)
+ gth_browser_show_file_properties (browser);
+ else if (browser->priv->fullscreen_state.sidebar == GTH_SIDEBAR_STATE_TOOLS)
+ gth_browser_show_viewer_tools (browser);
+ else
+ gth_browser_hide_sidebar (browser);
+ _gth_browser_set_thumbnail_list_visibility (browser, browser->priv->fullscreen_state.thumbnail_list);
gth_window_show_only_content (GTH_WINDOW (browser), TRUE);
browser->priv->properties_on_screen = FALSE;
gtk_window_fullscreen (GTK_WINDOW (browser));
+
if (browser->priv->viewer_page != NULL) {
gth_viewer_page_show_properties (browser->priv->viewer_page,
browser->priv->properties_on_screen);
gth_viewer_page_fullscreen (browser->priv->viewer_page, TRUE);
@@ -6660,22 +6758,39 @@ gth_browser_unfullscreen (GthBrowser *browser)
browser->priv->was_fullscreen = TRUE;
browser->priv->fullscreen = FALSE;
+ if (browser->priv->fullscreen_headerbar != NULL) {
+ g_object_ref (browser->priv->fullscreen_headerbar);
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent
(browser->priv->fullscreen_headerbar)), browser->priv->fullscreen_headerbar);
+ gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (browser->priv->fullscreen_headerbar),
TRUE);
+ gth_window_set_header_bar (GTH_WINDOW (browser), browser->priv->fullscreen_headerbar);
+ g_object_unref (browser->priv->fullscreen_headerbar);
+ browser->priv->fullscreen_headerbar = NULL;
+ }
+ gtk_widget_set_margin_top (browser->priv->viewer_sidebar_alignment, 0);
gtk_widget_hide (browser->priv->fullscreen_toolbar);
gth_window_show_only_content (GTH_WINDOW (browser), FALSE);
+
+ browser->priv->fullscreen_state.sidebar = browser->priv->viewer_sidebar;
+ browser->priv->fullscreen_state.thumbnail_list = gth_window_get_action_state (GTH_WINDOW (browser),
"show-thumbnail-list");
+
+ if (browser->priv->before_fullscreen.page < 0)
+ browser->priv->before_fullscreen.page = GTH_BROWSER_PAGE_BROWSER;
gth_window_set_current_page (GTH_WINDOW (browser), browser->priv->before_fullscreen.page);
+
_gth_browser_set_thumbnail_list_visibility (browser, browser->priv->before_fullscreen.thumbnail_list);
if (browser->priv->before_fullscreen.page == GTH_BROWSER_PAGE_BROWSER) {
+ browser->priv->viewer_sidebar = browser->priv->before_fullscreen.viewer_sidebar;
if (browser->priv->before_fullscreen.browser_properties)
gth_browser_show_file_properties (browser);
else
gth_browser_hide_sidebar (browser);
}
else if (browser->priv->before_fullscreen.page == GTH_BROWSER_PAGE_VIEWER) {
- if (browser->priv->before_fullscreen.viewer_properties)
+ if (browser->priv->before_fullscreen.viewer_sidebar == GTH_SIDEBAR_STATE_PROPERTIES)
gth_browser_show_file_properties (browser);
- else if (browser->priv->before_fullscreen.viewer_tools)
+ else if (browser->priv->before_fullscreen.viewer_sidebar == GTH_SIDEBAR_STATE_TOOLS)
gth_browser_show_viewer_tools (browser);
else
gth_browser_hide_sidebar (browser);
@@ -6693,8 +6808,6 @@ gth_browser_unfullscreen (GthBrowser *browser)
g_list_free (browser->priv->viewer_controls);
browser->priv->viewer_controls = NULL;
- gtk_alignment_set_padding (GTK_ALIGNMENT (browser->priv->viewer_sidebar_alignment), 0, 0, 0, 0);
-
gth_browser_update_sensitivity (browser);
browser->priv->was_fullscreen = browser->priv->fullscreen;
}
@@ -6764,7 +6877,7 @@ gth_browser_restore_state (GthBrowser *browser)
browser->priv->state.current_file);
}
else {
- _gth_browser_load_file (browser, NULL, FALSE);
+ _gth_browser_load_file_more_options (browser, NULL, FALSE, FALSE, FALSE);
gth_browser_go_to_with_state (browser,
browser->priv->state.location,
browser->priv->state.selected,
@@ -6834,6 +6947,13 @@ gth_browser_get_screen_profile (GthBrowser *browser)
}
+GtkWidget *
+gth_browser_get_fullscreen_headerbar (GthBrowser *browser)
+{
+ return browser->priv->fullscreen_headerbar;
+}
+
+
GMenuItem *
_g_menu_item_new_for_file (GFile *file,
const char *custom_label)
diff --git a/gthumb/gth-browser.h b/gthumb/gth-browser.h
index 88ca066..18180df 100644
--- a/gthumb/gth-browser.h
+++ b/gthumb/gth-browser.h
@@ -263,6 +263,8 @@ void gth_browser_save_state (GthBrowser *browser);
gboolean gth_browser_restore_state (GthBrowser *browser);
void gth_browser_apply_editor_changes (GthBrowser *browser);
GthICCProfile gth_browser_get_screen_profile (GthBrowser *browser);
+GtkWidget * gth_browser_get_fullscreen_headerbar
+ (GthBrowser *browser);
/* utilities */
diff --git a/gthumb/gth-grid-view.c b/gthumb/gth-grid-view.c
index 6c1d9e8..a40283c 100644
--- a/gthumb/gth-grid-view.c
+++ b/gthumb/gth-grid-view.c
@@ -2692,7 +2692,7 @@ _gth_grid_view_select_single (GthGridView *self,
self->priv->last_selected_pos = pos;
self->priv->last_selected_item = item;
- if (self->priv->activate_on_single_click)
+ if (self->priv->activate_on_single_click && ((event->state & GDK_MOD1_MASK) == 0))
self->priv->activate_pending = TRUE;
}
@@ -2762,8 +2762,9 @@ gth_grid_view_button_press (GtkWidget *widget,
if ((pos != -1) && (event->button == 1) && (event->type == GDK_2BUTTON_PRESS)) {
/* Double click activates the item */
- if (((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
- && ((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK))
+ if (! (event->state & GDK_CONTROL_MASK)
+ && ! (event->state & GDK_SHIFT_MASK)
+ && ! (event->state & GDK_MOD1_MASK))
{
gth_file_view_activated (GTH_FILE_VIEW (self), pos);
}
@@ -2774,6 +2775,7 @@ gth_grid_view_button_press (GtkWidget *widget,
if (! (event->state & GDK_CONTROL_MASK)
&& ! (event->state & GDK_SHIFT_MASK)
+ && ! (event->state & GDK_MOD1_MASK)
&& self->priv->drag_source_enabled)
{
self->priv->dragging = TRUE;
@@ -2788,6 +2790,7 @@ gth_grid_view_button_press (GtkWidget *widget,
if (! (event->state & GDK_CONTROL_MASK)
&& ! (event->state & GDK_SHIFT_MASK)
+ && ! (event->state & GDK_MOD1_MASK)
&& self->priv->drag_source_enabled)
{
self->priv->dragging = TRUE;
@@ -3043,8 +3046,8 @@ gth_grid_view_button_release (GtkWidget *widget,
_gth_grid_view_set_item_selected_and_emit_signal (self, TRUE, self->priv->select_pending_pos);
self->priv->last_selected_pos = self->priv->select_pending_pos;
self->priv->last_selected_item = self->priv->select_pending_item;
- if (self->priv->activate_on_single_click)
- gth_file_view_activated (GTH_FILE_VIEW (self), self->priv->last_selected_pos);
+ if (self->priv->activate_on_single_click && ((event->state & GDK_MOD1_MASK) == 0))
+ self->priv->activate_pending = TRUE;
}
if (self->priv->activate_pending) {
diff --git a/gthumb/gth-preferences.h b/gthumb/gth-preferences.h
index d28937c..b5816b8 100644
--- a/gthumb/gth-preferences.h
+++ b/gthumb/gth-preferences.h
@@ -62,6 +62,7 @@ G_BEGIN_DECLS
#define PREF_BROWSER_THUMBNAIL_LIMIT "thumbnail-limit"
#define PREF_BROWSER_THUMBNAIL_CAPTION "thumbnail-caption"
#define PREF_BROWSER_SINGLE_CLICK_ACTIVATION "single-click-activation"
+#define PREF_BROWSER_OPEN_FILES_IN_FULLSCREEN "open-files-in-fullscreen"
#define PREF_BROWSER_SORT_TYPE "sort-type"
#define PREF_BROWSER_SORT_INVERSE "sort-inverse"
#define PREF_BROWSER_WINDOW_WIDTH "window-width"
@@ -79,6 +80,9 @@ G_BEGIN_DECLS
#define PREF_BROWSER_VIEWER_THUMBNAILS_ORIENT "viewer-thumbnails-orientation"
#define PREF_BROWSER_REUSE_ACTIVE_WINDOW "reuse-active-window"
+#define PREF_FULLSCREEN_THUMBNAILS_VISIBLE "fullscreen-thumbnails-visible"
+#define PREF_FULLSCREEN_SIDEBAR "fullscreen-sidebar"
+
/* keys: add to catalog */
#define PREF_ADD_TO_CATALOG_LAST_CATALOG "last-catalog"
diff --git a/gthumb/gth-window.c b/gthumb/gth-window.c
index ef8a8c6..62bf802 100644
--- a/gthumb/gth-window.c
+++ b/gthumb/gth-window.c
@@ -41,8 +41,10 @@ struct _GthWindowPrivate {
int n_pages;
gboolean use_header_bar;
int current_page;
+ GtkWidget *overlay;
GtkWidget *grid;
GtkWidget *stack;
+ GtkWidget *headerbar_container;
GtkWidget *headerbar;
GtkWidget *title;
GtkWidget *menubar;
@@ -58,6 +60,25 @@ struct _GthWindowPrivate {
};
+static gboolean
+overlay_get_child_position_cb (GtkOverlay *overlay,
+ GtkWidget *widget,
+ GdkRectangle *allocation,
+ gpointer user_data)
+{
+ GtkAllocation main_alloc;
+
+ gtk_widget_get_allocation (gtk_bin_get_child (GTK_BIN (overlay)), &main_alloc);
+
+ allocation->x = 0;
+ allocation->y = 0;
+ allocation->width = main_alloc.width;
+ gtk_widget_get_preferred_height (widget, NULL, &allocation->height);
+
+ return TRUE;
+}
+
+
static void
gth_window_set_n_pages (GthWindow *self,
int n_pages)
@@ -71,9 +92,19 @@ gth_window_set_n_pages (GthWindow *self,
self->priv->n_pages = n_pages;
+ self->priv->overlay = gtk_overlay_new ();
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->overlay), "window-overlay");
+ gtk_widget_show (self->priv->overlay);
+ gtk_container_add (GTK_CONTAINER (self), self->priv->overlay);
+
+ g_signal_connect (self->priv->overlay,
+ "get-child-position",
+ G_CALLBACK (overlay_get_child_position_cb),
+ self);
+
self->priv->grid = gtk_grid_new ();
gtk_widget_show (self->priv->grid);
- gtk_container_add (GTK_CONTAINER (self), self->priv->grid);
+ gtk_container_add (GTK_CONTAINER (self->priv->overlay), self->priv->grid);
self->priv->stack = gtk_stack_new ();
gtk_stack_set_transition_type (GTK_STACK (self->priv->stack), GTK_STACK_TRANSITION_TYPE_CROSSFADE);
@@ -116,6 +147,8 @@ _gth_window_add_header_bar (GthWindow *self)
gtk_widget_show (self->priv->headerbar);
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (self->priv->headerbar), TRUE);
+ g_object_add_weak_pointer (G_OBJECT (self->priv->headerbar), &self->priv->headerbar);
+
#if GTK_CHECK_VERSION(3,12,0)
{
gboolean shell_shows_app_menu;
@@ -145,7 +178,12 @@ _gth_window_add_header_bar (GthWindow *self)
self->priv->title = gth_window_title_new ();
gtk_widget_show (self->priv->title);
gtk_header_bar_set_custom_title (GTK_HEADER_BAR (self->priv->headerbar), self->priv->title);
- gtk_window_set_titlebar (GTK_WINDOW (self), self->priv->headerbar);
+
+ self->priv->headerbar_container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_widget_show (self->priv->headerbar_container);
+ gtk_box_pack_start (GTK_BOX (self->priv->headerbar_container), self->priv->headerbar, TRUE, TRUE, 0);
+
+ gtk_window_set_titlebar (GTK_WINDOW (self), self->priv->headerbar_container);
}
@@ -452,6 +490,10 @@ void
gth_window_set_current_page (GthWindow *window,
int page)
{
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (GTH_IS_WINDOW (window));
+ g_return_if_fail (page >= 0 && page < window->priv->n_pages);
+
GTH_WINDOW_GET_CLASS (window)->set_current_page (window, page);
}
@@ -527,6 +569,28 @@ gth_window_get_area (GthWindow *window,
}
+void
+gth_window_add_overlay (GthWindow *window,
+ GtkWidget *widget)
+{
+ gtk_overlay_add_overlay (GTK_OVERLAY (window->priv->overlay), widget);
+}
+
+
+void
+gth_window_set_header_bar (GthWindow *window,
+ GtkWidget *header_bar)
+{
+ if (window->priv->headerbar != header_bar) {
+ if (window->priv->headerbar != NULL)
+ gtk_widget_destroy (window->priv->headerbar);
+ window->priv->headerbar = header_bar;
+ }
+ gtk_widget_show (window->priv->headerbar);
+ gtk_box_pack_start (GTK_BOX (window->priv->headerbar_container), window->priv->headerbar, TRUE, TRUE,
0);
+}
+
+
GtkWidget *
gth_window_get_header_bar (GthWindow *window)
{
diff --git a/gthumb/gth-window.h b/gthumb/gth-window.h
index 5988457..366c07f 100644
--- a/gthumb/gth-window.h
+++ b/gthumb/gth-window.h
@@ -88,6 +88,10 @@ void gth_window_show_only_content (GthWindow *window,
gboolean only_content);
GtkWidget * gth_window_get_area (GthWindow *window,
GthWindowArea area);
+void gth_window_add_overlay (GthWindow *window,
+ GtkWidget *widget);
+void gth_window_set_header_bar (GthWindow *window,
+ GtkWidget *header_bar);
GtkWidget * gth_window_get_header_bar (GthWindow *window);
void gth_window_save_page_size (GthWindow *window,
int page,
diff --git a/gthumb/resources/gthumb.css b/gthumb/resources/gthumb.css
index 8e799ff..7be66d4 100644
--- a/gthumb/resources/gthumb.css
+++ b/gthumb/resources/gthumb.css
@@ -145,3 +145,11 @@ GthToolbox .header-bar {
box-shadow: none;
background-image: none;
}
+
+/* -- header-bar in fullscreen -- */
+
+.window-overlay .header-bar {
+ border-radius: 0;
+ box-shadow: none;
+ background-image: none;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]