show marks in iconview
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 22 Jun 2008 20:01:20 +0000 (20:01 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sun, 22 Jun 2008 20:01:20 +0000 (20:01 +0000)
src/cellrenderericon.c
src/cellrenderericon.h
src/view_file.c
src/view_file_icon.c
src/view_file_icon.h
src/view_file_list.c

index b32fb13..17855bd 100644 (file)
 
 #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 @@ enum {
 
        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 @@ gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *class)
                                                        _("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 @@ gqv_cell_renderer_icon_get_property(GObject        *object,
        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 @@ gqv_cell_renderer_icon_set_property(GObject                *object,
        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 @@ gqv_cell_renderer_icon_get_size(GtkCellRenderer *cell,
                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 @@ gqv_cell_renderer_icon_render(GtkCellRenderer              *cell,
                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 @@ gqv_cell_renderer_icon_render(GtkCellRenderer              *cell,
                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,
index b23e097..5c278dc 100644 (file)
@@ -56,7 +56,13 @@ struct _GQvCellRendererIcon
        gboolean foreground_set;
        gboolean background_set;
 
+       gint num_marks;
+       
        gboolean show_text;
+       gboolean show_marks;
+       
+       guint marks;
+       
 };
 
 struct _GQvCellRendererIconClass
index a578558..310416f 100644 (file)
@@ -732,10 +732,14 @@ void vf_thumb_set(ViewFile *vf, gint enable)
 
 void vf_marks_set(ViewFile *vf, gint enable)
 {
+       if (vf->marks_enabled == enable) return;
+
+       vf->marks_enabled = enable;
+
        switch(vf->type)
        {
        case FILEVIEW_LIST: vflist_marks_set(vf, enable); break;
-       case FILEVIEW_ICON: /*vficon_marks_set(vf, enable);*/ break;
+       case FILEVIEW_ICON: vficon_marks_set(vf, enable); break;
        }
 }
 
index 38cf94e..0683780 100644 (file)
@@ -617,6 +617,11 @@ static void vficon_selection_remove(ViewFile *vf, IconData *id, SelectionType ma
        vficon_selection_set(vf, id, id->selected & ~mask, iter);
 }
 
+void vficon_marks_set(ViewFile *vf, gint enable)
+{
+       vficon_populate_at_new_size(vf, vf->listview->allocation.width, vf->listview->allocation.height, TRUE);
+}
+
 /*
  *-------------------------------------------------------------------
  * selections
@@ -1572,7 +1577,10 @@ static void vficon_populate(ViewFile *vf, gint resize, gint keep_position)
                                {
                                g_object_set(G_OBJECT(cell), "fixed_width", thumb_width,
                                                             "fixed_height", options->thumbnails.max_height,
-                                                            "show_text", VFICON_INFO(vf, show_text), NULL);
+                                                            "show_text", VFICON_INFO(vf, show_text),
+                                                            "show_marks", vf->marks_enabled,
+                                                            "num_marks", FILEDATA_MARKS_SIZE,
+                                                            NULL);
                                }
                        }
                if (GTK_WIDGET_REALIZED(vf->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vf->listview));
@@ -2274,6 +2282,8 @@ static void vficon_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer
 
                        g_object_set(cell,      "pixbuf", id->fd->thumb_pixbuf,
                                                "text", name_sidecars,
+                                               "marks", id->fd->marks,
+                                               "show_marks", vf->marks_enabled,
                                                "cell-background-gdk", &color_bg,
                                                "cell-background-set", TRUE,
                                                "foreground-gdk", &color_fg,
@@ -2289,6 +2299,7 @@ static void vficon_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer
                        {
                        g_object_set(cell,      "pixbuf", NULL,
                                                "text", NULL,
+                                               "show_marks", FALSE,
                                                "cell-background-set", FALSE,
                                                "foreground-set", FALSE,
                                                "has-focus", FALSE, NULL);
index 48b47d2..bcdc7ec 100644 (file)
@@ -27,6 +27,8 @@ gint vficon_refresh(ViewFile *vf);
 
 void vficon_sort_set(ViewFile *vf, SortType type, gint ascend);
 
+void vficon_marks_set(ViewFile *vf, gint enable);
+
 GList *vficon_pop_menu_file_list(ViewFile *vf);
 void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data);
 void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data);
index e067485..36c829f 100644 (file)
@@ -1977,10 +1977,6 @@ void vflist_marks_set(ViewFile *vf, gint enable)
 {
        GList *columns, *work;
 
-       if (vf->marks_enabled == enable) return;
-
-       vf->marks_enabled = enable;
-
        columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(vf->listview));
 
        work = columns;