1997-11-25 06:05:25 +08:00
|
|
|
/* 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
|
1998-04-13 13:44:11 +08:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "appenv.h"
|
|
|
|
#include "actionarea.h"
|
1998-07-09 13:31:06 +08:00
|
|
|
#include "gimpbrushlist.h"
|
1999-07-06 23:18:25 +08:00
|
|
|
#include "gimpcontext.h"
|
1998-07-12 19:40:43 +08:00
|
|
|
#include "gimplist.h"
|
1998-07-09 13:31:06 +08:00
|
|
|
#include "gimpbrushgenerated.h"
|
1999-07-06 23:18:25 +08:00
|
|
|
#include "gimprc.h"
|
1998-07-09 13:31:06 +08:00
|
|
|
#include "brush_edit.h"
|
|
|
|
#include "brush_select.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "colormaps.h"
|
|
|
|
#include "disp_callbacks.h"
|
|
|
|
#include "errors.h"
|
1999-04-22 22:34:00 +08:00
|
|
|
#include "paint_options.h"
|
1998-06-23 01:30:40 +08:00
|
|
|
#include "session.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
#include "libgimp/gimpintl.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
#define MIN_CELL_SIZE 24
|
|
|
|
#define MAX_CELL_SIZE 24 /* disable variable brush preview size */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
#define STD_BRUSH_COLUMNS 5
|
|
|
|
#define STD_BRUSH_ROWS 5
|
|
|
|
|
1999-05-02 05:37:34 +08:00
|
|
|
/* how long to wait after mouse-down before showing pattern popup */
|
|
|
|
#define POPUP_DELAY_MS 150
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
#define MAX_WIN_WIDTH(bsp) (MIN_CELL_SIZE * ((bsp)->NUM_BRUSH_COLUMNS))
|
|
|
|
#define MAX_WIN_HEIGHT(bsp) (MIN_CELL_SIZE * ((bsp)->NUM_BRUSH_ROWS))
|
1997-11-25 06:05:25 +08:00
|
|
|
#define MARGIN_WIDTH 3
|
|
|
|
#define MARGIN_HEIGHT 3
|
|
|
|
|
|
|
|
#define BRUSH_EVENT_MASK GDK_EXPOSURE_MASK | \
|
|
|
|
GDK_BUTTON_PRESS_MASK | \
|
|
|
|
GDK_BUTTON_RELEASE_MASK | \
|
|
|
|
GDK_BUTTON1_MOTION_MASK | \
|
|
|
|
GDK_ENTER_NOTIFY_MASK
|
|
|
|
|
|
|
|
/* local function prototypes */
|
1998-07-09 13:31:06 +08:00
|
|
|
static void brush_popup_open (BrushSelectP, int, int, GimpBrushP);
|
1997-11-25 06:05:25 +08:00
|
|
|
static void brush_popup_close (BrushSelectP);
|
1998-07-09 13:31:06 +08:00
|
|
|
static void display_brush (BrushSelectP, GimpBrushP, int, int);
|
1997-11-25 06:05:25 +08:00
|
|
|
static void display_brushes (BrushSelectP);
|
|
|
|
static void display_setup (BrushSelectP);
|
|
|
|
static void preview_calc_scrollbar (BrushSelectP);
|
|
|
|
static void brush_select_show_selected (BrushSelectP, int, int);
|
|
|
|
static void update_active_brush_field (BrushSelectP);
|
1999-07-29 18:40:42 +08:00
|
|
|
static void edit_active_brush ();
|
1998-07-09 13:31:06 +08:00
|
|
|
static gint edit_brush_callback (GtkWidget *w, GdkEvent *e,
|
|
|
|
gpointer data);
|
|
|
|
static gint new_brush_callback (GtkWidget *w, GdkEvent *e,
|
|
|
|
gpointer data);
|
1998-07-10 16:59:55 +08:00
|
|
|
static gint brush_select_brush_dirty_callback(GimpBrushP brush,
|
|
|
|
BrushSelectP bsp);
|
|
|
|
static void connect_signals_to_brush (GimpBrushP brush,
|
|
|
|
BrushSelectP bsp);
|
|
|
|
static void disconnect_signals_from_brush(GimpBrushP brush,
|
|
|
|
BrushSelectP bsp);
|
|
|
|
static void brush_added_callback (GimpBrushList *list,
|
|
|
|
GimpBrushP brush,
|
|
|
|
BrushSelectP bsp);
|
|
|
|
static void brush_removed_callback (GimpBrushList *list,
|
|
|
|
GimpBrushP brush,
|
|
|
|
BrushSelectP bsp);
|
1999-04-29 16:50:22 +08:00
|
|
|
/* static void brush_select_map_callback (GtkWidget *, BrushSelectP); */
|
1997-11-25 06:05:25 +08:00
|
|
|
static void brush_select_close_callback (GtkWidget *, gpointer);
|
|
|
|
static void brush_select_refresh_callback(GtkWidget *, gpointer);
|
|
|
|
static void paint_mode_menu_callback (GtkWidget *, gpointer);
|
|
|
|
static gint brush_select_events (GtkWidget *, GdkEvent *, BrushSelectP);
|
|
|
|
static gint brush_select_resize (GtkWidget *, GdkEvent *, BrushSelectP);
|
|
|
|
|
new ui for the "Layer Offset" dialog.
1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de>
* app/channel_ops.[ch]: new ui for the "Layer Offset" dialog.
* app/channels_dialog.c
* app/layers_dialog.c: major code cleanup: Folded some callbacks
into common ones, "widget" instead of "w", indentation, ...
* app/commands.c
* app/interface.[ch]
* app/global_edit.c: the query boxes must be shown by the caller
now. There's no need to split up the string for the message box
manually as the Gtk 1.2 label widget handles newlines corectly.
Added the "edge_lock" toggle to the "Shrink Selection" dialog.
Nicer spacings for the query and message boxes.
* app/ink.c: tried to grab the pointer in the blob preview but
failed. Left the code there as a reminder (commented out).
* app/menus.c: reordered <Image>/Select.
I was bored and grep-ed the sources for ancient or deprecated stuff:
* app/about_dialog.[ch]
* app/actionarea.[ch]
* app/app_procs.c
* app/brush_edit.c
* app/brush_select.c
* app/color_select.c
* app/convert.c
* app/devices.c
* app/gdisplay.c
* app/gdisplay_ops.c
* app/histogram_tool.[ch]
* app/info_window.c
* app/install.c
* app/ops_buttons.c
* app/palette.c
* app/palette_select.c
* app/paths_dialog.c
* app/pattern_select.c
* app/resize.c
* app/scale_toolc.c
* app/text_tool.c:
s/container_border_width/container_set_border_width/g,
s/sprintf/g_snprintf/g, replaced some constant string lengths with
strlen(x).
* app/bezier_select.c
* app/blend.c
* app/boundary.c
* app/errors.[ch]
* app/free_select.c
* app/gimpbrushlist.c
* app/gimprc.c
* app/iscissors.c
* app/main.c
* app/patterns.[ch]
* app/text_tool.c: namespace fanaticism: prefixed all gimp error
functions with "gimp_" and formated the messages more uniformly.
* app/gradient.c
* app/gradient_select.c: same stuff as above for the ui
code. There are still some sub-dialogs which need cleanup.
Did some cleanup in most of these files: prototypes, removed tons
of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
|
|
|
static gint brush_select_delete_callback (GtkWidget *, GdkEvent *, gpointer);
|
1999-04-22 22:34:00 +08:00
|
|
|
static void preview_scroll_update (GtkAdjustment *, gpointer);
|
|
|
|
static void opacity_scale_update (GtkAdjustment *, gpointer);
|
|
|
|
static void spacing_scale_update (GtkAdjustment *, gpointer);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* local variables */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* List of active dialogs */
|
gave parasite undo a MISC_UNDO class for now so it compiles
* app/gimpdrawable.c: gave parasite undo a MISC_UNDO class for now
so it compiles
* app/tools_cmds.c: fix crop invoker to give correct args to
crop_image
* app/color_cmds.c: s/GRAY/GRAY_LUT/g;
* app/brush_select.[ch]: removed PDB procs, export brush_active_dialogs,
brush_select_dialog, s/active_dialogs/brush_active_dialogs/
* app/gimage_cmds.[ch]
* app/channel_ops.[ch]: removed channel ops PDB procs, moved duplicate
function from gimage_cmds to channel_ops, export offset and duplicate
* app/gimpbrushlist.[ch]: removed PDB procs
* app/gradient.[ch]: removed PDB procs,
* app/gradient_header.h: exported G_SAMPLE, GradSelect, num_gradients,
grad_active_dialogs, gradient_select_dialog
* app/gradient_select.c: removed PDB procs,
s/active_dialogs/grad_active_dialogs/
* app/patterns.[ch]: removed PDB procs
* app/pattern_select.[ch]: removed PDB procs,
s/active_dialogs/pattern_active_dialogs/
* app/procedural_db.c: removed PDB procs and supporting functions
* app/procedrual_db.h: fiddled with enums
* app/channel_cmds.[ch]
* app/drawable_cmds.[ch]
* app/parasite_cmds.[ch]: pdbgenned now, removed header files
* app/gimpparasite.c: minor cleanup
* app/internal_procs.c: use pdbgen stuff
* app/tools_cmds.c
* app/text_tool_cmds.c: updated from pdbgen
* app/brushes_cmds.c
* app/brush_select_cmds.c
* app/gradient_cmds.c
* app/gradient_select_cmds.c
* app/patterns_cmds.c
* app/pattern_select_cmds.c
* app/procedural_db_cmds.c: new pdbgen files
* app/Makefile.am: file shuffle (see above)
-Yosh
1999-04-24 04:54:02 +08:00
|
|
|
GSList *brush_active_dialogs = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
/* Brush editor dialog (main brush dialog only) */
|
|
|
|
static BrushEditGeneratedWindow *brush_edit_generated_dialog;
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
|
|
|
|
/* If title == NULL then it is the main brush dialog */
|
1997-11-25 06:05:25 +08:00
|
|
|
BrushSelectP
|
1999-04-22 22:34:00 +08:00
|
|
|
brush_select_new (gchar *title,
|
|
|
|
/* These are the required initial vals
|
|
|
|
* If init_name == NULL then use current brush
|
|
|
|
*/
|
|
|
|
gchar *init_name,
|
|
|
|
gdouble init_opacity,
|
|
|
|
gint init_spacing,
|
|
|
|
gint init_mode)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
BrushSelectP bsp;
|
|
|
|
GtkWidget *vbox;
|
|
|
|
GtkWidget *hbox;
|
1999-04-23 22:47:50 +08:00
|
|
|
GtkWidget *frame;
|
1997-11-25 06:05:25 +08:00
|
|
|
GtkWidget *sbar;
|
|
|
|
GtkWidget *label;
|
1999-04-22 22:34:00 +08:00
|
|
|
GtkWidget *sep;
|
|
|
|
GtkWidget *table;
|
|
|
|
GtkWidget *abox;
|
1997-11-25 06:05:25 +08:00
|
|
|
GtkWidget *util_box;
|
|
|
|
GtkWidget *option_menu;
|
1999-04-22 22:34:00 +08:00
|
|
|
GtkWidget *menu;
|
1997-11-25 06:05:25 +08:00
|
|
|
GtkWidget *slider;
|
1998-09-09 09:35:35 +08:00
|
|
|
GtkWidget *button2;
|
1999-04-24 07:28:49 +08:00
|
|
|
|
|
|
|
GimpBrushP active = NULL;
|
1998-09-19 08:40:27 +08:00
|
|
|
gint gotinitbrush = FALSE;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
static ActionAreaItem action_items[] =
|
|
|
|
{
|
|
|
|
{ N_("Refresh"), brush_select_refresh_callback, NULL, NULL },
|
|
|
|
{ N_("Close"), brush_select_close_callback, NULL, NULL }
|
|
|
|
};
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
bsp = g_malloc (sizeof (_BrushSelect));
|
|
|
|
bsp->redraw = TRUE;
|
1998-03-27 02:24:42 +08:00
|
|
|
bsp->scroll_offset = 0;
|
1998-09-19 08:40:27 +08:00
|
|
|
bsp->callback_name = 0;
|
|
|
|
bsp->old_row = bsp->old_col = 0;
|
|
|
|
bsp->brush = NULL; /* NULL -> main dialog window */
|
1997-11-25 06:05:25 +08:00
|
|
|
bsp->brush_popup = NULL;
|
1999-05-02 05:37:34 +08:00
|
|
|
bsp->popup_timeout_tag = 0;
|
1998-10-14 05:10:22 +08:00
|
|
|
bsp->NUM_BRUSH_COLUMNS = STD_BRUSH_COLUMNS;
|
|
|
|
bsp->NUM_BRUSH_ROWS = STD_BRUSH_ROWS;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* The shell and main vbox */
|
|
|
|
bsp->shell = gtk_dialog_new ();
|
1998-01-26 06:13:00 +08:00
|
|
|
gtk_window_set_wmclass (GTK_WINDOW (bsp->shell), "brushselection", "Gimp");
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
if (!title)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
gtk_window_set_title (GTK_WINDOW (bsp->shell), _("Brush Selection"));
|
1999-04-24 07:28:49 +08:00
|
|
|
|
|
|
|
/* set dialog's size later because weird thing will happen if the
|
|
|
|
* size was not saved in the current paint options mode
|
|
|
|
*/
|
1999-04-22 22:34:00 +08:00
|
|
|
session_set_window_geometry (bsp->shell, &brush_select_session_info,
|
|
|
|
FALSE);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gtk_window_set_title (GTK_WINDOW (bsp->shell), title);
|
1999-07-06 23:18:25 +08:00
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
if (init_name && strlen (init_name))
|
|
|
|
active = gimp_brush_list_get_brush (brush_list, init_name);
|
|
|
|
if (active)
|
1998-09-19 08:40:27 +08:00
|
|
|
gotinitbrush = TRUE;
|
|
|
|
}
|
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
gtk_window_set_policy (GTK_WINDOW (bsp->shell), FALSE, TRUE, FALSE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
/* Handle the wm close signal */
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->shell), "delete_event",
|
|
|
|
GTK_SIGNAL_FUNC (brush_select_delete_callback),
|
|
|
|
bsp);
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* The main vbox */
|
|
|
|
vbox = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
|
|
|
|
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (bsp->shell)->vbox), vbox);
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* The horizontal box containing the brush list & options box */
|
1997-11-25 06:05:25 +08:00
|
|
|
hbox = gtk_hbox_new (FALSE, 2);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
|
|
|
|
|
|
|
/* A place holder for paint mode switching */
|
|
|
|
bsp->left_box = gtk_hbox_new (FALSE, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), bsp->left_box, TRUE, TRUE, 0);
|
|
|
|
|
|
|
|
/* The hbox for the brush list */
|
|
|
|
bsp->brush_selection_box = gtk_hbox_new (FALSE, 0);
|
|
|
|
gtk_container_add (GTK_CONTAINER (bsp->left_box), bsp->brush_selection_box);
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
frame = gtk_frame_new (NULL);
|
|
|
|
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
|
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->brush_selection_box), frame,
|
1999-04-22 22:34:00 +08:00
|
|
|
TRUE, TRUE, 0);
|
1998-10-14 05:10:22 +08:00
|
|
|
bsp->sbar_data = GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, MAX_WIN_HEIGHT(bsp), 1, 1, MAX_WIN_HEIGHT(bsp)));
|
1997-11-25 06:05:25 +08:00
|
|
|
sbar = gtk_vscrollbar_new (bsp->sbar_data);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->sbar_data), "value_changed",
|
|
|
|
(GtkSignalFunc) preview_scroll_update, bsp);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->brush_selection_box), sbar, FALSE, FALSE, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Create the brush preview window and the underlying image */
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
/* Get the maximum brush extents */
|
1999-04-29 16:50:22 +08:00
|
|
|
bsp->cell_width = MIN_CELL_SIZE;
|
|
|
|
bsp->cell_height = MIN_CELL_SIZE;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
bsp->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_size (GTK_PREVIEW (bsp->preview),
|
|
|
|
MAX_WIN_WIDTH (bsp), MAX_WIN_HEIGHT (bsp));
|
1999-04-29 16:50:22 +08:00
|
|
|
gtk_widget_set_usize (bsp->preview,
|
|
|
|
MAX_WIN_WIDTH (bsp), MAX_WIN_HEIGHT (bsp));
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_set_expand (GTK_PREVIEW (bsp->preview), TRUE);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_widget_set_events (bsp->preview, BRUSH_EVENT_MASK);
|
1999-04-23 22:47:50 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->preview), "event",
|
|
|
|
(GtkSignalFunc) brush_select_events,
|
|
|
|
bsp);
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT(bsp->preview), "size_allocate",
|
|
|
|
(GtkSignalFunc) brush_select_resize,
|
|
|
|
bsp);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), bsp->preview);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_widget_show (bsp->preview);
|
|
|
|
|
|
|
|
gtk_widget_show (sbar);
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_widget_show (frame);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_widget_show (bsp->brush_selection_box);
|
|
|
|
gtk_widget_show (bsp->left_box);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
/* Options box */
|
1999-04-22 22:34:00 +08:00
|
|
|
bsp->options_box = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), bsp->options_box, FALSE, FALSE, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Create the active brush label */
|
1999-04-29 16:50:22 +08:00
|
|
|
util_box = gtk_hbox_new (FALSE, 0);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->options_box), util_box, FALSE, FALSE, 2);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
bsp->brush_name = gtk_label_new (_("Active"));
|
1999-04-29 16:50:22 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (util_box), bsp->brush_name, FALSE, FALSE, 4);
|
1999-04-22 22:34:00 +08:00
|
|
|
bsp->brush_size = gtk_label_new ("(0 X 0)");
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (util_box), bsp->brush_size, FALSE, FALSE, 2);
|
|
|
|
|
|
|
|
gtk_widget_show (bsp->brush_name);
|
|
|
|
gtk_widget_show (bsp->brush_size);
|
|
|
|
gtk_widget_show (util_box);
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* A place holder for paint mode switching */
|
|
|
|
bsp->right_box = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->options_box), bsp->right_box, TRUE, TRUE, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* The vbox for the paint options */
|
|
|
|
bsp->paint_options_box = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->right_box), bsp->paint_options_box,
|
|
|
|
FALSE, FALSE, 0);
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
/* A separator before the paint options */
|
1999-04-22 22:34:00 +08:00
|
|
|
sep = gtk_hseparator_new ();
|
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->paint_options_box), sep, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (sep);
|
|
|
|
|
|
|
|
/* Create the frame and the table for the options */
|
|
|
|
table = gtk_table_new (2, 2, FALSE);
|
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
|
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
|
|
|
|
gtk_box_pack_start (GTK_BOX (bsp->paint_options_box), table, FALSE, FALSE, 2);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Create the opacity scale widget */
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
label = gtk_label_new (_("Opacity:"));
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
bsp->opacity_data =
|
1999-04-22 22:34:00 +08:00
|
|
|
GTK_ADJUSTMENT (gtk_adjustment_new ((active)?(init_opacity*100.0):100.0,
|
|
|
|
0.0, 100.0, 1.0, 1.0, 0.0));
|
1997-11-25 06:05:25 +08:00
|
|
|
slider = gtk_hscale_new (bsp->opacity_data);
|
|
|
|
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
|
|
|
|
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), slider, 1, 2, 0, 1);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->opacity_data), "value_changed",
|
|
|
|
(GtkSignalFunc) opacity_scale_update, bsp);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_widget_show (slider);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* Create the paint mode option menu */
|
|
|
|
label = gtk_label_new (_("Mode:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_widget_show (label);
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
abox = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), abox, 1, 2, 1, 2);
|
|
|
|
gtk_widget_show (abox);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
menu = paint_mode_menu_new (paint_mode_menu_callback, (gpointer) bsp);
|
|
|
|
bsp->option_menu = option_menu = gtk_option_menu_new ();
|
|
|
|
gtk_container_add (GTK_CONTAINER (abox), option_menu);
|
|
|
|
gtk_widget_show (option_menu);
|
|
|
|
gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
|
|
|
|
|
|
|
|
gtk_widget_show (table);
|
|
|
|
gtk_widget_show (bsp->paint_options_box);
|
|
|
|
gtk_widget_show (bsp->right_box);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-07-09 13:31:06 +08:00
|
|
|
/* Create the edit/new buttons */
|
1999-04-22 22:34:00 +08:00
|
|
|
util_box = gtk_hbox_new (FALSE, 0);
|
|
|
|
gtk_box_pack_end (GTK_BOX (bsp->options_box), util_box, FALSE, FALSE, 4);
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
bsp->edit_button = gtk_button_new_with_label (_("Edit Brush"));
|
1998-09-09 09:35:35 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->edit_button), "clicked",
|
1998-07-09 13:31:06 +08:00
|
|
|
(GtkSignalFunc) edit_brush_callback,
|
|
|
|
NULL);
|
1998-09-09 09:35:35 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (util_box), bsp->edit_button, TRUE, TRUE, 5);
|
1998-07-09 13:31:06 +08:00
|
|
|
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
button2 = gtk_button_new_with_label (_("New Brush"));
|
1998-07-09 13:31:06 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (button2), "clicked",
|
|
|
|
(GtkSignalFunc) new_brush_callback,
|
|
|
|
NULL);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (util_box), button2, TRUE, TRUE, 6);
|
1998-07-09 13:31:06 +08:00
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
gtk_widget_show (bsp->edit_button);
|
1998-07-09 13:31:06 +08:00
|
|
|
gtk_widget_show (button2);
|
|
|
|
gtk_widget_show (util_box);
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* We can only edit in the main window! (for now) */
|
|
|
|
if (title)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_widget_set_sensitive (bsp->edit_button, FALSE);
|
|
|
|
gtk_widget_set_sensitive (button2, FALSE);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* Create the spacing scale widget */
|
|
|
|
table = gtk_table_new (1, 2, FALSE);
|
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
|
|
|
|
gtk_box_pack_end (GTK_BOX (bsp->options_box), table, FALSE, FALSE, 2);
|
|
|
|
|
|
|
|
label = gtk_label_new (_("Spacing:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
|
|
|
bsp->spacing_data =
|
|
|
|
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 1.0, 1000.0, 1.0, 1.0, 0.0));
|
|
|
|
slider = gtk_hscale_new (bsp->spacing_data);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), slider, 1, 2, 0, 1);
|
|
|
|
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
|
|
|
|
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->spacing_data), "value_changed",
|
|
|
|
(GtkSignalFunc) spacing_scale_update, bsp);
|
|
|
|
gtk_widget_show (slider);
|
|
|
|
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* The action area */
|
|
|
|
action_items[0].user_data = bsp;
|
|
|
|
action_items[1].user_data = bsp;
|
1999-05-19 01:33:39 +08:00
|
|
|
if (title)
|
|
|
|
build_action_area (GTK_DIALOG (bsp->shell), &action_items[1], 1, 0);
|
|
|
|
else
|
|
|
|
build_action_area (GTK_DIALOG (bsp->shell), action_items, 2, 1);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gtk_widget_show (bsp->options_box);
|
|
|
|
gtk_widget_show (hbox);
|
|
|
|
gtk_widget_show (vbox);
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* Calculate the scrollbar */
|
1999-04-24 07:28:49 +08:00
|
|
|
if (no_data)
|
|
|
|
brushes_init (FALSE);
|
1999-04-29 16:50:22 +08:00
|
|
|
/* This is done by size_allocate anyway, which is much better */
|
1997-11-25 06:05:25 +08:00
|
|
|
preview_calc_scrollbar (bsp);
|
|
|
|
|
|
|
|
/* render the brushes into the newly created image structure */
|
|
|
|
display_brushes (bsp);
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* Only for main dialog */
|
1998-09-19 08:40:27 +08:00
|
|
|
if(!title)
|
|
|
|
{
|
1999-04-22 22:34:00 +08:00
|
|
|
/* add callbacks to keep the display area current */
|
1999-04-23 22:47:50 +08:00
|
|
|
gimp_list_foreach (GIMP_LIST (brush_list),
|
|
|
|
(GFunc) connect_signals_to_brush,
|
|
|
|
bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (brush_list), "add",
|
|
|
|
(GtkSignalFunc) brush_added_callback,
|
|
|
|
bsp);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (brush_list), "remove",
|
|
|
|
(GtkSignalFunc) brush_removed_callback,
|
|
|
|
bsp);
|
1999-04-22 22:34:00 +08:00
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* set the preview's size in the callback
|
|
|
|
gtk_signal_connect (GTK_OBJECT (bsp->shell), "map",
|
|
|
|
GTK_SIGNAL_FUNC (brush_select_map_callback),
|
|
|
|
bsp);
|
|
|
|
*/
|
1999-04-24 07:28:49 +08:00
|
|
|
|
|
|
|
/* if we are in per-tool paint options mode, hide the paint options */
|
1999-04-22 22:34:00 +08:00
|
|
|
brush_select_show_paint_options (bsp, global_paint_options);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1999-04-24 07:28:49 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* update the active selection */
|
1999-04-24 07:28:49 +08:00
|
|
|
if (!active)
|
1998-09-19 08:40:27 +08:00
|
|
|
active = get_active_brush ();
|
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
if (title)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
bsp->brush = active;
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (active)
|
|
|
|
{
|
|
|
|
int old_value = bsp->redraw;
|
|
|
|
bsp->redraw = FALSE;
|
1999-04-23 22:47:50 +08:00
|
|
|
if (!gotinitbrush)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
1999-07-06 23:18:25 +08:00
|
|
|
GimpContext *context = gimp_context_get_user ();
|
|
|
|
|
|
|
|
bsp->opacity_value = gimp_context_get_opacity (context);
|
|
|
|
bsp->paint_mode = gimp_context_get_paint_mode (context);
|
1999-04-22 22:34:00 +08:00
|
|
|
bsp->spacing_value = gimp_brush_get_spacing (active);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bsp->opacity_value = init_opacity;
|
1999-07-06 23:18:25 +08:00
|
|
|
bsp->paint_mode = init_mode;
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_select (bsp, gimp_brush_list_get_brush_index (brush_list,
|
|
|
|
active));
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
if (gotinitbrush && init_spacing >= 0)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
/* Use passed spacing instead of brushes default */
|
|
|
|
bsp->spacing_data->value = init_spacing;
|
1999-04-24 07:28:49 +08:00
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (bsp->spacing_data),
|
|
|
|
"value_changed");
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
bsp->redraw = old_value;
|
1999-04-24 07:28:49 +08:00
|
|
|
if (GIMP_IS_BRUSH_GENERATED (active))
|
1998-09-09 09:35:35 +08:00
|
|
|
gtk_widget_set_sensitive (bsp->edit_button, 1);
|
|
|
|
else
|
1998-09-19 08:40:27 +08:00
|
|
|
gtk_widget_set_sensitive (bsp->edit_button, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
1999-04-24 07:28:49 +08:00
|
|
|
|
|
|
|
/* Finally, show the dialog */
|
|
|
|
gtk_widget_show (bsp->shell);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
return bsp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
brush_select_select (BrushSelectP bsp,
|
|
|
|
int index)
|
|
|
|
{
|
|
|
|
int row, col;
|
1998-07-24 16:56:18 +08:00
|
|
|
if (index < 0)
|
|
|
|
return;
|
1997-11-25 06:05:25 +08:00
|
|
|
update_active_brush_field (bsp);
|
1998-10-14 05:10:22 +08:00
|
|
|
row = index / bsp->NUM_BRUSH_COLUMNS;
|
|
|
|
col = index - row * (bsp->NUM_BRUSH_COLUMNS);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
brush_select_show_selected (bsp, row, col);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
brush_select_free (BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
if (bsp)
|
|
|
|
{
|
1998-09-19 08:40:27 +08:00
|
|
|
/* Only main one is saved */
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp == brush_select_dialog)
|
1999-04-29 16:50:22 +08:00
|
|
|
{
|
|
|
|
session_get_window_info (bsp->shell, &brush_select_session_info);
|
|
|
|
/* save the size of the preview */
|
|
|
|
brush_select_session_info.width = bsp->preview->allocation.width;
|
|
|
|
brush_select_session_info.height = bsp->preview->allocation.height;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
if (bsp->brush_popup != NULL)
|
|
|
|
gtk_widget_destroy (bsp->brush_popup);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp->callback_name)
|
|
|
|
g_free (bsp->callback_name);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
/* remove from active list */
|
1999-04-24 07:28:49 +08:00
|
|
|
brush_active_dialogs = g_slist_remove (brush_active_dialogs, bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
g_free (bsp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
void
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (BrushSelectP bsp,
|
|
|
|
gint closing)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
gchar * name;
|
|
|
|
ProcRecord *prec = NULL;
|
|
|
|
GimpBrushP brush;
|
|
|
|
int nreturn_vals;
|
|
|
|
static int busy = 0;
|
|
|
|
|
|
|
|
/* Any procs registered to callback? */
|
|
|
|
Argument *return_vals;
|
1999-04-23 22:47:50 +08:00
|
|
|
|
|
|
|
if (!bsp || !bsp->callback_name || busy != 0)
|
1998-09-19 08:40:27 +08:00
|
|
|
return;
|
|
|
|
|
|
|
|
busy = 1;
|
|
|
|
name = bsp->callback_name;
|
|
|
|
brush = bsp->brush;
|
|
|
|
|
|
|
|
/* If its still registered run it */
|
1999-04-23 22:47:50 +08:00
|
|
|
prec = procedural_db_lookup (name);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
if(prec && brush)
|
|
|
|
{
|
|
|
|
return_vals = procedural_db_run_proc (name,
|
|
|
|
&nreturn_vals,
|
|
|
|
PDB_STRING,brush->name,
|
|
|
|
PDB_FLOAT,bsp->opacity_value,
|
|
|
|
PDB_INT32,bsp->spacing_value,
|
|
|
|
PDB_INT32,(gint)bsp->paint_mode,
|
|
|
|
PDB_INT32,brush->mask->width,
|
|
|
|
PDB_INT32,brush->mask->height,
|
|
|
|
PDB_INT32,brush->mask->width * brush->mask->height,
|
|
|
|
PDB_INT8ARRAY,temp_buf_data (brush->mask),
|
|
|
|
PDB_INT32,closing,
|
|
|
|
PDB_END);
|
|
|
|
|
|
|
|
if (!return_vals || return_vals[0].value.pdb_int != PDB_SUCCESS)
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
g_message (_("failed to run brush callback function"));
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
procedural_db_destroy_args (return_vals, nreturn_vals);
|
|
|
|
}
|
|
|
|
busy = 0;
|
|
|
|
}
|
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
void
|
|
|
|
brush_select_show_paint_options (BrushSelectP bsp,
|
|
|
|
gboolean show)
|
|
|
|
{
|
|
|
|
show = show ? TRUE : FALSE;
|
|
|
|
|
|
|
|
if ((bsp == NULL) && ((bsp = brush_select_dialog) == NULL))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (show)
|
|
|
|
{
|
|
|
|
if (! GTK_WIDGET_VISIBLE (bsp->paint_options_box))
|
|
|
|
gtk_widget_show (bsp->paint_options_box);
|
|
|
|
if (bsp->brush_selection_box->parent != bsp->left_box)
|
|
|
|
gtk_widget_reparent (bsp->brush_selection_box, bsp->left_box);
|
|
|
|
gtk_box_set_child_packing (GTK_BOX (bsp->options_box->parent),
|
|
|
|
bsp->options_box,
|
|
|
|
FALSE, FALSE, 0, GTK_PACK_START);
|
|
|
|
gtk_box_set_child_packing (GTK_BOX (bsp->left_box->parent),
|
1999-04-29 16:50:22 +08:00
|
|
|
bsp->left_box,
|
|
|
|
TRUE, TRUE, 0, GTK_PACK_START);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_box_set_spacing (GTK_BOX (bsp->left_box->parent), 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (GTK_WIDGET_VISIBLE (bsp->paint_options_box))
|
|
|
|
gtk_widget_hide (bsp->paint_options_box);
|
|
|
|
if (bsp->brush_selection_box->parent != bsp->right_box)
|
|
|
|
gtk_widget_reparent (bsp->brush_selection_box, bsp->right_box);
|
1999-04-29 16:50:22 +08:00
|
|
|
gtk_box_set_child_packing (GTK_BOX (bsp->left_box->parent),
|
|
|
|
bsp->left_box,
|
|
|
|
FALSE, FALSE, 0, GTK_PACK_START);
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_box_set_child_packing (GTK_BOX (bsp->options_box->parent),
|
|
|
|
bsp->options_box,
|
|
|
|
TRUE, TRUE, 0, GTK_PACK_START);
|
|
|
|
gtk_box_set_spacing (GTK_BOX (bsp->left_box->parent), 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* Disabled until I've figured out how gtk window resizing *really* works.
|
|
|
|
* I don't think that the function below is the correct way to do it
|
|
|
|
* -- Michael
|
|
|
|
*
|
|
|
|
static void
|
|
|
|
brush_select_map_callback (GtkWidget *widget,
|
|
|
|
BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
GtkAllocation allocation;
|
|
|
|
gint xdiff, ydiff;
|
|
|
|
|
|
|
|
xdiff =
|
|
|
|
bsp->shell->allocation.width - bsp->preview->allocation.width;
|
|
|
|
ydiff =
|
|
|
|
bsp->shell->allocation.height - bsp->preview->allocation.height;
|
|
|
|
|
|
|
|
allocation = bsp->shell->allocation;
|
|
|
|
allocation.width = brush_select_session_info.width + xdiff;
|
|
|
|
allocation.height = brush_select_session_info.height + ydiff;
|
|
|
|
|
|
|
|
gtk_widget_size_allocate (bsp->shell, &allocation);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
1998-07-10 16:59:55 +08:00
|
|
|
static void
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_brush_changed (BrushSelectP bsp,
|
|
|
|
GimpBrushP brush)
|
1998-07-09 13:31:06 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
/* TODO: be smarter here and only update the part of the preview
|
|
|
|
* that has changed */
|
1998-07-09 13:31:06 +08:00
|
|
|
if (bsp)
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
display_brushes (bsp);
|
1998-07-09 13:31:06 +08:00
|
|
|
gtk_widget_draw (bsp->preview, NULL);
|
1999-07-20 03:46:05 +08:00
|
|
|
update_active_brush_field (bsp);
|
1998-07-09 13:31:06 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-07-10 16:59:55 +08:00
|
|
|
static gint
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_brush_dirty_callback (GimpBrushP brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-09 13:31:06 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_brush_changed (bsp, brush);
|
1999-07-29 18:40:42 +08:00
|
|
|
update_active_brush_field (bsp);
|
1998-07-10 16:59:55 +08:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-04-23 22:47:50 +08:00
|
|
|
connect_signals_to_brush (GimpBrushP brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-10 16:59:55 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (brush), "dirty",
|
|
|
|
GTK_SIGNAL_FUNC (brush_select_brush_dirty_callback),
|
|
|
|
bsp);
|
1999-07-29 18:40:42 +08:00
|
|
|
gtk_signal_connect (GTK_OBJECT (brush), "rename",
|
|
|
|
GTK_SIGNAL_FUNC (brush_select_brush_dirty_callback),
|
|
|
|
bsp);
|
1998-07-10 16:59:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-04-23 22:47:50 +08:00
|
|
|
disconnect_signals_from_brush (GimpBrushP brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-10 16:59:55 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
if (!GTK_OBJECT_DESTROYED (brush))
|
|
|
|
gtk_signal_disconnect_by_data (GTK_OBJECT (brush), bsp);
|
1998-07-10 16:59:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_added_callback (GimpBrushList *list,
|
|
|
|
GimpBrushP brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-10 16:59:55 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
connect_signals_to_brush (brush, bsp);
|
|
|
|
preview_calc_scrollbar (bsp);
|
|
|
|
brush_select_brush_changed (bsp, brush);
|
1998-07-10 16:59:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_removed_callback (GimpBrushList *list,
|
|
|
|
GimpBrushP brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-10 16:59:55 +08:00
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
disconnect_signals_from_brush (brush, bsp);
|
|
|
|
preview_calc_scrollbar (bsp);
|
1998-07-09 13:31:06 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Local functions
|
|
|
|
*/
|
1999-05-02 05:37:34 +08:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
BrushSelectP bsp;
|
|
|
|
int x;
|
|
|
|
int y;
|
|
|
|
GimpBrushP brush;
|
|
|
|
} popup_timeout_args_t;
|
|
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
brush_popup_timeout (gpointer data)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-05-02 05:37:34 +08:00
|
|
|
popup_timeout_args_t *args = data;
|
|
|
|
BrushSelectP bsp = args->bsp;
|
|
|
|
GimpBrushP brush = args->brush;
|
|
|
|
gint x, y;
|
1997-11-25 06:05:25 +08:00
|
|
|
gint x_org, y_org;
|
|
|
|
gint scr_w, scr_h;
|
|
|
|
gchar *src, *buf;
|
|
|
|
|
1999-05-02 05:37:34 +08:00
|
|
|
/* timeout has gone off so our tag is now invalid */
|
|
|
|
bsp->popup_timeout_tag = 0;
|
|
|
|
|
1997-12-18 12:19:11 +08:00
|
|
|
/* make sure the popup exists and is not visible */
|
1997-11-25 06:05:25 +08:00
|
|
|
if (bsp->brush_popup == NULL)
|
|
|
|
{
|
|
|
|
GtkWidget *frame;
|
|
|
|
|
|
|
|
bsp->brush_popup = gtk_window_new (GTK_WINDOW_POPUP);
|
1999-05-02 05:37:34 +08:00
|
|
|
gtk_window_set_policy (GTK_WINDOW (bsp->brush_popup),
|
|
|
|
FALSE, FALSE, TRUE);
|
1997-11-25 06:05:25 +08:00
|
|
|
frame = gtk_frame_new (NULL);
|
|
|
|
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
|
|
|
|
gtk_container_add (GTK_CONTAINER (bsp->brush_popup), frame);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
bsp->brush_preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
|
|
|
|
gtk_container_add (GTK_CONTAINER (frame), bsp->brush_preview);
|
|
|
|
gtk_widget_show (bsp->brush_preview);
|
|
|
|
}
|
|
|
|
else
|
1997-12-18 12:19:11 +08:00
|
|
|
{
|
|
|
|
gtk_widget_hide (bsp->brush_popup);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1997-12-18 12:19:11 +08:00
|
|
|
/* decide where to put the popup */
|
1997-11-25 06:05:25 +08:00
|
|
|
gdk_window_get_origin (bsp->preview->window, &x_org, &y_org);
|
|
|
|
scr_w = gdk_screen_width ();
|
|
|
|
scr_h = gdk_screen_height ();
|
1999-05-02 05:37:34 +08:00
|
|
|
x = x_org + args->x - brush->mask->width * 0.5;
|
|
|
|
y = y_org + args->y - brush->mask->height * 0.5;
|
1997-11-25 06:05:25 +08:00
|
|
|
x = (x < 0) ? 0 : x;
|
|
|
|
y = (y < 0) ? 0 : y;
|
|
|
|
x = (x + brush->mask->width > scr_w) ? scr_w - brush->mask->width : x;
|
|
|
|
y = (y + brush->mask->height > scr_h) ? scr_h - brush->mask->height : y;
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_size (GTK_PREVIEW (bsp->brush_preview),
|
|
|
|
brush->mask->width, brush->mask->height);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gtk_widget_popup (bsp->brush_popup, x, y);
|
1999-04-29 16:50:22 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Draw the brush */
|
|
|
|
buf = g_new (gchar, brush->mask->width);
|
1999-04-29 16:50:22 +08:00
|
|
|
src = (gchar *) temp_buf_data (brush->mask);
|
1997-11-25 06:05:25 +08:00
|
|
|
for (y = 0; y < brush->mask->height; y++)
|
|
|
|
{
|
|
|
|
/* Invert the mask for display. We're doing this because
|
|
|
|
* a value of 255 in the mask means it is full intensity.
|
|
|
|
* However, it makes more sense for full intensity to show
|
|
|
|
* up as black in this brush preview window...
|
|
|
|
*/
|
|
|
|
for (x = 0; x < brush->mask->width; x++)
|
|
|
|
buf[x] = 255 - src[x];
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->brush_preview), (guchar *)buf,
|
|
|
|
0, y, brush->mask->width);
|
1997-11-25 06:05:25 +08:00
|
|
|
src += brush->mask->width;
|
|
|
|
}
|
1999-05-02 05:37:34 +08:00
|
|
|
g_free (buf);
|
1999-04-29 16:50:22 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Draw the brush preview */
|
|
|
|
gtk_widget_draw (bsp->brush_preview, NULL);
|
1999-05-02 05:37:34 +08:00
|
|
|
|
|
|
|
return FALSE; /* don't repeat */
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-05-02 05:37:34 +08:00
|
|
|
static void
|
|
|
|
brush_popup_open (BrushSelectP bsp,
|
|
|
|
int x,
|
|
|
|
int y,
|
|
|
|
GimpBrushP brush)
|
|
|
|
{
|
|
|
|
static popup_timeout_args_t popup_timeout_args;
|
|
|
|
|
|
|
|
/* if we've already got a timeout scheduled, then we complain */
|
|
|
|
g_return_if_fail (bsp->popup_timeout_tag == 0);
|
|
|
|
|
|
|
|
popup_timeout_args.bsp = bsp;
|
|
|
|
popup_timeout_args.x = x;
|
|
|
|
popup_timeout_args.y = y;
|
|
|
|
popup_timeout_args.brush = brush;
|
|
|
|
bsp->popup_timeout_tag = gtk_timeout_add (POPUP_DELAY_MS,
|
|
|
|
brush_popup_timeout,
|
|
|
|
&popup_timeout_args);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
brush_popup_close (BrushSelectP bsp)
|
|
|
|
{
|
1999-05-02 05:37:34 +08:00
|
|
|
if (bsp->popup_timeout_tag != 0)
|
|
|
|
gtk_timeout_remove (bsp->popup_timeout_tag);
|
|
|
|
bsp->popup_timeout_tag = 0;
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (bsp->brush_popup != NULL)
|
|
|
|
gtk_widget_hide (bsp->brush_popup);
|
|
|
|
}
|
1998-07-09 13:31:06 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static void
|
|
|
|
display_brush (BrushSelectP bsp,
|
1999-04-23 22:47:50 +08:00
|
|
|
GimpBrushP brush,
|
1997-11-25 06:05:25 +08:00
|
|
|
int col,
|
|
|
|
int row)
|
|
|
|
{
|
|
|
|
TempBuf * brush_buf;
|
|
|
|
unsigned char * src, *s;
|
|
|
|
unsigned char * buf, *b;
|
|
|
|
int width, height;
|
|
|
|
int offset_x, offset_y;
|
|
|
|
int yend;
|
|
|
|
int ystart;
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
buf = (unsigned char *) g_malloc (sizeof (char) * bsp->cell_width);
|
|
|
|
|
|
|
|
brush_buf = brush->mask;
|
|
|
|
|
|
|
|
/* calculate the offset into the image */
|
|
|
|
width = (brush_buf->width > bsp->cell_width) ? bsp->cell_width :
|
|
|
|
brush_buf->width;
|
|
|
|
height = (brush_buf->height > bsp->cell_height) ? bsp->cell_height :
|
|
|
|
brush_buf->height;
|
|
|
|
|
|
|
|
offset_x = col * bsp->cell_width + ((bsp->cell_width - width) >> 1);
|
|
|
|
offset_y = row * bsp->cell_height + ((bsp->cell_height - height) >> 1)
|
|
|
|
- bsp->scroll_offset;
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
ystart = BOUNDS (offset_y, 0, bsp->preview->allocation.height);
|
|
|
|
yend = BOUNDS (offset_y + height, 0, bsp->preview->allocation.height);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Get the pointer into the brush mask data */
|
|
|
|
src = mask_buf_data (brush_buf) + (ystart - offset_y) * brush_buf->width;
|
|
|
|
|
|
|
|
for (i = ystart; i < yend; i++)
|
|
|
|
{
|
|
|
|
/* Invert the mask for display. We're doing this because
|
|
|
|
* a value of 255 in the mask means it is full intensity.
|
|
|
|
* However, it makes more sense for full intensity to show
|
|
|
|
* up as black in this brush preview window...
|
|
|
|
*/
|
|
|
|
s = src;
|
|
|
|
b = buf;
|
|
|
|
for (j = 0; j < width; j++)
|
|
|
|
*b++ = 255 - *s++;
|
|
|
|
|
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf, offset_x, i, width);
|
|
|
|
|
|
|
|
src += brush_buf->width;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_free (buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
display_setup (BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
unsigned char * buf;
|
|
|
|
int i;
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
buf =
|
|
|
|
(unsigned char *) g_malloc (sizeof (char) * bsp->preview->allocation.width);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Set the buffer to white */
|
1999-04-23 22:47:50 +08:00
|
|
|
memset (buf, 255, bsp->preview->allocation.width);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Set the image buffer to white */
|
1999-04-23 22:47:50 +08:00
|
|
|
for (i = 0; i < bsp->preview->allocation.height; i++)
|
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf, 0, i,
|
|
|
|
bsp->preview->allocation.width);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
g_free (buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-07-12 19:40:43 +08:00
|
|
|
static int brush_counter = 0;
|
1999-04-23 22:47:50 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
do_display_brush (GimpBrush *brush,
|
|
|
|
BrushSelectP bsp)
|
1998-07-12 19:40:43 +08:00
|
|
|
{
|
1998-10-14 05:10:22 +08:00
|
|
|
display_brush (bsp, brush, brush_counter % (bsp->NUM_BRUSH_COLUMNS),
|
|
|
|
brush_counter / (bsp->NUM_BRUSH_COLUMNS));
|
1998-07-12 19:40:43 +08:00
|
|
|
brush_counter++;
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static void
|
|
|
|
display_brushes (BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
/* If there are no brushes, insensitize widgets */
|
1998-07-12 19:40:43 +08:00
|
|
|
if (brush_list == NULL || gimp_brush_list_length(brush_list) == 0)
|
1999-04-23 22:47:50 +08:00
|
|
|
{
|
|
|
|
gtk_widget_set_sensitive (bsp->options_box, FALSE);
|
|
|
|
return;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Else, sensitize widgets */
|
|
|
|
else
|
|
|
|
gtk_widget_set_sensitive (bsp->options_box, TRUE);
|
|
|
|
|
|
|
|
/* setup the display area */
|
|
|
|
display_setup (bsp);
|
1998-07-12 19:40:43 +08:00
|
|
|
brush_counter = 0;
|
1999-04-23 22:47:50 +08:00
|
|
|
gimp_list_foreach (GIMP_LIST (brush_list), (GFunc) do_display_brush, bsp);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
brush_select_show_selected (BrushSelectP bsp,
|
|
|
|
int row,
|
|
|
|
int col)
|
|
|
|
{
|
|
|
|
GdkRectangle area;
|
|
|
|
unsigned char * buf;
|
|
|
|
int yend;
|
|
|
|
int ystart;
|
|
|
|
int offset_x, offset_y;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
buf = (unsigned char *) g_malloc (sizeof (char) * bsp->cell_width);
|
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
if (bsp->old_col != col || bsp->old_row != row)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
/* remove the old selection */
|
1998-09-19 08:40:27 +08:00
|
|
|
offset_x = bsp->old_col * bsp->cell_width;
|
|
|
|
offset_y = bsp->old_row * bsp->cell_height - bsp->scroll_offset;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
ystart = BOUNDS (offset_y , 0, bsp->preview->allocation.height);
|
|
|
|
yend = BOUNDS (offset_y + bsp->cell_height, 0, bsp->preview->allocation.height);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* set the buf to white */
|
|
|
|
memset (buf, 255, bsp->cell_width);
|
|
|
|
|
|
|
|
for (i = ystart; i < yend; i++)
|
|
|
|
{
|
|
|
|
if (i == offset_y || i == (offset_y + bsp->cell_height - 1))
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf,
|
|
|
|
offset_x, i, bsp->cell_width);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf,
|
|
|
|
offset_x, i, 1);
|
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf,
|
|
|
|
offset_x + bsp->cell_width - 1, i, 1);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bsp->redraw)
|
|
|
|
{
|
|
|
|
area.x = offset_x;
|
|
|
|
area.y = ystart;
|
|
|
|
area.width = bsp->cell_width;
|
|
|
|
area.height = (yend - ystart);
|
|
|
|
gtk_widget_draw (bsp->preview, &area);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* make the new selection */
|
|
|
|
offset_x = col * bsp->cell_width;
|
|
|
|
offset_y = row * bsp->cell_height - bsp->scroll_offset;
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
ystart = BOUNDS (offset_y , 0, bsp->preview->allocation.height);
|
|
|
|
yend = BOUNDS (offset_y + bsp->cell_height, 0, bsp->preview->allocation.height);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* set the buf to black */
|
|
|
|
memset (buf, 0, bsp->cell_width);
|
|
|
|
|
|
|
|
for (i = ystart; i < yend; i++)
|
|
|
|
{
|
|
|
|
if (i == offset_y || i == (offset_y + bsp->cell_height - 1))
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview),
|
|
|
|
buf, offset_x, i, bsp->cell_width);
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf,
|
|
|
|
offset_x, i, 1);
|
|
|
|
gtk_preview_draw_row (GTK_PREVIEW (bsp->preview), buf,
|
|
|
|
offset_x + bsp->cell_width - 1, i, 1);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bsp->redraw)
|
|
|
|
{
|
|
|
|
area.x = offset_x;
|
|
|
|
area.y = ystart;
|
|
|
|
area.width = bsp->cell_width;
|
|
|
|
area.height = (yend - ystart);
|
|
|
|
gtk_widget_draw (bsp->preview, &area);
|
|
|
|
}
|
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
bsp->old_row = row;
|
|
|
|
bsp->old_col = col;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
g_free (buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
preview_calc_scrollbar (BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
int num_rows;
|
|
|
|
int page_size;
|
|
|
|
int max;
|
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
bsp->scroll_offset = 0;
|
1998-10-14 05:10:22 +08:00
|
|
|
num_rows = (gimp_brush_list_length(brush_list) + (bsp->NUM_BRUSH_COLUMNS) - 1)
|
|
|
|
/ (bsp->NUM_BRUSH_COLUMNS);
|
1997-11-25 06:05:25 +08:00
|
|
|
max = num_rows * bsp->cell_width;
|
|
|
|
if (!num_rows) num_rows = 1;
|
|
|
|
page_size = bsp->preview->allocation.height;
|
1998-03-27 02:24:42 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
bsp->sbar_data->value = bsp->scroll_offset;
|
|
|
|
bsp->sbar_data->upper = max;
|
1998-03-27 02:24:42 +08:00
|
|
|
bsp->sbar_data->page_size = ((page_size < max) ? page_size : max);
|
1997-11-25 06:05:25 +08:00
|
|
|
bsp->sbar_data->page_increment = (page_size >> 1);
|
|
|
|
bsp->sbar_data->step_increment = bsp->cell_width;
|
|
|
|
|
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (bsp->sbar_data), "changed");
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_resize (GtkWidget *widget,
|
|
|
|
GdkEvent *event,
|
|
|
|
BrushSelectP bsp)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-04-29 16:50:22 +08:00
|
|
|
/* calculate the best-fit approximation... */
|
|
|
|
gint wid;
|
|
|
|
gint now;
|
|
|
|
gint cell_size;
|
|
|
|
|
|
|
|
wid = widget->allocation.width;
|
|
|
|
|
|
|
|
for(now = cell_size = MIN_CELL_SIZE;
|
|
|
|
now < MAX_CELL_SIZE; ++now)
|
|
|
|
{
|
|
|
|
if ((wid % now) < (wid % cell_size)) cell_size = now;
|
|
|
|
if ((wid % cell_size) == 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
bsp->NUM_BRUSH_COLUMNS =
|
1999-04-29 16:50:22 +08:00
|
|
|
(gint) (wid / cell_size);
|
1999-04-23 22:47:50 +08:00
|
|
|
bsp->NUM_BRUSH_ROWS =
|
|
|
|
(gint) ((gimp_brush_list_length (brush_list) + bsp->NUM_BRUSH_COLUMNS - 1) /
|
|
|
|
bsp->NUM_BRUSH_COLUMNS);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
bsp->cell_width = cell_size;
|
|
|
|
bsp->cell_height = cell_size;
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* recalculate scrollbar extents */
|
|
|
|
preview_calc_scrollbar (bsp);
|
|
|
|
|
1999-04-29 16:50:22 +08:00
|
|
|
/* render the brushes into the newly created image structure */
|
1997-11-25 06:05:25 +08:00
|
|
|
display_brushes (bsp);
|
1999-04-23 22:47:50 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* update the display */
|
|
|
|
if (bsp->redraw)
|
1999-04-22 22:34:00 +08:00
|
|
|
gtk_widget_draw (bsp->preview, NULL);
|
1999-04-29 16:50:22 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
update_active_brush_field (BrushSelectP bsp)
|
|
|
|
{
|
1998-07-09 13:31:06 +08:00
|
|
|
GimpBrushP brush;
|
1997-11-25 06:05:25 +08:00
|
|
|
char buf[32];
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp->brush)
|
1998-09-19 08:40:27 +08:00
|
|
|
brush = bsp->brush;
|
|
|
|
else
|
|
|
|
brush = get_active_brush ();
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
if (!brush)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* Set brush name */
|
1999-01-11 05:54:02 +08:00
|
|
|
gtk_label_set_text (GTK_LABEL (bsp->brush_name), brush->name);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Set brush size */
|
new ui for the "Layer Offset" dialog.
1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de>
* app/channel_ops.[ch]: new ui for the "Layer Offset" dialog.
* app/channels_dialog.c
* app/layers_dialog.c: major code cleanup: Folded some callbacks
into common ones, "widget" instead of "w", indentation, ...
* app/commands.c
* app/interface.[ch]
* app/global_edit.c: the query boxes must be shown by the caller
now. There's no need to split up the string for the message box
manually as the Gtk 1.2 label widget handles newlines corectly.
Added the "edge_lock" toggle to the "Shrink Selection" dialog.
Nicer spacings for the query and message boxes.
* app/ink.c: tried to grab the pointer in the blob preview but
failed. Left the code there as a reminder (commented out).
* app/menus.c: reordered <Image>/Select.
I was bored and grep-ed the sources for ancient or deprecated stuff:
* app/about_dialog.[ch]
* app/actionarea.[ch]
* app/app_procs.c
* app/brush_edit.c
* app/brush_select.c
* app/color_select.c
* app/convert.c
* app/devices.c
* app/gdisplay.c
* app/gdisplay_ops.c
* app/histogram_tool.[ch]
* app/info_window.c
* app/install.c
* app/ops_buttons.c
* app/palette.c
* app/palette_select.c
* app/paths_dialog.c
* app/pattern_select.c
* app/resize.c
* app/scale_toolc.c
* app/text_tool.c:
s/container_border_width/container_set_border_width/g,
s/sprintf/g_snprintf/g, replaced some constant string lengths with
strlen(x).
* app/bezier_select.c
* app/blend.c
* app/boundary.c
* app/errors.[ch]
* app/free_select.c
* app/gimpbrushlist.c
* app/gimprc.c
* app/iscissors.c
* app/main.c
* app/patterns.[ch]
* app/text_tool.c: namespace fanaticism: prefixed all gimp error
functions with "gimp_" and formated the messages more uniformly.
* app/gradient.c
* app/gradient_select.c: same stuff as above for the ui
code. There are still some sub-dialogs which need cleanup.
Did some cleanup in most of these files: prototypes, removed tons
of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
|
|
|
g_snprintf (buf, sizeof (buf), "(%d X %d)",
|
|
|
|
brush->mask->width, brush->mask->height);
|
1999-01-11 05:54:02 +08:00
|
|
|
gtk_label_set_text (GTK_LABEL (bsp->brush_size), buf);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Set brush spacing */
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp == brush_select_dialog)
|
1999-04-22 22:34:00 +08:00
|
|
|
bsp->spacing_data->value = gimp_brush_get_spacing (brush);
|
1998-09-19 08:40:27 +08:00
|
|
|
else
|
|
|
|
bsp->spacing_data->value = bsp->spacing_value = brush->spacing;
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_signal_emit_by_name (GTK_OBJECT (bsp->spacing_data), "value_changed");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-07-29 18:40:42 +08:00
|
|
|
static void
|
|
|
|
edit_active_brush()
|
|
|
|
{
|
|
|
|
if (GIMP_IS_BRUSH_GENERATED (get_active_brush ()))
|
|
|
|
{
|
|
|
|
if (!brush_edit_generated_dialog)
|
|
|
|
{
|
|
|
|
/* Create the dialog... */
|
|
|
|
brush_edit_generated_dialog = brush_edit_generated_new ();
|
|
|
|
brush_edit_generated_set_brush (brush_edit_generated_dialog,
|
|
|
|
get_active_brush ());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Popup the dialog */
|
|
|
|
if (!GTK_WIDGET_VISIBLE (brush_edit_generated_dialog->shell))
|
|
|
|
gtk_widget_show (brush_edit_generated_dialog->shell);
|
|
|
|
else
|
|
|
|
gdk_window_raise (brush_edit_generated_dialog->shell->window);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
g_message (_("We are all fresh out of brush editors today,\n"
|
|
|
|
"please write your own or try back tomorrow\n"));
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static gint
|
|
|
|
brush_select_events (GtkWidget *widget,
|
|
|
|
GdkEvent *event,
|
|
|
|
BrushSelectP bsp)
|
|
|
|
{
|
|
|
|
GdkEventButton *bevent;
|
1998-07-09 13:31:06 +08:00
|
|
|
GimpBrushP brush;
|
1997-11-25 06:05:25 +08:00
|
|
|
int row, col, index;
|
|
|
|
|
|
|
|
switch (event->type)
|
|
|
|
{
|
|
|
|
case GDK_EXPOSE:
|
|
|
|
break;
|
|
|
|
|
1999-07-29 18:40:42 +08:00
|
|
|
case GDK_2BUTTON_PRESS:
|
|
|
|
edit_active_brush();
|
|
|
|
break;
|
1997-11-25 06:05:25 +08:00
|
|
|
case GDK_BUTTON_PRESS:
|
|
|
|
bevent = (GdkEventButton *) event;
|
|
|
|
|
|
|
|
if (bevent->button == 1)
|
|
|
|
{
|
|
|
|
col = bevent->x / bsp->cell_width;
|
|
|
|
row = (bevent->y + bsp->scroll_offset) / bsp->cell_height;
|
1998-10-14 05:10:22 +08:00
|
|
|
index = row * bsp->NUM_BRUSH_COLUMNS + col;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Get the brush and display the popup brush preview */
|
1998-07-20 22:05:33 +08:00
|
|
|
if ((brush = gimp_brush_list_get_brush_by_index (brush_list, index)))
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
gdk_pointer_grab (bsp->preview->window, FALSE,
|
|
|
|
(GDK_POINTER_MOTION_HINT_MASK |
|
|
|
|
GDK_BUTTON1_MOTION_MASK |
|
|
|
|
GDK_BUTTON_RELEASE_MASK),
|
|
|
|
NULL, NULL, bevent->time);
|
|
|
|
|
|
|
|
/* Make this brush the active brush */
|
1998-09-19 08:40:27 +08:00
|
|
|
/* only if dialog is main one */
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp == brush_select_dialog)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
select_brush (brush);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Keeping up appearances */
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
bsp->brush = brush;
|
|
|
|
brush_select_select (bsp,
|
1999-04-23 22:47:50 +08:00
|
|
|
gimp_brush_list_get_brush_index (brush_list, brush));
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
if (GIMP_IS_BRUSH_GENERATED (brush) && bsp == brush_select_dialog)
|
1998-09-09 09:35:35 +08:00
|
|
|
gtk_widget_set_sensitive (bsp->edit_button, 1);
|
|
|
|
else
|
|
|
|
gtk_widget_set_sensitive (bsp->edit_button, 0);
|
|
|
|
|
1998-07-09 13:31:06 +08:00
|
|
|
if (brush_edit_generated_dialog)
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_edit_generated_set_brush (brush_edit_generated_dialog,
|
|
|
|
get_active_brush ());
|
1998-07-09 13:31:06 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Show the brush popup window if the brush is too large */
|
|
|
|
if (brush->mask->width > bsp->cell_width ||
|
|
|
|
brush->mask->height > bsp->cell_height)
|
|
|
|
brush_popup_open (bsp, bevent->x, bevent->y, brush);
|
|
|
|
}
|
|
|
|
}
|
1999-07-25 00:27:47 +08:00
|
|
|
|
|
|
|
/* wheelmouse support */
|
|
|
|
else if (bevent->button == 4)
|
|
|
|
{
|
|
|
|
GtkAdjustment *adj = bsp->sbar_data;
|
|
|
|
gfloat new_value = adj->value - adj->page_increment / 2;
|
|
|
|
new_value =
|
|
|
|
CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
|
|
|
|
gtk_adjustment_set_value (adj, new_value);
|
|
|
|
}
|
|
|
|
else if (bevent->button == 5)
|
|
|
|
{
|
|
|
|
GtkAdjustment *adj = bsp->sbar_data;
|
|
|
|
gfloat new_value = adj->value + adj->page_increment / 2;
|
|
|
|
new_value =
|
|
|
|
CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
|
|
|
|
gtk_adjustment_set_value (adj, new_value);
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GDK_BUTTON_RELEASE:
|
|
|
|
bevent = (GdkEventButton *) event;
|
|
|
|
|
|
|
|
if (bevent->button == 1)
|
|
|
|
{
|
|
|
|
/* Ungrab the pointer */
|
|
|
|
gdk_pointer_ungrab (bevent->time);
|
|
|
|
|
|
|
|
/* Close the brush popup window */
|
|
|
|
brush_popup_close (bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
/* Call any callbacks registered */
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (bsp, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GDK_DELETE:
|
1998-05-30 15:32:37 +08:00
|
|
|
/* g_warning ("test"); */
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
1998-07-09 13:31:06 +08:00
|
|
|
static gint
|
1999-04-23 22:47:50 +08:00
|
|
|
edit_brush_callback (GtkWidget *w,
|
|
|
|
GdkEvent *e,
|
|
|
|
gpointer data)
|
1998-07-09 13:31:06 +08:00
|
|
|
{
|
1999-07-29 18:40:42 +08:00
|
|
|
edit_active_brush();
|
1998-07-09 13:31:06 +08:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gint
|
1999-04-23 22:47:50 +08:00
|
|
|
new_brush_callback (GtkWidget *w,
|
|
|
|
GdkEvent *e,
|
|
|
|
gpointer data)
|
1998-07-09 13:31:06 +08:00
|
|
|
{
|
1998-07-16 19:44:56 +08:00
|
|
|
GimpBrushGenerated *brush;
|
1999-04-23 22:47:50 +08:00
|
|
|
brush = gimp_brush_generated_new (10, .5, 0.0, 1.0);
|
|
|
|
gimp_brush_list_add(brush_list, GIMP_BRUSH (brush));
|
|
|
|
select_brush (GIMP_BRUSH (brush));
|
1999-03-07 19:50:09 +08:00
|
|
|
if (brush_edit_generated_dialog)
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_edit_generated_set_brush (brush_edit_generated_dialog,
|
|
|
|
get_active_brush());
|
|
|
|
edit_brush_callback (w, e, data);
|
1998-07-09 13:31:06 +08:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static gint
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_delete_callback (GtkWidget *w,
|
|
|
|
GdkEvent *e,
|
|
|
|
gpointer data)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
brush_select_close_callback (w, data);
|
|
|
|
|
1998-03-13 06:01:43 +08:00
|
|
|
return TRUE;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
1998-09-19 08:40:27 +08:00
|
|
|
brush_select_close_callback (GtkWidget *w, /* Unused so can be NULL */
|
1997-11-25 06:05:25 +08:00
|
|
|
gpointer client_data)
|
|
|
|
{
|
|
|
|
BrushSelectP bsp;
|
|
|
|
|
|
|
|
bsp = (BrushSelectP) client_data;
|
|
|
|
|
|
|
|
if (GTK_WIDGET_VISIBLE (bsp->shell))
|
|
|
|
gtk_widget_hide (bsp->shell);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
/* Free memory if poping down dialog which is not the main one */
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp != brush_select_dialog)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
/* Send data back */
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (bsp,1);
|
|
|
|
gtk_widget_destroy (bsp->shell);
|
|
|
|
brush_select_free (bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
brush_select_refresh_callback (GtkWidget *w,
|
|
|
|
gpointer client_data)
|
|
|
|
{
|
|
|
|
BrushSelectP bsp;
|
1998-07-09 13:31:06 +08:00
|
|
|
GimpBrushP active;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
bsp = (BrushSelectP) client_data;
|
|
|
|
|
|
|
|
/* re-init the brush list */
|
1999-04-23 22:47:50 +08:00
|
|
|
brushes_init (FALSE);
|
1998-03-27 02:24:42 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* recalculate scrollbar extents */
|
|
|
|
preview_calc_scrollbar (bsp);
|
|
|
|
|
|
|
|
/* render the brushes into the newly created image structure */
|
|
|
|
display_brushes (bsp);
|
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
/* update the active selection */
|
|
|
|
active = get_active_brush ();
|
|
|
|
if (active)
|
|
|
|
brush_select_select (bsp, gimp_brush_list_get_brush_index (brush_list,
|
|
|
|
active));
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* update the display */
|
|
|
|
if (bsp->redraw)
|
|
|
|
gtk_widget_draw (bsp->preview, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
preview_scroll_update (GtkAdjustment *adjustment,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
BrushSelectP bsp;
|
1998-07-09 13:31:06 +08:00
|
|
|
GimpBrushP active;
|
1998-07-20 22:05:33 +08:00
|
|
|
int row, col, index;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
bsp = data;
|
|
|
|
|
|
|
|
if (bsp)
|
|
|
|
{
|
|
|
|
bsp->scroll_offset = adjustment->value;
|
|
|
|
display_brushes (bsp);
|
|
|
|
|
1999-04-24 07:28:49 +08:00
|
|
|
if (brush_select_dialog == bsp)
|
1998-09-19 08:40:27 +08:00
|
|
|
active = get_active_brush ();
|
1999-04-24 07:28:49 +08:00
|
|
|
else
|
|
|
|
active = bsp->brush;
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (active)
|
|
|
|
{
|
1999-04-24 07:28:49 +08:00
|
|
|
index = gimp_brush_list_get_brush_index (brush_list, active);
|
1998-07-24 16:56:18 +08:00
|
|
|
if (index < 0)
|
|
|
|
return;
|
1998-10-14 05:10:22 +08:00
|
|
|
row = index / bsp->NUM_BRUSH_COLUMNS;
|
|
|
|
col = index - row * bsp->NUM_BRUSH_COLUMNS;
|
1997-11-25 06:05:25 +08:00
|
|
|
brush_select_show_selected (bsp, row, col);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bsp->redraw)
|
|
|
|
gtk_widget_draw (bsp->preview, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
paint_mode_menu_callback (GtkWidget *w,
|
|
|
|
gpointer client_data)
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
BrushSelectP bsp = (BrushSelectP) gtk_object_get_user_data (GTK_OBJECT (w));
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-23 22:47:50 +08:00
|
|
|
if (bsp == brush_select_dialog)
|
1999-07-06 23:18:25 +08:00
|
|
|
{
|
|
|
|
gimp_context_set_paint_mode (gimp_context_get_user (),
|
|
|
|
(int) client_data);
|
|
|
|
}
|
1998-09-19 08:40:27 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
bsp->paint_mode = (int) client_data;
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (bsp, 0);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
opacity_scale_update (GtkAdjustment *adjustment,
|
|
|
|
gpointer data)
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
BrushSelectP bsp = (BrushSelectP) data;
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-07-06 23:18:25 +08:00
|
|
|
if (bsp == brush_select_dialog)
|
|
|
|
{
|
|
|
|
gimp_context_set_opacity (gimp_context_get_user (),
|
|
|
|
adjustment->value / 100.0);
|
|
|
|
}
|
1998-09-19 08:40:27 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
bsp->opacity_value = (adjustment->value / 100.0);
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (bsp, 0);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
spacing_scale_update (GtkAdjustment *adjustment,
|
|
|
|
gpointer data)
|
|
|
|
{
|
1999-04-23 22:47:50 +08:00
|
|
|
BrushSelectP bsp = (BrushSelectP) data;
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
if(bsp == brush_select_dialog)
|
1999-04-22 22:34:00 +08:00
|
|
|
gimp_brush_set_spacing (get_active_brush(), (int) adjustment->value);
|
1998-09-19 08:40:27 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if(bsp->spacing_value != adjustment->value)
|
|
|
|
{
|
|
|
|
bsp->spacing_value = adjustment->value;
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_change_callbacks (bsp, 0);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
1998-09-19 08:40:27 +08:00
|
|
|
|
1999-04-22 22:34:00 +08:00
|
|
|
/* not used
|
|
|
|
static void
|
|
|
|
paint_options_toggle_callback (GtkWidget *widget,
|
|
|
|
gpointer client_data)
|
|
|
|
{
|
|
|
|
paint_options_set_global (GTK_TOGGLE_BUTTON (widget)->active);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
1998-09-19 08:40:27 +08:00
|
|
|
/* Close active dialogs that no longer have PDB registered for them */
|
|
|
|
|
|
|
|
void
|
gave parasite undo a MISC_UNDO class for now so it compiles
* app/gimpdrawable.c: gave parasite undo a MISC_UNDO class for now
so it compiles
* app/tools_cmds.c: fix crop invoker to give correct args to
crop_image
* app/color_cmds.c: s/GRAY/GRAY_LUT/g;
* app/brush_select.[ch]: removed PDB procs, export brush_active_dialogs,
brush_select_dialog, s/active_dialogs/brush_active_dialogs/
* app/gimage_cmds.[ch]
* app/channel_ops.[ch]: removed channel ops PDB procs, moved duplicate
function from gimage_cmds to channel_ops, export offset and duplicate
* app/gimpbrushlist.[ch]: removed PDB procs
* app/gradient.[ch]: removed PDB procs,
* app/gradient_header.h: exported G_SAMPLE, GradSelect, num_gradients,
grad_active_dialogs, gradient_select_dialog
* app/gradient_select.c: removed PDB procs,
s/active_dialogs/grad_active_dialogs/
* app/patterns.[ch]: removed PDB procs
* app/pattern_select.[ch]: removed PDB procs,
s/active_dialogs/pattern_active_dialogs/
* app/procedural_db.c: removed PDB procs and supporting functions
* app/procedrual_db.h: fiddled with enums
* app/channel_cmds.[ch]
* app/drawable_cmds.[ch]
* app/parasite_cmds.[ch]: pdbgenned now, removed header files
* app/gimpparasite.c: minor cleanup
* app/internal_procs.c: use pdbgen stuff
* app/tools_cmds.c
* app/text_tool_cmds.c: updated from pdbgen
* app/brushes_cmds.c
* app/brush_select_cmds.c
* app/gradient_cmds.c
* app/gradient_select_cmds.c
* app/patterns_cmds.c
* app/pattern_select_cmds.c
* app/procedural_db_cmds.c: new pdbgen files
* app/Makefile.am: file shuffle (see above)
-Yosh
1999-04-24 04:54:02 +08:00
|
|
|
brushes_check_dialogs (void)
|
1998-09-19 08:40:27 +08:00
|
|
|
{
|
|
|
|
GSList *list;
|
|
|
|
BrushSelectP bsp;
|
|
|
|
gchar * name;
|
|
|
|
ProcRecord *prec = NULL;
|
|
|
|
|
gave parasite undo a MISC_UNDO class for now so it compiles
* app/gimpdrawable.c: gave parasite undo a MISC_UNDO class for now
so it compiles
* app/tools_cmds.c: fix crop invoker to give correct args to
crop_image
* app/color_cmds.c: s/GRAY/GRAY_LUT/g;
* app/brush_select.[ch]: removed PDB procs, export brush_active_dialogs,
brush_select_dialog, s/active_dialogs/brush_active_dialogs/
* app/gimage_cmds.[ch]
* app/channel_ops.[ch]: removed channel ops PDB procs, moved duplicate
function from gimage_cmds to channel_ops, export offset and duplicate
* app/gimpbrushlist.[ch]: removed PDB procs
* app/gradient.[ch]: removed PDB procs,
* app/gradient_header.h: exported G_SAMPLE, GradSelect, num_gradients,
grad_active_dialogs, gradient_select_dialog
* app/gradient_select.c: removed PDB procs,
s/active_dialogs/grad_active_dialogs/
* app/patterns.[ch]: removed PDB procs
* app/pattern_select.[ch]: removed PDB procs,
s/active_dialogs/pattern_active_dialogs/
* app/procedural_db.c: removed PDB procs and supporting functions
* app/procedrual_db.h: fiddled with enums
* app/channel_cmds.[ch]
* app/drawable_cmds.[ch]
* app/parasite_cmds.[ch]: pdbgenned now, removed header files
* app/gimpparasite.c: minor cleanup
* app/internal_procs.c: use pdbgen stuff
* app/tools_cmds.c
* app/text_tool_cmds.c: updated from pdbgen
* app/brushes_cmds.c
* app/brush_select_cmds.c
* app/gradient_cmds.c
* app/gradient_select_cmds.c
* app/patterns_cmds.c
* app/pattern_select_cmds.c
* app/procedural_db_cmds.c: new pdbgen files
* app/Makefile.am: file shuffle (see above)
-Yosh
1999-04-24 04:54:02 +08:00
|
|
|
list = brush_active_dialogs;
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
while (list)
|
|
|
|
{
|
|
|
|
bsp = (BrushSelectP) list->data;
|
|
|
|
list = list->next;
|
|
|
|
|
|
|
|
name = bsp->callback_name;
|
1999-04-23 22:47:50 +08:00
|
|
|
prec = procedural_db_lookup (name);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
|
|
|
if(!prec)
|
|
|
|
{
|
gave parasite undo a MISC_UNDO class for now so it compiles
* app/gimpdrawable.c: gave parasite undo a MISC_UNDO class for now
so it compiles
* app/tools_cmds.c: fix crop invoker to give correct args to
crop_image
* app/color_cmds.c: s/GRAY/GRAY_LUT/g;
* app/brush_select.[ch]: removed PDB procs, export brush_active_dialogs,
brush_select_dialog, s/active_dialogs/brush_active_dialogs/
* app/gimage_cmds.[ch]
* app/channel_ops.[ch]: removed channel ops PDB procs, moved duplicate
function from gimage_cmds to channel_ops, export offset and duplicate
* app/gimpbrushlist.[ch]: removed PDB procs
* app/gradient.[ch]: removed PDB procs,
* app/gradient_header.h: exported G_SAMPLE, GradSelect, num_gradients,
grad_active_dialogs, gradient_select_dialog
* app/gradient_select.c: removed PDB procs,
s/active_dialogs/grad_active_dialogs/
* app/patterns.[ch]: removed PDB procs
* app/pattern_select.[ch]: removed PDB procs,
s/active_dialogs/pattern_active_dialogs/
* app/procedural_db.c: removed PDB procs and supporting functions
* app/procedrual_db.h: fiddled with enums
* app/channel_cmds.[ch]
* app/drawable_cmds.[ch]
* app/parasite_cmds.[ch]: pdbgenned now, removed header files
* app/gimpparasite.c: minor cleanup
* app/internal_procs.c: use pdbgen stuff
* app/tools_cmds.c
* app/text_tool_cmds.c: updated from pdbgen
* app/brushes_cmds.c
* app/brush_select_cmds.c
* app/gradient_cmds.c
* app/gradient_select_cmds.c
* app/patterns_cmds.c
* app/pattern_select_cmds.c
* app/procedural_db_cmds.c: new pdbgen files
* app/Makefile.am: file shuffle (see above)
-Yosh
1999-04-24 04:54:02 +08:00
|
|
|
brush_active_dialogs = g_slist_remove (brush_active_dialogs,bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
|
gave parasite undo a MISC_UNDO class for now so it compiles
* app/gimpdrawable.c: gave parasite undo a MISC_UNDO class for now
so it compiles
* app/tools_cmds.c: fix crop invoker to give correct args to
crop_image
* app/color_cmds.c: s/GRAY/GRAY_LUT/g;
* app/brush_select.[ch]: removed PDB procs, export brush_active_dialogs,
brush_select_dialog, s/active_dialogs/brush_active_dialogs/
* app/gimage_cmds.[ch]
* app/channel_ops.[ch]: removed channel ops PDB procs, moved duplicate
function from gimage_cmds to channel_ops, export offset and duplicate
* app/gimpbrushlist.[ch]: removed PDB procs
* app/gradient.[ch]: removed PDB procs,
* app/gradient_header.h: exported G_SAMPLE, GradSelect, num_gradients,
grad_active_dialogs, gradient_select_dialog
* app/gradient_select.c: removed PDB procs,
s/active_dialogs/grad_active_dialogs/
* app/patterns.[ch]: removed PDB procs
* app/pattern_select.[ch]: removed PDB procs,
s/active_dialogs/pattern_active_dialogs/
* app/procedural_db.c: removed PDB procs and supporting functions
* app/procedrual_db.h: fiddled with enums
* app/channel_cmds.[ch]
* app/drawable_cmds.[ch]
* app/parasite_cmds.[ch]: pdbgenned now, removed header files
* app/gimpparasite.c: minor cleanup
* app/internal_procs.c: use pdbgen stuff
* app/tools_cmds.c
* app/text_tool_cmds.c: updated from pdbgen
* app/brushes_cmds.c
* app/brush_select_cmds.c
* app/gradient_cmds.c
* app/gradient_select_cmds.c
* app/patterns_cmds.c
* app/pattern_select_cmds.c
* app/procedural_db_cmds.c: new pdbgen files
* app/Makefile.am: file shuffle (see above)
-Yosh
1999-04-24 04:54:02 +08:00
|
|
|
/* Can alter brush_active_dialogs list*/
|
1999-04-23 22:47:50 +08:00
|
|
|
brush_select_close_callback (NULL, bsp);
|
1998-09-19 08:40:27 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|