Re: [PATCH] Fix shift-select in manual icon layout mode



Am Montag, den 29.08.2005, 10:19 +0200 schrieb Alexander Larsson:
> On Fri, 2005-08-26 at 23:15 +0200, Christian Neumair wrote:
> > Am Freitag, den 15.07.2005, 11:40 +0200 schrieb Alexander Larsson:
> > > 
> > > Its still extremely weird. It allows 25 pixel above the highest icon,
> > > but only the top 25 pixels of the lowest icon. Just either use the full
> > > extent of both icons to calculate the max/min position, or use the
> > > middle of the icon.
> > 
> > New proposed patch which takes into account the center of all selection
> > candidates. I also tried to only use the image rectangle but throwed
> > away this idea since it proved to feel a bit weird.
> 
> That patch seems to contain a variety of changes. Some are even partial,
> so that the patch doesn't compile.
> 
> Also, by now we should be looking at showstopper bugs, like crashes or
> data-loss things. While this bug is silly, and we should eventually fix
> it, we shouldn't focus on it much atm.

Attaching a new patch, containing only the relevant bits, so that we
have something when the freeze is over.

-- 
Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-icon-container.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-container.c,v
retrieving revision 1.393
diff -u -p -r1.393 nautilus-icon-container.c
--- libnautilus-private/nautilus-icon-container.c	12 Aug 2005 18:11:29 -0000	1.393
+++ libnautilus-private/nautilus-icon-container.c	26 Aug 2005 21:12:26 -0000
@@ -1771,26 +1778,63 @@ select_range (NautilusIconContainer *con
 
 	unmatched_icon = NULL;
 	select = FALSE;
-	for (p = container->details->icons; p != NULL; p = p->next) {
-		icon = p->data;
+	if (container->details->auto_layout) {
+		for (p = container->details->icons; p != NULL; p = p->next) {
+			icon = p->data;
+
+			if (unmatched_icon == NULL) {
+				if (icon == icon1) {
+					unmatched_icon = icon2;
+					select = TRUE;
+				} else if (icon == icon2) {
+					unmatched_icon = icon1;
+					select = TRUE;
+				}
+			}
+			
+			selection_changed |= icon_set_selected
+				(container, icon, select);
 
-		if (unmatched_icon == NULL) {
-			if (icon == icon1) {
-				unmatched_icon = icon2;
-				select = TRUE;
-			} else if (icon == icon2) {
-				unmatched_icon = icon1;
-				select = TRUE;
+			if (unmatched_icon != NULL && icon == unmatched_icon) {
+				select = FALSE;
 			}
+			
 		}
-		
-		selection_changed |= icon_set_selected
-			(container, icon, select);
+	} else {
+		ArtIRect icon1_rect, icon2_rect;
+		ArtIRect icon_rect;
+		int x0, x1, y0, y1;
+		int x, y;
+
+		icon_get_bounding_box (icon1,
+				       &icon1_rect.x0, &icon1_rect.y0, 
+				       &icon1_rect.x1, &icon1_rect.y1);
+		icon_get_bounding_box (icon2,
+				       &icon2_rect.x0, &icon2_rect.y0, 
+				       &icon2_rect.x1, &icon2_rect.y1);
+
+		x0 = MIN (icon1_rect.x0, icon2_rect.x0);
+		x1 = MAX (icon1_rect.x1, icon2_rect.x1);
+		y0 = MIN (icon1_rect.y0, icon2_rect.y0);
+		y1 = MAX (icon1_rect.y1, icon2_rect.y1);
+
 
-		if (unmatched_icon != NULL && icon == unmatched_icon) {
-			select = FALSE;
+		for (p = container->details->icons; p != NULL; p = p->next) {
+			icon = p->data;
+
+			/* select all items whose center is inside the selection rectangle */
+			icon_get_bounding_box (icon,
+					       &icon_rect.x0, &icon_rect.y0, 
+					       &icon_rect.x1, &icon_rect.y1);
+
+			x = (icon_rect.x0 + icon_rect.x1) / 2;
+			y = (icon_rect.y0 + icon_rect.y1) / 2;
+
+			select = (x > x0 && x < x1 && y > y0 && y < y1);
+			selection_changed |= icon_set_selected
+				(container, icon, select);
 		}
-		
+
 	}
 	
 	if (selection_changed && icon2 != NULL) {

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]