| 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) { |
| 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); |
| 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), |