-/*
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+
+/**
* (GLABELS) Label and Business Card Creation program for GNOME
*
* object-editor.c: object properties editor module
*/
#include <config.h>
-#include <gnome.h>
+#include "object-editor.h"
+
+#include <glib/gi18n.h>
#include <glade/glade-xml.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtknotebook.h>
+#include <gtk/gtkcombobox.h>
+#include <gtk/gtktogglebutton.h>
+
#include <math.h>
-#include "object-editor.h"
#include "prefs.h"
-#include "mygal/widget-color-combo.h"
+#include "color-combo.h"
#include "color.h"
+#include "wdgt-chain-button.h"
+#include "wdgt-merge-menu.h"
#include "marshal.h"
+#include "util.h"
#include "object-editor-private.h"
gint gl_object_editor_signals[LAST_SIGNAL] = { 0 };
-static GtkVBoxClass *parent_class = NULL;
-
/*===========================================*/
/* Local function prototypes */
/*===========================================*/
-static void gl_object_editor_class_init (glObjectEditorClass *klass);
-static void gl_object_editor_init (glObjectEditor *editor);
static void gl_object_editor_finalize (GObject *object);
static void gl_object_notebook_construct_valist (glObjectEditor *editor,
+ glLabel *label,
glObjectEditorOption first_option,
va_list args);
+static void prefs_changed_cb (glObjectEditor *editor);
+
+static void label_changed_cb (glLabel *label,
+ glObjectEditor *editor);
+
\f
/*****************************************************************************/
/* Boilerplate object stuff. */
/*****************************************************************************/
-GType
-gl_object_editor_get_type (void)
-{
- static GType editor_type = 0;
-
- if (!editor_type)
- {
- static const GTypeInfo editor_info =
- {
- sizeof (glObjectEditorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gl_object_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (glObjectEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gl_object_editor_init
- };
-
- editor_type = g_type_register_static (GTK_TYPE_VBOX,
- "glObjectEditor",
- &editor_info,
- 0);
- }
-
- return editor_type;
-}
+G_DEFINE_TYPE (glObjectEditor, gl_object_editor, GTK_TYPE_VBOX);
static void
-gl_object_editor_class_init (glObjectEditorClass *klass)
+gl_object_editor_class_init (glObjectEditorClass *class)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
gl_debug (DEBUG_EDITOR, "START");
- parent_class = g_type_class_peek_parent (klass);
+ gl_object_editor_parent_class = g_type_class_peek_parent (class);
object_class->finalize = gl_object_editor_finalize;
gl_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ gl_object_editor_signals[SIZE_CHANGED] =
+ g_signal_new ("size_changed",
+ G_OBJECT_CLASS_TYPE(object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (glObjectEditorClass, size_changed),
+ NULL, NULL,
+ gl_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
gl_debug (DEBUG_EDITOR, "END");
}
NULL);
if (!editor->priv->gui) {
- g_warning ("Could not open object-editor.glade, reinstall glabels!");
+ g_critical ("Could not open object-editor.glade. gLabels may not be installed correctly!");
return;
}
/* Hide all notebook pages to start with. */
gtk_widget_hide_all (editor->priv->notebook);
+ gtk_widget_set_no_show_all (editor->priv->notebook, TRUE);
gl_debug (DEBUG_EDITOR, "END");
}
static void
gl_object_editor_finalize (GObject *object)
{
- glObjectEditor* editor;
+ glObjectEditor* editor = GL_OBJECT_EDITOR (object);;
gl_debug (DEBUG_EDITOR, "START");
g_return_if_fail (object != NULL);
-
- editor = GL_OBJECT_EDITOR (object);
-
g_return_if_fail (GL_IS_OBJECT_EDITOR (editor));
g_return_if_fail (editor->priv != NULL);
+ g_signal_handlers_disconnect_by_func (G_OBJECT(gl_prefs),
+ prefs_changed_cb, editor);
+ g_signal_handlers_disconnect_by_func (G_OBJECT(editor->priv->label),
+ label_changed_cb, editor);
+
+ g_object_unref (editor->priv->gui);
g_free (editor->priv);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (gl_object_editor_parent_class)->finalize (object);
gl_debug (DEBUG_EDITOR, "END");
}
/*****************************************************************************/
GtkWidget*
gl_object_editor_new (gchar *image,
- gchar *label,
+ gchar *title,
+ glLabel *label,
glObjectEditorOption first_option, ...)
{
glObjectEditor *editor;
GTK_ICON_SIZE_LARGE_TOOLBAR);
}
- if (label) {
+ if (title) {
gchar *s;
s = g_strdup_printf ("<span weight=\"bold\">%s</span>",
- label);
+ title);
gtk_label_set_text (GTK_LABEL(editor->priv->title_label), s);
g_free (s);
gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK(editor->priv->notebook), TRUE);
va_start (args, first_option);
- gl_object_notebook_construct_valist (editor, first_option, args);
+ gl_object_notebook_construct_valist (editor, label, first_option, args);
va_end (args);
gl_debug (DEBUG_EDITOR, "END");
/*--------------------------------------------------------------------------*/
static void
gl_object_notebook_construct_valist (glObjectEditor *editor,
+ glLabel *label,
glObjectEditorOption first_option,
va_list args)
{
gl_debug (DEBUG_EDITOR, "START");
+ editor->priv->label = label;
+
option = first_option;
for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
pages++;
break;
+ case GL_OBJECT_EDITOR_SHADOW_PAGE:
+ gl_object_editor_prepare_shadow_page (editor);
+ pages++;
+ break;
+
default:
- g_warning ("option = %d", option);
+ g_message ("option = %d", option);
g_assert_not_reached ();
}
gtk_widget_show (editor->priv->notebook);
}
+ g_signal_connect_swapped (G_OBJECT (gl_prefs), "changed",
+ G_CALLBACK (prefs_changed_cb),
+ editor);
+ if (label)
+ {
+ label_changed_cb (label, editor);
+ g_signal_connect (G_OBJECT (label), "size_changed",
+ G_CALLBACK (label_changed_cb),
+ editor);
+ g_signal_connect (G_OBJECT (label), "merge_changed",
+ G_CALLBACK (label_changed_cb),
+ editor);
+ }
+
gl_debug (DEBUG_EDITOR, "END");
}
void
gl_object_editor_changed_cb (glObjectEditor *editor)
{
+ if (editor->priv->stop_signals) return;
+
gl_debug (DEBUG_EDITOR, "START");
/* Emit our "changed" signal */
gl_debug (DEBUG_EDITOR, "END");
}
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Widget size changed callback. Emit our "size-changed" signal. */
+/*--------------------------------------------------------------------------*/
+void
+gl_object_editor_size_changed_cb (glObjectEditor *editor)
+{
+ if (editor->priv->stop_signals) return;
+
+ gl_debug (DEBUG_EDITOR, "START");
+
+ /* Emit our "size_changed" signal */
+ g_signal_emit (G_OBJECT (editor), gl_object_editor_signals[SIZE_CHANGED], 0);
+
+ gl_debug (DEBUG_EDITOR, "END");
+}
+
/*****************************************************************************/
/* Set possible key names from merge object. */
/*****************************************************************************/
{
GList *keys;
GtkWidget *combo;
+ GtkWidget *menu;
+ gboolean fixed_flag;
+ gboolean state;
gl_debug (DEBUG_EDITOR, "START");
- if (editor->priv->edit_key_label) {
- gtk_widget_set_sensitive (editor->priv->edit_key_label, merge != NULL);
+ if (editor->priv->text_auto_shrink_check) {
+ gtk_widget_set_sensitive (editor->priv->text_auto_shrink_check,
+ merge != NULL);
}
- if (editor->priv->edit_key_combo) {
- gtk_widget_set_sensitive (editor->priv->edit_key_combo, merge != NULL);
+ if (editor->priv->text_page_vbox) {
+ gtk_widget_set_sensitive (editor->priv->text_color_key_radio, merge != NULL);
+ if (merge == NULL) {
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON(editor->priv->text_color_radio), TRUE);
+ gtk_widget_set_sensitive (editor->priv->text_color_combo, TRUE);
+ gtk_widget_set_sensitive (editor->priv->text_color_key_combo, FALSE);
+ } else {
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->text_color_key_radio));
+ gtk_widget_set_sensitive (editor->priv->text_color_combo, !state);
+ gtk_widget_set_sensitive (editor->priv->text_color_key_combo, state);
+
+ }
}
-
+
if (editor->priv->edit_insert_field_button) {
gtk_widget_set_sensitive (editor->priv->edit_insert_field_button,
merge != NULL);
GTK_TOGGLE_BUTTON(editor->priv->data_literal_radio), TRUE);
}
}
-
+
+ fixed_flag = editor->priv->data_format_fixed_flag;
+ if (editor->priv->data_format_label) {
+ gtk_widget_set_sensitive (editor->priv->data_format_label,
+ (merge != NULL));
+ }
+ if (editor->priv->data_ex_label) {
+ gtk_widget_set_sensitive (editor->priv->data_ex_label,
+ (merge != NULL));
+ }
+ if (editor->priv->data_digits_label) {
+ gtk_widget_set_sensitive (editor->priv->data_digits_label,
+ (merge != NULL) && !fixed_flag);
+ }
+ if (editor->priv->data_digits_spin) {
+ gtk_widget_set_sensitive (editor->priv->data_digits_spin,
+ (merge != NULL) && !fixed_flag);
+ }
-
- keys = gl_merge_get_key_list (merge);
- if ( keys != NULL ) {
+ if (editor->priv->fill_page_vbox) {
+ gtk_widget_set_sensitive (editor->priv->fill_key_radio, merge != NULL);
+ if (merge == NULL) {
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON(editor->priv->fill_color_radio), TRUE);
+ gtk_widget_set_sensitive (editor->priv->fill_color_combo, TRUE);
+ gtk_widget_set_sensitive (editor->priv->fill_key_combo, FALSE);
+ } else {
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->fill_key_radio));
+ gtk_widget_set_sensitive (editor->priv->fill_color_combo, !state);
+ gtk_widget_set_sensitive (editor->priv->fill_key_combo, state);
+
+ }
+ }
- combo = editor->priv->img_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
+ if (editor->priv->line_page_vbox) {
+ gtk_widget_set_sensitive (editor->priv->line_key_radio, merge != NULL);
+ if (merge == NULL) {
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON(editor->priv->line_color_radio), TRUE);
+ gtk_widget_set_sensitive (editor->priv->line_color_combo, TRUE);
+ gtk_widget_set_sensitive (editor->priv->line_key_combo, FALSE);
+ } else {
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->line_key_radio));
+ gtk_widget_set_sensitive (editor->priv->line_color_combo, !state);
+ gtk_widget_set_sensitive (editor->priv->line_key_combo, state);
+
}
+ }
- combo = editor->priv->edit_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
+ if (editor->priv->bc_page_vbox) {
+ gtk_widget_set_sensitive (editor->priv->bc_key_radio, merge != NULL);
+ if (merge == NULL) {
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON(editor->priv->bc_color_radio), TRUE);
+ gtk_widget_set_sensitive (editor->priv->bc_color_combo, TRUE);
+ gtk_widget_set_sensitive (editor->priv->bc_key_combo, FALSE);
+ } else {
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->bc_key_radio));
+ gtk_widget_set_sensitive (editor->priv->bc_color_combo, !state);
+ gtk_widget_set_sensitive (editor->priv->bc_key_combo, state);
+
}
+ }
- combo = editor->priv->data_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
+ if (editor->priv->shadow_page_vbox) {
+ gtk_widget_set_sensitive (editor->priv->shadow_key_radio, merge != NULL);
+ if (merge == NULL) {
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON(editor->priv->shadow_color_radio), TRUE);
+ gtk_widget_set_sensitive (editor->priv->shadow_color_combo, TRUE);
+ gtk_widget_set_sensitive (editor->priv->shadow_key_combo, FALSE);
+ } else {
+ state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->priv->shadow_key_radio));
+ gtk_widget_set_sensitive (editor->priv->shadow_color_combo, !state);
+ gtk_widget_set_sensitive (editor->priv->shadow_key_combo, state);
+
}
+ }
- gl_merge_free_key_list (&keys);
- } else {
+ keys = gl_merge_get_key_list (merge);
+ if ( keys == NULL ) {
+ keys = g_list_append (keys, g_strdup (""));
+ }
- keys = g_list_append (keys, "");
+ combo = editor->priv->img_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
- combo = editor->priv->img_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
- }
+ menu = editor->priv->edit_insert_field_menu;
+ if (menu) {
+ gl_wdgt_merge_menu_set_fields (GL_WDGT_MERGE_MENU(menu), keys);
+ }
- combo = editor->priv->edit_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
- }
+ combo = editor->priv->data_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
+
+ combo = editor->priv->fill_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
- combo = editor->priv->data_key_combo;
- if (combo) {
- gtk_combo_set_popdown_strings (GTK_COMBO (combo), keys);
- }
+ combo = editor->priv->text_color_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
- g_list_free (keys);
- }
+ combo = editor->priv->line_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
+
+ combo = editor->priv->bc_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
+
+ combo = editor->priv->shadow_key_combo;
+ if (combo) {
+ gl_util_combo_box_set_strings (GTK_COMBO_BOX (combo), keys);
+ }
+
+ gl_merge_free_key_list (&keys);
gl_debug (DEBUG_EDITOR, "END");
}
gint int2)
{
GtkWidget *color_combo;
- ColorGroup *cg;
- gchar *cg_name;
guint color;
- GdkColor *gdk_color;
gchar *no_color;
switch (int1) {
+ case 3:
+ color = GL_COLOR_SHADOW_DEFAULT;
+ no_color = _("Default");
+ break;
+
case 2:
- cg_name = "text_color_group";
color = gl_prefs->default_text_color;
no_color = _("Default");
break;
case 1:
- cg_name = "line_color_group";
color = gl_prefs->default_line_color;
no_color = _("No line");
break;
case 0:
default:
- cg_name = "fill_color_group";
color = gl_prefs->default_fill_color;
no_color = _("No fill");
break;
}
- cg = color_group_fetch (cg_name, NULL);
- gdk_color = gl_color_to_gdk_color (color);
- color_combo = color_combo_new (NULL, no_color, gdk_color, cg);
- g_free (gdk_color);
+ color_combo = gl_color_combo_new (NULL, no_color, color, color);
- color_combo_box_set_preview_relief (COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
+ gl_color_combo_set_relief (GL_COLOR_COMBO(color_combo), GTK_RELIEF_NORMAL);
return color_combo;
}
+
+/*****************************************************************************/
+/* Construct chain button "Custom widget". */
+/*****************************************************************************/
+GtkWidget *
+gl_object_editor_construct_chain_button (gchar *name,
+ gchar *string1,
+ gchar *string2,
+ gint int1,
+ gint int2)
+{
+ GtkWidget *chain_button;
+
+ chain_button = gl_wdgt_chain_button_new (GL_WDGT_CHAIN_RIGHT);
+ gl_wdgt_chain_button_set_active (GL_WDGT_CHAIN_BUTTON(chain_button), TRUE);
+
+ return chain_button;
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE. Prefs changed callback. Update units related items. */
+/*--------------------------------------------------------------------------*/
+static void
+prefs_changed_cb (glObjectEditor *editor)
+{
+
+ gl_debug (DEBUG_EDITOR, "START");
+
+ if (editor->priv->lsize_r_spin) {
+ lsize_prefs_changed_cb (editor);
+ }
+
+ if (editor->priv->size_w_spin) {
+ size_prefs_changed_cb (editor);
+ }
+
+ if (editor->priv->pos_x_spin) {
+ position_prefs_changed_cb (editor);
+ }
+
+ if (editor->priv->shadow_x_spin) {
+ shadow_prefs_changed_cb (editor);
+ }
+
+ gl_debug (DEBUG_EDITOR, "END");
+}
+
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. label "changed" callback. */
+/*---------------------------------------------------------------------------*/
+static void
+label_changed_cb (glLabel *label,
+ glObjectEditor *editor)
+{
+ gdouble label_width, label_height;
+ glMerge *merge;
+
+ gl_debug (DEBUG_EDITOR, "START");
+
+ gl_label_get_size (label, &label_width, &label_height);
+ gl_object_editor_set_max_position (GL_OBJECT_EDITOR (editor),
+ label_width, label_height);
+ gl_object_editor_set_max_size (GL_OBJECT_EDITOR (editor),
+ label_width, label_height);
+ gl_object_editor_set_max_lsize (GL_OBJECT_EDITOR (editor),
+ label_width, label_height);
+ gl_object_editor_set_max_shadow_offset (GL_OBJECT_EDITOR (editor),
+ label_width, label_height);
+
+ merge = gl_label_get_merge (label);
+ gl_object_editor_set_key_names (editor, merge);
+
+ gl_debug (DEBUG_EDITOR, "END");
+}
+