summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrzej <ndrwrdck@gmail.com>2012-10-11 00:20:44 +0100
committerNick Schermer <nick@xfce.org>2013-05-05 17:41:13 +0200
commiteb60ba80bb8ccde40bc0a5ce1677457f63a887d2 (patch)
tree19e269db55d078f31ab75a69e4224568d0f3c870
parent31f9236eff7a8221a811966e0d5201c1c8877757 (diff)
downloadxfce4-panel-eb60ba80bb8ccde40bc0a5ce1677457f63a887d2.tar.gz
Fixed DnD markers with non-square small items.
(cherry picked from commit 478c43e89b291e89f726d43a861e1266e0fa5905)
-rw-r--r--panel/panel-itembar.c89
1 files changed, 64 insertions, 25 deletions
diff --git a/panel/panel-itembar.c b/panel/panel-itembar.c
index 142a7185..98ffae1e 100644
--- a/panel/panel-itembar.c
+++ b/panel/panel-itembar.c
@@ -21,6 +21,7 @@
#include <config.h>
#endif
+#include <math.h>
#include <gtk/gtk.h>
#include <exo/exo.h>
@@ -95,7 +96,7 @@ struct _PanelItembar
/* dnd support */
gint highlight_index;
- gint highlight_x, highlight_y;
+ gint highlight_x, highlight_y, highlight_length;
gboolean highlight_small;
};
@@ -234,6 +235,7 @@ panel_itembar_init (PanelItembar *itembar)
itembar->size = 30;
itembar->nrows = 1;
itembar->highlight_index = -1;
+ itembar->highlight_length = -1;
GTK_WIDGET_SET_FLAGS (GTK_WIDGET (itembar), GTK_NO_WINDOW);
@@ -702,12 +704,14 @@ panel_itembar_expose_event (GtkWidget *widget,
(!IS_HORIZONTAL (itembar) && itembar->highlight_small))
{
rect.width = HIGHLIGHT_SIZE;
- rect.height = row_size;
+ rect.height = (itembar->highlight_length != -1) ?
+ itembar->highlight_length : row_size;
}
else
{
rect.height = HIGHLIGHT_SIZE;
- rect.width = row_size;
+ rect.width = (itembar->highlight_length != -1) ?
+ itembar->highlight_length : row_size;
}
/* draw highlight box */
@@ -1015,11 +1019,12 @@ panel_itembar_get_drop_index (PanelItembar *itembar,
gint x,
gint y)
{
- PanelItembarChild *child;
- GSList *li;
+ PanelItembarChild *child, *child2;
+ GSList *li, *li2;
GtkAllocation alloc;
- guint idx, col_start_idx;
- gint xr, yr;
+ guint idx, col_start_idx, col_end_idx;
+ gint xr, yr, col_width;
+ gdouble aspect;
panel_return_val_if_fail (PANEL_IS_ITEMBAR (itembar), 0);
@@ -1037,15 +1042,19 @@ panel_itembar_get_drop_index (PanelItembar *itembar,
x >= alloc.x + alloc.width || y >= alloc.y + alloc.height)
return g_slist_length (itembar->children);
- for (li = itembar->children, idx = 0, col_start_idx = 0; li != NULL; li = g_slist_next (li))
+ col_width = -1;
+ itembar->highlight_length = -1;
+ idx = 0;
+ col_start_idx = 0;
+ col_end_idx = 0;
+
+ for (li = itembar->children; li != NULL; li = g_slist_next (li))
{
child = li->data;
if (G_UNLIKELY (child == NULL))
continue;
- if (child->row == 0)
- col_start_idx = idx;
-
+ panel_assert (child->widget != NULL);
alloc = child->widget->allocation;
if (!IS_HORIZONTAL (itembar))
@@ -1053,31 +1062,61 @@ panel_itembar_get_drop_index (PanelItembar *itembar,
xr = x - alloc.x;
yr = y - alloc.y;
+
if (child->option == CHILD_OPTION_SMALL)
{
+ /* are we at the beginning of the column? */
+ if (child->row == 0)
+ {
+ col_start_idx = idx;
+ col_end_idx = idx + 1;
+ col_width = alloc.width;
+ /* find the width of the current column and the idx of last item */
+ for (li2 = g_slist_next (li); li2 != NULL; li2 = g_slist_next (li2))
+ {
+ child2 = li2->data;
+ if (G_UNLIKELY (child2 == NULL))
+ continue;
+ if (child2->row == 0)
+ break;
+ panel_assert (child2->widget != NULL);
+ col_end_idx++;
+ if (IS_HORIZONTAL (itembar))
+ col_width = MAX (col_width, child2->widget->allocation.width);
+ else
+ col_width = MAX (col_width, child2->widget->allocation.height);
+ }
+ }
+
+ /* calculate aspect ratio */
+ if (alloc.height > 0 && col_width > 0)
+ aspect = (gdouble) col_width / (gdouble) alloc.height;
+ else
+ aspect = 1.0;
+
/* before current column */
if (xr < 0 ||
- (xr < yr && xr < alloc.height - yr))
+ (xr < (gint) round (yr * aspect) &&
+ xr < (gint) round ((alloc.height - yr) * aspect)))
{
idx = col_start_idx;
break;
}
/* before current child */
- if (xr < alloc.width && xr >= yr && alloc.width - xr >= yr)
- break;
+ if (xr < col_width &&
+ xr >= (gint) round (yr * aspect) &&
+ col_width - xr >= (gint) round (yr * aspect))
+ {
+ if (child->row != 0)
+ itembar->highlight_length = col_width;
+ break;
+ }
/* after current column */
- if (xr < alloc.width && xr >= alloc.height - yr && xr >= yr)
+ if (xr < col_width &&
+ xr >= (gint) round ((alloc.height - yr) * aspect) &&
+ xr >= (gint) round (yr * aspect))
{
- /* search for the beginning of the next column */
- for (li = g_slist_next (li), idx++; li != NULL; li = g_slist_next (li))
- {
- child = li->data;
- if (G_UNLIKELY (child == NULL))
- continue;
- if (child->row == 0)
- break;
- idx++;
- }
+ idx = col_end_idx;
break;
}
}