UiText *text;
UiGeneric *html;
+ /*
+ * text note paragraph types
+ */
+ UiList *textnote_para;
+
bool modified;
};
ui_set(model->type, 1);
//ui_set_group(model->ctx, APP_STATE_NOTE_SELECTED);
+ model->textnote_para = ui_list_new(model->ctx, "note_textnote_para");
+ // currently only one type of textnote exists, therefore the
+ // paragraph types are static
+ ui_list_append(model->textnote_para, "Paragraph");
+ ui_list_append(model->textnote_para, "Code");
+ ui_list_append(model->textnote_para, "Blockquote");
+ ui_list_append(model->textnote_para, "Heading 1");
+ ui_list_append(model->textnote_para, "Heading 2");
+ ui_list_append(model->textnote_para, "Heading 3");
+ ui_list_append(model->textnote_para, "Heading 4");
+ ui_list_append(model->textnote_para, "Heading 5");
+ ui_list_append(model->textnote_para, "Heading 6");
+
return model;
}
void window_create() {
UiObject *obj = ui_sidebar_window("note", NULL);
+ ui_window_size(obj, 1600, 1200);
MainWindow *wdata = window_init_data(obj);
/*
ui_tab(obj, "textnote") {
ui_vbox0(obj) {
ui_grid(obj, .margin = 10, .columnspacing = 10, .rowspacing = 10, .def_vfill = TRUE, .fill = UI_OFF) {
- ui_label(obj, .label = "Title", .vfill = TRUE);
+ //ui_label(obj, .label = "Title", .vfill = TRUE);
ui_textfield(obj, .varname = "note_title", .hexpand = TRUE, .groups = UI_GROUPS(APP_STATE_NOTE_SELECTED));
ui_newline(obj);
}
+ ui_hbox(obj, .style_class = "note_toolbar", .margin = 10, .spacing = 4, .fill = UI_OFF) {
+ ui_combobox(obj, .varname = "note_textnote_para");
+ ui_button(obj, .icon = "format-text-bold");
+ ui_button(obj, .icon = "format-text-italic");
+ ui_button(obj, .icon = "format-text-underline");
+ ui_button(obj, .icon = "view-list-bullet");
+ ui_button(obj, .icon = "view-list-ordered");
+ ui_button(obj, .icon = "insert-image");
+ ui_button(obj, .icon = "insert-link");
+ }
ui_textarea(obj, .varname = "note_text", .vfill = TRUE, .hfill = TRUE, .hexpand = TRUE, .vexpand = TRUE, .colspan = 2, .groups = UI_GROUPS(APP_STATE_NOTE_SELECTED), .fill = UI_ON);
}
}
*to = tmp;
UiList* t2 = to->value;
- ui_notify(t2->observers, NULL);
+ if(t->update) {
+ t->update(t, -1);
+ }
+ ui_notify(t2->observers, NULL); // TODO: why not t?
break;
}
cxListAdd(s->children, widget);
if(s->pos == 0) {
- gtk_paned_set_start_child(GTK_PANED(s->current_pane), widget);
+ PANED_SET_CHILD1(s->current_pane, widget);
s->pos++;
s->nchildren++;
} else {
if(s->nchildren+1 == s->max) {
- gtk_paned_set_end_child(GTK_PANED(s->current_pane), widget);
+ PANED_SET_CHILD2(s->current_pane, widget);
} else {
GtkWidget *pane = create_paned(s->orientation);
- gtk_paned_set_start_child(GTK_PANED(pane), widget);
- gtk_paned_set_end_child(GTK_PANED(s->current_pane), pane);
+ PANED_SET_CHILD1(pane, widget);
+ PANED_SET_CHILD2(s->current_pane, pane);
s->current_pane = pane;
}
};
*/
+static void listview_copy_static_elements(UiListView *listview, char **elm, size_t nelm) {
+ listview->elements = calloc(nelm, sizeof(char*));
+ listview->nelm = nelm;
+ for(int i=0;i<nelm;i++) {
+ listview->elements[i] = strdup(elm[i]);
+ }
+}
+
#if GTK_CHECK_VERSION(4, 10, 0)
list->setselection = ui_listview_setselection2;
ui_update_liststore(ls, list);
+ } else if (args.static_elements && args.static_nelm > 0) {
+ listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+ listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
+ ui_update_liststore_static(ls, listview->elements, listview->nelm);
}
// event handling
list->setselection = ui_combobox_setselection;
ui_update_liststore(ls, list);
+ } else if (args.static_elements && args.static_nelm > 0) {
+ listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+ listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
+ ui_update_liststore_static(ls, listview->elements, listview->nelm);
}
// event handling
if(args.onactivate) {
- g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), listview);
+ g_signal_connect(view, "notify::selected", G_CALLBACK(ui_dropdown_notify), listview);
}
// add widget to parent
free(newselection);
}
}
+
+void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata) {
+ UiListView *view = userdata;
+ guint index = gtk_drop_down_get_selected(GTK_DROP_DOWN(dropdown));
+ GObject *item = gtk_drop_down_get_selected_item(GTK_DROP_DOWN(dropdown));
+ if(item && view->onactivate) {
+ ObjWrapper *eventdata = (ObjWrapper*)item;
+ UiEvent event;
+ event.obj = view->obj;
+ event.document = event.obj->ctx->document;
+ event.window = event.obj->window;
+ event.intval = index;
+ event.eventdata = eventdata->data;
+ view->onactivate(&event, view->onactivatedata);
+ }
+}
+
void ui_columnview_activate(void *ignore, guint position, gpointer userdata) {
UiListView *view = userdata;
}
}
+void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm) {
+ g_list_store_remove_all(liststore);
+ for(int i=0;i<nelm;i++) {
+ ObjWrapper *obj = obj_wrapper_new(elm[i]);
+ g_list_store_append(liststore, obj);
+ }
+}
+
void ui_listview_update2(UiList *list, int i) {
UiListView *view = list->obj;
ui_update_liststore(view->liststore, list);
g_object_unref(listmodel);
UiListView *listview = malloc(sizeof(UiListView));
+ memset(listview, 0, sizeof(UiListView));
listview->obj = obj;
listview->widget = view;
listview->var = var;
// add TreeView as observer to the UiList to update the TreeView if the
// data changes
UiListView *tableview = malloc(sizeof(UiListView));
+ memset(tableview, 0, sizeof(UiListView));
tableview->obj = obj;
tableview->widget = view;
tableview->var = var;
UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
- GtkWidget *combobox = ui_create_combobox(obj, model, var, args.onactivate, args.onactivatedata);
+ GtkWidget *combobox = ui_create_combobox(obj, model, var, args.static_elements, args.static_nelm, args.onactivate, args.onactivatedata);
ui_set_name_and_style(combobox, args.name, args.style_class);
ui_set_widget_groups(obj->ctx, combobox, args.groups);
UI_APPLY_LAYOUT1(current, args);
return combobox;
}
-GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, ui_callback f, void *udata) {
+GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, char **elm, size_t nelm, ui_callback f, void *udata) {
GtkWidget *combobox = gtk_combo_box_new();
UiListView *uicbox = malloc(sizeof(UiListView));
+ memset(uicbox, 0, sizeof(UiListView));
uicbox->obj = obj;
uicbox->widget = combobox;
UiList *list = var ? var->value : NULL;
GtkListStore *listmodel = create_list_store(list, model);
+ if(!list && elm && nelm > 0) {
+ listview_copy_static_elements(uicbox, elm, nelm);
+ for(int i=0;i<nelm;i++) {
+ GtkTreeIter iter;
+ GValue value = G_VALUE_INIT;
+ gtk_list_store_insert(listmodel, &iter, -1);
+ g_value_init(&value, G_TYPE_STRING);
+ g_value_set_string(&value, uicbox->elements[i]);
+ gtk_list_store_set_value(listmodel, &iter, 0, &value);
+ }
+ }
+
if(listmodel) {
gtk_combo_box_set_model(GTK_COMBO_BOX(combobox), GTK_TREE_MODEL(listmodel));
g_object_unref(listmodel);
event->userdata = udata;
event->callback = f;
event->value = 0;
- event->customdata = NULL;
+ event->customdata = uicbox;
g_signal_connect(
combobox,
}
void ui_combobox_change_event(GtkComboBox *widget, UiEventData *e) {
+ int index = gtk_combo_box_get_active(widget);
+ UiListView *listview = e->customdata;
+ void *eventdata = NULL;
+ if(listview->var && listview->var->value) {
+ UiList *list = listview->var->value;
+ eventdata = ui_list_get(list, index);
+ } else if(listview->elements && listview->nelm > index) {
+ eventdata = listview->elements[index];
+ }
+
UiEvent event;
event.obj = e->obj;
event.window = event.obj->window;
event.document = event.obj->ctx->document;
- event.eventdata = NULL;
- event.intval = gtk_combo_box_get_active(widget);
+ event.eventdata = eventdata;
+ event.intval = index;
e->callback(&event, e->userdata);
}
void ui_listview_destroy(GtkWidget *w, UiListView *v) {
//gtk_tree_view_set_model(GTK_TREE_VIEW(w), NULL);
- ui_destroy_boundvar(v->obj->ctx, v->var);
+ if(v->var) {
+ ui_destroy_boundvar(v->obj->ctx, v->var);
+ }
+ if(v->elements) {
+ for(int i=0;i<v->nelm;i++) {
+ free(v->elements[i]);
+ }
+ free(v->elements);
+ }
#if GTK_CHECK_VERSION(4, 10, 0)
free(v->columns);
#endif
}
void ui_combobox_destroy(GtkWidget *w, UiListView *v) {
- ui_destroy_boundvar(v->obj->ctx, v->var);
+ if(v->var) {
+ ui_destroy_boundvar(v->obj->ctx, v->var);
+ }
+ if(v->elements) {
+ for(int i=0;i<v->nelm;i++) {
+ free(v->elements[i]);
+ }
+ free(v->elements);
+ }
free(v);
}
GtkWidget *widget;
UiVar *var;
UiModel *model;
+ char **elements;
+ size_t nelm;
#if GTK_CHECK_VERSION(4, 10, 0)
GListStore *liststore;
GtkSelectionModel *selectionmodel;
void *onactivatedata;
ui_callback onbuttonclick;
void *onbuttonclickdata;
-
GtkListBoxRow *first_row;
};
#if GTK_CHECK_VERSION(4, 10, 0)
void ui_update_liststore(GListStore *liststore, UiList *list);
+void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm);
void ui_listview_update2(UiList *list, int i);
UiListSelection ui_listview_getselection2(UiList *list);
void ui_listview_setselection2(UiList *list, UiListSelection selection);
+void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata);
void ui_columnview_activate(void *ignore, guint position, gpointer userdata);
void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer user_data);
void ui_listview_enable_drop(UiListView *listview, UiListArgs *args);
UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata);
-GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, ui_callback f, void *udata);
+GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, char **elm, size_t nelm, ui_callback f, void *udata);
void ui_combobox_change_event(GtkComboBox *widget, UiEventData *e);
void ui_combobox_modelupdate(UiList *list, int i);
UiListSelection ui_combobox_getselection(UiList *list);
#if GTK_MAJOR_VERSION >= 3
-static GtkCssProvider* ui_gtk_css_provider;
-
#if GTK_MAJOR_VERSION == 4
static const char *ui_gtk_css =
"#path-textfield-box {\n"
#endif
void ui_css_init(void) {
- ui_gtk_css_provider = gtk_css_provider_new();
+ ui_add_styledata(ui_gtk_css, -1);
+}
+
+void ui_add_styledata(const char *styledata, int len) {
+ GtkCssProvider *css = gtk_css_provider_new();
#ifdef UI_GTK3
- gtk_css_provider_load_from_data(ui_gtk_css_provider, ui_gtk_css, -1, NULL);
+ gtk_css_provider_load_from_data(css, styledata, len, NULL);
GdkScreen *screen = gdk_screen_get_default();
gtk_style_context_add_provider_for_screen(
screen,
- GTK_STYLE_PROVIDER(ui_gtk_css_provider),
+ GTK_STYLE_PROVIDER(css),
GTK_STYLE_PROVIDER_PRIORITY_USER);
#endif /* UI_GTK3 */
#if GTK_MINOR_VERSION < 12
- gtk_css_provider_load_from_data(ui_gtk_css_provider, ui_gtk_css, -1);
+ gtk_css_provider_load_from_data(css, styledata, len);
#else
- gtk_css_provider_load_from_string(ui_gtk_css_provider, ui_gtk_css);
+ if(len < 0) {
+ gtk_css_provider_load_from_string(css, ui_gtk_css);
+ } else {
+ GBytes *style_data = g_bytes_new(styledata, len);
+ gtk_css_provider_load_from_bytes(css, style_data);
+ g_bytes_unref(style_data);
+
+ }
#endif /* GTK_MINOR_VERSION < 12 */
GdkDisplay *display = gdk_display_get_default();
- gtk_style_context_add_provider_for_display(display, GTK_STYLE_PROVIDER(ui_gtk_css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ gtk_style_context_add_provider_for_display(display, GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
#endif /* UI_GTK4 */
}
#define ICON_IMAGE(icon) gtk_image_new_from_icon_name(icon)
#define LISTBOX_REMOVE(listbox, row) gtk_list_box_remove(GTK_LIST_BOX(listbox), row)
#define LISTBOX_ROW_SET_CHILD(row, child) gtk_list_box_row_set_child(GTK_LIST_BOX_ROW(row), child)
+#define PANED_SET_CHILD1(paned, child) gtk_paned_set_start_child(GTK_PANED(paned), child)
+#define PANED_SET_CHILD2(paned, child) gtk_paned_set_end_child(GTK_PANED(paned), child)
#else
#define WINDOW_SHOW(window) gtk_widget_show_all(window)
#define WINDOW_DESTROY(window) gtk_widget_destroy(window)
#define ICON_IMAGE(icon) gtk_image_new_from_icon_name(icon, GTK_ICON_SIZE_BUTTON)
#define LISTBOX_REMOVE(listbox, row) gtk_container_remove(GTK_CONTAINER(listbox), row)
#define LISTBOX_ROW_SET_CHILD(row, child) gtk_container_add(GTK_CONTAINER(row), child)
+#define PANED_SET_CHILD1(paned, child) gtk_paned_pack1(GTK_PANED(paned), child, TRUE, TRUE)
+#define PANED_SET_CHILD2(paned, child) gtk_paned_pack2(GTK_PANED(paned), child, TRUE, TRUE)
#endif
#ifdef UI_GTK2
UIEXPORT void ui_init(const char *appname, int argc, char **argv);
UIEXPORT const char* ui_appname();
+UIEXPORT void ui_add_styledata(const char *styledata, int len);
+
UIEXPORT UiContext* ui_global_context(void);
UIEXPORT void ui_context_closefunc(UiContext *ctx, ui_callback fnc, void *udata);
UiList* list;
const char* varname;
UiModel* model;
+ char **static_elements;
+ size_t static_nelm;
ui_getvaluefunc getvalue;
ui_callback onactivate;
void* onactivatedata;