ui/gtk/list.c

changeset 745
a4ee36ff7147
parent 743
85588901880f
child 749
0f052f6f532c
equal deleted inserted replaced
744:0528926422da 745:a4ee36ff7147
770 770
771 #else 771 #else
772 772
773 static void update_list_row(UiListView *listview, GtkListStore *store, GtkTreeIter *iter, UiList *list, void *elm, int row) { 773 static void update_list_row(UiListView *listview, GtkListStore *store, GtkTreeIter *iter, UiList *list, void *elm, int row) {
774 UiModel *model = listview->model; 774 UiModel *model = listview->model;
775 ui_getstylefunc getstyle = listview->getstyle;
776
777 // get the row style
778 UiBool style_set = FALSE;
779 UiTextStyle style = { 0, 0 };
780 if(getstyle) {
781 style_set = getstyle(list, elm, row, -1, listview->getstyledata, &style);
782 }
783
775 // set column values 784 // set column values
776 int c = 0; 785 int c = 0;
777 for(int i=0;i<model->columns;i++,c++) { 786 for(int i=0;i<model->columns;i++,c++) {
778 UiBool freevalue = FALSE; 787 UiBool freevalue = FALSE;
779 void *data = listview->getvalue(list, elm, row, c, listview->getvaluedata, &freevalue); 788 void *data = listview->getvalue(list, elm, row, c, listview->getvaluedata, &freevalue);
789
790 UiModelType type = model->types[i];
791
792 if(getstyle) {
793 // in case the column is icon+text, only get a style for the text column
794 int style_col = c;
795 if(type == UI_ICON_TEXT || type == UI_ICON_TEXT_FREE) {
796 style_col++;
797 }
798
799 // Get the individual column style
800 // The column style overrides the row style, however if no column style
801 // is provided, we stick with the row style
802 if(getstyle(list, elm, row, style_col, listview->getstyledata, &style)) {
803 style_set = TRUE;
804 }
805 }
780 806
781 GValue value = G_VALUE_INIT; 807 GValue value = G_VALUE_INIT;
782 switch(model->types[i]) { 808 switch(type) {
783 case UI_STRING_FREE: { 809 case UI_STRING_FREE: {
784 freevalue = TRUE; 810 freevalue = TRUE;
785 } 811 }
786 case UI_STRING: { 812 case UI_STRING: {
787 g_value_init(&value, G_TYPE_STRING); 813 g_value_init(&value, G_TYPE_STRING);
850 break; 876 break;
851 } 877 }
852 } 878 }
853 879
854 gtk_list_store_set_value(store, iter, c, &value); 880 gtk_list_store_set_value(store, iter, c, &value);
881
882 if(style_set) {
883 int soff = listview->style_offset + i*6;
884
885 GValue style_set_value = G_VALUE_INIT;
886 g_value_init(&style_set_value, G_TYPE_BOOLEAN);
887 g_value_set_boolean(&style_set_value, TRUE);
888 gtk_list_store_set_value(store, iter, soff, &style_set_value);
889
890 GValue style_weight_value = G_VALUE_INIT;
891 g_value_init(&style_weight_value, G_TYPE_INT);
892 if(style.text_style & UI_TEXT_STYLE_BOLD) {
893 g_value_set_int(&style_weight_value, 600);
894 } else {
895 g_value_set_int(&style_weight_value, 400);
896 }
897 gtk_list_store_set_value(store, iter, soff + 1, &style_weight_value);
898
899 GValue style_underline_value = G_VALUE_INIT;
900 g_value_init(&style_underline_value, G_TYPE_INT);
901 if(style.text_style & UI_TEXT_STYLE_UNDERLINE) {
902 g_value_set_int(&style_underline_value, PANGO_UNDERLINE_SINGLE);
903 } else {
904 g_value_set_int(&style_underline_value, PANGO_UNDERLINE_NONE);
905 }
906 gtk_list_store_set_value(store, iter, soff + 2, &style_underline_value);
907
908 GValue style_italic_value = G_VALUE_INIT;
909 g_value_init(&style_italic_value, G_TYPE_INT);
910 if(style.text_style & UI_TEXT_STYLE_ITALIC) {
911 g_value_set_int(&style_italic_value, PANGO_STYLE_ITALIC);
912 } else {
913 g_value_set_int(&style_italic_value, PANGO_STYLE_NORMAL);
914 }
915 gtk_list_store_set_value(store, iter, soff + 3, &style_italic_value);
916
917 GValue style_fgset_value = G_VALUE_INIT;
918 g_value_init(&style_fgset_value, G_TYPE_BOOLEAN);
919 g_value_set_boolean(&style_fgset_value, style.fg_set);
920 gtk_list_store_set_value(store, iter, soff + 4, &style_fgset_value);
921
922 if(style.fg_set) {
923 char buf[8];
924 snprintf(buf, 8, "#%02X%02X%02X", (int)style.fg.red, (int)style.fg.green, (int)style.fg.blue);
925
926 GValue style_fg_value = G_VALUE_INIT;
927 g_value_init(&style_fg_value, G_TYPE_STRING);
928 g_value_set_string(&style_fg_value, buf);
929 gtk_list_store_set_value(store, iter, soff + 5, &style_fg_value);
930 }
931 }
855 } 932 }
856 } 933 }
857 934
858 static GtkListStore* create_list_store(UiListView *listview, UiList *list) { 935 static GtkListStore* create_list_store(UiListView *listview, UiList *list) {
859 UiModel *model = listview->model; 936 UiModel *model = listview->model;
860 int columns = model->columns; 937 int columns = model->columns;
861 GType types[2*columns]; 938 GType *types = calloc(columns*8, sizeof(GType));
862 int c = 0; 939 int c = 0;
863 for(int i=0;i<columns;i++,c++) { 940 for(int i=0;i<columns;i++,c++) {
864 switch(model->types[i]) { 941 switch(model->types[i]) {
865 case UI_STRING: 942 case UI_STRING:
866 case UI_STRING_FREE: types[c] = G_TYPE_STRING; break; 943 case UI_STRING_FREE: types[c] = G_TYPE_STRING; break;
871 types[c] = G_TYPE_OBJECT; 948 types[c] = G_TYPE_OBJECT;
872 types[++c] = G_TYPE_STRING; 949 types[++c] = G_TYPE_STRING;
873 } 950 }
874 } 951 }
875 } 952 }
876 953 int s = 0;
877 GtkListStore *store = gtk_list_store_newv(c, types); 954 for(int i=0;i<columns;i++) {
955 types[listview->style_offset+s] = G_TYPE_BOOLEAN; s++; // *-set
956 types[listview->style_offset+s] = G_TYPE_INT; s++; // weight
957 types[listview->style_offset+s] = G_TYPE_INT; s++; // underline
958 types[listview->style_offset+s] = G_TYPE_INT; s++; // style
959 types[listview->style_offset+s] = G_TYPE_BOOLEAN; s++; // foreground-set
960 types[listview->style_offset+s] = G_TYPE_STRING; s++; // foreground
961 }
962
963 GtkListStore *store = gtk_list_store_newv(c+s, types);
964 free(types);
878 965
879 if(list) { 966 if(list) {
880 void *elm = list->first(list); 967 void *elm = list->first(list);
881 int i = 0; 968 int i = 0;
882 while(elm) { 969 while(elm) {
918 #endif 1005 #endif
919 1006
920 UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); 1007 UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1);
921 1008
922 UiListView *listview = create_listview(obj, args); 1009 UiListView *listview = create_listview(obj, args);
1010 listview->style_offset = 1;
923 if(!args->getvalue && !args->getvalue2) { 1011 if(!args->getvalue && !args->getvalue2) {
924 listview->getvalue = str_getvalue; 1012 listview->getvalue = str_getvalue;
925 } 1013 }
926 listview->model = model; 1014 listview->model = model;
927 g_signal_connect( 1015 g_signal_connect(
1018 GtkWidget *view = gtk_tree_view_new(); 1106 GtkWidget *view = gtk_tree_view_new();
1019 1107
1020 UiModel *model = args->model; 1108 UiModel *model = args->model;
1021 int columns = model ? model->columns : 0; 1109 int columns = model ? model->columns : 0;
1022 1110
1111 // find the last data column index
1023 int addi = 0; 1112 int addi = 0;
1024 for(int i=0;i<columns;i++) { 1113 int style_offset = 0;
1114 int i = 0;
1115 for(;i<columns;i++) {
1116 if(model->types[i] == UI_ICON_TEXT || model->types[i] == UI_ICON_TEXT_FREE) {
1117 addi++;
1118 }
1119 }
1120 style_offset = i+addi;
1121
1122 // create columns and init cell renderers
1123 addi = 0;
1124 for(i=0;i<columns;i++) {
1025 GtkTreeViewColumn *column = NULL; 1125 GtkTreeViewColumn *column = NULL;
1026 if(model->types[i] == UI_ICON_TEXT) { 1126 if(model->types[i] == UI_ICON_TEXT || model->types[i] == UI_ICON_TEXT_FREE) {
1027 column = gtk_tree_view_column_new(); 1127 column = gtk_tree_view_column_new();
1028 gtk_tree_view_column_set_title(column, model->titles[i]); 1128 gtk_tree_view_column_set_title(column, model->titles[i]);
1029 1129
1030 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new(); 1130 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new();
1031 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new(); 1131 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new();
1035 1135
1036 1136
1037 gtk_tree_view_column_add_attribute(column, iconrenderer, "pixbuf", addi + i); 1137 gtk_tree_view_column_add_attribute(column, iconrenderer, "pixbuf", addi + i);
1038 gtk_tree_view_column_add_attribute(column, textrenderer, "text", addi + i+1); 1138 gtk_tree_view_column_add_attribute(column, textrenderer, "text", addi + i+1);
1039 1139
1140 if(args->getstyle) {
1141 int soff = style_offset + i*6;
1142 gtk_tree_view_column_add_attribute(column, textrenderer, "weight-set", soff);
1143 gtk_tree_view_column_add_attribute(column, textrenderer, "underline-set", soff);
1144 gtk_tree_view_column_add_attribute(column, textrenderer, "style-set", soff);
1145
1146 gtk_tree_view_column_add_attribute(column, textrenderer, "weight", soff + 1);
1147 gtk_tree_view_column_add_attribute(column, textrenderer, "underline", soff + 2);
1148 gtk_tree_view_column_add_attribute(column, textrenderer, "style", soff + 3);
1149 gtk_tree_view_column_add_attribute(column, textrenderer, "foreground-set", soff + 4);
1150 gtk_tree_view_column_add_attribute(column, textrenderer, "foreground", soff + 5);
1151 }
1152
1040 addi++; 1153 addi++;
1041 } else if (model->types[i] == UI_ICON) { 1154 } else if (model->types[i] == UI_ICON) {
1042 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new(); 1155 GtkCellRenderer *iconrenderer = gtk_cell_renderer_pixbuf_new();
1043 column = gtk_tree_view_column_new_with_attributes( 1156 column = gtk_tree_view_column_new_with_attributes(
1044 model->titles[i], 1157 model->titles[i],
1045 iconrenderer, 1158 iconrenderer,
1046 "pixbuf", 1159 "pixbuf",
1047 i + addi, 1160 i + addi,
1048 NULL); 1161 NULL);
1049 } else { 1162 } else {
1050 GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); 1163 GtkCellRenderer *textrenderer = gtk_cell_renderer_text_new();
1051 column = gtk_tree_view_column_new_with_attributes( 1164 column = gtk_tree_view_column_new_with_attributes(
1052 model->titles[i], 1165 model->titles[i],
1053 renderer, 1166 textrenderer,
1054 "text", 1167 "text",
1055 i + addi, 1168 i + addi,
1056 NULL); 1169 NULL);
1170
1171 if(args->getstyle) {
1172 int soff = style_offset + i*6;
1173 gtk_tree_view_column_add_attribute(column, textrenderer, "weight-set", soff);
1174 gtk_tree_view_column_add_attribute(column, textrenderer, "underline-set", soff);
1175 gtk_tree_view_column_add_attribute(column, textrenderer, "style-set", soff);
1176
1177 gtk_tree_view_column_add_attribute(column, textrenderer, "weight", soff + 1);
1178 gtk_tree_view_column_add_attribute(column, textrenderer, "underline", soff + 2);
1179 gtk_tree_view_column_add_attribute(column, textrenderer, "style", soff + 3);
1180 gtk_tree_view_column_add_attribute(column, textrenderer, "foreground-set", soff + 4);
1181 gtk_tree_view_column_add_attribute(column, textrenderer, "foreground", soff + 5);
1182 }
1057 } 1183 }
1058 1184
1059 int colsz = model->columnsize[i]; 1185 int colsz = model->columnsize[i];
1060 if(colsz > 0) { 1186 if(colsz > 0) {
1061 gtk_tree_view_column_set_fixed_width(column, colsz); 1187 gtk_tree_view_column_set_fixed_width(column, colsz);
1081 1207
1082 // add TreeView as observer to the UiList to update the TreeView if the 1208 // add TreeView as observer to the UiList to update the TreeView if the
1083 // data changes 1209 // data changes
1084 UiListView *tableview = create_listview(obj, args); 1210 UiListView *tableview = create_listview(obj, args);
1085 tableview->widget = view; 1211 tableview->widget = view;
1212 tableview->style_offset = style_offset;
1086 g_signal_connect( 1213 g_signal_connect(
1087 view, 1214 view,
1088 "destroy", 1215 "destroy",
1089 G_CALLBACK(ui_listview_destroy), 1216 G_CALLBACK(ui_listview_destroy),
1090 tableview); 1217 tableview);
1216 current->container->add(current->container, combobox); 1343 current->container->add(current->container, combobox);
1217 current->container->current = combobox; 1344 current->container->current = combobox;
1218 1345
1219 UiListView *listview = create_listview(obj, args); 1346 UiListView *listview = create_listview(obj, args);
1220 listview->widget = combobox; 1347 listview->widget = combobox;
1348 listview->style_offset = 1;
1221 listview->model = ui_model(obj->ctx, UI_STRING, "", -1); 1349 listview->model = ui_model(obj->ctx, UI_STRING, "", -1);
1222 g_signal_connect( 1350 g_signal_connect(
1223 combobox, 1351 combobox,
1224 "destroy", 1352 "destroy",
1225 G_CALLBACK(ui_listview_destroy), 1353 G_CALLBACK(ui_listview_destroy),

mercurial