comparison src/bar_info.c @ 1223:18d08b10b80e

implemented a possibility to connect keywords with marks
author nadvornik
date Thu, 25 Dec 2008 12:39:34 +0000
parents a0c249bcc4ff
children 31f50c1b6a9a
comparison
equal deleted inserted replaced
1222:31dc2f240afb 1223:18d08b10b80e
357 BAR_SORT_LINK 357 BAR_SORT_LINK
358 } SortActionType; 358 } SortActionType;
359 359
360 enum { 360 enum {
361 KEYWORD_COLUMN_TOGGLE = 0, 361 KEYWORD_COLUMN_TOGGLE = 0,
362 KEYWORD_COLUMN_TEXT 362 KEYWORD_COLUMN_TEXT,
363 KEYWORD_COLUMN_MARK
363 }; 364 };
364 365
365 typedef struct _BarInfoData BarInfoData; 366 typedef struct _BarInfoData BarInfoData;
366 struct _BarInfoData 367 struct _BarInfoData
367 { 368 {
407 408
408 string_list_free(list); 409 string_list_free(list);
409 g_free(comment); 410 g_free(comment);
410 } 411 }
411 412
413 static gchar *bar_info_get_mark_text(const gchar *key)
414 {
415 gint i;
416 static gchar buf[10];
417
418 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
419 {
420 FileDataGetMarkFunc get_mark_func;
421 FileDataSetMarkFunc set_mark_func;
422 gpointer data;
423 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &data);
424 if (get_mark_func == meta_data_get_keyword_mark && strcmp(data, key) == 0)
425 {
426 sprintf(buf, " %d ", i + 1);
427 return buf;
428 }
429 }
430 return " ... ";
431 }
432
412 static void bar_keyword_list_sync(BarInfoData *bd, GList *keywords) 433 static void bar_keyword_list_sync(BarInfoData *bd, GList *keywords)
413 { 434 {
414 GList *list; 435 GList *list;
415 GtkListStore *store; 436 GtkListStore *store;
416 GtkTreeIter iter; 437 GtkTreeIter iter;
440 { 461 {
441 gchar *key = list->data; 462 gchar *key = list->data;
442 463
443 gtk_list_store_append(store, &iter); 464 gtk_list_store_append(store, &iter);
444 gtk_list_store_set(store, &iter, KEYWORD_COLUMN_TOGGLE, find_string_in_list(keywords, key), 465 gtk_list_store_set(store, &iter, KEYWORD_COLUMN_TOGGLE, find_string_in_list(keywords, key),
445 KEYWORD_COLUMN_TEXT, key, -1); 466 KEYWORD_COLUMN_TEXT, key,
467 KEYWORD_COLUMN_MARK, bar_info_get_mark_text(key), -1);
446 468
447 list = list->prev; 469 list = list->prev;
448 } 470 }
449 } 471 }
450 472
693 file_data_unregister_notify_func(bar_info_notify_cb, bd); 715 file_data_unregister_notify_func(bar_info_notify_cb, bd);
694 bar_info_write(bd); 716 bar_info_write(bd);
695 file_data_register_notify_func(bar_info_notify_cb, bd, NOTIFY_PRIORITY_LOW); 717 file_data_register_notify_func(bar_info_notify_cb, bd, NOTIFY_PRIORITY_LOW);
696 } 718 }
697 719
720 static void bar_info_mark_edited (GtkCellRendererText *cell, const gchar *path, const gchar *text, gpointer data)
721 {
722 BarInfoData *bd = data;
723 GtkTreeModel *store;
724 GtkTreeIter iter;
725 GtkTreePath *tpath;
726 gchar *key = NULL;
727 gint i;
728 FileDataGetMarkFunc get_mark_func;
729 FileDataSetMarkFunc set_mark_func;
730 gpointer mark_func_data;
731
732 file_data_unregister_notify_func(bar_info_notify_cb, bd);
733
734 store = gtk_tree_view_get_model(GTK_TREE_VIEW(bd->keyword_treeview));
735
736 tpath = gtk_tree_path_new_from_string(path);
737 gtk_tree_model_get_iter(store, &iter, tpath);
738 gtk_tree_path_free(tpath);
739
740 gtk_tree_model_get(store, &iter, KEYWORD_COLUMN_TEXT, &key, -1);
741
742 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
743 {
744 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data);
745 if (get_mark_func == meta_data_get_keyword_mark && strcmp(mark_func_data, key) == 0)
746 {
747 g_free(mark_func_data);
748 file_data_register_mark_func(i, NULL, NULL, NULL);
749 }
750 }
751
752 if (sscanf(text, " %d ", &i) &&i >=1 && i <= FILEDATA_MARKS_SIZE)
753 {
754 i--;
755 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data);
756 if (get_mark_func == meta_data_get_keyword_mark && mark_func_data) g_free(mark_func_data);
757 file_data_register_mark_func(i, meta_data_get_keyword_mark, meta_data_set_keyword_mark, g_strdup(key));
758 }
759
760 g_free(key);
761
762 file_data_register_notify_func(bar_info_notify_cb, bd, NOTIFY_PRIORITY_LOW);
763 bar_info_update(bd);
764 }
765
698 void bar_info_close(GtkWidget *bar) 766 void bar_info_close(GtkWidget *bar)
699 { 767 {
700 BarInfoData *bd; 768 BarInfoData *bd;
701 769
702 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); 770 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
713 bar_list = g_list_remove(bar_list, bd); 781 bar_list = g_list_remove(bar_list, bd);
714 782
715 file_data_unref(bd->fd); 783 file_data_unref(bd->fd);
716 784
717 g_free(bd); 785 g_free(bd);
786 }
787
788 static GtkTreeModel *create_marks_list(void)
789 {
790 GtkListStore *model;
791 GtkTreeIter iter;
792 gint i;
793
794 /* create list store */
795 model = gtk_list_store_new (1, G_TYPE_STRING);
796 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
797 {
798 char str[10];
799 sprintf(str, " %d ", i + 1);
800 gtk_list_store_append (model, &iter);
801 gtk_list_store_set(model, &iter, 0, str, -1);
802 }
803 gtk_list_store_append (model, &iter);
804 gtk_list_store_set(model, &iter, 0, " ... ", -1);
805 return GTK_TREE_MODEL (model);
718 } 806 }
719 807
720 GtkWidget *bar_info_new(FileData *fd, gint metadata_only, GtkWidget *bounding_widget) 808 GtkWidget *bar_info_new(FileData *fd, gint metadata_only, GtkWidget *bounding_widget)
721 { 809 {
722 BarInfoData *bd; 810 BarInfoData *bd;
810 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 898 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
811 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 899 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
812 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); 900 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
813 gtk_widget_show(scrolled); 901 gtk_widget_show(scrolled);
814 902
815 store = gtk_list_store_new(2, G_TYPE_BOOLEAN, G_TYPE_STRING); 903 store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING);
816 bd->keyword_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); 904 bd->keyword_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
817 g_object_unref(store); 905 g_object_unref(store);
818 906
819 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(bd->keyword_treeview), FALSE); 907 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(bd->keyword_treeview), FALSE);
820 908
839 renderer = gtk_cell_renderer_text_new(); 927 renderer = gtk_cell_renderer_text_new();
840 gtk_tree_view_column_pack_start(column, renderer, TRUE); 928 gtk_tree_view_column_pack_start(column, renderer, TRUE);
841 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_TEXT); 929 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_TEXT);
842 930
843 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->keyword_treeview), column); 931 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->keyword_treeview), column);
932
933 column = gtk_tree_view_column_new();
934 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
935
936 renderer = gtk_cell_renderer_combo_new();
937 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE,
938 "model", create_marks_list(),
939 "text-column", 0,
940 "has-entry", FALSE,
941 NULL);
942
943 gtk_tree_view_column_pack_start(column, renderer, TRUE);
944 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_MARK);
945 g_signal_connect (renderer, "edited",
946 G_CALLBACK (bar_info_mark_edited), bd);
947 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->keyword_treeview), column);
948
844 949
845 gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_treeview); 950 gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_treeview);
846 gtk_widget_show(bd->keyword_treeview); 951 gtk_widget_show(bd->keyword_treeview);
847 952
848 /* comment entry */ 953 /* comment entry */