diff --git a/ChangeLog b/ChangeLog index 33ada90e140428b4f6d29767624a16f6f0a3a6f6..eb4adc2c494482906cfcf4eec356765022633630 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-02-25 Alexander Larsson + + * libnautilus-private/nautilus-icon-container.[ch]: + * src/file-manager/fm-directory-view.[ch]: + * src/file-manager/fm-icon-view.c: + Fixes the icon position when creating a new folder, + and the view is zoomed. + Patch from Christian Neumair + 2008-02-25 Alexander Larsson * libnautilus-private/nautilus-icon-info.c (nautilus_icon_info_new_for_icon_info): diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index e5b48fe47e0554451225ce03bcb72a162f94d9f7..20bc2527519e43ea51681bb2fb79d9c5630e3cd6 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -7949,6 +7949,27 @@ nautilus_icon_container_accessible_select_all_selection (AtkSelection *accessibl return TRUE; } +void +nautilus_icon_container_widget_to_file_operation_position (NautilusIconContainer *container, + GdkPoint *position) +{ + double x, y; + + g_return_if_fail (position != NULL); + + x = position->x; + y = position->y; + + eel_canvas_window_to_world (EEL_CANVAS (container), x, y, &x, &y); + + position->x = (int) x; + position->y = (int) y; + + /* ensure that we end up in the middle of the icon */ + position->x -= nautilus_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; + position->y -= nautilus_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; +} + static void nautilus_icon_container_accessible_selection_interface_init (AtkSelectionIface *iface) { diff --git a/libnautilus-private/nautilus-icon-container.h b/libnautilus-private/nautilus-icon-container.h index 7f0bbc3031d64d2bc395e836c45f96c0ae8f67f7..03d64c1d7a4b219bcd4582d3534866580477bd1f 100644 --- a/libnautilus-private/nautilus-icon-container.h +++ b/libnautilus-private/nautilus-icon-container.h @@ -304,6 +304,10 @@ void nautilus_icon_container_set_allow_moves (Nautilu gboolean nautilus_icon_container_is_layout_rtl (NautilusIconContainer *container); +void nautilus_icon_container_widget_to_file_operation_position (NautilusIconContainer *container, + GdkPoint *position); + + #define CANVAS_WIDTH(container) ((GTK_WIDGET (container)->allocation.width \ - container->details->left_margin \ - container->details->right_margin) \ diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index 0f56cbe11cc877237de0e002edf67eb267ec8a5c..382d9a8316d3149be615c70c87561d0cb67a77ee 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -3819,6 +3819,9 @@ context_menu_to_file_operation_position (FMDirectoryView *directory_view) if (fm_directory_view_using_manual_layout (directory_view) && directory_view->details->context_menu_position.x >= 0 && directory_view->details->context_menu_position.y >= 0) { + EEL_CALL_METHOD (FM_DIRECTORY_VIEW_CLASS, directory_view, + widget_to_file_operation_position, + (directory_view, &directory_view->details->context_menu_position)); return &directory_view->details->context_menu_position; } else { return NULL; diff --git a/src/file-manager/fm-directory-view.h b/src/file-manager/fm-directory-view.h index 3390134b75134792a7299d51c56cefff32323191..6dd93822d0f5627bf8448ac4c11307ae9f4d9979 100644 --- a/src/file-manager/fm-directory-view.h +++ b/src/file-manager/fm-directory-view.h @@ -297,6 +297,15 @@ struct FMDirectoryViewClass { NautilusFile *file, NautilusDirectory *directory); + /* convert *point from widget's coordinate system to a coordinate + * system used for specifying file operation positions, which is view-specific. + * + * This is used by the the icon view, which converts the screen position to a zoom + * level-independent coordinate system. + */ + void (* widget_to_file_operation_position) (FMDirectoryView *view, + GdkPoint *position); + /* Preference change callbacks, overriden by icon and list views. * Icon and list views respond by synchronizing to the new preference * values and forcing an update if appropriate. diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index e10f266d1c8a3ded89ea6fdb971cbae7ada3d79a..7be3640aef9c6531ca8e25ff0503af40145193ec 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -1682,6 +1682,16 @@ fm_icon_view_using_manual_layout (FMDirectoryView *view) return !fm_icon_view_using_auto_layout (FM_ICON_VIEW (view)); } +static void +fm_icon_view_widget_to_file_operation_position (FMDirectoryView *view, + GdkPoint *position) +{ + g_assert (FM_IS_ICON_VIEW (view)); + + nautilus_icon_container_widget_to_file_operation_position + (get_icon_container (FM_ICON_VIEW (view)), position); +} + static void icon_container_activate_callback (NautilusIconContainer *container, GList *file_list, @@ -2600,6 +2610,7 @@ fm_icon_view_class_init (FMIconViewClass *klass) fm_directory_view_class->text_attribute_names_changed = fm_icon_view_text_attribute_names_changed; fm_directory_view_class->update_menus = fm_icon_view_update_menus; fm_directory_view_class->using_manual_layout = fm_icon_view_using_manual_layout; + fm_directory_view_class->widget_to_file_operation_position = fm_icon_view_widget_to_file_operation_position; klass->clean_up = fm_icon_view_real_clean_up; klass->supports_auto_layout = real_supports_auto_layout;