ui/gtk/text.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 109
c3dfcb8f0be7
equal deleted inserted replaced
107:b34bd1557c6c 108:77254bd6dccb
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);
708 UiEvent e; 710 UiEvent e;
709 e.obj = textfield->obj; 711 e.obj = textfield->obj;
710 e.window = e.obj->window; 712 e.window = e.obj->window;
711 e.document = textfield->obj->ctx->document; 713 e.document = textfield->obj->ctx->document;
712 e.eventdata = NULL; 714 e.eventdata = NULL;
715 e.eventdatatype = 0;
713 e.intval = 0; 716 e.intval = 0;
714 e.set = ui_get_setop(); 717 e.set = ui_get_setop();
715 textfield->onactivate(&e, textfield->onactivatedata); 718 textfield->onactivate(&e, textfield->onactivatedata);
716 } 719 }
717 } 720 }
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 }
886 UiEvent evt; 890 UiEvent evt;
887 evt.obj = obj; 891 evt.obj = obj;
888 evt.window = obj->window; 892 evt.window = obj->window;
889 evt.document = obj->ctx->document; 893 evt.document = obj->ctx->document;
890 evt.eventdata = (char*)text; 894 evt.eventdata = (char*)text;
895 evt.eventdatatype = UI_EVENT_DATA_STRING;
891 evt.intval = -1; 896 evt.intval = -1;
892 pathtf->onactivate(&evt, pathtf->onactivatedata); 897 pathtf->onactivate(&evt, pathtf->onactivatedata);
893 } 898 }
894 } 899 }
895 900
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;

mercurial