diff src/cellrenderericon.c @ 852:8308d3606991

show marks in iconview
author nadvornik
date Sun, 22 Jun 2008 20:01:20 +0000
parents 631d626c1f6b
children b54e3fc9cafb
line wrap: on
line diff
--- a/src/cellrenderericon.c	Sun Jun 22 10:01:26 2008 +0000
+++ b/src/cellrenderericon.c	Sun Jun 22 20:01:20 2008 +0000
@@ -26,6 +26,10 @@
 
 #define FIXED_ICON_SIZE_MAX 512
 
+#define TOGGLE_WIDTH 13
+#define TOGGLE_SPACING 18
+
+
 static void gqv_cell_renderer_icon_get_property(GObject		*object,
 						guint		param_id,
 						GValue		*value,
@@ -65,7 +69,10 @@
 
 	PROP_BACKGROUND_SET,
 	PROP_FOREGROUND_SET,
-	PROP_SHOW_TEXT
+	PROP_SHOW_TEXT,
+	PROP_SHOW_MARKS,
+	PROP_NUM_MARKS,
+	PROP_MARKS
 };
 
 static gpointer parent_class;
@@ -203,6 +210,32 @@
 							_("Whether the text is displayed"),
 							TRUE,
 							G_PARAM_READWRITE));
+
+	g_object_class_install_property(object_class,
+					PROP_SHOW_MARKS,
+					g_param_spec_boolean("show_marks",
+							_("Show marks"),
+							_("Whether the marks are displayed"),
+							TRUE,
+							G_PARAM_READWRITE));
+
+	g_object_class_install_property(object_class,
+					PROP_NUM_MARKS,
+					g_param_spec_int("num_marks",
+							_("Number of marks"),
+							_("Number of marks"),
+							0, 32,
+							6,
+							G_PARAM_READWRITE));
+
+	g_object_class_install_property(object_class,
+					PROP_MARKS,
+					g_param_spec_uint("marks",
+							_("Marks"),
+							_("Marks bit array"),
+							0, 0xffffffff,
+							0,
+							G_PARAM_READWRITE));
 }
 
 static void
@@ -273,6 +306,15 @@
 	case PROP_SHOW_TEXT:
 		g_value_set_boolean(value, cellicon->show_text);
 		break;
+	case PROP_SHOW_MARKS:
+		g_value_set_boolean(value, cellicon->show_marks);
+		break;
+	case PROP_NUM_MARKS:
+		g_value_set_int(value, cellicon->num_marks);
+		break;
+	case PROP_MARKS:
+		g_value_set_uint(value, cellicon->marks);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
 		break;
@@ -385,6 +427,15 @@
 	case PROP_SHOW_TEXT:
 		cellicon->show_text = g_value_get_boolean(value);
 		break;
+	case PROP_SHOW_MARKS:
+		cellicon->show_marks = g_value_get_boolean(value);
+		break;
+	case PROP_NUM_MARKS:
+		cellicon->num_marks = g_value_get_int(value);
+		break;
+	case PROP_MARKS:
+		cellicon->marks = g_value_get_uint(value);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
 		break;
@@ -494,6 +545,12 @@
 		calc_height += rect.height;
 		}
 
+	if (cellicon->show_marks)
+		{
+		calc_height += TOGGLE_SPACING;
+		calc_width = MAX(calc_width, TOGGLE_SPACING * cellicon->num_marks);
+		}
+
 	calc_width += (gint)cell->xpad * 2;
 	calc_height += (gint)cell->ypad * 2;
 
@@ -614,6 +671,11 @@
 		pix_rect.height = text_rect.height;
 		pix_rect.x = cell_area->x + cell->xpad + (cell_rect.width - text_rect.width + 1) / 2;
 		pix_rect.y = cell_area->y + cell->ypad + (cell_rect.height - text_rect.height);
+		
+		if (cellicon->show_marks)
+			{
+			pix_rect.y -= TOGGLE_SPACING;
+			}
 
 		if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
 		    gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
@@ -629,6 +691,28 @@
 		g_object_unref(layout);
 		}
 
+	if (cellicon->show_marks)
+		{
+		GdkRectangle pix_rect;
+		GdkRectangle draw_rect;
+		gint i;
+
+		pix_rect.width = TOGGLE_SPACING * cellicon->num_marks;
+		pix_rect.height = TOGGLE_SPACING;
+		pix_rect.x = cell_area->x + cell->xpad + (cell_rect.width - pix_rect.width + 1) / 2 + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
+		pix_rect.y = cell_area->y + cell->ypad + (cell_rect.height - pix_rect.height) + (TOGGLE_SPACING - TOGGLE_WIDTH) / 2;
+		
+		for (i = 0; i < cellicon->num_marks; i++)
+			{
+			gtk_paint_check (widget->style, window,
+				 state, (cellicon->marks & (1 << i)) ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
+				 cell_area, widget, "cellcheck",
+				 pix_rect.x + i * TOGGLE_SPACING + (TOGGLE_WIDTH - TOGGLE_SPACING) / 2,
+				 pix_rect.y,
+				 TOGGLE_WIDTH, TOGGLE_WIDTH);
+			}
+                }
+
 	if (cellicon->focused && GTK_WIDGET_HAS_FOCUS(widget))
 		{
 		gtk_paint_focus(widget->style, window,