Commit bd8931b3 authored by Christian Neumair's avatar Christian Neumair Committed by Christian Neumair

Consolidate zoom handling. Add nautilus_window_sync_zoom_level(), and

2008-08-06  Christian Neumair  <cneumair@gnome.org>

	* src/nautilus-navigation-window.c (real_sync_zoom_widgets),
	(nautilus_navigation_window_class_init):
	* src/nautilus-window-manage-views.c (create_content_view),
	(location_has_really_changed), (update_for_new_location),
	(free_location_change), (nautilus_window_report_view_failed),
	(nautilus_window_manage_views_destroy),
	(nautilus_window_manage_views_close_slot):
	* src/nautilus-window-private.h:
	* src/nautilus-window-slot.c (real_active),
	(title_changed_callback),
	(nautilus_window_slot_connect_content_view),
	(nautilus_window_slot_disconnect_content_view),
	(nautilus_window_slot_set_content_view_widget):
	* src/nautilus-window-slot.h:
	* src/nautilus-window.c (nautilus_window_set_active_slot),
	(real_sync_zoom_widgets), (nautilus_window_sync_zoom_widgets),
	(zoom_level_changed_callback),
	(nautilus_window_connect_content_view),
	(nautilus_window_disconnect_content_view),
	(nautilus_window_class_init):
	* src/nautilus-window.h:
	Consolidate zoom handling. Add nautilus_window_sync_zoom_level(),
	and sync_zoom_level() method to NautilusWindow. Use it to sync both
	the menu state, and the toolbar state. Remove NautilusWindow's
	(dis)connect_content_view(), and use unified code in
	nautilus_window_(dis)connect_content_view(), wrapped by
	nautilus_window_slot_(dis)connect_content_view(), which also handles
	the (notebook) title sync. Fixes #546333.

svn path=/trunk/; revision=14454
parent c0a2bfa0
2008-08-06 Christian Neumair <cneumair@gnome.org>
* src/nautilus-navigation-window.c (real_sync_zoom_widgets),
(nautilus_navigation_window_class_init):
* src/nautilus-window-manage-views.c (create_content_view),
(location_has_really_changed), (update_for_new_location),
(free_location_change), (nautilus_window_report_view_failed),
(nautilus_window_manage_views_destroy),
(nautilus_window_manage_views_close_slot):
* src/nautilus-window-private.h:
* src/nautilus-window-slot.c (real_active),
(title_changed_callback),
(nautilus_window_slot_connect_content_view),
(nautilus_window_slot_disconnect_content_view),
(nautilus_window_slot_set_content_view_widget):
* src/nautilus-window-slot.h:
* src/nautilus-window.c (nautilus_window_set_active_slot),
(real_sync_zoom_widgets), (nautilus_window_sync_zoom_widgets),
(zoom_level_changed_callback),
(nautilus_window_connect_content_view),
(nautilus_window_disconnect_content_view),
(nautilus_window_class_init):
* src/nautilus-window.h:
Consolidate zoom handling. Add nautilus_window_sync_zoom_level(),
and sync_zoom_level() method to NautilusWindow. Use it to sync both
the menu state, and the toolbar state. Remove NautilusWindow's
(dis)connect_content_view(), and use unified code in
nautilus_window_(dis)connect_content_view(), wrapped by
nautilus_window_slot_(dis)connect_content_view(), which also handles
the (notebook) title sync. Fixes #546333.
2008-08-06 Cosimo Cecchi <cosimoc@gnome.org>
* src/nautilus-bookmarks-window.c: (on_selection_changed),
......
......@@ -1224,78 +1224,6 @@ real_get_icon (NautilusWindow *window,
return nautilus_icon_info_lookup_from_name ("system-file-manager", 48);
}
static void
zoom_level_changed_callback (NautilusView *view,
NautilusNavigationWindow *window)
{
g_assert (NAUTILUS_WINDOW (window)->details->active_slot->content_view == view);
/* This is called each time the component successfully completed
* a zooming operation.
*/
nautilus_zoom_control_set_zoom_level (NAUTILUS_ZOOM_CONTROL (window->zoom_control),
nautilus_view_get_zoom_level (view));
}
static void
real_connect_content_view (NautilusWindow *nautilus_window,
NautilusView *view)
{
NautilusNavigationWindow *window;
NautilusWindowSlot *slot;
window = NAUTILUS_NAVIGATION_WINDOW (nautilus_window);
slot = nautilus_window->details->active_slot;
EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS,
connect_content_view,
(nautilus_window, view));
g_signal_connect (view, "zoom_level_changed",
G_CALLBACK (zoom_level_changed_callback),
window);
if (nautilus_view_supports_zooming (view)) {
gtk_widget_show (window->zoom_control);
} else {
gtk_widget_hide (window->zoom_control);
}
/* Update displayed view in menu. Only do this if we're not switching
* locations though, because if we are switching locations we'll
* install a whole new set of views in the menu later (the current
* views in the menu are for the old location).
*/
if (slot->pending_location == NULL) {
load_view_as_menu (nautilus_window);
}
}
static void
real_disconnect_content_view (NautilusWindow *nautilus_window,
NautilusView *view)
{
NautilusNavigationWindow *window;
window = NAUTILUS_NAVIGATION_WINDOW (nautilus_window);
EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS,
disconnect_content_view,
(nautilus_window, view));
g_signal_handlers_disconnect_by_func
(view,
G_CALLBACK (zoom_level_changed_callback),
window);
if (window->zoom_control != NULL) {
/* if we run in destroy(), the
* zoom control is already gone
*/
gtk_widget_hide (window->zoom_control);
}
}
static void
real_sync_allow_stop (NautilusWindow *window,
NautilusWindowSlot *slot)
......@@ -1563,6 +1491,50 @@ real_sync_search_widgets (NautilusWindow *window)
}
}
static void
real_sync_zoom_widgets (NautilusWindow *nautilus_window)
{
NautilusNavigationWindow *window;
NautilusWindowSlot *slot;
NautilusView *view;
gboolean supports_zooming, can_zoom;
window = NAUTILUS_NAVIGATION_WINDOW (nautilus_window);
slot = nautilus_window->details->active_slot;
view = slot->content_view;
EEL_CALL_PARENT (NAUTILUS_WINDOW_CLASS,
sync_zoom_widgets, (nautilus_window));
if (view == NULL) {
/* don't toggle UI state at all. This might be
* wrong, but it prevents flickering when opening
* a new tab and immediately switching to it -
* before view selection.
*/
return;
}
supports_zooming = nautilus_view_supports_zooming (view);
can_zoom = supports_zooming &&
nautilus_view_get_zoom_level (view) != 0.0;
if (window->zoom_control != NULL) {
if (supports_zooming) {
gtk_widget_set_sensitive (window->zoom_control, can_zoom);
gtk_widget_show (window->zoom_control);
if (can_zoom) {
nautilus_zoom_control_set_zoom_level (NAUTILUS_ZOOM_CONTROL (window->zoom_control),
nautilus_view_get_zoom_level (view));
}
} else {
gtk_widget_hide (window->zoom_control);
}
}
}
static void
side_panel_image_changed_callback (NautilusSidebar *side_panel,
gpointer callback_data)
......@@ -2017,11 +1989,10 @@ nautilus_navigation_window_class_init (NautilusNavigationWindowClass *class)
GTK_WIDGET_CLASS (class)->window_state_event = nautilus_navigation_window_state_event;
GTK_WIDGET_CLASS (class)->key_press_event = nautilus_navigation_window_key_press_event;
NAUTILUS_WINDOW_CLASS (class)->load_view_as_menu = real_load_view_as_menu;
NAUTILUS_WINDOW_CLASS (class)->connect_content_view = real_connect_content_view;
NAUTILUS_WINDOW_CLASS (class)->disconnect_content_view = real_disconnect_content_view;
NAUTILUS_WINDOW_CLASS (class)->sync_allow_stop = real_sync_allow_stop;
NAUTILUS_WINDOW_CLASS (class)->prompt_for_location = real_prompt_for_location;
NAUTILUS_WINDOW_CLASS (class)->sync_search_widgets = real_sync_search_widgets;
NAUTILUS_WINDOW_CLASS (class)->sync_zoom_widgets = real_sync_zoom_widgets;
NAUTILUS_WINDOW_CLASS (class)->sync_title = real_sync_title;
NAUTILUS_WINDOW_CLASS (class)->get_icon = real_get_icon;
NAUTILUS_WINDOW_CLASS (class)->get_default_size = real_get_default_size;
......
......@@ -82,10 +82,6 @@
*/
#define MAX_URI_IN_DIALOG_LENGTH 60
static void slot_connect_view (NautilusWindowSlot *slot,
NautilusView *view);
static void slot_disconnect_view (NautilusWindowSlot *slot,
NautilusView *view);
static void begin_location_change (NautilusWindowSlot *slot,
GFile *location,
GList *new_selection,
......@@ -110,8 +106,6 @@ static void load_new_location (NautilusWindowSlot
gboolean tell_new_content_view);
static void location_has_really_changed (NautilusWindowSlot *slot);
static void update_for_new_location (NautilusWindowSlot *slot);
static void zoom_parameters_changed_callback (NautilusView *view,
NautilusWindowSlot *window);
void
nautilus_window_report_selection_changed (NautilusWindowInfo *window)
......@@ -1194,7 +1188,6 @@ create_content_view (NautilusWindowSlot *slot,
NautilusWindow *window;
NautilusView *view;
GList *selection;
GtkAction *action;
window = slot->window;
......@@ -1209,16 +1202,6 @@ create_content_view (NautilusWindowSlot *slot,
*/
view_id = NAUTILUS_DESKTOP_ICON_VIEW_IID;
}
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_IN);
gtk_action_set_sensitive (action, FALSE);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_OUT);
gtk_action_set_sensitive (action, FALSE);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_NORMAL);
gtk_action_set_sensitive (action, FALSE);
if (slot->content_view != NULL &&
eel_strcmp (nautilus_view_get_view_id (slot->content_view),
......@@ -1234,10 +1217,9 @@ create_content_view (NautilusWindowSlot *slot,
eel_accessibility_set_name (view, _("Content View"));
eel_accessibility_set_description (view, _("View of the current folder"));
slot_connect_view (slot, view);
slot->new_content_view = view;
nautilus_window_slot_connect_content_view (slot, slot->new_content_view);
}
/* Actually load the pending location and selection: */
......@@ -1395,7 +1377,9 @@ location_has_really_changed (NautilusWindowSlot *slot)
widget = nautilus_view_get_widget (slot->new_content_view);
/* Switch to the new content view. */
if (widget->parent == NULL) {
slot_disconnect_view (slot, slot->content_view);
if (slot->content_view != NULL) {
nautilus_window_slot_disconnect_content_view (slot, slot->content_view);
}
nautilus_window_slot_set_content_view_widget (slot, slot->new_content_view);
}
g_object_unref (slot->new_content_view);
......@@ -1635,12 +1619,9 @@ update_for_new_location (NautilusWindowSlot *slot)
/* Check if we can go up. */
update_up_button (window);
}
/* Set up the initial zoom levels */
zoom_parameters_changed_callback (slot->content_view,
slot);
if (slot == window->details->active_slot) {
nautilus_window_sync_zoom_widgets (window);
/* Set up the content view menu for this new location. */
nautilus_window_load_view_as_menus (window);
......@@ -1786,7 +1767,7 @@ free_location_change (NautilusWindowSlot *slot)
nautilus_view_stop_loading (slot->new_content_view);
window->details->temporarily_ignore_view_signals = FALSE;
slot_disconnect_view (slot, slot->new_content_view);
nautilus_window_slot_disconnect_content_view (slot, slot->new_content_view);
g_object_unref (slot->new_content_view);
slot->new_content_view = NULL;
}
......@@ -1839,7 +1820,7 @@ nautilus_window_report_view_failed (NautilusWindow *window,
fallback_load_location = NULL;
if (view == slot->content_view) {
slot_disconnect_view (slot, slot->content_view);
nautilus_window_slot_disconnect_content_view (slot, view);
nautilus_window_slot_set_content_view_widget (slot, NULL);
report_current_content_view_failure_to_user (slot);
......@@ -2037,123 +2018,6 @@ nautilus_window_slot_set_content_view (NautilusWindowSlot *slot,
create_content_view (slot, id);
}
static void
zoom_level_changed_callback (NautilusView *view,
NautilusWindowSlot *slot)
{
NautilusWindow *window;
GtkAction *action;
gboolean supports_zooming;
window = slot->window;
g_assert (NAUTILUS_IS_WINDOW (window));
if (slot != nautilus_window_get_active_slot (window)) {
return;
}
/* This is called each time the component successfully completed
* a zooming operation.
*/
supports_zooming = nautilus_view_supports_zooming (view);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_IN);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action,
nautilus_view_can_zoom_in (view));
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_OUT);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action,
nautilus_view_can_zoom_out (view));
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_NORMAL);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action, supports_zooming);
}
static void
zoom_parameters_changed_callback (NautilusView *view,
NautilusWindowSlot *slot)
{
NautilusWindow *window;
float zoom_level;
GtkAction *action;
window = slot->window;
g_assert (NAUTILUS_IS_WINDOW (window));
if (slot != window->details->active_slot) {
return;
}
/* The initial zoom level of a component is allowed to be 0.0 if
* there is no file loaded yet. In this case we need to set the
* commands insensitive but display the zoom control nevertheless
* (the component is just temporarily unable to zoom, but the
* zoom control will "do the right thing" here).
*/
zoom_level = nautilus_view_get_zoom_level (view);
if (zoom_level == 0.0) {
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_IN);
gtk_action_set_sensitive (action, FALSE);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_OUT);
gtk_action_set_sensitive (action, FALSE);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_NORMAL);
gtk_action_set_sensitive (action, FALSE);
/* Don't attempt to set 0.0 as zoom level. */
return;
}
/* "zoom_parameters_changed" always implies "zoom_level_changed",
* but you won't get both signals, so we need to pass it down.
*/
zoom_level_changed_callback (view, slot);
}
static void
title_changed_callback (NautilusView *view,
NautilusWindowSlot *slot)
{
g_assert (NAUTILUS_IS_WINDOW (slot->window));
nautilus_window_slot_update_title (slot);
nautilus_window_slot_update_icon (slot);
}
static void
slot_connect_view (NautilusWindowSlot *slot,
NautilusView *view)
{
g_signal_connect (view, "title_changed",
G_CALLBACK (title_changed_callback), slot);
g_signal_connect (view, "zoom_level_changed",
G_CALLBACK (zoom_level_changed_callback), slot);
g_signal_connect (view, "zoom_parameters_changed",
G_CALLBACK (zoom_parameters_changed_callback), slot);
}
static void
slot_disconnect_view (NautilusWindowSlot *slot,
NautilusView *view)
{
if (view == NULL) {
return;
}
g_signal_handlers_disconnect_by_func (view, title_changed_callback, slot);
g_signal_handlers_disconnect_by_func (view, zoom_level_changed_callback, slot);
g_signal_handlers_disconnect_by_func (view, zoom_parameters_changed_callback, slot);
}
void
nautilus_window_manage_views_destroy (NautilusWindow *window)
{
......@@ -2168,10 +2032,10 @@ nautilus_window_manage_views_destroy (NautilusWindow *window)
slot = l->data;
if (slot->content_view != NULL) {
slot_disconnect_view (slot, slot->content_view);
nautilus_window_slot_disconnect_content_view (slot, slot->content_view);
}
if (slot->new_content_view != NULL) {
slot_disconnect_view (slot, slot->new_content_view);
nautilus_window_slot_disconnect_content_view (slot, slot->new_content_view);
}
}
}
......@@ -2180,6 +2044,9 @@ void
nautilus_window_manage_views_close_slot (NautilusWindow *window,
NautilusWindowSlot *slot)
{
if (slot->content_view != NULL) {
nautilus_window_slot_disconnect_content_view (slot, slot->content_view);
}
free_location_change (slot);
cancel_viewed_file_changed_callback (slot);
......
......@@ -224,6 +224,7 @@ void nautilus_window_sync_allow_stop (NautilusWindow *window,
void nautilus_window_sync_title (NautilusWindow *window,
NautilusWindowSlot *slot);
void nautilus_window_sync_location_widgets (NautilusWindow *window);
void nautilus_window_sync_zoom_widgets (NautilusWindow *window);
/* Navigation window menus */
void nautilus_navigation_window_initialize_actions (NautilusNavigationWindow *window);
......
......@@ -114,6 +114,7 @@ real_active (NautilusWindowSlot *slot)
nautilus_window_sync_status (window);
nautilus_window_sync_allow_stop (window, slot);
nautilus_window_sync_title (window, slot);
nautilus_window_sync_zoom_widgets (window);
nautilus_window_sync_location_widgets (window);
nautilus_window_sync_search_widgets (window);
......@@ -359,24 +360,60 @@ nautilus_window_slot_update_icon (NautilusWindowSlot *slot)
}
}
static void
title_changed_callback (NautilusView *view,
NautilusWindowSlot *slot)
{
g_assert (NAUTILUS_IS_WINDOW (slot->window));
nautilus_window_slot_update_title (slot);
nautilus_window_slot_update_icon (slot);
}
void
nautilus_window_slot_connect_content_view (NautilusWindowSlot *slot,
NautilusView *view)
{
NautilusWindow *window;
g_signal_connect (view, "title-changed",
G_CALLBACK (title_changed_callback),
slot);
window = slot->window;
if (window != NULL && slot == nautilus_window_get_active_slot (window)) {
nautilus_window_connect_content_view (window, view);
}
}
void
nautilus_window_slot_disconnect_content_view (NautilusWindowSlot *slot,
NautilusView *view)
{
NautilusWindow *window;
g_signal_handlers_disconnect_by_func (view, G_CALLBACK (title_changed_callback), slot);
window = slot->window;
if (window != NULL && slot == nautilus_window_get_active_slot (window)) {
nautilus_window_disconnect_content_view (window, view);
}
}
void
nautilus_window_slot_set_content_view_widget (NautilusWindowSlot *slot,
NautilusView *new_view)
{
NautilusWindow *window;
GtkWidget *widget;
gboolean inform_window;
window = slot->window;
g_return_if_fail (NAUTILUS_IS_WINDOW (window));
inform_window = slot == window->details->active_slot;
g_assert (NAUTILUS_IS_WINDOW (window));
if (slot->content_view != NULL) {
/* disconnect old view */
if (inform_window) {
nautilus_window_disconnect_content_view (window, slot->content_view);
}
nautilus_window_slot_disconnect_content_view (slot, slot->content_view);
widget = nautilus_view_get_widget (slot->content_view);
gtk_widget_destroy (widget);
......@@ -395,9 +432,7 @@ nautilus_window_slot_set_content_view_widget (NautilusWindowSlot *slot,
g_object_ref (slot->content_view);
/* connect new view */
if (inform_window) {
nautilus_window_connect_content_view (window, new_view);
}
nautilus_window_slot_connect_content_view (slot, new_view);
}
}
......
......@@ -142,6 +142,11 @@ const char *nautilus_window_slot_get_content_view_id (NautilusWindow
gboolean nautilus_window_slot_content_view_matches_iid (NautilusWindowSlot *slot,
const char *iid);
void nautilus_window_slot_connect_content_view (NautilusWindowSlot *slot,
NautilusView *view);
void nautilus_window_slot_disconnect_content_view (NautilusWindowSlot *slot,
NautilusView *view);
#define nautilus_window_slot_go_to(slot,location, new_tab) \
nautilus_window_slot_open_location_full(slot, location, NAUTILUS_WINDOW_OPEN_ACCORDING_TO_MODE, \
(new_tab ? NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB : 0), \
......
......@@ -762,7 +762,7 @@ nautilus_window_set_active_slot (NautilusWindow *window,
if (old_slot != NULL) {
/* inform window */
if (old_slot->content_view != NULL) {
nautilus_window_disconnect_content_view (window, old_slot->content_view);
nautilus_window_slot_disconnect_content_view (old_slot, old_slot->content_view);
}
/* inform slot & view */
......@@ -782,7 +782,7 @@ nautilus_window_set_active_slot (NautilusWindow *window,
if (new_slot->content_view != NULL) {
/* inform window */
nautilus_window_connect_content_view (window, new_slot->content_view);
nautilus_window_slot_connect_content_view (new_slot, new_slot->content_view);
}
/* inform slot & view */
......@@ -1313,55 +1313,112 @@ nautilus_window_sync_title (NautilusWindow *window,
}
static void
real_connect_content_view (NautilusWindow *window,
NautilusView *view)
real_sync_zoom_widgets (NautilusWindow *window)
{
NautilusWindowSlot *slot;
NautilusView *view;
GtkAction *action;
gboolean supports_zooming;
gboolean can_zoom, can_zoom_in, can_zoom_out;
slot = window->details->active_slot;
view = slot->content_view;
/* Update displayed view in menu. Only do this if we're not switching
* locations though, because if we are switching locations we'll
* install a whole new set of views in the menu later (the current
* views in the menu are for the old location).
*/
if (slot->pending_location == NULL) {
nautilus_window_load_view_as_menus (window);
if (view != NULL) {
supports_zooming = nautilus_view_supports_zooming (view);
can_zoom = supports_zooming && nautilus_view_get_zoom_level (view) != 0.0;
can_zoom_in = can_zoom && nautilus_view_can_zoom_in (view);
can_zoom_out = can_zoom && nautilus_view_can_zoom_out (view);
} else {
supports_zooming = FALSE;
can_zoom = FALSE;
can_zoom_in = FALSE;
can_zoom_out = FALSE;
}
nautilus_view_grab_focus (view);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_IN);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action, can_zoom_in);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_OUT);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action, can_zoom_out);
action = gtk_action_group_get_action (window->details->main_action_group,
NAUTILUS_ACTION_ZOOM_NORMAL);
gtk_action_set_visible (action, supports_zooming);
gtk_action_set_sensitive (action, can_zoom);
}
void
nautilus_window_sync_zoom_widgets (NautilusWindow *window)
{
EEL_CALL_METHOD (NAUTILUS_WINDOW_CLASS, window,
sync_zoom_widgets, (window));
}
static void
real_disconnect_content_view (NautilusWindow *window,
NautilusView *view)
zoom_level_changed_callback (NautilusView *view,
NautilusWindow *window)
{
g_assert (NAUTILUS_IS_WINDOW (window));
g_assert (NAUTILUS_IS_VIEW (view));
/* nothing to do... */
/* This is called each time the component in
* the active slot successfully completed
* a zooming operation.
*/
nautilus_window_sync_zoom_widgets (window);
}
/* These are called
* A) when switching the view within the active slot
* B) when switching the active slot
* C) when closing the active slot (disconnect)
*/
void
nautilus_window_connect_content_view (NautilusWindow *window,
NautilusView *view)
{
NautilusWindowSlot *slot;
g_assert (NAUTILUS_IS_WINDOW (window));
g_assert (NAUTILUS_IS_VIEW (view));
EEL_CALL_METHOD (NAUTILUS_WINDOW_CLASS, window,
connect_content_view, (window, view));