Gimp/app/widgets/gimpviewabledialog.c
Michael Natterer 59bd430526 make sure the button_box is always interted at the very bottom of the
2004-10-22  Michael Natterer  <mitch@gimp.org>

	* app/widgets/gimpeditor.c (gimp_editor_ensure_button_box): make
	sure the button_box is always interted at the very bottom of the
	editor.

	* app/widgets/gimpviewabledialog.c: changed the "description"
	property from CONSTRUCT_ONLY to CONSTRUCT.

	* app/widgets/gimpcolormapeditor.c: show the index of the edited
	color in the color dialog and use the correct icon. Replaced label
	"Hex triplet" by "HTML notation" to be consistent with the color
	dialog. Removed wrong 2 pixel border around the table below the
	preview.
2004-10-22 15:41:03 +00:00

364 lines
12 KiB
C

/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpviewabledialog.c
* Copyright (C) 2000 Michael Natterer <mitch@gimp.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
#include "core/gimpimage.h"
#include "core/gimpitem.h"
#include "file/file-utils.h"
#include "gimpview.h"
#include "gimpviewabledialog.h"
enum
{
PROP_0,
PROP_STOCK_ID,
PROP_DESC,
PROP_PARENT
};
static void gimp_viewable_dialog_class_init (GimpViewableDialogClass *klass);
static void gimp_viewable_dialog_init (GimpViewableDialog *dialog);
static void gimp_viewable_dialog_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_viewable_dialog_destroy (GtkObject *object);
static void gimp_viewable_dialog_name_changed (GimpObject *object,
GimpViewableDialog *dialog);
static void gimp_viewable_dialog_close (GimpViewableDialog *dialog);
static GimpDialogClass *parent_class = NULL;
GType
gimp_viewable_dialog_get_type (void)
{
static GType dialog_type = 0;
if (! dialog_type)
{
static const GTypeInfo dialog_info =
{
sizeof (GimpViewableDialogClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gimp_viewable_dialog_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GimpViewableDialog),
0, /* n_preallocs */
(GInstanceInitFunc) gimp_viewable_dialog_init,
};
dialog_type = g_type_register_static (GIMP_TYPE_DIALOG,
"GimpViewableDialog",
&dialog_info, 0);
}
return dialog_type;
}
static void
gimp_viewable_dialog_class_init (GimpViewableDialogClass *klass)
{
GtkObjectClass *gtk_object_class;
GObjectClass *object_class;
gtk_object_class = GTK_OBJECT_CLASS (klass);
object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
gtk_object_class->destroy = gimp_viewable_dialog_destroy;
object_class->set_property = gimp_viewable_dialog_set_property;
g_object_class_install_property (object_class, PROP_STOCK_ID,
g_param_spec_string ("stock-id", NULL, NULL,
NULL,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_DESC,
g_param_spec_string ("description", NULL, NULL,
NULL,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_PARENT,
g_param_spec_object ("parent", NULL, NULL,
GTK_TYPE_WIDGET,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
}
static void
gimp_viewable_dialog_init (GimpViewableDialog *dialog)
{
GtkWidget *frame;
GtkWidget *hbox;
GtkWidget *vbox;
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame,
FALSE, FALSE, 0);
gtk_widget_show (frame);
hbox = gtk_hbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
gtk_container_add (GTK_CONTAINER (frame), hbox);
gtk_widget_show (hbox);
dialog->icon = gtk_image_new ();
gtk_misc_set_alignment (GTK_MISC (dialog->icon), 0.5, 0.0);
gtk_box_pack_start (GTK_BOX (hbox), dialog->icon, FALSE, FALSE, 0);
gtk_widget_show (dialog->icon);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (hbox), vbox);
gtk_widget_show (vbox);
dialog->desc_label = gtk_label_new (NULL);
gtk_misc_set_alignment (GTK_MISC (dialog->desc_label), 0.0, 0.5);
gimp_label_set_attributes (GTK_LABEL (dialog->desc_label),
PANGO_ATTR_SCALE, PANGO_SCALE_LARGE,
PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD,
-1);
gtk_box_pack_start (GTK_BOX (vbox), dialog->desc_label, FALSE, FALSE, 0);
gtk_widget_show (dialog->desc_label);
dialog->viewable_label = gtk_label_new (NULL);
gtk_misc_set_alignment (GTK_MISC (dialog->viewable_label), 0.0, 0.5);
gimp_label_set_attributes (GTK_LABEL (dialog->viewable_label),
PANGO_ATTR_SCALE, PANGO_SCALE_SMALL,
-1);
gtk_box_pack_start (GTK_BOX (vbox), dialog->viewable_label, FALSE, FALSE, 0);
gtk_widget_show (dialog->viewable_label);
}
static void
gimp_viewable_dialog_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpViewableDialog *dialog = GIMP_VIEWABLE_DIALOG (object);
switch (property_id)
{
case PROP_STOCK_ID:
gtk_image_set_from_stock (GTK_IMAGE (dialog->icon),
g_value_get_string (value),
GTK_ICON_SIZE_LARGE_TOOLBAR);
break;
case PROP_DESC:
gtk_label_set_text (GTK_LABEL (dialog->desc_label),
g_value_get_string (value));
break;
case PROP_PARENT:
{
GtkWidget *parent = g_value_get_object (value);
if (parent)
{
if (GTK_IS_WINDOW (parent))
gtk_window_set_transient_for (GTK_WINDOW (dialog),
GTK_WINDOW (parent));
else
gtk_window_set_screen (GTK_WINDOW (dialog),
gtk_widget_get_screen (parent));
}
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_viewable_dialog_destroy (GtkObject *object)
{
GimpViewableDialog *dialog = GIMP_VIEWABLE_DIALOG (object);
if (dialog->preview)
gimp_viewable_dialog_set_viewable (dialog, NULL);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
GtkWidget *
gimp_viewable_dialog_new (GimpViewable *viewable,
const gchar *title,
const gchar *role,
const gchar *stock_id,
const gchar *desc,
GtkWidget *parent,
GimpHelpFunc help_func,
const gchar *help_id,
...)
{
GimpViewableDialog *dialog;
va_list args;
g_return_val_if_fail (! viewable || GIMP_IS_VIEWABLE (viewable), NULL);
g_return_val_if_fail (title != NULL, NULL);
g_return_val_if_fail (role != NULL, NULL);
g_return_val_if_fail (parent == NULL || GTK_IS_WIDGET (parent), NULL);
dialog = g_object_new (GIMP_TYPE_VIEWABLE_DIALOG,
"title", title,
"role", role,
"help-func", help_func,
"help-id", help_id,
"stock-id", stock_id,
"description", desc,
"parent", parent,
NULL);
va_start (args, help_id);
gimp_dialog_add_buttons_valist (GIMP_DIALOG (dialog), args);
va_end (args);
if (viewable)
gimp_viewable_dialog_set_viewable (dialog, viewable);
return GTK_WIDGET (dialog);
}
void
gimp_viewable_dialog_set_viewable (GimpViewableDialog *dialog,
GimpViewable *viewable)
{
g_return_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog));
g_return_if_fail (! viewable || GIMP_IS_VIEWABLE (viewable));
if (dialog->preview)
{
GimpViewable *old_viewable;
old_viewable = GIMP_VIEW (dialog->preview)->viewable;
if (viewable == old_viewable)
return;
gtk_widget_destroy (dialog->preview);
if (old_viewable)
{
g_signal_handlers_disconnect_by_func (old_viewable,
gimp_viewable_dialog_name_changed,
dialog);
g_signal_handlers_disconnect_by_func (old_viewable,
gimp_viewable_dialog_close,
dialog);
}
}
if (viewable)
{
g_signal_connect_object (viewable,
GIMP_VIEWABLE_GET_CLASS (viewable)->name_changed_signal,
G_CALLBACK (gimp_viewable_dialog_name_changed),
dialog,
0);
dialog->preview = gimp_view_new (viewable, 32, 1, TRUE);
gtk_box_pack_end (GTK_BOX (dialog->icon->parent), dialog->preview,
FALSE, FALSE, 2);
gtk_widget_show (dialog->preview);
g_object_add_weak_pointer (G_OBJECT (dialog->preview),
(gpointer *) &dialog->preview);
gimp_viewable_dialog_name_changed (GIMP_OBJECT (viewable), dialog);
if (GIMP_IS_ITEM (viewable))
{
g_signal_connect_object (viewable, "removed",
G_CALLBACK (gimp_viewable_dialog_close),
dialog,
G_CONNECT_SWAPPED);
}
else
{
g_signal_connect_object (viewable, "disconnect",
G_CALLBACK (gimp_viewable_dialog_close),
dialog,
G_CONNECT_SWAPPED);
}
}
}
/* private functions */
static void
gimp_viewable_dialog_name_changed (GimpObject *object,
GimpViewableDialog *dialog)
{
gchar *name;
name = gimp_viewable_get_description (GIMP_VIEWABLE (object), NULL);
if (GIMP_IS_ITEM (object))
{
const gchar *uri;
gchar *basename;
gchar *tmp;
uri = gimp_image_get_uri (gimp_item_get_image (GIMP_ITEM (object)));
tmp = name;
basename = file_utils_uri_to_utf8_basename (uri);
name = g_strdup_printf ("%s-%d (%s)",
tmp,
gimp_item_get_ID (GIMP_ITEM (object)),
basename);
g_free (basename);
g_free (tmp);
}
gtk_label_set_text (GTK_LABEL (dialog->viewable_label), name);
g_free (name);
}
static void
gimp_viewable_dialog_close (GimpViewableDialog *dialog)
{
g_signal_emit_by_name (dialog, "close");
}