| 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); |
| 160 |
160 |
| 161 // bind value |
161 // bind value |
| 162 if(var) { |
162 if(var) { |
| 163 UiText *value = var->value; |
163 UiText *value = var->value; |
| 164 GtkTextBuffer *buf; |
164 GtkTextBuffer *buf; |
| 328 UiEvent e; |
328 UiEvent e; |
| 329 e.obj = textarea->obj; |
329 e.obj = textarea->obj; |
| 330 e.window = e.obj->window; |
330 e.window = e.obj->window; |
| 331 e.document = textarea->ctx->document; |
331 e.document = textarea->ctx->document; |
| 332 e.eventdata = value; |
332 e.eventdata = value; |
| |
333 e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; |
| 333 e.intval = 0; |
334 e.intval = 0; |
| 334 e.set = ui_get_setop(); |
335 e.set = ui_get_setop(); |
| 335 |
336 |
| 336 if(textarea->onchange) { |
337 if(textarea->onchange) { |
| 337 textarea->onchange(&e, textarea->onchangedata); |
338 textarea->onchange(&e, textarea->onchangedata); |
| 590 } |
591 } |
| 591 |
592 |
| 592 |
593 |
| 593 |
594 |
| 594 |
595 |
| 595 static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs args) { |
596 static UIWIDGET create_textfield(UiObject *obj, UiBool frameless, UiBool password, UiTextFieldArgs *args) { |
| 596 GtkWidget *textfield = gtk_entry_new(); |
597 GtkWidget *textfield = gtk_entry_new(); |
| 597 ui_set_name_and_style(textfield, args.name, args.style_class); |
598 ui_set_name_and_style(textfield, args->name, args->style_class); |
| 598 ui_set_widget_groups(obj->ctx, textfield, args.groups); |
599 ui_set_widget_groups(obj->ctx, textfield, args->groups); |
| 599 |
600 |
| 600 UiObject* current = uic_current_obj(obj); |
601 UiObject* current = uic_current_obj(obj); |
| 601 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
602 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 602 |
603 |
| 603 UiTextField *uitext = malloc(sizeof(UiTextField)); |
604 UiTextField *uitext = malloc(sizeof(UiTextField)); |
| 604 uitext->obj = obj; |
605 uitext->obj = obj; |
| 605 uitext->var = var; |
606 uitext->var = var; |
| 606 uitext->onchange = args.onchange; |
607 uitext->onchange = args->onchange; |
| 607 uitext->onchangedata = args.onchangedata; |
608 uitext->onchangedata = args->onchangedata; |
| 608 uitext->onactivate = args.onactivate; |
609 uitext->onactivate = args->onactivate; |
| 609 uitext->onactivatedata = args.onactivatedata; |
610 uitext->onactivatedata = args->onactivatedata; |
| 610 |
611 |
| 611 g_signal_connect( |
612 g_signal_connect( |
| 612 textfield, |
613 textfield, |
| 613 "destroy", |
614 "destroy", |
| 614 G_CALLBACK(ui_textfield_destroy), |
615 G_CALLBACK(ui_textfield_destroy), |
| 615 uitext); |
616 uitext); |
| 616 |
617 |
| 617 if(args.width > 0) { |
618 if(args->width > 0) { |
| 618 // TODO: gtk4 |
619 // TODO: gtk4 |
| 619 #if GTK_MAJOR_VERSION <= 3 |
620 #if GTK_MAJOR_VERSION <= 3 |
| 620 gtk_entry_set_width_chars(GTK_ENTRY(textfield), args.width); |
621 gtk_entry_set_width_chars(GTK_ENTRY(textfield), args->width); |
| 621 #endif |
622 #endif |
| 622 } |
623 } |
| 623 if(frameless) { |
624 if(frameless) { |
| 624 // TODO: gtk2legacy workaroud |
625 // TODO: gtk2legacy workaroud |
| 625 gtk_entry_set_has_frame(GTK_ENTRY(textfield), FALSE); |
626 gtk_entry_set_has_frame(GTK_ENTRY(textfield), FALSE); |
| 626 } |
627 } |
| 627 if(password) { |
628 if(password) { |
| 628 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); |
629 gtk_entry_set_visibility(GTK_ENTRY(textfield), FALSE); |
| 629 } |
630 } |
| 630 |
631 |
| 631 UI_APPLY_LAYOUT1(current, args); |
632 UI_APPLY_LAYOUT2(current, args); |
| 632 current->container->add(current->container, textfield, FALSE); |
633 current->container->add(current->container, textfield); |
| 633 |
634 |
| 634 if(var) { |
635 if(var) { |
| 635 UiString *value = var->value; |
636 UiString *value = var->value; |
| 636 if(value->value.ptr) { |
637 if(value->value.ptr) { |
| 637 ENTRY_SET_TEXT(textfield, value->value.ptr); |
638 ENTRY_SET_TEXT(textfield, value->value.ptr); |
| 645 value->value.ptr = NULL; |
646 value->value.ptr = NULL; |
| 646 value->value.free = NULL; |
647 value->value.free = NULL; |
| 647 value->obj = GTK_ENTRY(textfield); |
648 value->obj = GTK_ENTRY(textfield); |
| 648 } |
649 } |
| 649 |
650 |
| 650 if(args.onchange || var) { |
651 if(args->onchange || var) { |
| 651 g_signal_connect( |
652 g_signal_connect( |
| 652 textfield, |
653 textfield, |
| 653 "changed", |
654 "changed", |
| 654 G_CALLBACK(ui_textfield_changed), |
655 G_CALLBACK(ui_textfield_changed), |
| 655 uitext); |
656 uitext); |
| 656 } |
657 } |
| 657 |
658 |
| 658 if(args.onactivate) { |
659 if(args->onactivate) { |
| 659 g_signal_connect( |
660 g_signal_connect( |
| 660 textfield, |
661 textfield, |
| 661 "activate", |
662 "activate", |
| 662 G_CALLBACK(ui_textfield_activate), |
663 G_CALLBACK(ui_textfield_activate), |
| 663 uitext); |
664 uitext); |
| 664 } |
665 } |
| 665 |
666 |
| 666 return textfield; |
667 return textfield; |
| 667 } |
668 } |
| 668 |
669 |
| 669 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { |
670 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { |
| 670 return create_textfield(obj, FALSE, FALSE, args); |
671 return create_textfield(obj, FALSE, FALSE, args); |
| 671 } |
672 } |
| 672 |
673 |
| 673 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { |
674 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 674 return create_textfield(obj, TRUE, FALSE, args); |
675 return create_textfield(obj, TRUE, FALSE, args); |
| 675 } |
676 } |
| 676 |
677 |
| 677 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { |
678 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 678 return create_textfield(obj, FALSE, TRUE, args); |
679 return create_textfield(obj, FALSE, TRUE, args); |
| 679 } |
680 } |
| 680 |
681 |
| 681 |
682 |
| 682 void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) { |
683 void ui_textfield_destroy(GtkWidget *object, UiTextField *textfield) { |
| 689 UiEvent e; |
690 UiEvent e; |
| 690 e.obj = textfield->obj; |
691 e.obj = textfield->obj; |
| 691 e.window = e.obj->window; |
692 e.window = e.obj->window; |
| 692 e.document = textfield->obj->ctx->document; |
693 e.document = textfield->obj->ctx->document; |
| 693 e.eventdata = value; |
694 e.eventdata = value; |
| |
695 e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; |
| 694 e.intval = 0; |
696 e.intval = 0; |
| 695 e.set = ui_get_setop(); |
697 e.set = ui_get_setop(); |
| 696 |
698 |
| 697 if(textfield->onchange) { |
699 if(textfield->onchange) { |
| 698 textfield->onchange(&e, textfield->onchangedata); |
700 textfield->onchange(&e, textfield->onchangedata); |
| 805 UiEvent evt; |
808 UiEvent evt; |
| 806 evt.obj = event->obj; |
809 evt.obj = event->obj; |
| 807 evt.window = evt.obj->window; |
810 evt.window = evt.obj->window; |
| 808 evt.document = evt.obj->ctx->document; |
811 evt.document = evt.obj->ctx->document; |
| 809 evt.eventdata = elm->path; |
812 evt.eventdata = elm->path; |
| |
813 evt.eventdatatype = UI_EVENT_DATA_STRING; |
| 810 evt.intval = event->value0; |
814 evt.intval = event->value0; |
| 811 evt.set = ui_get_setop(); |
815 evt.set = ui_get_setop(); |
| 812 event->callback(&evt, event->userdata); |
816 event->callback(&evt, event->userdata); |
| 813 free(path.ptr); |
817 free(path.ptr); |
| 814 } |
818 } |
| 913 pathbar_show_hbox(NULL, pathtf); |
918 pathbar_show_hbox(NULL, pathtf); |
| 914 } |
919 } |
| 915 return FALSE; |
920 return FALSE; |
| 916 } |
921 } |
| 917 |
922 |
| 918 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { |
923 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { |
| 919 UiObject* current = uic_current_obj(obj); |
924 UiObject* current = uic_current_obj(obj); |
| 920 |
925 |
| 921 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
926 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
| 922 memset(pathtf, 0, sizeof(UiPathTextField)); |
927 memset(pathtf, 0, sizeof(UiPathTextField)); |
| 923 pathtf->obj = obj; |
928 pathtf->obj = obj; |
| 924 pathtf->getpathelm = args.getpathelm; |
929 pathtf->getpathelm = args->getpathelm; |
| 925 pathtf->getpathelmdata = args.getpathelmdata; |
930 pathtf->getpathelmdata = args->getpathelmdata; |
| 926 pathtf->onactivate = args.onactivate; |
931 pathtf->onactivate = args->onactivate; |
| 927 pathtf->onactivatedata = args.onactivatedata; |
932 pathtf->onactivatedata = args->onactivatedata; |
| 928 pathtf->ondragcomplete = args.ondragcomplete; |
933 pathtf->ondragcomplete = args->ondragcomplete; |
| 929 pathtf->ondragcompletedata = args.ondragcompletedata; |
934 pathtf->ondragcompletedata = args->ondragcompletedata; |
| 930 pathtf->ondragstart = args.ondragstart; |
935 pathtf->ondragstart = args->ondragstart; |
| 931 pathtf->ondragstartdata = args.ondragstartdata; |
936 pathtf->ondragstartdata = args->ondragstartdata; |
| 932 pathtf->ondrop = args.ondrop; |
937 pathtf->ondrop = args->ondrop; |
| 933 pathtf->ondropdata = args.ondropsdata; |
938 pathtf->ondropdata = args->ondropsdata; |
| 934 |
939 |
| 935 if(!pathtf->getpathelm) { |
940 if(!pathtf->getpathelm) { |
| 936 pathtf->getpathelm = default_pathelm_func; |
941 pathtf->getpathelm = default_pathelm_func; |
| 937 pathtf->getpathelmdata = NULL; |
942 pathtf->getpathelmdata = NULL; |
| 938 } |
943 } |
| 939 |
944 |
| 940 pathtf->stack = gtk_stack_new(); |
945 pathtf->stack = gtk_stack_new(); |
| 941 gtk_widget_set_name(pathtf->stack, "path-textfield-box"); |
946 gtk_widget_set_name(pathtf->stack, "path-textfield-box"); |
| 942 |
947 |
| 943 UI_APPLY_LAYOUT1(current, args); |
948 UI_APPLY_LAYOUT2(current, args); |
| 944 current->container->add(current->container, pathtf->stack, FALSE); |
949 current->container->add(current->container, pathtf->stack); |
| 945 |
950 |
| 946 pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); |
951 pathtf->entry_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); |
| 947 pathtf->entry = gtk_entry_new(); |
952 pathtf->entry = gtk_entry_new(); |
| 948 gtk_box_append(GTK_BOX(pathtf->entry_box), pathtf->entry); |
953 gtk_box_append(GTK_BOX(pathtf->entry_box), pathtf->entry); |
| 949 gtk_widget_set_hexpand(pathtf->entry, TRUE); |
954 gtk_widget_set_hexpand(pathtf->entry, TRUE); |
| 971 g_signal_connect(entry_cancel, "key-pressed", G_CALLBACK(ui_path_textfield_key_controller), pathtf); |
976 g_signal_connect(entry_cancel, "key-pressed", G_CALLBACK(ui_path_textfield_key_controller), pathtf); |
| 972 |
977 |
| 973 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box); |
978 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->entry_box); |
| 974 |
979 |
| 975 |
980 |
| 976 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
981 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 977 if (var) { |
982 if (var) { |
| 978 UiString* value = (UiString*)var->value; |
983 UiString* value = (UiString*)var->value; |
| 979 value->obj = pathtf; |
984 value->obj = pathtf; |
| 980 value->get = ui_path_textfield_get; |
985 value->get = ui_path_textfield_get; |
| 981 value->set = ui_path_textfield_set; |
986 value->set = ui_path_textfield_set; |
| 1074 gtk_box_set_homogeneous(GTK_BOX(bb), FALSE); |
1079 gtk_box_set_homogeneous(GTK_BOX(bb), FALSE); |
| 1075 gtk_box_set_spacing(GTK_BOX(bb), 0); |
1080 gtk_box_set_spacing(GTK_BOX(bb), 0); |
| 1076 return bb; |
1081 return bb; |
| 1077 } |
1082 } |
| 1078 |
1083 |
| 1079 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { |
1084 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { |
| 1080 UiObject* current = uic_current_obj(obj); |
1085 UiObject* current = uic_current_obj(obj); |
| 1081 |
1086 |
| 1082 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
1087 UiPathTextField *pathtf = malloc(sizeof(UiPathTextField)); |
| 1083 memset(pathtf, 0, sizeof(UiPathTextField)); |
1088 memset(pathtf, 0, sizeof(UiPathTextField)); |
| 1084 pathtf->obj = obj; |
1089 pathtf->obj = obj; |
| 1085 pathtf->getpathelm = args.getpathelm; |
1090 pathtf->getpathelm = args->getpathelm; |
| 1086 pathtf->getpathelmdata = args.getpathelmdata; |
1091 pathtf->getpathelmdata = args->getpathelmdata; |
| 1087 pathtf->onactivate = args.onactivate; |
1092 pathtf->onactivate = args->onactivate; |
| 1088 pathtf->onactivatedata = args.onactivatedata; |
1093 pathtf->onactivatedata = args->onactivatedata; |
| 1089 pathtf->ondragcomplete = args.ondragcomplete; |
1094 pathtf->ondragcomplete = args->ondragcomplete; |
| 1090 pathtf->ondragcompletedata = args.ondragcompletedata; |
1095 pathtf->ondragcompletedata = args->ondragcompletedata; |
| 1091 pathtf->ondragstart = args.ondragstart; |
1096 pathtf->ondragstart = args->ondragstart; |
| 1092 pathtf->ondragstartdata = args.ondragstartdata; |
1097 pathtf->ondragstartdata = args->ondragstartdata; |
| 1093 pathtf->ondrop = args.ondrop; |
1098 pathtf->ondrop = args->ondrop; |
| 1094 pathtf->ondropdata = args.ondropsdata; |
1099 pathtf->ondropdata = args->ondropsdata; |
| 1095 |
1100 |
| 1096 if(!pathtf->getpathelm) { |
1101 if(!pathtf->getpathelm) { |
| 1097 pathtf->getpathelm = default_pathelm_func; |
1102 pathtf->getpathelm = default_pathelm_func; |
| 1098 pathtf->getpathelmdata = NULL; |
1103 pathtf->getpathelmdata = NULL; |
| 1099 } |
1104 } |
| 1110 eventbox, |
1115 eventbox, |
| 1111 "destroy", |
1116 "destroy", |
| 1112 G_CALLBACK(ui_path_textfield_destroy), |
1117 G_CALLBACK(ui_path_textfield_destroy), |
| 1113 pathtf); |
1118 pathtf); |
| 1114 |
1119 |
| 1115 UI_APPLY_LAYOUT1(current, args); |
1120 UI_APPLY_LAYOUT2(current, args); |
| 1116 current->container->add(current->container, eventbox, FALSE); |
1121 current->container->add(current->container, eventbox, FALSE); |
| 1117 |
1122 |
| 1118 // hbox as parent for the GtkEntry and GtkButtonBox |
1123 // hbox as parent for the GtkEntry and GtkButtonBox |
| 1119 GtkWidget *hbox = ui_gtk_hbox_new(0); |
1124 GtkWidget *hbox = ui_gtk_hbox_new(0); |
| 1120 pathtf->hbox = hbox; |
1125 pathtf->hbox = hbox; |
| 1135 pathtf->entry, |
1140 pathtf->entry, |
| 1136 "key-press-event", |
1141 "key-press-event", |
| 1137 G_CALLBACK(ui_path_textfield_key_press), |
1142 G_CALLBACK(ui_path_textfield_key_press), |
| 1138 pathtf); |
1143 pathtf); |
| 1139 |
1144 |
| 1140 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_STRING); |
1145 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
| 1141 if (var) { |
1146 if (var) { |
| 1142 UiString* value = (UiString*)var->value; |
1147 UiString* value = (UiString*)var->value; |
| 1143 value->obj = pathtf; |
1148 value->obj = pathtf; |
| 1144 value->get = ui_path_textfield_get; |
1149 value->get = ui_path_textfield_get; |
| 1145 value->set = ui_path_textfield_set; |
1150 value->set = ui_path_textfield_set; |