comparison src/view_file_list.c @ 132:661cd91e5a7e

First implementation of marks for all photos.
author bruclik
date Fri, 13 Jul 2007 14:03:08 +0000
parents 55166d93498d
children 71e1ebee420e
comparison
equal deleted inserted replaced
131:b1acdfc7271b 132:661cd91e5a7e
24 #include "utilops.h" 24 #include "utilops.h"
25 #include "ui_bookmark.h" 25 #include "ui_bookmark.h"
26 #include "ui_fileops.h" 26 #include "ui_fileops.h"
27 #include "ui_menu.h" 27 #include "ui_menu.h"
28 #include "ui_tree_edit.h" 28 #include "ui_tree_edit.h"
29 #include "typedefs.h"
29 30
30 #include <gdk/gdkkeysyms.h> /* for keyboard values */ 31 #include <gdk/gdkkeysyms.h> /* for keyboard values */
31 32
32 33
33 enum { 34 enum {
35 FILE_COLUMN_THUMB, 36 FILE_COLUMN_THUMB,
36 FILE_COLUMN_NAME, 37 FILE_COLUMN_NAME,
37 FILE_COLUMN_SIZE, 38 FILE_COLUMN_SIZE,
38 FILE_COLUMN_DATE, 39 FILE_COLUMN_DATE,
39 FILE_COLUMN_COLOR, 40 FILE_COLUMN_COLOR,
41 FILE_COLUMN_MARKS,
40 FILE_COLUMN_COUNT 42 FILE_COLUMN_COUNT
41 }; 43 };
42 44
43 45
44 static gint vflist_row_is_selected(ViewFileList *vfl, FileData *fd); 46 static gint vflist_row_is_selected(ViewFileList *vfl, FileData *fd);
524 { 526 {
525 ViewFileList *vfl = data; 527 ViewFileList *vfl = data;
526 GtkTreePath *tpath; 528 GtkTreePath *tpath;
527 GtkTreeIter iter; 529 GtkTreeIter iter;
528 FileData *fd = NULL; 530 FileData *fd = NULL;
529 531 GtkTreeViewColumn *column;
532 gint colnum;
533
530 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y, 534 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
531 &tpath, NULL, NULL, NULL)) 535 &tpath, &column, NULL, NULL))
532 { 536 {
533 GtkTreeModel *store; 537 GtkTreeModel *store;
534 538 colnum = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(column), "column"));
535 store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); 539
540 if (colnum <= FILE_COLUMN_MARKS - 2 + FILEDATA_MARKS_SIZE && colnum >= FILE_COLUMN_MARKS - 2)
541 return FALSE;
542
543 store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
544
536 gtk_tree_model_get_iter(store, &iter, tpath); 545 gtk_tree_model_get_iter(store, &iter, tpath);
537 gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1); 546 gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
538 #if 0 547 #if 0
539 gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE); 548 gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
540 #endif 549 #endif
825 work = vfl->list; 834 work = vfl->list;
826 while (work) 835 while (work)
827 { 836 {
828 FileData *fd; 837 FileData *fd;
829 gchar *size; 838 gchar *size;
830 839 int i;
840
831 fd = work->data; 841 fd = work->data;
832 size = text_from_size(fd->size); 842 size = text_from_size(fd->size);
833 gtk_list_store_append(store, &iter); 843 gtk_list_store_append(store, &iter);
834 gtk_list_store_set(store, &iter, FILE_COLUMN_POINTER, fd, 844 gtk_list_store_set(store, &iter, FILE_COLUMN_POINTER, fd,
835 FILE_COLUMN_THUMB, (vfl->thumbs_enabled) ? fd->pixbuf : NULL, 845 FILE_COLUMN_THUMB, (vfl->thumbs_enabled) ? fd->pixbuf : NULL,
836 FILE_COLUMN_NAME, fd->name, 846 FILE_COLUMN_NAME, fd->name,
837 FILE_COLUMN_SIZE, size, 847 FILE_COLUMN_SIZE, size,
838 FILE_COLUMN_DATE, text_from_time(fd->date), 848 FILE_COLUMN_DATE, text_from_time(fd->date),
839 FILE_COLUMN_COLOR, FALSE, -1); 849 FILE_COLUMN_COLOR, FALSE, -1);
840 g_free(size); 850 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
851 gtk_list_store_set(store, &iter, FILE_COLUMN_MARKS + i, fd->marks[i], -1);
852
853 g_free(size);
841 854
842 if (select_list && select_list->data == fd) 855 if (select_list && select_list->data == fd)
843 { 856 {
844 select_list = g_list_remove(select_list, fd); 857 select_list = g_list_remove(select_list, fd);
845 gtk_tree_selection_select_iter(selection, &iter); 858 gtk_tree_selection_select_iter(selection, &iter);
1311 GList *list; 1324 GList *list;
1312 1325
1313 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_COLUMN_THUMB - 1); 1326 column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_COLUMN_THUMB - 1);
1314 if (!column) return; 1327 if (!column) return;
1315 1328
1316 gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : 4); 1329 gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : FILE_COLUMN_MARKS);
1317 1330
1318 list = gtk_tree_view_column_get_cell_renderers(column); 1331 list = gtk_tree_view_column_get_cell_renderers(column);
1319 if (!list) return; 1332 if (!list) return;
1320 cell = list->data; 1333 cell = list->data;
1321 g_list_free(list); 1334 g_list_free(list);
1365 gint done = FALSE; 1378 gint done = FALSE;
1366 1379
1367 while (!done) 1380 while (!done)
1368 { 1381 {
1369 FileData *old_fd = NULL; 1382 FileData *old_fd = NULL;
1370 1383 int i;
1384
1371 if (valid) 1385 if (valid)
1372 { 1386 {
1373 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1); 1387 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
1374 match = CASE_SORT(fd->name, old_fd->name); 1388 match = CASE_SORT(fd->name, old_fd->name);
1375 } 1389 }
1396 FILE_COLUMN_THUMB, (thumbs) ? fd->pixbuf : NULL, 1410 FILE_COLUMN_THUMB, (thumbs) ? fd->pixbuf : NULL,
1397 FILE_COLUMN_NAME, fd->name, 1411 FILE_COLUMN_NAME, fd->name,
1398 FILE_COLUMN_SIZE, size, 1412 FILE_COLUMN_SIZE, size,
1399 FILE_COLUMN_DATE, text_from_time(fd->date), 1413 FILE_COLUMN_DATE, text_from_time(fd->date),
1400 FILE_COLUMN_COLOR, FALSE, -1); 1414 FILE_COLUMN_COLOR, FALSE, -1);
1401 g_free(size); 1415 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
1416 gtk_list_store_set(store, &new, FILE_COLUMN_MARKS + i, fd->marks[i], -1);
1417
1418 g_free(size);
1402 1419
1403 done = TRUE; 1420 done = TRUE;
1404 } 1421 }
1405 else if (match > 0) 1422 else if (match > 0)
1406 { 1423 {
1526 g_object_set(G_OBJECT(cell), 1543 g_object_set(G_OBJECT(cell),
1527 "cell-background-gdk", vflist_listview_color_shifted(vfl->listview), 1544 "cell-background-gdk", vflist_listview_color_shifted(vfl->listview),
1528 "cell-background-set", set, NULL); 1545 "cell-background-set", set, NULL);
1529 } 1546 }
1530 1547
1531 static void vflist_listview_add_column(ViewFileList *vfl, gint n, const gchar *title, gint image, gint right_justify) 1548 static void vflist_listview_add_column(ViewFileList *vfl, gint n, const gchar *title, gint image, gint right_justify, gint expand)
1532 { 1549 {
1533 GtkTreeViewColumn *column; 1550 GtkTreeViewColumn *column;
1534 GtkCellRenderer *renderer; 1551 GtkCellRenderer *renderer;
1535 1552
1536 column = gtk_tree_view_column_new(); 1553 column = gtk_tree_view_column_new();
1545 { 1562 {
1546 g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); 1563 g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
1547 } 1564 }
1548 gtk_tree_view_column_pack_start(column, renderer, TRUE); 1565 gtk_tree_view_column_pack_start(column, renderer, TRUE);
1549 gtk_tree_view_column_add_attribute(column, renderer, "text", n); 1566 gtk_tree_view_column_add_attribute(column, renderer, "text", n);
1550 } 1567 if (expand)
1568 gtk_tree_view_column_set_expand(column, TRUE);
1569 }
1551 else 1570 else
1552 { 1571 {
1553 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); 1572 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
1554 renderer = gtk_cell_renderer_pixbuf_new(); 1573 renderer = gtk_cell_renderer_pixbuf_new();
1555 cell_renderer_height_override(renderer); 1574 cell_renderer_height_override(renderer);
1560 gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vfl, NULL); 1579 gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vfl, NULL);
1561 1580
1562 gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column); 1581 gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column);
1563 } 1582 }
1564 1583
1584 static void vflist_listview_mark_toggled(GtkCellRendererToggle *cell, gchar *path_str, GtkListStore *store)
1585 {
1586 GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
1587 guint *marks;
1588 GtkTreeIter iter;
1589 FileData *fd;
1590 gboolean mark;
1591 guint column;
1592
1593 if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path))
1594 return;
1595
1596 column = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(cell), "column"));
1597
1598 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, column, &mark, -1);
1599 mark ^= 1;
1600 fd->marks[column] = mark;
1601
1602 gtk_list_store_set(store, &iter, column, mark, -1);
1603 gtk_tree_path_free(path);
1604 }
1605
1606 static void vflist_listview_add_column_toggle(ViewFileList *vfl, gint n, const gchar *title)
1607 {
1608 GtkTreeViewColumn *column;
1609 GtkCellRenderer *renderer;
1610 GtkListStore *store;
1611 gint index;
1612
1613 store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
1614
1615 renderer = gtk_cell_renderer_toggle_new();
1616 column = gtk_tree_view_column_new_with_attributes(title, renderer, "active", n, NULL);
1617
1618 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
1619 g_object_set_data (G_OBJECT (column), "column", GUINT_TO_POINTER(n));
1620 g_object_set_data (G_OBJECT (renderer), "column", GUINT_TO_POINTER(n));
1621
1622 index = gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column);
1623 gtk_tree_view_column_set_fixed_width(column, 16);
1624 gtk_tree_view_column_set_visible(column, vfl->marks_enabled);
1625
1626
1627 g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled), store);
1628 }
1629
1565 /* 1630 /*
1566 *----------------------------------------------------------------------------- 1631 *-----------------------------------------------------------------------------
1567 * base 1632 * base
1568 *----------------------------------------------------------------------------- 1633 *-----------------------------------------------------------------------------
1569 */ 1634 */
1611 { 1676 {
1612 ViewFileList *vfl; 1677 ViewFileList *vfl;
1613 GtkListStore *store; 1678 GtkListStore *store;
1614 GtkTreeSelection *selection; 1679 GtkTreeSelection *selection;
1615 1680
1681 GType *flist_types;
1682 int i;
1683
1616 vfl = g_new0(ViewFileList, 1); 1684 vfl = g_new0(ViewFileList, 1);
1617 1685
1618 vfl->path = NULL; 1686 vfl->path = NULL;
1619 vfl->list = NULL; 1687 vfl->list = NULL;
1620 vfl->click_fd = NULL; 1688 vfl->click_fd = NULL;
1637 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vfl->widget), 1705 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vfl->widget),
1638 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); 1706 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1639 g_signal_connect(G_OBJECT(vfl->widget), "destroy", 1707 g_signal_connect(G_OBJECT(vfl->widget), "destroy",
1640 G_CALLBACK(vflist_destroy_cb), vfl); 1708 G_CALLBACK(vflist_destroy_cb), vfl);
1641 1709
1642 store = gtk_list_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, 1710 flist_types = g_new(GType, FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE);
1643 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); 1711 flist_types[0] = G_TYPE_POINTER;
1644 vfl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); 1712 flist_types[1] = GDK_TYPE_PIXBUF;
1713 flist_types[2] = G_TYPE_STRING;
1714 flist_types[3] = G_TYPE_STRING;
1715 flist_types[4] = G_TYPE_STRING;
1716 flist_types[5] = G_TYPE_BOOLEAN;
1717 for (i = FILE_COLUMN_MARKS; i < FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE; i++)
1718 flist_types[i] = G_TYPE_BOOLEAN;
1719
1720 store = gtk_list_store_newv(FILE_COLUMN_MARKS + FILEDATA_MARKS_SIZE, flist_types);
1721 g_free(flist_types);
1722
1723 vfl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1645 g_object_unref(store); 1724 g_object_unref(store);
1646 1725
1647 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview)); 1726 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
1648 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE); 1727 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
1649 gtk_tree_selection_set_select_function(selection, vflist_select_cb, vfl, NULL); 1728 gtk_tree_selection_set_select_function(selection, vflist_select_cb, vfl, NULL);
1650 1729
1651 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vfl->listview), FALSE); 1730 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vfl->listview), FALSE);
1652 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vfl->listview), FALSE); 1731 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vfl->listview), FALSE);
1653 1732
1654 vflist_listview_add_column(vfl, FILE_COLUMN_THUMB, "", TRUE, FALSE); 1733 vflist_listview_add_column(vfl, FILE_COLUMN_THUMB, "", TRUE, FALSE, FALSE);
1655 vflist_listview_add_column(vfl, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE); 1734 vflist_listview_add_column(vfl, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE, FALSE);
1656 vflist_listview_add_column(vfl, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE); 1735 vflist_listview_add_column(vfl, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE);
1657 vflist_listview_add_column(vfl, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE); 1736 vflist_listview_add_column(vfl, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, TRUE);
1658 1737
1659 g_signal_connect(G_OBJECT(vfl->listview), "key_press_event", 1738 for(i = 0; i < FILEDATA_MARKS_SIZE;i++)
1739 vflist_listview_add_column_toggle(vfl, i + FILE_COLUMN_MARKS, "");
1740
1741 g_signal_connect(G_OBJECT(vfl->listview), "key_press_event",
1660 G_CALLBACK(vflist_press_key_cb), vfl); 1742 G_CALLBACK(vflist_press_key_cb), vfl);
1661 1743
1662 gtk_container_add (GTK_CONTAINER(vfl->widget), vfl->listview); 1744 gtk_container_add (GTK_CONTAINER(vfl->widget), vfl->listview);
1663 gtk_widget_show(vfl->listview); 1745 gtk_widget_show(vfl->listview);
1664 1746
1665 vflist_dnd_init(vfl); 1747 vflist_dnd_init(vfl);
1666 1748
1667 g_signal_connect(G_OBJECT(vfl->listview), "button_press_event", 1749 g_signal_connect(G_OBJECT(vfl->listview), "button_press_event",
1668 G_CALLBACK(vflist_press_cb), vfl); 1750 G_CALLBACK(vflist_press_cb), vfl);
1669 g_signal_connect(G_OBJECT(vfl->listview), "button_release_event", 1751 g_signal_connect(G_OBJECT(vfl->listview), "button_release_event",
1670 G_CALLBACK(vflist_release_cb), vfl); 1752 G_CALLBACK(vflist_release_cb), vfl);
1671 1753
1754
1672 if (path) vflist_set_path(vfl, path); 1755 if (path) vflist_set_path(vfl, path);
1673 1756
1674 return vfl; 1757 return vfl;
1675 } 1758 }
1676 1759
1693 { 1776 {
1694 if (vfl->thumbs_enabled == enable) return; 1777 if (vfl->thumbs_enabled == enable) return;
1695 1778
1696 vfl->thumbs_enabled = enable; 1779 vfl->thumbs_enabled = enable;
1697 vflist_refresh(vfl); 1780 vflist_refresh(vfl);
1781 }
1782
1783 void vflist_marks_set(ViewFileList *vfl, gint enable)
1784 {
1785 GtkListStore *store;
1786 GtkTreeViewColumn *column;
1787 int i;
1788
1789 if (vfl->marks_enabled == enable) return;
1790
1791 vfl->marks_enabled = enable;
1792
1793 for (i = 0; i < FILEDATA_MARKS_SIZE; i++) {
1794 /* index - 2 because column's store != tree view */
1795 column = gtk_tree_view_get_column(GTK_TREE_VIEW(vfl->listview), i + FILE_COLUMN_MARKS - 2);
1796
1797 gtk_tree_view_column_set_visible(column, enable);
1798 }
1799
1800 //vflist_refresh(vfl);
1698 } 1801 }
1699 1802
1700 void vflist_set_layout(ViewFileList *vfl, LayoutWindow *layout) 1803 void vflist_set_layout(ViewFileList *vfl, LayoutWindow *layout)
1701 { 1804 {
1702 vfl->layout = layout; 1805 vfl->layout = layout;