Blame gtksourceview/gtksourcestyleschemechooserbutton.c

Packit a7d494
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*-
Packit a7d494
 *
Packit a7d494
 * This file is part of GtkSourceView
Packit a7d494
 *
Packit a7d494
 * Copyright (C) 2014 - Christian Hergert
Packit a7d494
 * Copyright (C) 2014 - Ignacio Casal Quinteiro
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is free software; you can redistribute it and/or
Packit a7d494
 * modify it under the terms of the GNU Lesser General Public
Packit a7d494
 * License as published by the Free Software Foundation; either
Packit a7d494
 * version 2.1 of the License, or (at your option) any later version.
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is distributed in the hope that it will be useful,
Packit a7d494
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a7d494
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a7d494
 * Lesser General Public License for more details.
Packit a7d494
 *
Packit a7d494
 * You should have received a copy of the GNU Lesser General Public License
Packit a7d494
 * along with GtkSourceView. If not, see <http://www.gnu.org/licenses/>.
Packit a7d494
 */
Packit a7d494
Packit a7d494
#ifdef HAVE_CONFIG_H
Packit a7d494
#include <config.h>
Packit a7d494
#endif
Packit a7d494
Packit a7d494
#include "gtksourcestyleschemechooserbutton.h"
Packit a7d494
#include "gtksourcestyleschemechooser.h"
Packit a7d494
#include "gtksourcestyleschemechooserwidget.h"
Packit a7d494
#include "gtksourcestylescheme.h"
Packit a7d494
#include "gtksourceview-i18n.h"
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * SECTION:styleschemechooserbutton
Packit a7d494
 * @Short_description: A button to launch a style scheme selection dialog
Packit a7d494
 * @Title: GtkSourceStyleSchemeChooserButton
Packit a7d494
 * @See_also: #GtkSourceStyleSchemeChooserWidget
Packit a7d494
 *
Packit a7d494
 * The #GtkSourceStyleSchemeChooserButton is a button which displays
Packit a7d494
 * the currently selected style scheme and allows to open a style scheme
Packit a7d494
 * selection dialog to change the style scheme.
Packit a7d494
 * It is suitable widget for selecting a style scheme in a preference dialog.
Packit a7d494
 *
Packit a7d494
 * In #GtkSourceStyleSchemeChooserButton, a #GtkSourceStyleSchemeChooserWidget
Packit a7d494
 * is used to provide a dialog for selecting style schemes.
Packit a7d494
 *
Packit a7d494
 * Since: 3.16
Packit a7d494
 */
Packit a7d494
Packit a7d494
typedef struct
Packit a7d494
{
Packit a7d494
	GtkSourceStyleScheme *scheme;
Packit a7d494
Packit a7d494
	GtkWidget *dialog;
Packit a7d494
	GtkSourceStyleSchemeChooserWidget *chooser;
Packit a7d494
} GtkSourceStyleSchemeChooserButtonPrivate;
Packit a7d494
Packit a7d494
static void gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init (GtkSourceStyleSchemeChooserInterface *iface);
Packit a7d494
Packit a7d494
G_DEFINE_TYPE_WITH_CODE (GtkSourceStyleSchemeChooserButton,
Packit a7d494
                         gtk_source_style_scheme_chooser_button,
Packit a7d494
                         GTK_TYPE_BUTTON,
Packit a7d494
                         G_ADD_PRIVATE (GtkSourceStyleSchemeChooserButton)
Packit a7d494
                         G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_STYLE_SCHEME_CHOOSER,
Packit a7d494
                                                gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init))
Packit a7d494
Packit a7d494
#define GET_PRIV(o) gtk_source_style_scheme_chooser_button_get_instance_private (o)
Packit a7d494
Packit a7d494
enum
Packit a7d494
{
Packit a7d494
	PROP_0,
Packit a7d494
	PROP_STYLE_SCHEME
Packit a7d494
};
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_dispose (GObject *object)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (object);
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
Packit a7d494
	g_clear_object (&priv->scheme);
Packit a7d494
Packit a7d494
	G_OBJECT_CLASS (gtk_source_style_scheme_chooser_button_parent_class)->dispose (object);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_get_property (GObject    *object,
Packit a7d494
                                                     guint       prop_id,
Packit a7d494
                                                     GValue     *value,
Packit a7d494
                                                     GParamSpec *pspec)
Packit a7d494
{
Packit a7d494
	switch (prop_id)
Packit a7d494
	{
Packit a7d494
		case PROP_STYLE_SCHEME:
Packit a7d494
			g_value_set_object (value,
Packit a7d494
			                    gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (object)));
Packit a7d494
			break;
Packit a7d494
Packit a7d494
		default:
Packit a7d494
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_set_property (GObject      *object,
Packit a7d494
                                                     guint         prop_id,
Packit a7d494
                                                     const GValue *value,
Packit a7d494
                                                     GParamSpec   *pspec)
Packit a7d494
{
Packit a7d494
	switch (prop_id)
Packit a7d494
	{
Packit a7d494
		case PROP_STYLE_SCHEME:
Packit a7d494
			gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (object),
Packit a7d494
			                                                  g_value_get_object (value));
Packit a7d494
			break;
Packit a7d494
Packit a7d494
		default:
Packit a7d494
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_constructed (GObject *object)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (object);
Packit a7d494
Packit a7d494
	G_OBJECT_CLASS (gtk_source_style_scheme_chooser_button_parent_class)->constructed (object);
Packit a7d494
Packit a7d494
	gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (button),
Packit a7d494
	                                                  _gtk_source_style_scheme_get_default ());
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
dialog_destroy (GtkWidget *widget,
Packit a7d494
                gpointer   data)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (data);
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
Packit a7d494
	priv->dialog = NULL;
Packit a7d494
	priv->chooser = NULL;
Packit a7d494
Packit a7d494
	return FALSE;
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
dialog_response (GtkDialog *dialog,
Packit a7d494
                 gint       response,
Packit a7d494
                 gpointer   data)
Packit a7d494
{
Packit a7d494
	if (response == GTK_RESPONSE_CANCEL)
Packit a7d494
	{
Packit a7d494
		gtk_widget_hide (GTK_WIDGET (dialog));
Packit a7d494
	}
Packit a7d494
	else if (response == GTK_RESPONSE_OK)
Packit a7d494
	{
Packit a7d494
		GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (data);
Packit a7d494
		GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
		GtkSourceStyleScheme *scheme;
Packit a7d494
Packit a7d494
		scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser));
Packit a7d494
Packit a7d494
		gtk_widget_hide (GTK_WIDGET (dialog));
Packit a7d494
Packit a7d494
		gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (button),
Packit a7d494
		                                                  scheme);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
/* Create the dialog and connects its buttons */
Packit a7d494
static void
Packit a7d494
ensure_dialog (GtkSourceStyleSchemeChooserButton *button)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
	GtkWidget *parent, *dialog, *scrolled_window;
Packit a7d494
	GtkWidget *content_area;
Packit a7d494
Packit a7d494
	if (priv->dialog != NULL)
Packit a7d494
	{
Packit a7d494
		return;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	parent = gtk_widget_get_toplevel (GTK_WIDGET (button));
Packit a7d494
Packit a7d494
	/* TODO: have a ChooserDialog? */
Packit a7d494
	priv->dialog = dialog = gtk_dialog_new_with_buttons (_("Select a Style"),
Packit a7d494
	                                                     GTK_WINDOW (parent),
Packit a7d494
	                                                     GTK_DIALOG_DESTROY_WITH_PARENT |
Packit a7d494
	                                                     GTK_DIALOG_USE_HEADER_BAR,
Packit a7d494
	                                                     _("_Cancel"), GTK_RESPONSE_CANCEL,
Packit a7d494
	                                                     _("_Select"), GTK_RESPONSE_OK,
Packit a7d494
	                                                     NULL);
Packit a7d494
	gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
Packit a7d494
Packit a7d494
	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
Packit a7d494
	gtk_widget_set_size_request (scrolled_window, 325, 350);
Packit a7d494
	gtk_widget_show (scrolled_window);
Packit a7d494
	gtk_widget_set_hexpand (scrolled_window, TRUE);
Packit a7d494
	gtk_widget_set_vexpand (scrolled_window, TRUE);
Packit a7d494
	content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
Packit a7d494
	gtk_container_add (GTK_CONTAINER (content_area), scrolled_window);
Packit a7d494
Packit a7d494
	priv->chooser = GTK_SOURCE_STYLE_SCHEME_CHOOSER_WIDGET (gtk_source_style_scheme_chooser_widget_new ());
Packit a7d494
	gtk_widget_show (GTK_WIDGET (priv->chooser));
Packit a7d494
	gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser),
Packit a7d494
	                                                  priv->scheme);
Packit a7d494
Packit a7d494
	gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (priv->chooser));
Packit a7d494
Packit a7d494
	if (gtk_widget_is_toplevel (parent) && GTK_IS_WINDOW (parent))
Packit a7d494
	{
Packit a7d494
		if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (dialog)))
Packit a7d494
		{
Packit a7d494
			gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
Packit a7d494
		}
Packit a7d494
Packit a7d494
		gtk_window_set_modal (GTK_WINDOW (dialog),
Packit a7d494
		                      gtk_window_get_modal (GTK_WINDOW (parent)));
Packit a7d494
	}
Packit a7d494
Packit a7d494
	g_signal_connect (dialog, "response",
Packit a7d494
	                  G_CALLBACK (dialog_response), button);
Packit a7d494
	g_signal_connect (dialog, "destroy",
Packit a7d494
	                  G_CALLBACK (dialog_destroy), button);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_clicked (GtkButton *button)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *cbutton = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (button);
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (cbutton);
Packit a7d494
Packit a7d494
	ensure_dialog (cbutton);
Packit a7d494
Packit a7d494
	gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser),
Packit a7d494
	                                                  priv->scheme);
Packit a7d494
Packit a7d494
	gtk_window_present (GTK_WINDOW (priv->dialog));
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_class_init (GtkSourceStyleSchemeChooserButtonClass *klass)
Packit a7d494
{
Packit a7d494
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit a7d494
	GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
Packit a7d494
Packit a7d494
	object_class->dispose = gtk_source_style_scheme_chooser_button_dispose;
Packit a7d494
	object_class->get_property = gtk_source_style_scheme_chooser_button_get_property;
Packit a7d494
	object_class->set_property = gtk_source_style_scheme_chooser_button_set_property;
Packit a7d494
	object_class->constructed = gtk_source_style_scheme_chooser_button_constructed;
Packit a7d494
Packit a7d494
	button_class->clicked = gtk_source_style_scheme_chooser_button_clicked;
Packit a7d494
Packit a7d494
	g_object_class_override_property (object_class, PROP_STYLE_SCHEME, "style-scheme");
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_init (GtkSourceStyleSchemeChooserButton *button)
Packit a7d494
{
Packit a7d494
}
Packit a7d494
Packit a7d494
static GtkSourceStyleScheme *
Packit a7d494
gtk_source_style_scheme_chooser_button_get_style_scheme (GtkSourceStyleSchemeChooser *chooser)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (chooser);
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
Packit a7d494
	return priv->scheme;
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_update_label (GtkSourceStyleSchemeChooserButton *button)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
	const gchar *label;
Packit a7d494
Packit a7d494
	label = priv->scheme != NULL ? gtk_source_style_scheme_get_name (priv->scheme) : NULL;
Packit a7d494
	gtk_button_set_label (GTK_BUTTON (button), label);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_set_style_scheme (GtkSourceStyleSchemeChooser *chooser,
Packit a7d494
                                                         GtkSourceStyleScheme        *scheme)
Packit a7d494
{
Packit a7d494
	GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (chooser);
Packit a7d494
	GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
Packit a7d494
Packit a7d494
	if (g_set_object (&priv->scheme, scheme))
Packit a7d494
	{
Packit a7d494
		gtk_source_style_scheme_chooser_button_update_label (button);
Packit a7d494
Packit a7d494
		g_object_notify (G_OBJECT (button), "style-scheme");
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init (GtkSourceStyleSchemeChooserInterface *iface)
Packit a7d494
{
Packit a7d494
	iface->get_style_scheme = gtk_source_style_scheme_chooser_button_get_style_scheme;
Packit a7d494
	iface->set_style_scheme = gtk_source_style_scheme_chooser_button_set_style_scheme;
Packit a7d494
}
Packit a7d494
Packit a7d494
/**
Packit a7d494
 * gtk_source_style_scheme_chooser_button_new:
Packit a7d494
 *
Packit a7d494
 * Creates a new #GtkSourceStyleSchemeChooserButton.
Packit a7d494
 *
Packit a7d494
 * Returns: a new #GtkSourceStyleSchemeChooserButton.
Packit a7d494
 *
Packit a7d494
 * Since: 3.16
Packit a7d494
 */
Packit a7d494
GtkWidget *
Packit a7d494
gtk_source_style_scheme_chooser_button_new (void)
Packit a7d494
{
Packit a7d494
	return g_object_new (GTK_SOURCE_TYPE_STYLE_SCHEME_CHOOSER_BUTTON, NULL);
Packit a7d494
}