diff options
Diffstat (limited to 'src/file-manager/fm-icon-view.c')
| -rw-r--r-- | src/file-manager/fm-icon-view.c | 125 |
1 files changed, 124 insertions, 1 deletions
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index 83517273..c17bedf6 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -38,6 +38,7 @@ #include <sys/wait.h> #include <eel/eel-background.h> +#include <eel/eel-canvas.h> #include <eel/eel-glib-extensions.h> #include <eel/eel-gtk-extensions.h> #include <eel/eel-gtk-macros.h> @@ -48,11 +49,14 @@ #include <libcaja-private/caja-clipboard-monitor.h> #include <libcaja-private/caja-directory-background.h> #include <libcaja-private/caja-directory.h> +#include <libcaja-private/caja-search-directory.h> #include <libcaja-private/caja-dnd.h> #include <libcaja-private/caja-file-utilities.h> #include <libcaja-private/caja-ui-utilities.h> #include <libcaja-private/caja-global-preferences.h> +#include <libcaja-private/caja-icon-canvas-item.h> #include <libcaja-private/caja-icon-container.h> +#include <libcaja-private/caja-icon-private.h> #include <libcaja-private/caja-icon-dnd.h> #include <libcaja-private/caja-link.h> #include <libcaja-private/caja-metadata.h> @@ -201,6 +205,7 @@ static void default_sort_in_reverse_order_changed_callback (gpointer callback_da static void default_use_tighter_layout_changed_callback (gpointer callback_data); static void default_zoom_level_changed_callback (gpointer callback_data); static void labels_beside_icons_changed_callback (gpointer callback_data); +static void display_git_branch_changed_callback (gpointer callback_data); static void all_columns_same_width_changed_callback (gpointer callback_data); static void fm_icon_view_iface_init (CajaViewIface *iface); @@ -265,6 +270,9 @@ fm_icon_view_finalize (GObject *object) g_signal_handlers_disconnect_by_func (caja_icon_view_preferences, labels_beside_icons_changed_callback, icon_view); + g_signal_handlers_disconnect_by_func (caja_icon_view_preferences, + display_git_branch_changed_callback, + icon_view); g_signal_handlers_disconnect_by_func (caja_compact_view_preferences, default_zoom_level_changed_callback, icon_view); @@ -706,6 +714,16 @@ fm_icon_view_supports_labels_beside_icons (FMIconView *view) } static gboolean +fm_icon_view_supports_display_git_branch (FMIconView *view) +{ + g_return_val_if_fail (FM_IS_ICON_VIEW (view), FALSE); + + return EEL_CALL_METHOD_WITH_RETURN_VALUE + (FM_ICON_VIEW_CLASS, view, + supports_display_git_branch, (view)); +} + +static gboolean fm_icon_view_supports_tighter_layout (FMIconView *view) { return !fm_icon_view_is_compact (view); @@ -1184,6 +1202,14 @@ real_supports_labels_beside_icons (FMIconView *view) } static gboolean +real_supports_display_git_branch (FMIconView *view) +{ + g_return_val_if_fail (FM_IS_ICON_VIEW (view), TRUE); + + return TRUE; +} + +static gboolean set_sort_reversed (FMIconView *icon_view, gboolean new_value) { if (icon_view->details->sort_reversed == new_value) @@ -1283,6 +1309,31 @@ set_labels_beside_icons (FMIconView *icon_view) } static void +set_display_git_branch (FMIconView *icon_view) +{ + gboolean git_branch; + + if (fm_icon_view_supports_display_git_branch (icon_view)) + { + git_branch = fm_icon_view_is_compact (icon_view) || + g_settings_get_boolean (caja_icon_view_preferences, CAJA_PREFERENCES_ICON_VIEW_DISPLAY_GIT_BRANCH); + + if (git_branch) + { + caja_display_git_branch_enable + (get_icon_container (icon_view), + CAJA_DISPLAY_GIT_BRANCH_ENABLED); + } + else + { + caja_display_git_branch_enable + (get_icon_container (icon_view), + CAJA_DISPLAY_GIT_BRANCH_DISABLED); + } + } +} + +static void set_columns_same_width (FMIconView *icon_view) { gboolean all_columns_same_width; @@ -1383,6 +1434,7 @@ fm_icon_view_begin_loading (FMDirectoryView *view) fm_icon_view_get_directory_tighter_layout (icon_view, file)); set_labels_beside_icons (icon_view); + set_display_git_branch (icon_view); set_columns_same_width (icon_view); /* We must set auto-layout last, because it invokes the layout_changed @@ -2903,6 +2955,18 @@ labels_beside_icons_changed_callback (gpointer callback_data) } static void +display_git_branch_changed_callback (gpointer callback_data) +{ + FMIconView *icon_view; + + g_return_if_fail (FM_IS_ICON_VIEW (callback_data)); + + icon_view = FM_ICON_VIEW (callback_data); + + set_display_git_branch (icon_view); +} + +static void all_columns_same_width_changed_callback (gpointer callback_data) { FMIconView *icon_view; @@ -3054,6 +3118,58 @@ focus_in_event_callback (GtkWidget *widget, GdkEventFocus *event, gpointer user_ return FALSE; } +static gboolean +icon_container_query_tooltip_callback (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip, + FMIconView *icon_view) +{ + CajaIconContainer *icon_container; + EelCanvasItem *item; + CajaFile *file; + char *location_text; + + /* Only show tooltips in search directories */ + if (!CAJA_IS_SEARCH_DIRECTORY (fm_directory_view_get_model (FM_DIRECTORY_VIEW (icon_view)))) + { + return FALSE; + } + + icon_container = CAJA_ICON_CONTAINER (widget); + + /* Get the canvas item at the cursor position */ + item = eel_canvas_get_item_at (EEL_CANVAS (icon_container), x, y); + if (item == NULL || !CAJA_IS_ICON_CANVAS_ITEM (item)) + { + return FALSE; + } + + /* Get the file from the canvas item's user_data */ + CajaIcon *icon = CAJA_ICON_CANVAS_ITEM (item)->user_data; + file = CAJA_FILE (icon->data); + if (file == NULL) + { + return FALSE; + } + + /* Get the location attribute */ + location_text = caja_file_get_string_attribute_with_default (file, "location"); + if (location_text == NULL || location_text[0] == '\0') + { + g_free (location_text); + return FALSE; + } + + /* Set tooltip text with file location */ + gtk_tooltip_set_text (tooltip, location_text); + + g_free (location_text); + + return TRUE; +} + static CajaIconContainer * create_icon_container (FMIconView *icon_view) { @@ -3062,9 +3178,12 @@ create_icon_container (FMIconView *icon_view) icon_container = fm_icon_container_new (icon_view); gtk_widget_set_can_focus (GTK_WIDGET (icon_container), TRUE); + gtk_widget_set_has_tooltip (GTK_WIDGET (icon_container), TRUE); g_signal_connect_object (icon_container, "focus_in_event", G_CALLBACK (focus_in_event_callback), icon_view, 0); + g_signal_connect_object (icon_container, "query-tooltip", + G_CALLBACK (icon_container_query_tooltip_callback), icon_view, 0); g_signal_connect_object (icon_container, "activate", G_CALLBACK (icon_container_activate_callback), icon_view, 0); g_signal_connect_object (icon_container, "activate_alternate", @@ -3293,6 +3412,7 @@ fm_icon_view_class_init (FMIconViewClass *klass) klass->supports_manual_layout = real_supports_manual_layout; klass->supports_keep_aligned = real_supports_keep_aligned; klass->supports_labels_beside_icons = real_supports_labels_beside_icons; + klass->supports_display_git_branch = real_supports_display_git_branch; klass->get_directory_auto_layout = fm_icon_view_real_get_directory_auto_layout; klass->get_directory_sort_by = fm_icon_view_real_get_directory_sort_by; klass->get_directory_sort_reversed = fm_icon_view_real_get_directory_sort_reversed; @@ -3389,7 +3509,10 @@ fm_icon_view_init (FMIconView *icon_view) "changed::" CAJA_PREFERENCES_ICON_VIEW_LABELS_BESIDE_ICONS, G_CALLBACK (labels_beside_icons_changed_callback), icon_view); - + g_signal_connect_swapped (caja_icon_view_preferences, + "changed::" CAJA_PREFERENCES_ICON_VIEW_DISPLAY_GIT_BRANCH, + G_CALLBACK (display_git_branch_changed_callback), + icon_view); g_signal_connect_swapped (caja_compact_view_preferences, "changed::" CAJA_PREFERENCES_COMPACT_VIEW_DEFAULT_ZOOM_LEVEL, G_CALLBACK (default_zoom_level_changed_callback), |
