| 105 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
105 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
| 106 } |
106 } |
| 107 return buf; |
107 return buf; |
| 108 } |
108 } |
| 109 |
109 |
| 110 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { |
110 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { |
| 111 UiObject* current = uic_current_obj(obj); |
111 UiObject* current = uic_current_obj(obj); |
| 112 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT); |
112 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_TEXT); |
| 113 |
113 |
| 114 GtkWidget *text_area = gtk_text_view_new(); |
114 GtkWidget *text_area = gtk_text_view_new(); |
| 115 ui_set_name_and_style(text_area, args.name, args.style_class); |
115 ui_set_name_and_style(text_area, args->name, args->style_class); |
| 116 ui_set_widget_groups(obj->ctx, text_area, args.groups); |
116 ui_set_widget_groups(obj->ctx, text_area, args->groups); |
| 117 |
117 |
| 118 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_area), GTK_WRAP_WORD_CHAR); |
118 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_area), GTK_WRAP_WORD_CHAR); |
| 119 g_signal_connect( |
119 g_signal_connect( |
| 120 text_area, |
120 text_area, |
| 121 "realize", |
121 "realize", |
| 125 UiTextArea *uitext = malloc(sizeof(UiTextArea)); |
125 UiTextArea *uitext = malloc(sizeof(UiTextArea)); |
| 126 uitext->obj = obj; |
126 uitext->obj = obj; |
| 127 uitext->ctx = obj->ctx; |
127 uitext->ctx = obj->ctx; |
| 128 uitext->var = var; |
128 uitext->var = var; |
| 129 uitext->last_selection_state = 0; |
129 uitext->last_selection_state = 0; |
| 130 uitext->onchange = args.onchange; |
130 uitext->onchange = args->onchange; |
| 131 uitext->onchangedata = args.onchangedata; |
131 uitext->onchangedata = args->onchangedata; |
| 132 |
132 |
| 133 g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); |
133 g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); |
| 134 |
134 |
| 135 g_signal_connect( |
135 g_signal_connect( |
| 136 text_area, |
136 text_area, |
| 153 |
153 |
| 154 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_area), 2); |
154 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_area), 2); |
| 155 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text_area), 2); |
155 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text_area), 2); |
| 156 |
156 |
| 157 // add |
157 // add |
| 158 UI_APPLY_LAYOUT1(current, args); |
158 UI_APPLY_LAYOUT2(current, args); |
| 159 current->container->add(current->container, scroll_area, TRUE); |
159 current->container->add(current->container, scroll_area, TRUE); |
| 160 |
160 |
| 161 // bind value |
161 // bind value |
| 162 if(var) { |
162 if(var) { |
| 163 UiText *value = var->value; |
163 UiText *value = var->value; |
| 590 } |
590 } |
| 591 |
591 |
| 592 |
592 |
| 593 |
593 |
| 594 |
594 |
| 595 static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs args) { |
595 static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs *args) { |
| 596 GtkWidget *textfield = gtk_entry_new(); |
596 GtkWidget *textfield = gtk_entry_new(); |
| 597 ui_set_name_and_style(textfield, args.name, args.style_class); |
597 ui_set_name_and_style(textfield, args->name, args->style_class); |
| 598 ui_set_widget_groups(obj->ctx, textfield, args.groups); |
598 ui_set_widget_groups(obj->ctx, textfield, args->groups); |
| 599 |
599 |
| 600 UiObject* current = uic_current_obj(obj); |
600 UiObject* current = uic_current_obj(obj); |
| 601 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
601 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 602 |
602 |
| 603 UiTextField *uitext = malloc(sizeof(UiTextField)); |
603 UiTextField *uitext = malloc(sizeof(UiTextField)); |
| 604 uitext->obj = obj; |
604 uitext->obj = obj; |
| 605 uitext->var = var; |
605 uitext->var = var; |
| 606 uitext->onchange = args.onchange; |
606 uitext->onchange = args->onchange; |
| 607 uitext->onchangedata = args.onchangedata; |
607 uitext->onchangedata = args->onchangedata; |
| 608 uitext->onactivate = args.onactivate; |
608 uitext->onactivate = args->onactivate; |
| 609 uitext->onactivatedata = args.onactivatedata; |
609 uitext->onactivatedata = args->onactivatedata; |
| 610 |
610 |
| 611 g_signal_connect( |
611 g_signal_connect( |
| 612 textfield, |
612 textfield, |
| 613 "destroy", |
613 "destroy", |
| 614 G_CALLBACK(ui_textfield_destroy), |
614 G_CALLBACK(ui_textfield_destroy), |
| 615 uitext); |
615 uitext); |
| 616 |
616 |
| 617 if(args.width > 0) { |
617 if(args->width > 0) { |
| 618 // TODO: gtk4 |
618 // TODO: gtk4 |
| 619 #if GTK_MAJOR_VERSION <= 3 |
619 #if GTK_MAJOR_VERSION <= 3 |
| 620 gtk_entry_set_width_chars(GTK_ENTRY(textfield), args.width); |
620 gtk_entry_set_width_chars(GTK_ENTRY(textfield), args->width); |
| 621 #endif |
621 #endif |
| 622 } |
622 } |
| 623 if(frameless) { |
623 if(frameless) { |
| 624 // TODO: gtk2legacy workaroud |
624 // TODO: gtk2legacy workaroud |
| 625 gtk_entry_set_has_frame(GTK_ENTRY(textfield), FALSE); |
625 gtk_entry_set_has_frame(GTK_ENTRY(textfield), FALSE); |
| 626 } |
626 } |
| 627 if(password) { |
627 if(password) { |
| 628 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); |
628 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); |
| 629 } |
629 } |
| 630 |
630 |
| 631 UI_APPLY_LAYOUT1(current, args); |
631 UI_APPLY_LAYOUT2(current, args); |
| 632 current->container->add(current->container, textfield, FALSE); |
632 current->container->add(current->container, textfield, FALSE); |
| 633 |
633 |
| 634 if(var) { |
634 if(var) { |
| 635 UiString *value = var->value; |
635 UiString *value = var->value; |
| 636 if(value->value.ptr) { |
636 if(value->value.ptr) { |
| 645 value->value.ptr = NULL; |
645 value->value.ptr = NULL; |
| 646 value->value.free = NULL; |
646 value->value.free = NULL; |
| 647 value->obj = GTK_ENTRY(textfield); |
647 value->obj = GTK_ENTRY(textfield); |
| 648 } |
648 } |
| 649 |
649 |
| 650 if(args.onchange || var) { |
650 if(args->onchange || var) { |
| 651 g_signal_connect( |
651 g_signal_connect( |
| 652 textfield, |
652 textfield, |
| 653 "changed", |
653 "changed", |
| 654 G_CALLBACK(ui_textfield_changed), |
654 G_CALLBACK(ui_textfield_changed), |
| 655 uitext); |
655 uitext); |
| 656 } |
656 } |
| 657 |
657 |
| 658 if(args.onactivate) { |
658 if(args->onactivate) { |
| 659 g_signal_connect( |
659 g_signal_connect( |
| 660 textfield, |
660 textfield, |
| 661 "activate", |
661 "activate", |
| 662 G_CALLBACK(ui_textfield_activate), |
662 G_CALLBACK(ui_textfield_activate), |
| 663 uitext); |
663 uitext); |
| 664 } |
664 } |
| 665 |
665 |
| 666 return textfield; |
666 return textfield; |
| 667 } |
667 } |
| 668 |
668 |
| 669 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { |
669 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { |
| 670 return create_textfield(obj, FALSE, FALSE, args); |
670 return create_textfield(obj, FALSE, FALSE, args); |
| 671 } |
671 } |
| 672 |
672 |
| 673 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { |
673 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 674 return create_textfield(obj, TRUE, FALSE, args); |
674 return create_textfield(obj, TRUE, FALSE, args); |
| 675 } |
675 } |
| 676 |
676 |
| 677 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { |
677 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 678 return create_textfield(obj, FALSE, TRUE, args); |
678 return create_textfield(obj, FALSE, TRUE, args); |
| 679 } |
679 } |
| 680 |
680 |
| 681 |
681 |
| 682 void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) { |
682 void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) { |
| 913 pathbar_show_hbox(NULL, pathtf); |
913 pathbar_show_hbox(NULL, pathtf); |
| 914 } |
914 } |
| 915 return FALSE; |
915 return FALSE; |
| 916 } |
916 } |
| 917 |
917 |
| 918 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { |
918 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { |
| 919 UiObject* current = uic_current_obj(obj); |
919 UiObject* current = uic_current_obj(obj); |
| 920 |
920 |
| 921 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
921 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
| 922 memset(pathtf, 0, sizeof(UiPathTextField)); |
922 memset(pathtf, 0, sizeof(UiPathTextField)); |
| 923 pathtf->obj = obj; |
923 pathtf->obj = obj; |
| 924 pathtf->getpathelm = args.getpathelm; |
924 pathtf->getpathelm = args->getpathelm; |
| 925 pathtf->getpathelmdata = args.getpathelmdata; |
925 pathtf->getpathelmdata = args->getpathelmdata; |
| 926 pathtf->onactivate = args.onactivate; |
926 pathtf->onactivate = args->onactivate; |
| 927 pathtf->onactivatedata = args.onactivatedata; |
927 pathtf->onactivatedata = args->onactivatedata; |
| 928 pathtf->ondragcomplete = args.ondragcomplete; |
928 pathtf->ondragcomplete = args->ondragcomplete; |
| 929 pathtf->ondragcompletedata = args.ondragcompletedata; |
929 pathtf->ondragcompletedata = args->ondragcompletedata; |
| 930 pathtf->ondragstart = args.ondragstart; |
930 pathtf->ondragstart = args->ondragstart; |
| 931 pathtf->ondragstartdata = args.ondragstartdata; |
931 pathtf->ondragstartdata = args->ondragstartdata; |
| 932 pathtf->ondrop = args.ondrop; |
932 pathtf->ondrop = args->ondrop; |
| 933 pathtf->ondropdata = args.ondropsdata; |
933 pathtf->ondropdata = args->ondropsdata; |
| 934 |
934 |
| 935 if(!pathtf->getpathelm) { |
935 if(!pathtf->getpathelm) { |
| 936 pathtf->getpathelm = default_pathelm_func; |
936 pathtf->getpathelm = default_pathelm_func; |
| 937 pathtf->getpathelmdata = NULL; |
937 pathtf->getpathelmdata = NULL; |
| 938 } |
938 } |
| 939 |
939 |
| 940 pathtf->stack = gtk_stack_new(); |
940 pathtf->stack = gtk_stack_new(); |
| 941 gtk_widget_set_name(pathtf->stack, "path-textfield-box"); |
941 gtk_widget_set_name(pathtf->stack, "path-textfield-box"); |
| 942 |
942 |
| 943 UI_APPLY_LAYOUT1(current, args); |
943 UI_APPLY_LAYOUT2(current, args); |
| 944 current->container->add(current->container, pathtf->stack, FALSE); |
944 current->container->add(current->container, pathtf->stack, FALSE); |
| 945 |
945 |
| 946 pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); |
946 pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); |
| 947 pathtf->entry = gtk_entry_new(); |
947 pathtf->entry = gtk_entry_new(); |
| 948 gtk_box_append(GTK_BOX(pathtf->entry_box), pathtf->entry); |
948 gtk_box_append(GTK_BOX(pathtf->entry_box), pathtf->entry); |
| 971 g_signal_connect(entry_cancel, "key-pressed", G_CALLBACK(ui_path_textfield_key_controller), pathtf); |
971 g_signal_connect(entry_cancel, "key-pressed", G_CALLBACK(ui_path_textfield_key_controller), pathtf); |
| 972 |
972 |
| 973 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box); |
973 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box); |
| 974 |
974 |
| 975 |
975 |
| 976 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
976 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 977 if (var) { |
977 if (var) { |
| 978 UiString* value = (UiString*)var->value; |
978 UiString* value = (UiString*)var->value; |
| 979 value->obj = pathtf; |
979 value->obj = pathtf; |
| 980 value->get = ui_path_textfield_get; |
980 value->get = ui_path_textfield_get; |
| 981 value->set = ui_path_textfield_set; |
981 value->set = ui_path_textfield_set; |
| 1074 gtk_box_set_homogeneous(GTK_BOX(bb), FALSE); |
1074 gtk_box_set_homogeneous(GTK_BOX(bb), FALSE); |
| 1075 gtk_box_set_spacing(GTK_BOX(bb), 0); |
1075 gtk_box_set_spacing(GTK_BOX(bb), 0); |
| 1076 return bb; |
1076 return bb; |
| 1077 } |
1077 } |
| 1078 |
1078 |
| 1079 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { |
1079 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { |
| 1080 UiObject* current = uic_current_obj(obj); |
1080 UiObject* current = uic_current_obj(obj); |
| 1081 |
1081 |
| 1082 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
1082 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
| 1083 memset(pathtf, 0, sizeof(UiPathTextField)); |
1083 memset(pathtf, 0, sizeof(UiPathTextField)); |
| 1084 pathtf->obj = obj; |
1084 pathtf->obj = obj; |
| 1085 pathtf->getpathelm = args.getpathelm; |
1085 pathtf->getpathelm = args->getpathelm; |
| 1086 pathtf->getpathelmdata = args.getpathelmdata; |
1086 pathtf->getpathelmdata = args->getpathelmdata; |
| 1087 pathtf->onactivate = args.onactivate; |
1087 pathtf->onactivate = args->onactivate; |
| 1088 pathtf->onactivatedata = args.onactivatedata; |
1088 pathtf->onactivatedata = args->onactivatedata; |
| 1089 pathtf->ondragcomplete = args.ondragcomplete; |
1089 pathtf->ondragcomplete = args->ondragcomplete; |
| 1090 pathtf->ondragcompletedata = args.ondragcompletedata; |
1090 pathtf->ondragcompletedata = args->ondragcompletedata; |
| 1091 pathtf->ondragstart = args.ondragstart; |
1091 pathtf->ondragstart = args->ondragstart; |
| 1092 pathtf->ondragstartdata = args.ondragstartdata; |
1092 pathtf->ondragstartdata = args->ondragstartdata; |
| 1093 pathtf->ondrop = args.ondrop; |
1093 pathtf->ondrop = args->ondrop; |
| 1094 pathtf->ondropdata = args.ondropsdata; |
1094 pathtf->ondropdata = args->ondropsdata; |
| 1095 |
1095 |
| 1096 if(!pathtf->getpathelm) { |
1096 if(!pathtf->getpathelm) { |
| 1097 pathtf->getpathelm = default_pathelm_func; |
1097 pathtf->getpathelm = default_pathelm_func; |
| 1098 pathtf->getpathelmdata = NULL; |
1098 pathtf->getpathelmdata = NULL; |
| 1099 } |
1099 } |
| 1110 eventbox, |
1110 eventbox, |
| 1111 "destroy", |
1111 "destroy", |
| 1112 G_CALLBACK(ui_path_textfield_destroy), |
1112 G_CALLBACK(ui_path_textfield_destroy), |
| 1113 pathtf); |
1113 pathtf); |
| 1114 |
1114 |
| 1115 UI_APPLY_LAYOUT1(current, args); |
1115 UI_APPLY_LAYOUT2(current, args); |
| 1116 current->container->add(current->container, eventbox, FALSE); |
1116 current->container->add(current->container, eventbox, FALSE); |
| 1117 |
1117 |
| 1118 // hbox as parent for the GtkEntry and GtkButtonBox |
1118 // hbox as parent for the GtkEntry and GtkButtonBox |
| 1119 GtkWidget *hbox = ui_gtk_hbox_new(0); |
1119 GtkWidget *hbox = ui_gtk_hbox_new(0); |
| 1120 pathtf->hbox = hbox; |
1120 pathtf->hbox = hbox; |
| 1135 pathtf->entry, |
1135 pathtf->entry, |
| 1136 "key-press-event", |
1136 "key-press-event", |
| 1137 G_CALLBACK(ui_path_textfield_key_press), |
1137 G_CALLBACK(ui_path_textfield_key_press), |
| 1138 pathtf); |
1138 pathtf); |
| 1139 |
1139 |
| 1140 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
1140 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 1141 if (var) { |
1141 if (var) { |
| 1142 UiString* value = (UiString*)var->value; |
1142 UiString* value = (UiString*)var->value; |
| 1143 value->obj = pathtf; |
1143 value->obj = pathtf; |
| 1144 value->get = ui_path_textfield_get; |
1144 value->get = ui_path_textfield_get; |
| 1145 value->set = ui_path_textfield_set; |
1145 value->set = ui_path_textfield_set; |