228 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
/*
 | 
						|
 * Copyright © 2015 Endless Mobile, Inc.
 | 
						|
 *
 | 
						|
 * This library is free software; you can redistribute it and/or
 | 
						|
 * modify it under the terms of the GNU Lesser General Public
 | 
						|
 * License as published by the Free Software Foundation; either
 | 
						|
 * version 2.1 of the License, or (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This library 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
 | 
						|
 * Lesser General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU Lesser General Public
 | 
						|
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 *
 | 
						|
 * Authors: Cosimo Cecchi <cosimoc@gnome.org>
 | 
						|
 */
 | 
						|
 | 
						|
#include "config.h"
 | 
						|
 | 
						|
#include "gtkbuiltiniconprivate.h"
 | 
						|
#include "gtkcssnodeprivate.h"
 | 
						|
#include "gtkiconprivate.h"
 | 
						|
#include "gtkwidgetprivate.h"
 | 
						|
 | 
						|
/* GtkIcon is a minimal widget wrapped around a GtkBuiltinIcon gadget,
 | 
						|
 * It should be used whenever builtin-icon functionality is desired
 | 
						|
 * but a widget is needed for other reasons.
 | 
						|
 */
 | 
						|
enum {
 | 
						|
  PROP_0,
 | 
						|
  PROP_CSS_NAME,
 | 
						|
  NUM_PROPERTIES
 | 
						|
};
 | 
						|
 | 
						|
static GParamSpec *icon_props[NUM_PROPERTIES] = { NULL, };
 | 
						|
 | 
						|
typedef struct _GtkIconPrivate GtkIconPrivate;
 | 
						|
struct _GtkIconPrivate {
 | 
						|
  GtkCssGadget *gadget;
 | 
						|
};
 | 
						|
 | 
						|
G_DEFINE_TYPE_WITH_PRIVATE (GtkIcon, gtk_icon, GTK_TYPE_WIDGET)
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_finalize (GObject *object)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (object);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
 | 
						|
  g_clear_object (&priv->gadget);
 | 
						|
 | 
						|
  G_OBJECT_CLASS (gtk_icon_parent_class)->finalize (object);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_get_property (GObject      *object,
 | 
						|
                       guint         property_id,
 | 
						|
                       GValue       *value,
 | 
						|
                       GParamSpec   *pspec)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (object);
 | 
						|
 | 
						|
  switch (property_id)
 | 
						|
    {
 | 
						|
    case PROP_CSS_NAME:
 | 
						|
      g_value_set_string (value, gtk_icon_get_css_name (self));
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_set_property (GObject      *object,
 | 
						|
                       guint         property_id,
 | 
						|
                       const GValue *value,
 | 
						|
                       GParamSpec   *pspec)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (object);
 | 
						|
 | 
						|
  switch (property_id)
 | 
						|
    {
 | 
						|
    case PROP_CSS_NAME:
 | 
						|
      gtk_icon_set_css_name (self, g_value_get_string (value));
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_get_preferred_height_and_baseline_for_width (GtkWidget *widget,
 | 
						|
                                                      gint       for_width,
 | 
						|
                                                      gint      *minimum,
 | 
						|
                                                      gint      *natural,
 | 
						|
                                                      gint      *minimum_baseline,
 | 
						|
                                                      gint      *natural_baseline)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (widget);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
 | 
						|
  gtk_css_gadget_get_preferred_size (priv->gadget,
 | 
						|
                                     GTK_ORIENTATION_VERTICAL,
 | 
						|
                                     for_width,
 | 
						|
                                     minimum, natural,
 | 
						|
                                     minimum_baseline, natural_baseline);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_get_preferred_height (GtkWidget *widget,
 | 
						|
                               gint      *minimum,
 | 
						|
                               gint      *natural)
 | 
						|
{
 | 
						|
  gtk_icon_get_preferred_height_and_baseline_for_width (widget, -1,
 | 
						|
                                                        minimum, natural,
 | 
						|
                                                        NULL, NULL);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_get_preferred_width (GtkWidget *widget,
 | 
						|
                              gint      *minimum,
 | 
						|
                              gint      *natural)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (widget);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
 | 
						|
  gtk_css_gadget_get_preferred_size (priv->gadget,
 | 
						|
                                     GTK_ORIENTATION_HORIZONTAL,
 | 
						|
                                     -1,
 | 
						|
                                     minimum, natural,
 | 
						|
                                     NULL, NULL);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_size_allocate (GtkWidget     *widget,
 | 
						|
                        GtkAllocation *allocation)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (widget);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
  GtkAllocation clip;
 | 
						|
 | 
						|
  gtk_widget_set_allocation (widget, allocation);
 | 
						|
  gtk_css_gadget_allocate (priv->gadget, allocation,
 | 
						|
                           gtk_widget_get_allocated_baseline (widget),
 | 
						|
                           &clip);
 | 
						|
 | 
						|
  gtk_widget_set_clip (widget, &clip);
 | 
						|
}
 | 
						|
 | 
						|
static gboolean
 | 
						|
gtk_icon_draw (GtkWidget *widget,
 | 
						|
               cairo_t   *cr)
 | 
						|
{
 | 
						|
  GtkIcon *self = GTK_ICON (widget);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
 | 
						|
  gtk_css_gadget_draw (priv->gadget, cr);
 | 
						|
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_class_init (GtkIconClass *klass)
 | 
						|
{
 | 
						|
  GObjectClass *oclass = G_OBJECT_CLASS (klass);
 | 
						|
  GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass);
 | 
						|
 | 
						|
  oclass->get_property = gtk_icon_get_property;
 | 
						|
  oclass->set_property = gtk_icon_set_property;
 | 
						|
  oclass->finalize = gtk_icon_finalize;
 | 
						|
 | 
						|
  wclass->size_allocate = gtk_icon_size_allocate;
 | 
						|
  wclass->get_preferred_width = gtk_icon_get_preferred_width;
 | 
						|
  wclass->get_preferred_height = gtk_icon_get_preferred_height;
 | 
						|
  wclass->get_preferred_height_and_baseline_for_width = gtk_icon_get_preferred_height_and_baseline_for_width;
 | 
						|
  wclass->draw = gtk_icon_draw;
 | 
						|
 | 
						|
  icon_props[PROP_CSS_NAME] =
 | 
						|
    g_param_spec_string ("css-name", "CSS name",
 | 
						|
                         "CSS name",
 | 
						|
                         NULL,
 | 
						|
                         G_PARAM_READWRITE |
 | 
						|
                         G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
 | 
						|
 | 
						|
  g_object_class_install_properties (oclass, NUM_PROPERTIES, icon_props);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
gtk_icon_init (GtkIcon *self)
 | 
						|
{
 | 
						|
  GtkWidget *widget = GTK_WIDGET (self);
 | 
						|
  GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
 | 
						|
  GtkCssNode *widget_node;
 | 
						|
 | 
						|
  gtk_widget_set_has_window (widget, FALSE);
 | 
						|
 | 
						|
  widget_node = gtk_widget_get_css_node (widget);
 | 
						|
  priv->gadget = gtk_builtin_icon_new_for_node (widget_node, widget);
 | 
						|
}
 | 
						|
 | 
						|
GtkWidget *
 | 
						|
gtk_icon_new (const char *css_name)
 | 
						|
{
 | 
						|
  return g_object_new (GTK_TYPE_ICON,
 | 
						|
                       "css-name", css_name,
 | 
						|
                       NULL);
 | 
						|
}
 | 
						|
 | 
						|
const char *
 | 
						|
gtk_icon_get_css_name (GtkIcon *self)
 | 
						|
{
 | 
						|
  GtkCssNode *widget_node = gtk_widget_get_css_node (GTK_WIDGET (self));
 | 
						|
  return gtk_css_node_get_name (widget_node);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
gtk_icon_set_css_name (GtkIcon    *self,
 | 
						|
                       const char *css_name)
 | 
						|
{
 | 
						|
  GtkCssNode *widget_node = gtk_widget_get_css_node (GTK_WIDGET (self));
 | 
						|
  gtk_css_node_set_name (widget_node, g_intern_string (css_name));
 | 
						|
}
 |