diff --git a/gnoemoe/widgets/gm-world-view.c b/gnoemoe/widgets/gm-world-view.c index e3b4e5a..6f42701 100644 --- a/gnoemoe/widgets/gm-world-view.c +++ b/gnoemoe/widgets/gm-world-view.c @@ -44,6 +44,8 @@ void on_gm_world_view_world_state_changing(GmWorld *world, guint state, GmWorldView *view); void on_gm_world_view_world_active_changed(GmWorld *world, gboolean active, GmWorldView *view); +void on_gm_world_view_world_highlight(GmWorld *world, gint start, gint end, + gchar *color, GmWorldView *view); void on_gm_world_view_world_editor_added(GmWorld *world, GmEditor *editor, GmWorldView *view); @@ -119,6 +121,8 @@ gm_world_view_finalize(GObject *object) { G_CALLBACK(on_gm_world_view_world_state_changing), view); g_signal_handlers_disconnect_by_func(view->priv->world, G_CALLBACK(on_gm_world_view_world_active_changed), view); + g_signal_handlers_disconnect_by_func(view->priv->world, + G_CALLBACK(on_gm_world_view_world_highlight), view); g_signal_handlers_disconnect_by_func(view->priv->world, G_CALLBACK(on_gm_world_view_world_editor_added), view); g_signal_handlers_disconnect_by_func(view->priv->world, @@ -379,6 +383,9 @@ gm_world_view_new(GmWorld *world) { G_CALLBACK(on_gm_world_view_world_state_changing), view); g_signal_connect(world, "active_changed", G_CALLBACK(on_gm_world_view_world_active_changed), view); + g_signal_connect(world, "highlight", + G_CALLBACK(on_gm_world_view_world_highlight), view); + g_signal_connect(world, "editor_added", G_CALLBACK(on_gm_world_view_world_editor_added), view); g_signal_connect(world, "editor_removed", @@ -488,6 +495,80 @@ gm_world_view_find_next(GmWorldView *view, const gchar *str, return FALSE; } +gboolean +gm_world_view_replace(GmWorldView *view, gchar const *replace) { + gint np = gtk_notebook_get_current_page(GTK_NOTEBOOK(view)); + GtkWidget *page; + GmSearchable *sea; + + if (np == 0) { + return FALSE; + } else { + page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(view), np); + + if (GM_IS_SEARCHABLE(page)) { + sea = GM_SEARCHABLE(page); + + if (gm_searchable_can_replace(sea)) { + return gm_searchable_replace(sea, replace); + } + } + } + + return FALSE; +} + +gboolean +gm_world_view_replace_all(GmWorldView *view, gchar const *str, + gchar const *replace, GmSearchableSearchFlags flags) { + gint np = gtk_notebook_get_current_page(GTK_NOTEBOOK(view)); + GtkWidget *page; + GmSearchable *sea; + + if (np == 0) { + return FALSE; + } else { + page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(view), np); + + if (GM_IS_SEARCHABLE(page)) { + sea = GM_SEARCHABLE(page); + + if (gm_searchable_can_replace(sea)) { + return gm_searchable_replace_all(sea, str, replace, flags); + } + } + } + + return FALSE; +} + +gboolean +gm_world_view_can_replace(GmWorldView *view) { + gint np = gtk_notebook_get_current_page(GTK_NOTEBOOK(view)); + return gm_world_view_page_can_replace(view, np); +} + +gboolean +gm_world_view_page_can_replace(GmWorldView *view, gint page_num) { + GtkWidget *page; + GmSearchable *sea; + + if (page_num == -1) { + return FALSE; + } else if (page_num == 0) { + return gm_searchable_can_replace(GM_SEARCHABLE(view)); + } else { + page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(view), page_num); + + if (GM_IS_SEARCHABLE(page)) { + sea = GM_SEARCHABLE(page); + return gm_searchable_can_replace(sea); + } + } + + return FALSE; +} + GmWorld * gm_world_view_world(GmWorldView *view) { return view->priv->world; @@ -738,6 +819,27 @@ on_gm_world_view_world_active_changed(GmWorld *world, gboolean active, } } +void +on_gm_world_view_world_highlight(GmWorld *world, gint start, gint end, + gchar *color, GmWorldView *view) { + GtkTextIter istart, iend; + GtkTextBuffer *buffer = gtk_text_view_get_buffer( + GTK_TEXT_VIEW(view->priv->text_view_world)); + + gtk_text_buffer_get_end_iter(buffer, &iend); + istart = iend; + gtk_text_iter_backward_line(&istart); + + if (start != -1) { + gtk_text_iter_forward_chars(&istart, start); + iend = istart; + gtk_text_iter_forward_chars(&iend, end); + } + + gtk_text_buffer_apply_tag_by_name(buffer, color, &istart, &iend); +} + + gboolean on_gm_world_view_world_text_view_scroll_event(GmWorldView *view, GdkEventScroll *event, GmWorldTextView *text) { if (event->state & GDK_CONTROL_MASK) {