|
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 |
}
|