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 |