Blame plugins/gtk+/glade-cell-renderer-editor.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2008 Tristan Van Berkom.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <gdk/gdkkeysyms.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-cell-renderer-editor.h"
Packit 1e8aac
#include "glade-column-types.h"
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void glade_cell_renderer_editor_finalize (GObject * object);
Packit 1e8aac
Packit 1e8aac
static void glade_cell_renderer_editor_editable_init (GladeEditableIface *
Packit 1e8aac
                                                      iface);
Packit 1e8aac
Packit 1e8aac
static void glade_cell_renderer_editor_grab_focus (GtkWidget * widget);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *editor;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *attributes_check;
Packit 1e8aac
  GladePropertyClass *pclass;
Packit 1e8aac
  GladePropertyClass *attr_pclass;
Packit 1e8aac
  GladePropertyClass *use_attr_pclass;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *use_prop_label;
Packit 1e8aac
  GtkWidget *use_attr_label;
Packit 1e8aac
  GtkWidget *use_prop_eprop;
Packit 1e8aac
  GtkWidget *use_attr_eprop;
Packit 1e8aac
} CheckTab;
Packit 1e8aac
Packit 1e8aac
static GladeEditableIface *parent_editable_iface;
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_CODE (GladeCellRendererEditor, glade_cell_renderer_editor,
Packit 1e8aac
                         GTK_TYPE_BOX,
Packit 1e8aac
                         G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
Packit 1e8aac
                                                glade_cell_renderer_editor_editable_init));
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_class_init (GladeCellRendererEditorClass * klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->finalize = glade_cell_renderer_editor_finalize;
Packit 1e8aac
  widget_class->grab_focus = glade_cell_renderer_editor_grab_focus;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_init (GladeCellRendererEditor * self)
Packit 1e8aac
{
Packit 1e8aac
  gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
Packit 1e8aac
				  GTK_ORIENTATION_VERTICAL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_load (GladeEditable * editable, GladeWidget * widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor =
Packit 1e8aac
      GLADE_CELL_RENDERER_EDITOR (editable);
Packit 1e8aac
  GList *l;
Packit 1e8aac
Packit 1e8aac
  /* Chain up to default implementation */
Packit 1e8aac
  parent_editable_iface->load (editable, widget);
Packit 1e8aac
Packit 1e8aac
  /* load the embedded editable... */
Packit 1e8aac
  if (renderer_editor->embed)
Packit 1e8aac
    glade_editable_load (GLADE_EDITABLE (renderer_editor->embed), widget);
Packit 1e8aac
Packit 1e8aac
  for (l = renderer_editor->properties; l; l = l->next)
Packit 1e8aac
    glade_editor_property_load_by_widget (GLADE_EDITOR_PROPERTY (l->data),
Packit 1e8aac
                                          widget);
Packit 1e8aac
Packit 1e8aac
  if (widget)
Packit 1e8aac
    {
Packit 1e8aac
      for (l = renderer_editor->checks; l; l = l->next)
Packit 1e8aac
        {
Packit 1e8aac
          CheckTab *tab = l->data;
Packit 1e8aac
          gboolean use_attr = FALSE;
Packit 1e8aac
Packit 1e8aac
          glade_widget_property_get (widget, glade_property_class_id (tab->use_attr_pclass), &use_attr);
Packit 1e8aac
          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tab->attributes_check), use_attr);
Packit 1e8aac
Packit 1e8aac
          if (use_attr)
Packit 1e8aac
            {
Packit 1e8aac
              //gtk_widget_show (tab->use_attr_label);
Packit 1e8aac
              gtk_widget_show (tab->use_attr_eprop);
Packit 1e8aac
              //gtk_widget_hide (tab->use_prop_label);
Packit 1e8aac
              gtk_widget_hide (tab->use_prop_eprop);
Packit 1e8aac
            }
Packit 1e8aac
          else
Packit 1e8aac
            {
Packit 1e8aac
              gtk_widget_show (tab->use_prop_label);
Packit 1e8aac
              gtk_widget_show (tab->use_prop_eprop);
Packit 1e8aac
              gtk_widget_hide (tab->use_attr_label);
Packit 1e8aac
              gtk_widget_hide (tab->use_attr_eprop);
Packit 1e8aac
            }
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_set_show_name (GladeEditable * editable,
Packit 1e8aac
                                          gboolean show_name)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor =
Packit 1e8aac
      GLADE_CELL_RENDERER_EDITOR (editable);
Packit 1e8aac
Packit 1e8aac
  glade_editable_set_show_name (GLADE_EDITABLE (renderer_editor->embed),
Packit 1e8aac
                                show_name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_editable_init (GladeEditableIface * iface)
Packit 1e8aac
{
Packit 1e8aac
  parent_editable_iface = g_type_default_interface_peek (GLADE_TYPE_EDITABLE);
Packit 1e8aac
Packit 1e8aac
  iface->load = glade_cell_renderer_editor_load;
Packit 1e8aac
  iface->set_show_name = glade_cell_renderer_editor_set_show_name;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_finalize (GObject * object)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor =
Packit 1e8aac
      GLADE_CELL_RENDERER_EDITOR (object);
Packit 1e8aac
Packit 1e8aac
  g_list_foreach (renderer_editor->checks, (GFunc) g_free, NULL);
Packit 1e8aac
  g_list_free (renderer_editor->checks);
Packit 1e8aac
  g_list_free (renderer_editor->properties);
Packit 1e8aac
Packit 1e8aac
  renderer_editor->properties = NULL;
Packit 1e8aac
  renderer_editor->checks = NULL;
Packit 1e8aac
  renderer_editor->embed = NULL;
Packit 1e8aac
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (object), NULL);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_cell_renderer_editor_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_cell_renderer_editor_grab_focus (GtkWidget * widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor =
Packit 1e8aac
      GLADE_CELL_RENDERER_EDITOR (widget);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_grab_focus (renderer_editor->embed);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
attributes_toggled (GtkWidget * widget, CheckTab * tab)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor = tab->editor;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladeWidget   *gwidget;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
Packit 1e8aac
  gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (renderer_editor));
Packit 1e8aac
Packit 1e8aac
  if (glade_editable_loading (GLADE_EDITABLE (renderer_editor)) || !gwidget)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  glade_editable_block (GLADE_EDITABLE (renderer_editor));
Packit 1e8aac
Packit 1e8aac
  if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tab->attributes_check)))
Packit 1e8aac
    {
Packit 1e8aac
Packit 1e8aac
      glade_command_push_group (_("Setting %s to use the %s property as an attribute"),
Packit 1e8aac
                                glade_widget_get_name (gwidget),
Packit 1e8aac
                                glade_property_class_id (tab->pclass));
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
      property =
Packit 1e8aac
          glade_widget_get_property (gwidget, glade_property_class_id (tab->pclass));
Packit 1e8aac
      glade_property_get_default (property, &value);
Packit 1e8aac
      glade_command_set_property_value (property, &value);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
Packit 1e8aac
      property =
Packit 1e8aac
          glade_widget_get_property (gwidget, glade_property_class_id (tab->use_attr_pclass));
Packit 1e8aac
      glade_command_set_property (property, TRUE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      glade_command_push_group (_("Setting %s to use the %s property directly"),
Packit 1e8aac
                                glade_widget_get_name (gwidget),
Packit 1e8aac
                                glade_property_class_id (tab->pclass));
Packit 1e8aac
Packit 1e8aac
      property =
Packit 1e8aac
          glade_widget_get_property (gwidget, glade_property_class_id (tab->attr_pclass));
Packit 1e8aac
      glade_property_get_default (property, &value);
Packit 1e8aac
      glade_command_set_property_value (property, &value);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
Packit 1e8aac
      property =
Packit 1e8aac
          glade_widget_get_property (gwidget, glade_property_class_id (tab->use_attr_pclass));
Packit 1e8aac
      glade_command_set_property (property, FALSE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  glade_editable_unblock (GLADE_EDITABLE (renderer_editor));
Packit 1e8aac
Packit 1e8aac
  /* reload buttons and sensitivity and stuff... */
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (renderer_editor), gwidget);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
property_class_comp (gconstpointer a, gconstpointer b)
Packit 1e8aac
{
Packit 1e8aac
  GladePropertyClass *ca = (GladePropertyClass *)a, *cb = (GladePropertyClass *)b;
Packit 1e8aac
  GParamSpec *pa, *pb;
Packit 1e8aac
Packit 1e8aac
  pa = glade_property_class_get_pspec (ca);
Packit 1e8aac
  pb = glade_property_class_get_pspec (cb);
Packit 1e8aac
Packit 1e8aac
  if (pa->owner_type == pb->owner_type)
Packit 1e8aac
    {
Packit 1e8aac
      gdouble result = glade_property_class_weight (ca) - glade_property_class_weight (cb);
Packit 1e8aac
      /* Avoid cast to int */
Packit 1e8aac
      if (result < 0.0)
Packit 1e8aac
        return -1;
Packit 1e8aac
      else if (result > 0.0)
Packit 1e8aac
        return 1;
Packit 1e8aac
      else
Packit 1e8aac
        return 0;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      if (g_type_is_a (pa->owner_type, pb->owner_type))
Packit 1e8aac
        return (glade_property_class_common (ca) || glade_property_class_get_is_packing (ca)) ? 1 : -1;
Packit 1e8aac
      else
Packit 1e8aac
        return (glade_property_class_common (ca) || glade_property_class_get_is_packing (ca)) ? -1 : 1;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GList *
Packit 1e8aac
get_sorted_properties (GladeWidgetAdaptor * adaptor, GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  GList *list = NULL;
Packit 1e8aac
  const GList *l;
Packit 1e8aac
Packit 1e8aac
  for (l = glade_widget_adaptor_get_properties (adaptor); l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      GladePropertyClass *klass = l->data;
Packit 1e8aac
Packit 1e8aac
      if (GLADE_PROPERTY_CLASS_IS_TYPE (klass, type) &&
Packit 1e8aac
          (glade_property_class_is_visible (klass)))
Packit 1e8aac
        {
Packit 1e8aac
          list = g_list_prepend (list, klass);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  return g_list_sort (list, property_class_comp);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
GtkWidget *
Packit 1e8aac
glade_cell_renderer_editor_new (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                GladeEditorPageType type, GladeEditable * embed)
Packit 1e8aac
{
Packit 1e8aac
  GladeCellRendererEditor *renderer_editor;
Packit 1e8aac
  GladeEditorProperty *eprop;
Packit 1e8aac
  GladePropertyClass *pclass, *attr_pclass, *use_attr_pclass;
Packit 1e8aac
  GList *list, *sorted;
Packit 1e8aac
  GtkWidget *hbox_left, *hbox_right, *grid;
Packit 1e8aac
  gchar *str;
Packit 1e8aac
  gint row = 0;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_EDITABLE (embed), NULL);
Packit 1e8aac
Packit 1e8aac
  renderer_editor = g_object_new (GLADE_TYPE_CELL_RENDERER_EDITOR, NULL);
Packit 1e8aac
  renderer_editor->embed = GTK_WIDGET (embed);
Packit 1e8aac
Packit 1e8aac
  /* Pack the parent on top... */
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (renderer_editor), GTK_WIDGET (embed), FALSE,
Packit 1e8aac
                      FALSE, 0);
Packit 1e8aac
Packit 1e8aac
  /* Next pack in a grid for all the renderers */
Packit 1e8aac
  grid = gtk_grid_new ();
Packit 1e8aac
  gtk_orientable_set_orientation (GTK_ORIENTABLE (grid),
Packit 1e8aac
                                  GTK_ORIENTATION_VERTICAL);
Packit 1e8aac
  gtk_grid_set_row_spacing (GTK_GRID (grid), 4);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (renderer_editor), grid, FALSE, FALSE, 0);
Packit 1e8aac
Packit 1e8aac
  sorted = get_sorted_properties (adaptor, type);
Packit 1e8aac
Packit 1e8aac
  /* For each normal property, if we have an attr- and use-attr- counterpart, load
Packit 1e8aac
   * a check button property pair into the table...
Packit 1e8aac
   */
Packit 1e8aac
  for (list = sorted; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      gchar *attr_name;
Packit 1e8aac
      gchar *use_attr_name;
Packit 1e8aac
Packit 1e8aac
      pclass = list->data;
Packit 1e8aac
Packit 1e8aac
      /* "stock-size" is a normal property, but we virtualize it to use the GtkIconSize enumeration */
Packit 1e8aac
      if (glade_property_class_get_virtual (pclass) &&
Packit 1e8aac
	  strcmp (glade_property_class_id (pclass), "stock-size") != 0)
Packit 1e8aac
	continue;
Packit 1e8aac
Packit 1e8aac
      attr_name = g_strdup_printf ("attr-%s", glade_property_class_id (pclass));
Packit 1e8aac
      use_attr_name = g_strdup_printf ("use-attr-%s", glade_property_class_id (pclass));
Packit 1e8aac
Packit 1e8aac
      attr_pclass =
Packit 1e8aac
          glade_widget_adaptor_get_property_class (adaptor, attr_name);
Packit 1e8aac
      use_attr_pclass =
Packit 1e8aac
          glade_widget_adaptor_get_property_class (adaptor, use_attr_name);
Packit 1e8aac
Packit 1e8aac
      if (attr_pclass && use_attr_pclass)
Packit 1e8aac
        {
Packit 1e8aac
          CheckTab *tab = g_new0 (CheckTab, 1);
Packit 1e8aac
	  GParamSpec *pspec;
Packit 1e8aac
Packit 1e8aac
	  pspec = glade_property_class_get_pspec (pclass);
Packit 1e8aac
Packit 1e8aac
          tab->editor = renderer_editor;
Packit 1e8aac
          tab->pclass = pclass;
Packit 1e8aac
          tab->attr_pclass = attr_pclass;
Packit 1e8aac
          tab->use_attr_pclass = use_attr_pclass;
Packit 1e8aac
Packit 1e8aac
          /* Label appearance... */
Packit 1e8aac
          hbox_left = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
Packit 1e8aac
          hbox_right = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
Packit 1e8aac
          gtk_widget_set_hexpand (hbox_right, TRUE);
Packit 1e8aac
Packit 1e8aac
          tab->attributes_check = gtk_check_button_new ();
Packit 1e8aac
          str = g_strdup_printf (_("Retrieve %s from model (type %s)"),
Packit 1e8aac
                                 glade_property_class_get_name (pclass),
Packit 1e8aac
                                 g_type_name (pspec->value_type));
Packit 1e8aac
          gtk_widget_set_tooltip_text (tab->attributes_check, str);
Packit 1e8aac
          g_free (str);
Packit 1e8aac
Packit 1e8aac
          gtk_box_pack_start (GTK_BOX (hbox_left), tab->attributes_check, FALSE,
Packit 1e8aac
                              FALSE, 4);
Packit 1e8aac
Packit 1e8aac
          /* Edit property */
Packit 1e8aac
          eprop = glade_widget_adaptor_create_eprop (adaptor, pclass, TRUE);
Packit 1e8aac
          gtk_box_pack_start (GTK_BOX (hbox_left), glade_editor_property_get_item_label (eprop), TRUE,
Packit 1e8aac
                              TRUE, 4);
Packit 1e8aac
          gtk_box_pack_start (GTK_BOX (hbox_right), GTK_WIDGET (eprop), FALSE,
Packit 1e8aac
                              FALSE, 4);
Packit 1e8aac
          renderer_editor->properties =
Packit 1e8aac
              g_list_prepend (renderer_editor->properties, eprop);
Packit 1e8aac
Packit 1e8aac
          tab->use_prop_label = glade_editor_property_get_item_label (eprop);
Packit 1e8aac
          tab->use_prop_eprop = GTK_WIDGET (eprop);
Packit 1e8aac
Packit 1e8aac
          /* Edit attribute */
Packit 1e8aac
          eprop =
Packit 1e8aac
              glade_widget_adaptor_create_eprop (adaptor, attr_pclass, TRUE);
Packit 1e8aac
          gtk_box_pack_start (GTK_BOX (hbox_right), GTK_WIDGET (eprop), FALSE,
Packit 1e8aac
                              FALSE, 4);
Packit 1e8aac
          renderer_editor->properties =
Packit 1e8aac
              g_list_prepend (renderer_editor->properties, eprop);
Packit 1e8aac
Packit 1e8aac
          gtk_grid_attach (GTK_GRID (grid), hbox_left, 0, row, 1, 1);
Packit 1e8aac
          gtk_grid_attach (GTK_GRID (grid), hbox_right, 1, row++, 1, 1);
Packit 1e8aac
Packit 1e8aac
          tab->use_attr_label = glade_editor_property_get_item_label (eprop);
Packit 1e8aac
          tab->use_attr_eprop = GTK_WIDGET (eprop);
Packit 1e8aac
Packit 1e8aac
          g_signal_connect (G_OBJECT (tab->attributes_check), "toggled",
Packit 1e8aac
                            G_CALLBACK (attributes_toggled), tab);
Packit 1e8aac
Packit 1e8aac
          renderer_editor->checks =
Packit 1e8aac
              g_list_prepend (renderer_editor->checks, tab);
Packit 1e8aac
        }
Packit 1e8aac
      g_free (attr_name);
Packit 1e8aac
      g_free (use_attr_name);
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (sorted);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show_all (GTK_WIDGET (renderer_editor));
Packit 1e8aac
Packit 1e8aac
  return GTK_WIDGET (renderer_editor);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/***************************************************************************
Packit 1e8aac
 *                             Editor Property                             *
Packit 1e8aac
 ***************************************************************************/
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorProperty parent_instance;
Packit 1e8aac
Packit 1e8aac
  GtkTreeModel *columns;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *spin;
Packit 1e8aac
  GtkWidget *combo;
Packit 1e8aac
} GladeEPropCellAttribute;
Packit 1e8aac
Packit 1e8aac
GLADE_MAKE_EPROP (GladeEPropCellAttribute, glade_eprop_cell_attribute)
Packit 1e8aac
#define GLADE_EPROP_CELL_ATTRIBUTE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_CELL_ATTRIBUTE, GladeEPropCellAttribute))
Packit 1e8aac
#define GLADE_EPROP_CELL_ATTRIBUTE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_CELL_ATTRIBUTE, GladeEPropCellAttributeClass))
Packit 1e8aac
#define GLADE_IS_EPROP_CELL_ATTRIBUTE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_CELL_ATTRIBUTE))
Packit 1e8aac
#define GLADE_IS_EPROP_CELL_ATTRIBUTE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_CELL_ATTRIBUTE))
Packit 1e8aac
#define GLADE_EPROP_CELL_ATTRIBUTE_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_CELL_ATTRIBUTE, GladeEPropCellAttributeClass))
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_cell_attribute_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  /* Chain up */
Packit 1e8aac
  GObjectClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
Packit 1e8aac
  //GladeEPropCellAttribute *eprop_attribute = GLADE_EPROP_CELL_ATTRIBUTE (object);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GladeWidget *
Packit 1e8aac
glade_cell_renderer_parent_get_model (GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeModel *model = NULL;
Packit 1e8aac
  
Packit 1e8aac
  glade_widget_property_get (widget, "model", &model);
Packit 1e8aac
Packit 1e8aac
  do
Packit 1e8aac
    {
Packit 1e8aac
      if (GTK_IS_TREE_MODEL_SORT (model))
Packit 1e8aac
        model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model));
Packit 1e8aac
      else if (GTK_IS_TREE_MODEL_FILTER (model))
Packit 1e8aac
        model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
Packit 1e8aac
      else
Packit 1e8aac
        break;
Packit 1e8aac
    } while (model);
Packit 1e8aac
Packit 1e8aac
  if (model)
Packit 1e8aac
    return glade_widget_get_from_gobject (model);
Packit 1e8aac
Packit 1e8aac
  return NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeWidget *
Packit 1e8aac
glade_cell_renderer_get_model (GladeWidget * renderer)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gparent;
Packit 1e8aac
  GObject *parent;
Packit 1e8aac
Packit 1e8aac
  if ((gparent = glade_widget_get_parent (renderer)) == NULL)
Packit 1e8aac
    return NULL;
Packit 1e8aac
Packit 1e8aac
  parent = glade_widget_get_object (gparent);
Packit 1e8aac
  
Packit 1e8aac
  /* Keep inline with all new cell layouts !!! */
Packit 1e8aac
  if (GTK_IS_TREE_VIEW_COLUMN (parent))
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidget *treeview = glade_widget_get_parent (gparent);
Packit 1e8aac
Packit 1e8aac
      if (treeview && GTK_IS_TREE_VIEW (glade_widget_get_object (treeview)))
Packit 1e8aac
        return glade_cell_renderer_parent_get_model (treeview);
Packit 1e8aac
    }
Packit 1e8aac
  else if (GTK_IS_ICON_VIEW (parent) || GTK_IS_COMBO_BOX (parent) ||
Packit 1e8aac
           GTK_IS_ENTRY_COMPLETION (parent))
Packit 1e8aac
    return glade_cell_renderer_parent_get_model (gparent);
Packit 1e8aac
Packit 1e8aac
  return NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_cell_attribute_load (GladeEditorProperty * eprop,
Packit 1e8aac
                                 GladeProperty * property)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPropertyClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
Packit 1e8aac
  GladeEPropCellAttribute *eprop_attribute = GLADE_EPROP_CELL_ATTRIBUTE (eprop);
Packit 1e8aac
Packit 1e8aac
  /* Chain up in a clean state... */
Packit 1e8aac
  parent_class->load (eprop, property);
Packit 1e8aac
Packit 1e8aac
  if (property)
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidget *gmodel;
Packit 1e8aac
      GtkListStore *store = GTK_LIST_STORE (eprop_attribute->columns);
Packit 1e8aac
      GtkTreeIter iter;
Packit 1e8aac
Packit 1e8aac
      gtk_list_store_clear (store);
Packit 1e8aac
Packit 1e8aac
      /* Generate model and set active iter */
Packit 1e8aac
      if ((gmodel = glade_cell_renderer_get_model (glade_property_get_widget (property))) != NULL)
Packit 1e8aac
        {
Packit 1e8aac
          GList *columns = NULL, *l;
Packit 1e8aac
Packit 1e8aac
          glade_widget_property_get (gmodel, "columns", &columns);
Packit 1e8aac
Packit 1e8aac
          gtk_list_store_append (store, &iter);
Packit 1e8aac
          /* translators: the adjective not the verb */
Packit 1e8aac
          gtk_list_store_set (store, &iter, 0, _("unset"), -1);
Packit 1e8aac
Packit 1e8aac
          for (l = columns; l; l = l->next)
Packit 1e8aac
            {
Packit 1e8aac
              GladeColumnType *column = l->data;
Packit 1e8aac
              gchar *str = g_strdup_printf ("%s - %s", column->column_name,
Packit 1e8aac
                                            column->type_name);
Packit 1e8aac
Packit 1e8aac
              gtk_list_store_append (store, &iter);
Packit 1e8aac
              gtk_list_store_set (store, &iter, 0, str, -1);
Packit 1e8aac
Packit 1e8aac
              g_free (str);
Packit 1e8aac
            }
Packit 1e8aac
Packit 1e8aac
          gtk_combo_box_set_active (GTK_COMBO_BOX (eprop_attribute->combo),
Packit 1e8aac
                                    CLAMP (g_value_get_int (glade_property_inline_value (property)) +
Packit 1e8aac
                                           1, 0, g_list_length (columns) + 1));
Packit 1e8aac
Packit 1e8aac
          gtk_widget_set_sensitive (eprop_attribute->combo, TRUE);
Packit 1e8aac
        }
Packit 1e8aac
      else
Packit 1e8aac
        {
Packit 1e8aac
          gtk_list_store_append (store, &iter);
Packit 1e8aac
          gtk_list_store_set (store, &iter, 0, _("no model"), -1);
Packit 1e8aac
          gtk_combo_box_set_active (GTK_COMBO_BOX (eprop_attribute->combo), 0);
Packit 1e8aac
          gtk_widget_set_sensitive (eprop_attribute->combo, FALSE);
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
      gtk_spin_button_set_value (GTK_SPIN_BUTTON (eprop_attribute->spin),
Packit 1e8aac
                                 (gdouble) g_value_get_int (glade_property_inline_value (property)));
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
combo_changed (GtkWidget * combo, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GValue val = { 0, };
Packit 1e8aac
Packit 1e8aac
  if (glade_editor_property_loading (eprop))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  g_value_init (&val, G_TYPE_INT);
Packit 1e8aac
  g_value_set_int (&val,
Packit 1e8aac
                   (gint) gtk_combo_box_get_active (GTK_COMBO_BOX (combo)) - 1);
Packit 1e8aac
  glade_editor_property_commit (eprop, &val;;
Packit 1e8aac
  g_value_unset (&val;;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
spin_changed (GtkWidget * spin, GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GValue val = { 0, };
Packit 1e8aac
Packit 1e8aac
  if (glade_editor_property_loading (eprop))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  g_value_init (&val, G_TYPE_INT);
Packit 1e8aac
  g_value_set_int (&val, gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin)));
Packit 1e8aac
  glade_editor_property_commit (eprop, &val;;
Packit 1e8aac
  g_value_unset (&val;;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_cell_attribute_create_input (GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropCellAttribute *eprop_attribute = GLADE_EPROP_CELL_ATTRIBUTE (eprop);
Packit 1e8aac
  GtkWidget *hbox;
Packit 1e8aac
  GtkAdjustment *adjustment;
Packit 1e8aac
  GtkCellRenderer *cell;
Packit 1e8aac
Packit 1e8aac
  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
Packit 1e8aac
Packit 1e8aac
  adjustment = glade_property_class_make_adjustment (glade_editor_property_get_pclass (eprop));
Packit 1e8aac
  eprop_attribute->spin = gtk_spin_button_new (adjustment, 1.0, 0);
Packit 1e8aac
Packit 1e8aac
  eprop_attribute->columns =
Packit 1e8aac
      (GtkTreeModel *) gtk_list_store_new (1, G_TYPE_STRING);
Packit 1e8aac
  eprop_attribute->combo =
Packit 1e8aac
      gtk_combo_box_new_with_model (eprop_attribute->columns);
Packit 1e8aac
Packit 1e8aac
  gtk_combo_box_set_popup_fixed_width (GTK_COMBO_BOX (eprop_attribute->combo),
Packit 1e8aac
                                       FALSE);
Packit 1e8aac
Packit 1e8aac
  /* Add cell renderer */
Packit 1e8aac
  cell = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (cell,
Packit 1e8aac
                "xpad", 0,
Packit 1e8aac
                "xalign", 0.0F,
Packit 1e8aac
                "ellipsize", PANGO_ELLIPSIZE_END, "width-chars", 10, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_cell_layout_clear (GTK_CELL_LAYOUT (eprop_attribute->combo));
Packit 1e8aac
Packit 1e8aac
  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (eprop_attribute->combo), cell,
Packit 1e8aac
                              TRUE);
Packit 1e8aac
  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (eprop_attribute->combo),
Packit 1e8aac
                                  cell, "text", 0, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (hbox), eprop_attribute->spin, FALSE, FALSE, 0);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (hbox), eprop_attribute->combo, FALSE, FALSE, 0);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (eprop_attribute->combo), "changed",
Packit 1e8aac
                    G_CALLBACK (combo_changed), eprop);
Packit 1e8aac
  g_signal_connect (G_OBJECT (eprop_attribute->spin), "value-changed",
Packit 1e8aac
                    G_CALLBACK (spin_changed), eprop);
Packit 1e8aac
Packit 1e8aac
  return hbox;
Packit 1e8aac
}