Mercurial > geeqie.yaz
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; |