mirror of https://github.com/GNOME/gimp.git
213 lines
5.0 KiB
C
213 lines
5.0 KiB
C
/* The GIMP -- an image manipulation program
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
*
|
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "appenv.h"
|
|
#include "gimprc.h"
|
|
#include "info_dialog.h"
|
|
#include "interface.h"
|
|
|
|
/* static functions */
|
|
static InfoField * info_field_new (InfoDialog *, char *, char *);
|
|
static void update_field (InfoField *);
|
|
static gint info_dialog_delete_callback (GtkWidget *, GdkEvent *, gpointer);
|
|
|
|
static InfoField *
|
|
info_field_new (InfoDialog *idialog,
|
|
char *title,
|
|
char *text_ptr)
|
|
{
|
|
GtkWidget *label;
|
|
InfoField *field;
|
|
|
|
field = (InfoField *) g_malloc (sizeof (InfoField));
|
|
|
|
label = gtk_label_new (title);
|
|
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
|
|
gtk_box_pack_start (GTK_BOX (idialog->labels), label, FALSE, FALSE, 0);
|
|
|
|
field->w = gtk_label_new (text_ptr);
|
|
gtk_misc_set_alignment (GTK_MISC (field->w), 0.0, 0.5);
|
|
gtk_box_pack_start (GTK_BOX (idialog->values), field->w, FALSE, FALSE, 0);
|
|
|
|
field->text_ptr = text_ptr;
|
|
|
|
gtk_widget_show (field->w);
|
|
gtk_widget_show (label);
|
|
|
|
return field;
|
|
}
|
|
|
|
static void
|
|
update_field (InfoField *field)
|
|
{
|
|
gchar *old_text;
|
|
|
|
/* only update the field if its new value differs from the old */
|
|
gtk_label_get (GTK_LABEL (field->w), &old_text);
|
|
|
|
if (strcmp (old_text, field->text_ptr))
|
|
{
|
|
/* set the new value and update somehow */
|
|
gtk_label_set (GTK_LABEL (field->w), field->text_ptr);
|
|
}
|
|
}
|
|
|
|
/* function definitions */
|
|
|
|
InfoDialog *
|
|
info_dialog_new (char *title)
|
|
{
|
|
InfoDialog * idialog;
|
|
GtkWidget *shell;
|
|
GtkWidget *vbox;
|
|
GtkWidget *labels, *values;
|
|
GtkWidget *info_area;
|
|
|
|
idialog = (InfoDialog *) g_malloc (sizeof (InfoDialog));
|
|
idialog->field_list = NULL;
|
|
|
|
shell = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (shell), title);
|
|
gtk_widget_set_uposition (shell, info_x, info_y);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (shell), "delete_event",
|
|
GTK_SIGNAL_FUNC (info_dialog_delete_callback),
|
|
idialog);
|
|
|
|
vbox = gtk_vbox_new (FALSE, 1);
|
|
gtk_container_border_width (GTK_CONTAINER (vbox), 1);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (shell)->vbox), vbox, TRUE, TRUE, 0);
|
|
|
|
info_area = gtk_hbox_new (FALSE, 1);
|
|
gtk_container_border_width (GTK_CONTAINER (info_area), 5);
|
|
gtk_box_pack_start (GTK_BOX (vbox), info_area, TRUE, TRUE, 0);
|
|
|
|
labels = gtk_vbox_new (FALSE, 1);
|
|
gtk_box_pack_start (GTK_BOX (info_area), labels, TRUE, TRUE, 0);
|
|
|
|
values = gtk_vbox_new (FALSE, 1);
|
|
gtk_box_pack_start (GTK_BOX (info_area), values, TRUE, TRUE, 0);
|
|
|
|
idialog->shell = shell;
|
|
idialog->vbox = vbox;
|
|
idialog->info_area = info_area;
|
|
idialog->labels = labels;
|
|
idialog->values = values;
|
|
|
|
gtk_widget_show (idialog->labels);
|
|
gtk_widget_show (idialog->values);
|
|
gtk_widget_show (idialog->info_area);
|
|
gtk_widget_show (idialog->vbox);
|
|
|
|
return idialog;
|
|
}
|
|
|
|
void
|
|
info_dialog_free (InfoDialog *idialog)
|
|
{
|
|
link_ptr list;
|
|
|
|
if (!idialog)
|
|
return;
|
|
|
|
/* Free each item in the field list */
|
|
list = idialog->field_list;
|
|
|
|
while (list)
|
|
{
|
|
g_free (list->data);
|
|
list = next_item (list);
|
|
}
|
|
|
|
/* Free the actual field linked list */
|
|
free_list (idialog->field_list);
|
|
|
|
/* Destroy the associated widgets */
|
|
gtk_widget_destroy (idialog->shell);
|
|
|
|
/* Free the info dialog memory */
|
|
g_free (idialog);
|
|
}
|
|
|
|
void
|
|
info_dialog_add_field (InfoDialog *idialog,
|
|
char *title,
|
|
char *text_ptr)
|
|
{
|
|
InfoField * new_field;
|
|
|
|
if (!idialog)
|
|
return;
|
|
|
|
new_field = info_field_new (idialog, title, text_ptr);
|
|
idialog->field_list = add_to_list (idialog->field_list, (void *) new_field);
|
|
}
|
|
|
|
void
|
|
info_dialog_popup (InfoDialog *idialog)
|
|
{
|
|
if (!idialog)
|
|
return;
|
|
|
|
if (!GTK_WIDGET_VISIBLE (idialog->shell))
|
|
gtk_widget_show (idialog->shell);
|
|
}
|
|
|
|
void
|
|
info_dialog_popdown (InfoDialog *idialog)
|
|
{
|
|
if (!idialog)
|
|
return;
|
|
|
|
if (GTK_WIDGET_VISIBLE (idialog->shell))
|
|
gtk_widget_hide (idialog->shell);
|
|
}
|
|
|
|
void
|
|
info_dialog_update (InfoDialog *idialog)
|
|
{
|
|
link_ptr list;
|
|
|
|
if (!idialog)
|
|
return;
|
|
|
|
list = idialog->field_list;
|
|
|
|
while (list)
|
|
{
|
|
update_field ((InfoField *) list->data);
|
|
list = next_item (list);
|
|
}
|
|
}
|
|
|
|
static gint
|
|
info_dialog_delete_callback (GtkWidget *w,
|
|
GdkEvent *e,
|
|
gpointer client_data) {
|
|
|
|
info_dialog_popdown ((InfoDialog *) client_data);
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|