gem-graph-client/libide/editor/ide-editor-page-settings.c

242 lines
8.0 KiB
C
Raw Normal View History

/* ide-editor-page-settings.c
*
* Copyright 2017-2019 Christian Hergert <chergert@redhat.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#define G_LOG_DOMAIN "ide-editor-page-settings"
#include "config.h"
#include "ide-editor-private.h"
#include <gtksourceview/gtksource.h>
static gboolean
get_smart_home_end (GValue *value,
GVariant *variant,
gpointer user_data)
{
if (g_variant_get_boolean (variant))
g_value_set_enum (value, GTK_SOURCE_SMART_HOME_END_BEFORE);
else
g_value_set_enum (value, GTK_SOURCE_SMART_HOME_END_DISABLED);
return TRUE;
}
static gboolean
get_wrap_mode (GValue *value,
GVariant *variant,
gpointer user_data)
{
const gchar *wrap_mode = g_variant_get_string (variant, NULL);
if (!g_strcmp0 (wrap_mode, "always"))
g_value_set_enum (value, GTK_WRAP_WORD_CHAR);
else if (!g_strcmp0 (wrap_mode, "whitespace"))
g_value_set_enum (value, GTK_WRAP_WORD);
else
g_value_set_enum (value, GTK_WRAP_NONE);
return TRUE;
}
static void
on_keybindings_changed (IdeEditorPage *self,
const gchar *key,
GSettings *settings)
{
IdeSourceView *source_view;
g_assert (IDE_IS_EDITOR_PAGE (self));
g_assert (g_strcmp0 (key, "keybindings") == 0);
g_assert (G_IS_SETTINGS (settings));
source_view = ide_editor_page_get_view (self);
g_signal_emit_by_name (source_view,
"set-mode",
NULL,
IDE_SOURCE_VIEW_MODE_TYPE_PERMANENT);
}
static void
on_draw_spaces_changed (IdeEditorPage *self,
const gchar *key,
GSettings *settings)
{
GtkSourceView *source_view;
GtkSourceSpaceDrawer *drawer;
guint flags;
GtkSourceSpaceLocationFlags location_flags = GTK_SOURCE_SPACE_LOCATION_NONE;
GtkSourceSpaceTypeFlags type_flags = GTK_SOURCE_SPACE_TYPE_NONE;
g_assert (IDE_IS_EDITOR_PAGE (self));
g_assert (g_strcmp0 (key, "draw-spaces") == 0);
g_assert (G_IS_SETTINGS (settings));
source_view = GTK_SOURCE_VIEW (ide_editor_page_get_view (self));
drawer = gtk_source_view_get_space_drawer (source_view);
flags = g_settings_get_flags (settings, "draw-spaces");
if (flags == 0)
{
gtk_source_space_drawer_set_enable_matrix (drawer, FALSE);
return;
}
/* Reset the matrix before setting it */
gtk_source_space_drawer_set_types_for_locations (drawer, GTK_SOURCE_SPACE_LOCATION_ALL, GTK_SOURCE_SPACE_TYPE_NONE);
if (flags & 1)
type_flags |= GTK_SOURCE_SPACE_TYPE_SPACE;
if (flags & 2)
type_flags |= GTK_SOURCE_SPACE_TYPE_TAB;
if (flags & 4)
{
gtk_source_space_drawer_set_types_for_locations (drawer, GTK_SOURCE_SPACE_LOCATION_ALL, GTK_SOURCE_SPACE_TYPE_NEWLINE);
type_flags |= GTK_SOURCE_SPACE_TYPE_NEWLINE;
}
if (flags & 8)
type_flags |= GTK_SOURCE_SPACE_TYPE_NBSP;
if (flags & 16)
location_flags |= GTK_SOURCE_SPACE_LOCATION_LEADING;
if (flags & 32)
location_flags |= GTK_SOURCE_SPACE_LOCATION_INSIDE_TEXT;
if (flags & 64)
location_flags |= GTK_SOURCE_SPACE_LOCATION_TRAILING;
if (type_flags > 0 && location_flags == 0)
location_flags |= GTK_SOURCE_SPACE_LOCATION_ALL;
gtk_source_space_drawer_set_enable_matrix (drawer, TRUE);
gtk_source_space_drawer_set_types_for_locations (drawer, location_flags, type_flags);
}
void
_ide_editor_page_init_settings (IdeEditorPage *self)
{
IdeSourceView *source_view;
IdeBuffer *buffer;
g_assert (IDE_IS_EDITOR_PAGE (self));
g_assert (self->editor_settings == NULL);
g_assert (self->insight_settings == NULL);
source_view = ide_editor_page_get_view (self);
buffer = ide_editor_page_get_buffer (self);
self->editor_settings = g_settings_new ("org.gnome.builder.editor");
g_settings_bind (self->editor_settings, "highlight-current-line",
source_view, "highlight-current-line",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "highlight-matching-brackets",
buffer, "highlight-matching-brackets",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-line-changes",
source_view, "show-line-changes",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-line-diagnostics",
source_view, "show-line-diagnostics",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-line-numbers",
source_view, "show-line-numbers",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-relative-line-numbers",
source_view, "show-relative-line-numbers",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "smart-backspace",
source_view, "smart-backspace",
G_SETTINGS_BIND_GET);
g_settings_bind_with_mapping (self->editor_settings, "smart-home-end",
source_view, "smart-home-end",
G_SETTINGS_BIND_GET,
get_smart_home_end, NULL, NULL, NULL);
g_settings_bind (self->editor_settings, "style-scheme-name",
buffer, "style-scheme-name",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "font-name",
source_view, "font-name",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "overscroll",
source_view, "overscroll",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "scroll-offset",
source_view, "scroll-offset",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-grid-lines",
source_view, "show-grid-lines",
G_SETTINGS_BIND_GET);
g_settings_bind_with_mapping (self->editor_settings, "wrap-text",
source_view, "wrap-mode",
G_SETTINGS_BIND_GET,
get_wrap_mode, NULL, NULL, NULL);
g_settings_bind (self->editor_settings, "completion-n-rows",
source_view, "completion-n-rows",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "interactive-completion",
source_view, "interactive-completion",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "show-map",
self, "show-map",
G_SETTINGS_BIND_GET);
g_settings_bind (self->editor_settings, "auto-hide-map",
self, "auto-hide-map",
G_SETTINGS_BIND_GET);
g_signal_connect_object (self->editor_settings,
"changed::keybindings",
G_CALLBACK (on_keybindings_changed),
self,
G_CONNECT_SWAPPED);
on_keybindings_changed (self, "keybindings", self->editor_settings);
g_signal_connect_object (self->editor_settings,
"changed::draw-spaces",
G_CALLBACK (on_draw_spaces_changed),
self,
G_CONNECT_SWAPPED);
on_draw_spaces_changed (self, "draw-spaces", self->editor_settings);
self->insight_settings = g_settings_new ("org.gnome.builder.code-insight");
}