]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/object-editor.c
2008-10-12 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / object-editor.c
index 0b28c9e59dbf5749d71553c59ed67567cca81d7b..ddaf6f90126a86ee549ae78cea064fc6dba9e565 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/* -*- 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"
 
@@ -51,61 +62,36 @@ typedef void (*ChangedSignal) (GObject * object, gpointer data);
 
 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;     
 
@@ -118,6 +104,15 @@ gl_object_editor_class_init (glObjectEditorClass *klass)
                          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");
 }
 
@@ -133,7 +128,7 @@ gl_object_editor_init (glObjectEditor *editor)
                                           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;
        }
 
@@ -154,6 +149,7 @@ gl_object_editor_init (glObjectEditor *editor)
 
        /* 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");
 }
@@ -161,20 +157,23 @@ gl_object_editor_init (glObjectEditor *editor)
 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");
 }
@@ -184,7 +183,8 @@ gl_object_editor_finalize (GObject *object)
 /*****************************************************************************/
 GtkWidget*
 gl_object_editor_new (gchar                *image,
-                     gchar                *label,
+                     gchar                *title,
+                      glLabel              *label,
                      glObjectEditorOption  first_option, ...)
 {
        glObjectEditor *editor;
@@ -200,11 +200,11 @@ gl_object_editor_new (gchar                *image,
                                          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);
 
@@ -215,7 +215,7 @@ gl_object_editor_new (gchar                *image,
        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");
@@ -228,6 +228,7 @@ gl_object_editor_new (gchar                *image,
 /*--------------------------------------------------------------------------*/
 static void
 gl_object_notebook_construct_valist (glObjectEditor       *editor,
+                                     glLabel              *label,
                                     glObjectEditorOption  first_option,
                                     va_list               args)
 {
@@ -236,6 +237,8 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
 
        gl_debug (DEBUG_EDITOR, "START");
 
+        editor->priv->label = label;
+
        option = first_option;
 
        for ( option=first_option; option; option=va_arg (args, glObjectEditorOption) ) {
@@ -298,8 +301,13 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
                        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 ();
                }
                
@@ -308,6 +316,20 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
                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");
 }
 
@@ -317,6 +339,8 @@ gl_object_notebook_construct_valist (glObjectEditor       *editor,
 void
 gl_object_editor_changed_cb (glObjectEditor *editor)
 {
+        if (editor->priv->stop_signals) return;
+
        gl_debug (DEBUG_EDITOR, "START");
 
        /* Emit our "changed" signal */
@@ -325,6 +349,22 @@ gl_object_editor_changed_cb (glObjectEditor *editor)
        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.                                 */
 /*****************************************************************************/
@@ -334,17 +374,32 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
 {
         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);
@@ -373,49 +428,131 @@ gl_object_editor_set_key_names (glObjectEditor      *editor,
                                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");
 }
@@ -431,41 +568,112 @@ gl_object_editor_construct_color_combo (gchar *name,
                                        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");
+}
+