ui/gtk/text.c

branch
newapi
changeset 323
38cb8e3992e8
parent 314
d96ba820083a
equal deleted inserted replaced
322:22f6dadd9f46 323:38cb8e3992e8
703 static void ui_path_textfield_destroy(GtkWidget *object, UiPathTextField *pathtf) { 703 static void ui_path_textfield_destroy(GtkWidget *object, UiPathTextField *pathtf) {
704 g_object_unref(pathtf->entry); 704 g_object_unref(pathtf->entry);
705 free(pathtf); 705 free(pathtf);
706 } 706 }
707 707
708 void ui_path_button_clicked(GtkWidget *widget, UiEventData *event) { 708 void ui_path_button_clicked(GtkWidget *widget, UiEventDataExt *event) {
709 UiPathElm *elm = event->customdata; 709 UiPathTextField *pathtf = event->customdata1;
710 for(int i=0;i<event->value1;i++) {
711 if(i <= event->value0) {
712 gtk_widget_remove_css_class(pathtf->current_path_buttons[i], "pathbar-button-inactive");
713 } else {
714 gtk_widget_add_css_class(pathtf->current_path_buttons[i], "pathbar-button-inactive");
715 }
716 }
717
718 UiPathElm *elm = event->customdata0;
710 cxmutstr path = cx_strdup(cx_strn(elm->path, elm->path_len)); 719 cxmutstr path = cx_strdup(cx_strn(elm->path, elm->path_len));
711 UiEvent evt; 720 UiEvent evt;
712 evt.obj = event->obj; 721 evt.obj = event->obj;
713 evt.window = evt.obj->window; 722 evt.window = evt.obj->window;
714 evt.document = evt.obj->ctx->document; 723 evt.document = evt.obj->ctx->document;
715 evt.eventdata = elm->path; 724 evt.eventdata = elm->path;
716 evt.intval = event->value; 725 evt.intval = event->value0;
717 event->callback(&evt, event->userdata); 726 event->callback(&evt, event->userdata);
718 free(path.ptr); 727 free(path.ptr);
719 } 728 }
720 729
721 int ui_pathtextfield_update(UiPathTextField* pathtf, const char *full_path) { 730 int ui_pathtextfield_update(UiPathTextField* pathtf, const char *full_path) {
732 741
733 free(pathtf->current_path); 742 free(pathtf->current_path);
734 pathtf->current_path = strdup(full_path); 743 pathtf->current_path = strdup(full_path);
735 744
736 ui_pathelm_destroy(pathtf->current_pathelms, pathtf->current_nelm); 745 ui_pathelm_destroy(pathtf->current_pathelms, pathtf->current_nelm);
746 free(pathtf->current_path_buttons);
747 pathtf->current_path_buttons = calloc(nelm, sizeof(GtkWidget*));
737 pathtf->current_pathelms = path_elm; 748 pathtf->current_pathelms = path_elm;
738 pathtf->current_nelm = nelm; 749 pathtf->current_nelm = nelm;
739 750
740 return ui_pathtextfield_update_widget(pathtf); 751 return ui_pathtextfield_update_widget(pathtf);
741 } 752 }
742 753
743 static GtkWidget* ui_path_elm_button(UiPathTextField *pathtf, UiPathElm *elm, int i) { 754 static GtkWidget* ui_path_elm_button(UiPathTextField *pathtf, UiPathElm *elm, int i) {
744 cxmutstr name = cx_strdup(cx_strn(elm->name, elm->name_len)); 755 cxmutstr name = cx_strdup(cx_strn(elm->name, elm->name_len));
745 GtkWidget *button = gtk_button_new_with_label(name.ptr); 756 GtkWidget *button = gtk_button_new_with_label(name.ptr);
757 pathtf->current_path_buttons[i] = button;
746 free(name.ptr); 758 free(name.ptr);
747 759
748 if(pathtf->onactivate) { 760 if(pathtf->onactivate) {
749 UiEventData *eventdata = malloc(sizeof(UiEventData)); 761 UiEventDataExt *eventdata = malloc(sizeof(UiEventDataExt));
762 memset(eventdata, 0, sizeof(UiEventDataExt));
750 eventdata->callback = pathtf->onactivate; 763 eventdata->callback = pathtf->onactivate;
751 eventdata->userdata = pathtf->onactivatedata; 764 eventdata->userdata = pathtf->onactivatedata;
752 eventdata->obj = pathtf->obj; 765 eventdata->obj = pathtf->obj;
753 eventdata->customdata = elm; 766 eventdata->customdata0 = elm;
754 eventdata->value = i; 767 eventdata->customdata1 = pathtf;
768 eventdata->value0 = i;
769 eventdata->value1 = pathtf->current_nelm;
755 770
756 g_signal_connect( 771 g_signal_connect(
757 button, 772 button,
758 "clicked", 773 "clicked",
759 G_CALLBACK(ui_path_button_clicked), 774 G_CALLBACK(ui_path_button_clicked),
918 gtk_widget_add_css_class(button, "flat"); 933 gtk_widget_add_css_class(button, "flat");
919 934
920 gtk_box_append(GTK_BOX(pathtf->hbox), button); 935 gtk_box_append(GTK_BOX(pathtf->hbox), button);
921 936
922 if(i+1 < pathtf->current_nelm && cx_strcmp(cx_strn(elm->name, elm->name_len), CX_STR("/"))) { 937 if(i+1 < pathtf->current_nelm && cx_strcmp(cx_strn(elm->name, elm->name_len), CX_STR("/"))) {
923 gtk_box_append(GTK_BOX(pathtf->hbox), gtk_label_new("/")); 938 GtkWidget *path_separator = gtk_label_new("/");
939 gtk_widget_add_css_class(path_separator, "pathbar-button-inactive");
940 gtk_box_append(GTK_BOX(pathtf->hbox), path_separator);
924 } 941 }
925 } 942 }
926 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->hbox); 943 gtk_stack_set_visible_child(GTK_STACK(pathtf->stack), pathtf->hbox);
927 944
928 // create a widget for receiving button press events 945 // create a widget for receiving button press events

mercurial