From df95a77559b8ec7f03209d3c19863a15b05e8e6d Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Thu, 29 Jan 2026 20:54:34 +0100 Subject: [PATCH] implement basic text search --- application/application.c | 10 +++++++++ application/application.h | 14 +++++++++++- application/menu.c | 4 ++++ application/note.c | 5 +++++ application/window.c | 46 +++++++++++++++++++++++++++++++-------- application/window.h | 3 +++ ui/common/context.c | 7 ++++++ ui/common/context.h | 1 + ui/common/types.c | 1 + ui/gtk/button.c | 6 +++++ ui/gtk/container.c | 30 +++++-------------------- ui/gtk/display.c | 6 +++++ ui/gtk/text.c | 14 ++++++++++++ ui/gtk/text.h | 1 + ui/motif/button.c | 4 ++++ ui/motif/container.c | 20 ++++------------- ui/motif/label.c | 3 +++ ui/motif/text.c | 3 +++ ui/ui/button.h | 3 +++ ui/ui/display.h | 6 +++++ ui/ui/text.h | 4 ++++ 21 files changed, 141 insertions(+), 50 deletions(-) diff --git a/application/application.c b/application/application.c index 56c8355..29ef4ad 100644 --- a/application/application.c +++ b/application/application.c @@ -176,3 +176,13 @@ void action_note_delete(UiEvent *event, void *data) { .result = delete_result); free(msg.ptr); } + +void action_find(UiEvent *event, void *data) { + ui_set_state(event->obj->ctx, APP_STATE_NOTE_FIND); + ui_unset_state(event->obj->ctx, APP_STATE_NOTE_REPLACE); +} + +void action_replace(UiEvent *event, void *data) { + ui_set_state(event->obj->ctx, APP_STATE_NOTE_FIND); + ui_set_state(event->obj->ctx, APP_STATE_NOTE_REPLACE); +} diff --git a/application/application.h b/application/application.h index c727542..2957a2e 100644 --- a/application/application.h +++ b/application/application.h @@ -42,7 +42,8 @@ extern "C" { #define APP_STATE_NOTEBOOK_SELECTED 100 #define APP_STATE_NOTE_SELECTED 110 #define APP_STATE_NOTE_HAS_ATTACHMENTS 201 -#define APP_STATE_NOTE_SEARCHBAR 202 +#define APP_STATE_NOTE_FIND 202 +#define APP_STATE_NOTE_REPLACE 203 #define VIEW_FLAGS_NO_BROWSER 1 @@ -161,6 +162,14 @@ struct NoteModel { UiInteger *textnote_underline; UiInteger *textnote_code; + /* + * Search Bar + */ + UiString *search; + UiString *replace; + UiInteger *search_cs; + UiInteger *search_regex; + bool modified; bool new_note; }; @@ -199,6 +208,9 @@ void action_go_forward(UiEvent *event, void *data); void action_note_new(UiEvent *event, void *data); void action_note_delete(UiEvent *event, void *data); +void action_find(UiEvent *event, void *data); +void action_replace(UiEvent *event, void *data); + #ifdef __cplusplus } #endif diff --git a/application/menu.c b/application/menu.c index 96eb847..648ad32 100644 --- a/application/menu.c +++ b/application/menu.c @@ -54,6 +54,10 @@ void toolbar_init() { ui_menuseparator(); + ui_menuitem("Find", .onclick = action_find); + ui_menuitem("Replace", .onclick = action_replace); + + ui_menuseparator(); ui_menuitem("Preferences", .onclick = action_preferences); } diff --git a/application/note.c b/application/note.c index 0e65d6d..a2a506f 100644 --- a/application/note.c +++ b/application/note.c @@ -84,6 +84,11 @@ NoteModel* notemodel_create(const CxAllocator *note_allocator) { model->textnote_underline = ui_int_new(model->ctx, "note_textnote_underline"); model->textnote_code = ui_int_new(model->ctx, "note_textnote_code"); + model->search = ui_string_new(model->ctx, "search"); + model->replace = ui_string_new(model->ctx, "replace"); + model->search_cs = ui_int_new(model->ctx, "search_cs"); + model->search_regex = ui_int_new(model->ctx, "search_regex"); + return model; } diff --git a/application/window.c b/application/window.c index 0bac192..74b105b 100644 --- a/application/window.c +++ b/application/window.c @@ -118,19 +118,20 @@ void window_create() { wdata->textview = ui_textarea(obj, .varname = "note_text", .vfill = TRUE, .hfill = TRUE, .hexpand = TRUE, .vexpand = TRUE, .colspan = 2, .states = UI_GROUPS(APP_STATE_NOTE_SELECTED), .fill = UI_ON); editor_init_textview(obj, ui_textarea_gettextwidget(wdata->textview)); - ui_grid(obj, .margin = 4, .columnspacing = 4, .rowspacing = 4, .def_hfill = TRUE, .def_vfill = TRUE, .visibility_states = UI_GROUPS(APP_STATE_NOTE_SEARCHBAR)) { + ui_grid(obj, .margin = 4, .columnspacing = 4, .rowspacing = 4, .def_hfill = TRUE, .def_vfill = TRUE, .visibility_states = UI_GROUPS(APP_STATE_NOTE_FIND)) { ui_rlabel(obj, .label = "Find"); - ui_textfield(obj, .hexpand = TRUE); + ui_textfield(obj, .hexpand = TRUE, .onactivate = ui_searchbar_next, .varname = "search"); ui_button(obj, .label = "Previous"); - ui_button(obj, .label = "Next"); - ui_checkbox(obj, .label = "Case Sensitive"); - ui_checkbox(obj, .label = "Regex"); + ui_button(obj, .label = "Next", .onclick = ui_searchbar_next); + ui_checkbox(obj, .label = "Case Sensitive", .varname = "search_cs"); + ui_checkbox(obj, .label = "Regex", .varname = "search_regex"); + ui_button(obj, .icon = "window-close", .onclick = action_searchbar_close); ui_newline(obj); - ui_rlabel(obj, .label = "Replace"); - ui_textfield(obj, .hexpand = TRUE); - ui_button(obj, .label = "Replace"); - ui_button(obj, .label = "Replace All"); + ui_rlabel(obj, .label = "Replace", .visibility_states = UI_GROUPS(APP_STATE_NOTE_REPLACE)); + ui_textfield(obj, .hexpand = TRUE, .varname = "replace", .visibility_states = UI_GROUPS(APP_STATE_NOTE_REPLACE)); + ui_button(obj, .label = "Replace", .visibility_states = UI_GROUPS(APP_STATE_NOTE_REPLACE)); + ui_button(obj, .label = "Replace All", .visibility_states = UI_GROUPS(APP_STATE_NOTE_REPLACE)); } } } @@ -557,3 +558,30 @@ static void insertimg_file(UiEvent *event, void *userdata) { void action_textnote_insertimg(UiEvent *event, void *userdata) { ui_openfiledialog(event->obj, UI_FILEDIALOG_SELECT_SINGLE, insertimg_file, NULL); } + +void action_searchbar_close(UiEvent *event, void *userdata) { + ui_unset_state(event->obj->ctx, APP_STATE_NOTE_FIND); + ui_unset_state(event->obj->ctx, APP_STATE_NOTE_REPLACE); +} + +void ui_searchbar_next(UiEvent *event, void *userdata) { + NoteModel *note = notemodel_current(event->obj); + if(!note) { + return; + } + + char *searchstr = ui_get(note->search); + if(!searchstr || strlen(searchstr) == 0) { + return; + } + + cxstring text = cx_str(ui_get(note->text)); + int pos = note->text->position(note->text); + cxstring subtext = cx_strsubs(text, pos); + + cxstring result = cx_strstr(subtext, searchstr); + if(result.ptr) { + size_t result_pos = result.ptr - text.ptr; + note->text->setselection(note->text, (int)result_pos, (int)(result_pos + result.length)); + } +} diff --git a/application/window.h b/application/window.h index c353186..c65d25f 100644 --- a/application/window.h +++ b/application/window.h @@ -87,6 +87,9 @@ void action_textnote_style_code(UiEvent *event, void *userdata); void action_textnote_insertlist(UiEvent *event, void *userdata); void action_textnote_insertimg(UiEvent *event, void *userdata); +void action_searchbar_close(UiEvent *event, void *userdata); +void ui_searchbar_next(UiEvent *event, void *userdata); + diff --git a/ui/common/context.c b/ui/common/context.c index 9ddfdb7..4909d93 100644 --- a/ui/common/context.c +++ b/ui/common/context.c @@ -621,6 +621,13 @@ void ui_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int ui_widget_set_states2(ctx, widget, (ui_enablefunc)ui_set_visible, states, nstates); } +void uic_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int *states) { + if(states) { + size_t nstates = uic_state_array_size(states); + ui_widget_set_visibility_states(ctx, widget, states, (int)nstates); + } +} + size_t uic_state_array_size(const int *states) { int i; for(i=0;states[i] >= 0;i++) { } diff --git a/ui/common/context.h b/ui/common/context.h index 407c051..9a73efa 100644 --- a/ui/common/context.h +++ b/ui/common/context.h @@ -150,6 +150,7 @@ const char *uic_type2str(UiVarType type); void uic_reg_var(UiContext *ctx, const char *name, UiVarType type, void *value); +void uic_widget_set_visibility_states(UiContext *ctx, UIWIDGET widget, const int *states); size_t uic_state_array_size(const int *states); void uic_check_state_widgets(UiContext *ctx); void uic_add_state_widget(UiContext *ctx, void *widget, ui_enablefunc enable, CxList *states); diff --git a/ui/common/types.c b/ui/common/types.c index 74b8190..67e1225 100644 --- a/ui/common/types.c +++ b/ui/common/types.c @@ -678,6 +678,7 @@ void uic_text_copy(UiText *from, UiText *to) { to->insert = from->insert; to->setposition = from->setposition; to->position = from->position; + to->setselection = from->setselection; to->selection = from->selection; to->length = from->length; to->remove = from->remove; diff --git a/ui/gtk/button.c b/ui/gtk/button.c index d9acdbf..9ce23bf 100644 --- a/ui/gtk/button.c +++ b/ui/gtk/button.c @@ -110,6 +110,7 @@ UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, button, &layout); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); return button; } @@ -317,6 +318,7 @@ static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleAr UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -380,6 +382,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -469,6 +472,7 @@ UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } @@ -621,6 +625,7 @@ UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, rbutton, &layout); + uic_widget_set_visibility_states(obj->ctx, rbutton, args->visibility_states); return rbutton; } @@ -913,6 +918,7 @@ UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, button, &layout); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); return button; } diff --git a/ui/gtk/container.c b/ui/gtk/container.c index 6b8b736..5489ecb 100644 --- a/ui/gtk/container.c +++ b/ui/gtk/container.c @@ -393,10 +393,7 @@ UIWIDGET ui_box_create(UiObject *obj, UiContainerArgs *args, UiSubContainerType UiContainerX *container = ui_box_container(obj, box, type); uic_object_push_container(obj, container); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, box, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, box, args->visibility_states); return box; } @@ -434,10 +431,7 @@ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); uic_object_push_container(obj, container); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, grid, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, grid, args->visibility_states); return grid; } @@ -486,10 +480,7 @@ UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, frame, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, frame, args->visibility_states); return frame; } @@ -515,10 +506,7 @@ UIEXPORT UIWIDGET ui_expander_create(UiObject *obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, expander, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, expander, args->visibility_states); return expander; } @@ -545,10 +533,7 @@ UIWIDGET ui_scrolledwindow_create(UiObject* obj, UiFrameArgs *args) { uic_object_push_container(obj, container); } - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, sw, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, sw, args->visibility_states); return sw; } @@ -839,10 +824,7 @@ UIWIDGET ui_tabview_create(UiObject* obj, UiTabViewArgs *args) { UiContainerX *container = ui_tabview_container(obj, widget); uic_object_push_container(obj, container); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, widget, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); return widget; } diff --git a/ui/gtk/display.c b/ui/gtk/display.c index 1f8c39e..1a4073c 100644 --- a/ui/gtk/display.c +++ b/ui/gtk/display.c @@ -115,6 +115,8 @@ UIWIDGET ui_label_create(UiObject *obj, UiLabelArgs *args) { UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, widget, &layout); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); + return widget; } @@ -205,6 +207,8 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) { UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, progressbar, &layout); + uic_widget_set_visibility_states(obj->ctx, progressbar, args->visibility_states); + return progressbar; } @@ -246,6 +250,8 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, spinner, &layout); + uic_widget_set_visibility_states(obj->ctx, spinner, args->visibility_states); + return spinner; } diff --git a/ui/gtk/text.c b/ui/gtk/text.c index 0c35219..36f25b9 100644 --- a/ui/gtk/text.c +++ b/ui/gtk/text.c @@ -160,6 +160,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, scroll_area, &layout); + uic_widget_set_visibility_states(obj->ctx, scroll_area, args->visibility_states); // bind value if(var) { @@ -185,6 +186,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { value->insert = ui_textarea_insert; value->setposition = ui_textarea_setposition; value->position = ui_textarea_position; + value->setselection = ui_textarea_setselection; value->selection = ui_textarea_selection; value->length = ui_textarea_length; value->remove = ui_textarea_remove; @@ -294,6 +296,15 @@ int ui_textarea_position(UiText *text) { return text->pos; } +void ui_textarea_setselection(UiText *text, int begin, int end) { + GtkTextBuffer *buf = text->data1; + GtkTextIter ib; + GtkTextIter ie; + gtk_text_buffer_get_iter_at_offset(text->data1, &ib, begin); + gtk_text_buffer_get_iter_at_offset(text->data1, &ie, end); + gtk_text_buffer_select_range(buf, &ib, &ie); +} + void ui_textarea_selection(UiText *text, int *begin, int *end) { GtkTextIter b; GtkTextIter e; @@ -639,6 +650,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool passwor UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, textfield, &layout); + uic_widget_set_visibility_states(obj->ctx, textfield, args->visibility_states); if(var) { UiString *value = var->value; @@ -999,6 +1011,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, pathtf->stack, &layout); + uic_widget_set_visibility_states(obj->ctx, pathtf->stack, args->visibility_states); pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); pathtf->entry = gtk_entry_new(); @@ -1174,6 +1187,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; UiLayout layout = UI_ARGS2LAYOUT(args); ct->add(ct, eventbox, &layout); + uic_widget_set_visibility_states(obj->ctx, eventbox, args->visibility_states); // hbox as parent for the GtkEntry and GtkButtonBox GtkWidget *hbox = ui_gtk_hbox_new(0); diff --git a/ui/gtk/text.h b/ui/gtk/text.h index b7fbda4..701ed7f 100644 --- a/ui/gtk/text.h +++ b/ui/gtk/text.h @@ -120,6 +120,7 @@ char* ui_textarea_getsubstr(UiText *text, int begin, int end); void ui_textarea_insert(UiText *text, int pos, char *str); void ui_textarea_setposition(UiText *text, int pos); int ui_textarea_position(UiText *text); +void ui_textarea_setselection(UiText *text, int begin, int end); void ui_textarea_selection(UiText *text, int *begin, int *end); int ui_textarea_length(UiText *text); void ui_textarea_remove(UiText *text, int begin, int end); diff --git a/ui/motif/button.c b/ui/motif/button.c index 45e7a1b..babbf80 100644 --- a/ui/motif/button.c +++ b/ui/motif/button.c @@ -60,6 +60,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { Widget button = XmCreatePushButton(parent, name, xargs, n); XtManageChild(button); ui_container_add(ctn, button); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); ui_set_widget_groups(obj->ctx, button, args->states); @@ -117,6 +118,7 @@ UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ui_container_add(ctn, button); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); ui_set_widget_groups(obj->ctx, button, args->states); @@ -145,6 +147,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ui_container_add(ctn, button); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); ui_set_widget_groups(obj->ctx, button, args->states); @@ -364,6 +367,7 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { Widget button = XmCreateToggleButton(parent, name, xargs, n); XtManageChild(button); ui_container_add(ctn, button); + uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); ui_set_widget_groups(obj->ctx, button, args->states); diff --git a/ui/motif/container.c b/ui/motif/container.c index d1e0599..73c9198 100644 --- a/ui/motif/container.c +++ b/ui/motif/container.c @@ -90,10 +90,7 @@ static UIWIDGET box_create(UiObject *obj, UiContainerArgs *args, UiBoxOrientatio UiContainerX *container = ui_box_container(obj, grid, orientation); uic_object_push_container(obj, container); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, grid, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, grid, args->visibility_states); return grid; } @@ -176,10 +173,7 @@ UIWIDGET ui_grid_create(UiObject *obj, UiContainerArgs *args) { UiContainerX *container = ui_grid_container(obj, grid, args->def_hexpand, args->def_vexpand, args->def_hfill, args->def_vfill); uic_object_push_container(obj, container); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, grid, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, grid, args->visibility_states); return grid; } @@ -309,10 +303,7 @@ UIWIDGET ui_frame_create(UiObject *obj, UiFrameArgs *args) { } } - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, frame, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, frame, args->visibility_states); return frame; } @@ -483,10 +474,7 @@ UIWIDGET ui_tabview_create(UiObject *obj, UiTabViewArgs *args) { uic_object_push_container(obj, (UiContainerX*)ct); - if(args->visibility_states) { - size_t nstates = uic_state_array_size(args->visibility_states); - ui_widget_set_visibility_states(obj->ctx, form, args->visibility_states, (int)nstates); - } + uic_widget_set_visibility_states(obj->ctx, form, args->visibility_states); return form; } diff --git a/ui/motif/label.c b/ui/motif/label.c index 2acb2c3..1439966 100644 --- a/ui/motif/label.c +++ b/ui/motif/label.c @@ -65,6 +65,7 @@ static UIWIDGET label_create(UiObject *obj, UiLabelArgs *args, int align) { Widget w = XmCreateLabel(parent, name, xargs, n); XtManageChild(w); ui_container_add(ctn, w); + uic_widget_set_visibility_states(obj->ctx, w, args->visibility_states); XmStringFree(label); @@ -162,6 +163,7 @@ UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs *args) { char *name = args->name ? (char*)args->name : "progressbar"; Widget frame = XmCreateFrame(parent, name, xargs, n); ui_container_add(ctn, frame); + uic_widget_set_visibility_states(obj->ctx, frame, args->visibility_states); // create a button and get some informations about the height, shadow, highlight, .... // we want the frame to have the same dimensions as a normal button @@ -252,6 +254,7 @@ UIWIDGET ui_progressspinner_create(UiObject* obj, UiProgressbarSpinnerArgs *args Widget w = XmCreateLabel(parent, name, xargs, n); XtManageChild(w); ui_container_add(ctn, w); + uic_widget_set_visibility_states(obj->ctx, w, args->visibility_states); UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { diff --git a/ui/motif/text.c b/ui/motif/text.c index 09841df..877659f 100644 --- a/ui/motif/text.c +++ b/ui/motif/text.c @@ -56,6 +56,7 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { Widget widget = XmCreateScrolledText(parent, name, xargs, n); XtManageChild(widget); ui_container_add(ctn, widget); + uic_widget_set_visibility_states(obj->ctx, widget, args->visibility_states); UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); @@ -408,6 +409,7 @@ static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, int frame XtManageChild(textfield); ui_container_add(ctn, textfield); + uic_widget_set_visibility_states(obj->ctx, textfield, args->visibility_states); ui_set_widget_groups(obj->ctx, textfield, args->states); UiEventDataExt *eventdata = malloc(sizeof(UiEventDataExt)); @@ -587,6 +589,7 @@ UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { XtManageChild(pathbar->widget); ui_container_add(ctn, pathbar->widget); + uic_widget_set_visibility_states(obj->ctx, pathbar->widget, args->visibility_states); UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if (var) { diff --git a/ui/ui/button.h b/ui/ui/button.h index 55367f1..c7db396 100644 --- a/ui/ui/button.h +++ b/ui/ui/button.h @@ -66,6 +66,7 @@ typedef struct UiButtonArgs { void *onclickdata; const int *states; + const int *visibility_states; } UiButtonArgs; typedef struct UiToggleArgs { @@ -96,6 +97,7 @@ typedef struct UiToggleArgs { int enable_state; const int *states; + const int *visibility_states; } UiToggleArgs; typedef struct UiLinkButtonArgs { @@ -125,6 +127,7 @@ typedef struct UiLinkButtonArgs { UiLinkType type; const int *states; + const int *visibility_states; } UiLinkButtonArgs; #define ui_button(obj, ...) ui_button_create(obj, &(UiButtonArgs){ __VA_ARGS__ } ) diff --git a/ui/ui/display.h b/ui/ui/display.h index 1ed1235..a9c585a 100644 --- a/ui/ui/display.h +++ b/ui/ui/display.h @@ -71,6 +71,8 @@ typedef struct UiLabelArgs { UiLabelStyle style; UiString* value; const char* varname; + + const int *visibility_states; } UiLabelArgs; typedef struct UiProgressbarArgs { @@ -95,6 +97,8 @@ typedef struct UiProgressbarArgs { double max; UiDouble* value; const char* varname; + + const int *visibility_states; } UiProgressbarArgs; typedef struct UiProgressbarSpinnerArgs { @@ -116,6 +120,8 @@ typedef struct UiProgressbarSpinnerArgs { UiInteger* value; const char* varname; + + const int *visibility_states; } UiProgressbarSpinnerArgs; /* label widgets */ diff --git a/ui/ui/text.h b/ui/ui/text.h index 4e92659..9fed6b8 100644 --- a/ui/ui/text.h +++ b/ui/ui/text.h @@ -60,6 +60,7 @@ typedef struct UiTextAreaArgs { void *onchangedata; const int *states; + const int *visibility_states; } UiTextAreaArgs; typedef struct UiTextFieldArgs { @@ -88,6 +89,7 @@ typedef struct UiTextFieldArgs { void *onactivatedata; const int *states; + const int *visibility_states; } UiTextFieldArgs; typedef struct UiPathElmRet { @@ -134,6 +136,8 @@ typedef struct UiPathTextFieldArgs { void *ondragcompletedata; ui_callback ondrop; void *ondropsdata; + + const int *visibility_states; } UiPathTextFieldArgs; #define ui_textarea(obj, ...) ui_textarea_create(obj, &(UiTextAreaArgs) { __VA_ARGS__ }) -- 2.47.3