diff --git a/data/ui/gummi.glade b/data/ui/gummi.glade index 48d7c3de..5d9ed5ea 100644 --- a/data/ui/gummi.glade +++ b/data/ui/gummi.glade @@ -1496,7 +1496,7 @@ True image9 False - + @@ -1675,6 +1675,30 @@ + + + Duplicate Line + False + True + False + True + False + + + + + + + Delete Line + False + True + False + True + False + + + + True diff --git a/src/gui/gui-main.c b/src/gui/gui-main.c index d64b3b08..93f7865c 100644 --- a/src/gui/gui-main.c +++ b/src/gui/gui-main.c @@ -68,7 +68,7 @@ const gchar* insens_widgets_str[] = { "tool_left", "tool_center", "tool_right", "menu_save", "menu_saveas", "menu_exportpdf", "import_tabs", "menu_close", "menu_export", "menu_undo", "menu_redo", "menu_cut", "menu_copy", "menu_paste", - "menu_delete", "menu_selectall", "menu_preferences", "menu_find", + "menu_delete", "menu_selectall", "menu_duplicate_line", "menu_delete_line", "menu_preferences", "menu_find", "menu_prev", "menu_next", "menu_pdfcompile", "menu_compileopts", "menu_runmakeindex", "menu_runbibtex", "menu_docstat", "menu_spelling", "menu_snippets", "menu_edit", "menu_document", "menu_search", diff --git a/src/gui/gui-menu.c b/src/gui/gui-menu.c index 90e0b38a..77a1e018 100644 --- a/src/gui/gui-menu.c +++ b/src/gui/gui-menu.c @@ -173,6 +173,63 @@ void on_menu_export_activate (GtkWidget *widget, void *user) { g_free (filename); } +G_MODULE_EXPORT +void on_menu_duplicate_line_activate (GtkWidget *widget, void *user) { + GtkTextIter start, end; + gboolean has_selection = gtk_text_buffer_get_selection_bounds (g_e_buffer, &start, &end); + + if (has_selection) { + gchar* entire_content = gtk_text_buffer_get_text (g_e_buffer, &start, &end, TRUE); + gtk_text_buffer_insert_at_cursor (g_e_buffer, entire_content, strlen (entire_content)); + g_free (entire_content); + } else { + GtkTextMark* insert_mark = gtk_text_buffer_get_insert (g_e_buffer); + + GtkTextIter insert_mark_position; + gtk_text_buffer_get_iter_at_mark (g_e_buffer, &insert_mark_position, insert_mark); + + gint line_of_insert = gtk_text_iter_get_line (&insert_mark_position); + gint line_after_insert = line_of_insert + 1; + + GtkTextIter start_of_line; + gtk_text_buffer_get_iter_at_line (g_e_buffer, &start_of_line, line_of_insert); + + GtkTextIter end_of_line; + gtk_text_buffer_get_iter_at_line (g_e_buffer, &end_of_line, line_after_insert); + + gchar* current_line_content = gtk_text_buffer_get_text (g_e_buffer, &start_of_line, &end_of_line, 1); + gint length_of_current_line_content = strlen (current_line_content); + gtk_text_buffer_insert (g_e_buffer, &end_of_line, current_line_content, length_of_current_line_content); + g_free (current_line_content); + } +} + +G_MODULE_EXPORT +void on_menu_delete_line_activate (GtkWidget *widget, void *user) { + GtkTextMark* insert_mark = gtk_text_buffer_get_insert (g_e_buffer); + + GtkTextIter insert_mark_position; + gtk_text_buffer_get_iter_at_mark (g_e_buffer, &insert_mark_position, insert_mark); + + gint line_of_insert = gtk_text_iter_get_line (&insert_mark_position); + gint line_after_insert = line_of_insert + 1; + + GtkTextIter start_of_line; + gtk_text_buffer_get_iter_at_line (g_e_buffer, &start_of_line, line_of_insert); + + GtkTextIter end_of_line; + gtk_text_buffer_get_iter_at_line (g_e_buffer, &end_of_line, line_after_insert); + + GtkTextIter start, end; + gboolean has_selection = gtk_text_buffer_get_selection_bounds (g_e_buffer, &start, &end); + + if (has_selection) + gtk_text_buffer_delete_selection (g_e_buffer, FALSE, TRUE); + else + // cannot be undone in case of multiple calls/lines deleted + gtk_text_buffer_delete (g_e_buffer, &start_of_line, &end_of_line); +} + G_MODULE_EXPORT void on_menu_recent_activate (GtkWidget *widget, void *user) { const gchar* name = gtk_menu_item_get_label (GTK_MENU_ITEM (widget));