static CxMap *markdown_tags;
+static void editor_button_released_cb(
+ GtkGestureClick *gesture,
+ guint n_press,
+ double x,
+ double y,
+ NoteEditor *editor);
+
void editor_global_init() {
markdown_tags = cxHashMapCreateSimple(sizeof(MDTag));
}
-void editor_init_textview(UIWIDGET textview) {
+void editor_init_textview(UiObject *obj, UIWIDGET textview) {
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_WORD_CHAR);
+ gtk_text_view_set_left_margin(GTK_TEXT_VIEW(textview), 16);
+
+ NoteEditor *editor = malloc(sizeof(NoteEditor));
+ memset(editor, 0, sizeof(NoteEditor));
+
+ editor->obj = obj;
+ editor->textview = textview;
+
+ g_object_set_data(G_OBJECT(textview), "editor", editor);
+
+ GtkEventController *controller = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
+ g_signal_connect(controller, "released", G_CALLBACK (editor_button_released_cb), editor);
+ gtk_widget_add_controller(textview, controller);
+}
+
+static void editor_button_released_cb(
+ GtkGestureClick *gesture,
+ guint n_press,
+ double x,
+ double y,
+ NoteEditor *editor)
+{
+ GtkTextView *textview = GTK_TEXT_VIEW(editor->textview);
+ if(gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture)) != 1) {
+ return;
+ }
+
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
+
+ if(gtk_text_buffer_get_has_selection(buffer)) {
+ return;
+ }
+ int buffer_x, buffer_y;
+ gtk_text_view_window_to_buffer_coords(
+ textview,
+ GTK_TEXT_WINDOW_WIDGET,
+ x,
+ y,
+ &buffer_x,
+ &buffer_y);
+
+ GtkTextIter pos;
+ if(gtk_text_view_get_iter_at_location(textview, &pos, buffer_x, buffer_y)) {
+ editor_try_follow_link(editor, &pos);
+ }
}
+void editor_try_follow_link(NoteEditor *editor, GtkTextIter *pos) {
+ GSList *tags = gtk_text_iter_get_tags(pos);
+ while(tags) {
+ GtkTextTag *tag = tags->data;
+ TextLink *link = g_object_get_data(G_OBJECT(tag), "link");
+ if(link) {
+ printf("open link: %s\n", link->link);
+ break;
+ }
+ tags = tags->next;
+ }
+}
+
+
void editor_init_textbuf(UiText *text) {
// toolkit internals: data1 is a GtkTextBuffer, but it is only
// initialized after UiText is bound to the textview
}
if(sec->link) {
GtkTextTag *linktag = gtk_text_tag_new(NULL);
- char *link = strdup(sec->link);
+ TextLink *link = malloc(sizeof(TextLink));
+ link->link = strdup(sec->link);
+ link->type = 0;
g_object_set_data(G_OBJECT(linktag), "link", link);
// TODO: destroy handler
gtk_text_tag_table_add(tagtable, linktag);
}
}
-cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a) {
- char *str = ui_get(text);
-
-
+cxmutstr editor_get_markdown(UiText *text, const CxAllocator *a) {
CxBuffer out;
cxBufferInit(&out, NULL, 1024, a, CX_BUFFER_AUTO_EXTEND);