app/actions/documents-actions.c app/actions/documents-commands.c

2004-05-12  Michael Natterer  <mitch@gimp.org>

	* app/actions/documents-actions.c
	* app/actions/documents-commands.c
	* app/actions/edit-actions.c
	* app/actions/edit-commands.[ch]
	* app/actions/layers-actions.c
	* app/actions/layers-commands.c
	* app/actions/select-actions.c
	* app/actions/select-commands.[ch]
	* app/actions/vectors-actions.c
	* app/actions/vectors-commands.[ch]: added tooltips for actions
	which are now used for dialog buttons, added callback
	implementations which formerly lived in various widgets, moved
	some actions around and did some general cleanups.

	* menus/image-menu.xml.in: s/edit-stroke/select-stroke/

	* menus/Makefile.am
	* menus/selection-editor-menu.xml: new popup menu.

	* app/menus/menus.c: register <SelectionEditor> and <UndoEditor>
	UI managers.

	* app/widgets/gimpeditor.[ch]: added construct properties
	"menu-factory", "menu-identifier", "ui-path" and "popup-data".
	Implement GObject::constructor() and create the UI manager
	if all needed properties were set. Enables creating action
	buttons at widget construction time because they need a
	UI manager.

	(gimp_editor_add_action_button): changed to take a va_list of
	"extended" actions which are invoked if the resp. button emits
	"extended_clicked". Store the actions and their modifier masks in
	a list attached to the button.

	* app/widgets/gimpcontainerview.c
	(gimp_container_view_item_selected): if the view has container
	*and* context, simply change the context and return.

	(gimp_container_view_context_changed): don't emit "select_item"
	manually but simply call gimp_container_view_select_item().

	(gimp_container_view_viewable_dropped): use
	gimp_container_view_item_selected() instead of changing the
	context directly.

	* app/widgets/gimpcontainereditor.c
	(gimp_container_editor_select_item): update the UI manager.

	* app/widgets/gimpdockable.c: don't try to fiddle with the
	dialog's menu if it doesn't have a ui_path (happens if the UI
	manager is just a collection of actions for the dialog buttons and
	has no menu registered).

	* app/widgets/gimpimageeditor.c: connect to the image's "flush"
	signal and update the UI manager in the callback.

	* app/widgets/gimpitemtreeview.c: use GimpEditor's construct
	properties to create the UI manager so GimpItemTreeView subclasses
	can have action buttons. Update the UI manager in
	gimp_item_tree_view_select_item().

	* app/widgets/gimpbufferview.c
	* app/widgets/gimpcolormapeditor.c
	* app/widgets/gimpcontainergridview.c
	* app/widgets/gimpdatafactoryview.c
	* app/widgets/gimpfontview.c
	* app/widgets/gimpimageview.c
	* app/widgets/gimptemplateview.c
	* app/widgets/gimptoolview.c: changed calls to
	gimp_editor_add_action_button() accordingly and removed some
	unneeded select_item() implementations.

	* app/widgets/gimpchanneltreeview.c
	* app/widgets/gimpvectorstreeview.[ch]
	* app/widgets/gimpdocumentview.[ch]
	* app/widgets/gimplayertreeview.c
	* app/widgets/gimpselectioneditor.[ch]
	* app/widgets/gimpundoeditor.[ch]: use action buttons and removed
	lots of callbacks which went to the resp. action callbacks.

	* app/widgets/widgets-types.h: removed some now unneeded function
	prototypes.

	* app/gui/dialogs-constructors.c: changed (simplified) many dialog
	constructors accordingly.
This commit is contained in:
Michael Natterer
2004-05-12 18:36:33 +00:00
committed by Michael Natterer
parent 6750667d87
commit 2632cd8f64
47 changed files with 1254 additions and 1392 deletions

View File

@ -1,3 +1,91 @@
2004-05-12 Michael Natterer <mitch@gimp.org>
* app/actions/documents-actions.c
* app/actions/documents-commands.c
* app/actions/edit-actions.c
* app/actions/edit-commands.[ch]
* app/actions/layers-actions.c
* app/actions/layers-commands.c
* app/actions/select-actions.c
* app/actions/select-commands.[ch]
* app/actions/vectors-actions.c
* app/actions/vectors-commands.[ch]: added tooltips for actions
which are now used for dialog buttons, added callback
implementations which formerly lived in various widgets, moved
some actions around and did some general cleanups.
* menus/image-menu.xml.in: s/edit-stroke/select-stroke/
* menus/Makefile.am
* menus/selection-editor-menu.xml: new popup menu.
* app/menus/menus.c: register <SelectionEditor> and <UndoEditor>
UI managers.
* app/widgets/gimpeditor.[ch]: added construct properties
"menu-factory", "menu-identifier", "ui-path" and "popup-data".
Implement GObject::constructor() and create the UI manager
if all needed properties were set. Enables creating action
buttons at widget construction time because they need a
UI manager.
(gimp_editor_add_action_button): extended to take a va_list of
"extended" actions which are invoked if the resp. button emits
"extended_clicked". Store the actions and their modifier masks in
a list attached to the button.
* app/widgets/gimpcontainerview.c
(gimp_container_view_item_selected): if the view has container
*and* context, simply change the context and return.
(gimp_container_view_context_changed): don't emit "select_item"
manually but simply call gimp_container_view_select_item().
(gimp_container_view_viewable_dropped): use
gimp_container_view_item_selected() instead of changing the
context directly.
* app/widgets/gimpcontainereditor.c
(gimp_container_editor_select_item): update the UI manager.
* app/widgets/gimpdockable.c: don't try to fiddle with the
dialog's menu if it doesn't have a ui_path (happens if the UI
manager is just a collection of actions for the dialog buttons and
has no menu registered).
* app/widgets/gimpimageeditor.c: connect to the image's "flush"
signal and update the UI manager in the callback.
* app/widgets/gimpitemtreeview.c: use GimpEditor's construct
properties to create the UI manager so GimpItemTreeView subclasses
can have action buttons. Update the UI manager in
gimp_item_tree_view_select_item().
* app/widgets/gimpbufferview.c
* app/widgets/gimpcolormapeditor.c
* app/widgets/gimpcontainergridview.c
* app/widgets/gimpdatafactoryview.c
* app/widgets/gimpfontview.c
* app/widgets/gimpimageview.c
* app/widgets/gimptemplateview.c
* app/widgets/gimptoolview.c: changed calls to
gimp_editor_add_action_button() accordingly and removed some
unneeded select_item() implementations.
* app/widgets/gimpchanneltreeview.c
* app/widgets/gimpvectorstreeview.[ch]
* app/widgets/gimpdocumentview.[ch]
* app/widgets/gimplayertreeview.c
* app/widgets/gimpselectioneditor.[ch]
* app/widgets/gimpundoeditor.[ch]: use action buttons and removed
lots of callbacks which went to the resp. action callbacks.
* app/widgets/widgets-types.h: removed some now unneeded function
prototypes.
* app/gui/dialogs-constructors.c: changed (simplified) many dialog
constructors accordingly.
2004-05-12 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimpwidgets.c (gimp_scale_entry_new_internal)

View File

@ -27,10 +27,9 @@
#include "core/gimpcontext.h"
#include "widgets/gimpactiongroup.h"
#include "widgets/gimpcontainereditor.h"
#include "widgets/gimpcontainerview.h"
#include "widgets/gimphelp-ids.h"
#include "actions.h"
#include "documents-actions.h"
#include "documents-commands.h"
@ -43,7 +42,8 @@ static GimpActionEntry documents_actions[] =
GIMP_HELP_DOCUMENT_DIALOG },
{ "documents-open", GTK_STOCK_OPEN,
N_("_Open Image"), "", NULL,
N_("_Open Image"), "",
N_("Open the selected entry"),
G_CALLBACK (documents_open_document_cmd_callback),
GIMP_HELP_DOCUMENT_OPEN },
@ -58,12 +58,14 @@ static GimpActionEntry documents_actions[] =
GIMP_HELP_DOCUMENT_OPEN },
{ "documents-remove", GTK_STOCK_REMOVE,
N_("Remove _Entry"), "", NULL,
N_("Remove _Entry"), "",
N_("Remove the selected entry"),
G_CALLBACK (documents_remove_document_cmd_callback),
GIMP_HELP_DOCUMENT_REMOVE },
{ "documents-recreate-preview", GTK_STOCK_REFRESH,
N_("Recreate _Preview"), "", NULL,
N_("Recreate _Preview"), "",
N_("Recreate preview"),
G_CALLBACK (documents_recreate_preview_cmd_callback),
GIMP_HELP_DOCUMENT_REFRESH },
@ -91,14 +93,13 @@ void
documents_actions_update (GimpActionGroup *group,
gpointer data)
{
GimpContainerEditor *editor;
GimpContext *context;
GimpImagefile *imagefile;
GimpContext *context;
GimpImagefile *imagefile = NULL;
editor = GIMP_CONTAINER_EDITOR (data);
context = gimp_container_view_get_context (editor->view);
context = action_data_get_context (data);
imagefile = gimp_context_get_imagefile (context);
if (context)
imagefile = gimp_context_get_imagefile (context);
#define SET_SENSITIVE(action,condition) \
gimp_action_group_set_action_sensitive (group, action, (condition) != 0)

View File

@ -18,15 +18,39 @@
#include "config.h"
#include <string.h>
#include <gtk/gtk.h>
#include "libgimpthumb/gimpthumb.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "actions-types.h"
#include "core/gimp.h"
#include "core/gimpcontainer.h"
#include "core/gimpcontext.h"
#include "core/gimpimagefile.h"
#include "file/file-open.h"
#include "file/file-utils.h"
#include "widgets/gimpcontainerview.h"
#include "widgets/gimpdocumentview.h"
#include "display/gimpdisplay.h"
#include "display/gimpdisplay-foreach.h"
#include "documents-commands.h"
#include "file-commands.h"
#include "gimp-intl.h"
/* local function prototypes */
static void documents_open_image (GimpContext *context,
GimpImagefile *imagefile);
/* public functions */
@ -35,66 +59,213 @@ void
documents_open_document_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
gtk_button_clicked (GTK_BUTTON (view->open_button));
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
documents_open_image (context, imagefile);
}
else
{
file_file_open_dialog (context->gimp, NULL, GTK_WIDGET (editor));
}
}
typedef struct _RaiseClosure RaiseClosure;
struct _RaiseClosure
{
const gchar *name;
gboolean found;
};
static void
documents_raise_display (gpointer data,
gpointer user_data)
{
GimpDisplay *gdisp = (GimpDisplay *) data;
RaiseClosure *closure = (RaiseClosure *) user_data;
const gchar *uri;
uri = gimp_object_get_name (GIMP_OBJECT (gdisp->gimage));
if (uri && ! strcmp (closure->name, uri))
{
closure->found = TRUE;
gtk_window_present (GTK_WINDOW (gdisp->shell));
}
}
void
documents_raise_or_open_document_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
gimp_button_extended_clicked (GIMP_BUTTON (view->open_button),
GDK_SHIFT_MASK);
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
RaiseClosure closure;
closure.name = gimp_object_get_name (GIMP_OBJECT (imagefile));
closure.found = FALSE;
gimp_container_foreach (context->gimp->displays,
documents_raise_display,
&closure);
if (! closure.found)
documents_open_image (context, imagefile);
}
}
void
documents_file_open_dialog_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
gimp_button_extended_clicked (GIMP_BUTTON (view->open_button),
GDK_CONTROL_MASK);
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
file_file_open_dialog (context->gimp,
gimp_object_get_name (GIMP_OBJECT (imagefile)),
GTK_WIDGET (editor));
}
}
void
documents_remove_document_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
gtk_button_clicked (GTK_BUTTON (view->remove_button));
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
gimp_container_remove (container, GIMP_OBJECT (imagefile));
}
}
void
documents_recreate_preview_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
gtk_button_clicked (GTK_BUTTON (view->refresh_button));
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
gint preview_size;
preview_size = gimp_container_view_get_preview_size (editor->view, NULL);
gimp_imagefile_create_thumbnail (imagefile, context, preview_size);
}
}
void
documents_reload_previews_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContainer *container;
gimp_button_extended_clicked (GIMP_BUTTON (view->refresh_button),
GDK_SHIFT_MASK);
container = gimp_container_view_get_container (editor->view);
gimp_container_foreach (container,
(GFunc) gimp_imagefile_update,
editor->view);
}
static void
documents_delete_dangling_foreach (GimpImagefile *imagefile,
GimpContainer *container)
{
if (gimp_thumbnail_peek_image (imagefile->thumbnail) ==
GIMP_THUMB_STATE_NOT_FOUND)
{
gimp_container_remove (container, GIMP_OBJECT (imagefile));
}
}
void
documents_delete_dangling_documents_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (data);
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data);
GimpContainer *container;
gimp_button_extended_clicked (GIMP_BUTTON (view->refresh_button),
GDK_CONTROL_MASK);
container = gimp_container_view_get_container (editor->view);
gimp_container_foreach (container,
(GFunc) documents_delete_dangling_foreach,
container);
}
/* private functions */
static void
documents_open_image (GimpContext *context,
GimpImagefile *imagefile)
{
const gchar *uri;
GimpImage *gimage;
GimpPDBStatusType status;
GError *error = NULL;
uri = gimp_object_get_name (GIMP_OBJECT (imagefile));
gimage = file_open_with_display (context->gimp, context,
uri, &status, &error);
if (! gimage && status != GIMP_PDB_CANCEL)
{
gchar *filename;
filename = file_utils_uri_to_utf8_filename (uri);
g_message (_("Opening '%s' failed:\n\n%s"),
filename, error->message);
g_clear_error (&error);
g_free (filename);
}
}

View File

@ -64,15 +64,23 @@ static GimpActionEntry edit_actions[] =
{ "edit-buffer-menu", NULL, N_("Buffer") },
{ "edit-undo", GTK_STOCK_UNDO,
N_("_Undo"), "<control>Z", NULL,
N_("_Undo"), "<control>Z",
N_("Undo"),
G_CALLBACK (edit_undo_cmd_callback),
GIMP_HELP_EDIT_UNDO },
{ "edit-redo", GTK_STOCK_REDO,
N_("_Redo"), "<control>Y", NULL,
N_("_Redo"), "<control>Y",
N_("Redo"),
G_CALLBACK (edit_redo_cmd_callback),
GIMP_HELP_EDIT_REDO },
{ "edit-undo-clear", GTK_STOCK_CLEAR,
N_("_Clear Undo History"), "",
N_("Clear undo history"),
G_CALLBACK (edit_undo_clear_cmd_callback),
GIMP_HELP_EDIT_UNDO_CLEAR },
{ "edit-cut", GTK_STOCK_CUT,
N_("Cu_t"), "<control>X", NULL,
G_CALLBACK (edit_cut_cmd_callback),
@ -116,12 +124,7 @@ static GimpActionEntry edit_actions[] =
{ "edit-clear", GTK_STOCK_CLEAR,
N_("Cl_ear"), "<control>K", NULL,
G_CALLBACK (edit_clear_cmd_callback),
GIMP_HELP_EDIT_CLEAR },
{ "edit-stroke", GIMP_STOCK_SELECTION_STROKE,
N_("_Stroke Selection..."), NULL, NULL,
G_CALLBACK (edit_stroke_cmd_callback),
GIMP_HELP_SELECTION_STROKE }
GIMP_HELP_EDIT_CLEAR }
};
static GimpEnumActionEntry edit_fill_actions[] =
@ -205,8 +208,9 @@ edit_actions_update (GimpActionGroup *group,
gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
{
gchar *undo_name = NULL;
gchar *redo_name = NULL;
gchar *undo_name = NULL;
gchar *redo_name = NULL;
gboolean enabled = FALSE;
if (gimage && gimp_image_undo_is_enabled (gimage))
{
@ -216,6 +220,8 @@ edit_actions_update (GimpActionGroup *group,
undo = gimp_undo_stack_peek (gimage->undo_stack);
redo = gimp_undo_stack_peek (gimage->redo_stack);
enabled = TRUE;
if (undo)
undo_name =
g_strdup_printf (_("_Undo %s"),
@ -230,8 +236,9 @@ edit_actions_update (GimpActionGroup *group,
SET_LABEL ("edit-undo", undo_name ? undo_name : _("_Undo"));
SET_LABEL ("edit-redo", redo_name ? redo_name : _("_Redo"));
SET_SENSITIVE ("edit-undo", undo_name);
SET_SENSITIVE ("edit-redo", redo_name);
SET_SENSITIVE ("edit-undo", enabled && undo_name);
SET_SENSITIVE ("edit-redo", enabled && redo_name);
SET_SENSITIVE ("edit-undo-clear", enabled && (redo_name || redo_name));
g_free (undo_name);
g_free (redo_name);
@ -249,7 +256,6 @@ edit_actions_update (GimpActionGroup *group,
SET_SENSITIVE ("edit-fill-fg", drawable);
SET_SENSITIVE ("edit-fill-bg", drawable);
SET_SENSITIVE ("edit-fill-pattern", drawable);
SET_SENSITIVE ("edit-stroke", drawable && sel);
#undef SET_LABEL
#undef SET_SENSITIVE

View File

@ -33,7 +33,6 @@
#include "core/gimpdrawable.h"
#include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
#include "core/gimptoolinfo.h"
#include "display/gimpdisplay.h"
#include "display/gimpdisplayshell.h"
@ -43,7 +42,6 @@
#include "widgets/gimpdialogfactory.h"
#include "gui/dialogs.h"
#include "gui/stroke-dialog.h"
#include "actions.h"
#include "edit-commands.h"
@ -85,6 +83,44 @@ edit_redo_cmd_callback (GtkAction *action,
gimp_image_flush (gimage);
}
static void
edit_undo_clear_callback (GtkWidget *widget,
gboolean clear,
gpointer data)
{
if (clear)
{
GimpImage *gimage = data;
gimp_image_undo_disable (gimage);
gimp_image_undo_enable (gimage);
gimp_image_flush (gimage);
}
}
void
edit_undo_clear_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GtkWidget *widget;
GtkWidget *dialog;
return_if_no_image (gimage, data);
return_if_no_widget (widget, data);
dialog = gimp_query_boolean_box (_("Clear Undo History"), widget,
gimp_standard_help_func,
GIMP_HELP_EDIT_UNDO_CLEAR,
GIMP_STOCK_QUESTION,
_("Really clear image's undo history?"),
GTK_STOCK_CLEAR, GTK_STOCK_CANCEL,
G_OBJECT (gimage),
"disconnect",
edit_undo_clear_callback,
gimage);
gtk_widget_show (dialog);
}
void
edit_cut_cmd_callback (GtkAction *action,
gpointer data)
@ -245,46 +281,6 @@ edit_fill_cmd_callback (GtkAction *action,
gimp_image_flush (gimage);
}
void
edit_stroke_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpDrawable *drawable;
GtkWidget *widget;
return_if_no_drawable (gimage, drawable, data);
return_if_no_widget (widget, data);
edit_stroke_selection (GIMP_ITEM (gimp_image_get_mask (gimage)), widget);
}
void
edit_stroke_selection (GimpItem *item,
GtkWidget *parent)
{
GimpImage *gimage;
GimpDrawable *active_drawable;
GtkWidget *dialog;
g_return_if_fail (GIMP_IS_ITEM (item));
g_return_if_fail (GTK_IS_WIDGET (parent));
gimage = gimp_item_get_image (item);
active_drawable = gimp_image_active_drawable (gimage);
if (! active_drawable)
{
g_message (_("There is no active layer or channel to stroke to."));
return;
}
dialog = stroke_dialog_new (item, GIMP_STOCK_SELECTION_STROKE,
GIMP_HELP_SELECTION_STROKE,
parent);
gtk_widget_show (dialog);
}
/* private functions */

View File

@ -24,6 +24,8 @@ void edit_undo_cmd_callback (GtkAction *action,
gpointer data);
void edit_redo_cmd_callback (GtkAction *action,
gpointer data);
void edit_undo_clear_cmd_callback (GtkAction *action,
gpointer data);
void edit_cut_cmd_callback (GtkAction *action,
gpointer data);
void edit_copy_cmd_callback (GtkAction *action,
@ -45,11 +47,6 @@ void edit_clear_cmd_callback (GtkAction *action,
void edit_fill_cmd_callback (GtkAction *action,
gint value,
gpointer data);
void edit_stroke_cmd_callback (GtkAction *action,
gpointer data);
void edit_stroke_selection (GimpItem *item,
GtkWidget *parent);
#endif /* __EDIT_COMMANDS_H__ */

View File

@ -119,7 +119,8 @@ static GimpActionEntry layers_actions[] =
GIMP_HELP_LAYER_LOWER_TO_BOTTOM },
{ "layers-anchor", GIMP_STOCK_ANCHOR,
N_("_Anchor Layer"), NULL, NULL,
N_("_Anchor Layer"), NULL,
N_("Anchor floating layer"),
G_CALLBACK (layers_anchor_cmd_callback),
GIMP_HELP_LAYER_ANCHOR },

View File

@ -177,10 +177,10 @@ layers_raise_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_image_raise_layer (gimage, active_layer);
gimp_image_raise_layer (gimage, layer);
gimp_image_flush (gimage);
}
@ -189,10 +189,10 @@ layers_lower_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_image_lower_layer (gimage, active_layer);
gimp_image_lower_layer (gimage, layer);
gimp_image_flush (gimage);
}
@ -201,10 +201,10 @@ layers_raise_to_top_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_image_raise_layer_to_top (gimage, active_layer);
gimp_image_raise_layer_to_top (gimage, layer);
gimp_image_flush (gimage);
}
@ -213,10 +213,10 @@ layers_lower_to_bottom_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_image_lower_layer_to_bottom (gimage, active_layer);
gimp_image_lower_layer_to_bottom (gimage, layer);
gimp_image_flush (gimage);
}
@ -237,13 +237,13 @@ layers_duplicate_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GimpLayer *new_layer;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
new_layer =
GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (active_layer),
G_TYPE_FROM_INSTANCE (active_layer),
GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (layer),
G_TYPE_FROM_INSTANCE (layer),
TRUE));
gimp_image_add_layer (gimage, new_layer, -1);
@ -255,12 +255,12 @@ layers_anchor_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (gimp_layer_is_floating_sel (active_layer))
if (gimp_layer_is_floating_sel (layer))
{
floating_sel_anchor (active_layer);
floating_sel_anchor (layer);
gimp_image_flush (gimage);
}
}
@ -270,11 +270,10 @@ layers_merge_down_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_image_merge_down (gimage, active_layer,
gimp_get_user_context (gimage->gimp),
gimp_image_merge_down (gimage, layer, action_data_get_context (data),
GIMP_EXPAND_AS_NECESSARY);
gimp_image_flush (gimage);
}
@ -284,13 +283,13 @@ layers_delete_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (gimp_layer_is_floating_sel (active_layer))
floating_sel_remove (active_layer);
if (gimp_layer_is_floating_sel (layer))
floating_sel_remove (layer);
else
gimp_image_remove_layer (gimage, active_layer);
gimp_image_remove_layer (gimage, layer);
gimp_image_flush (gimage);
}
@ -300,11 +299,11 @@ layers_text_discard_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (GIMP_IS_TEXT_LAYER (active_layer))
gimp_text_layer_discard (GIMP_TEXT_LAYER (active_layer));
if (GIMP_IS_TEXT_LAYER (layer))
gimp_text_layer_discard (GIMP_TEXT_LAYER (layer));
}
void
@ -312,12 +311,12 @@ layers_resize_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GtkWidget *widget;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
return_if_no_widget (widget, data);
layers_resize_layer_query (gimage, active_layer, widget);
layers_resize_layer_query (gimage, layer, widget);
}
void
@ -325,11 +324,10 @@ layers_resize_to_image_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
gimp_layer_resize_to_image (active_layer,
gimp_get_user_context (gimage->gimp));
gimp_layer_resize_to_image (layer, action_data_get_context (data));
gimp_image_flush (gimage);
}
@ -338,13 +336,13 @@ layers_scale_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GtkWidget *widget;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
return_if_no_widget (widget, data);
layers_scale_layer_query (GIMP_IS_DISPLAY (data) ? data : NULL,
gimage, active_layer, widget);
gimage, layer, widget);
}
void
@ -352,10 +350,10 @@ layers_crop_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
gint x1, y1, x2, y2;
gint off_x, off_y;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
if (! gimp_channel_bounds (gimp_image_get_mask (gimage),
&x1, &y1, &x2, &y2))
@ -364,7 +362,7 @@ layers_crop_cmd_callback (GtkAction *action,
return;
}
gimp_item_offsets (GIMP_ITEM (active_layer), &off_x, &off_y);
gimp_item_offsets (GIMP_ITEM (layer), &off_x, &off_y);
off_x -= x1;
off_y -= y1;
@ -372,8 +370,7 @@ layers_crop_cmd_callback (GtkAction *action,
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_ITEM_RESIZE,
_("Crop Layer"));
gimp_item_resize (GIMP_ITEM (active_layer),
gimp_get_user_context (gimage->gimp),
gimp_item_resize (GIMP_ITEM (layer), action_data_get_context (data),
x2 - x1, y2 - y1, off_x, off_y);
gimp_image_undo_group_end (gimage);
@ -386,12 +383,12 @@ layers_mask_add_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GtkWidget *widget;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
return_if_no_widget (widget, data);
layers_add_mask_query (active_layer, widget);
layers_add_mask_query (layer, widget);
}
void
@ -399,12 +396,12 @@ layers_mask_apply_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (gimp_layer_get_mask (active_layer))
if (gimp_layer_get_mask (layer))
{
gimp_layer_apply_mask (active_layer, GIMP_MASK_APPLY, TRUE);
gimp_layer_apply_mask (layer, GIMP_MASK_APPLY, TRUE);
gimp_image_flush (gimage);
}
}
@ -414,12 +411,12 @@ layers_mask_delete_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (gimp_layer_get_mask (active_layer))
if (gimp_layer_get_mask (layer))
{
gimp_layer_apply_mask (active_layer, GIMP_MASK_DISCARD, TRUE);
gimp_layer_apply_mask (layer, GIMP_MASK_DISCARD, TRUE);
gimp_image_flush (gimage);
}
}
@ -431,13 +428,13 @@ layers_mask_to_selection_cmd_callback (GtkAction *action,
{
GimpChannelOps op;
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GimpLayerMask *mask;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
op = (GimpChannelOps) value;
mask = gimp_layer_get_mask (active_layer);
mask = gimp_layer_get_mask (layer);
if (mask)
{
@ -459,12 +456,12 @@ layers_alpha_add_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (active_layer)))
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
{
gimp_layer_add_alpha (active_layer);
gimp_layer_add_alpha (layer);
gimp_image_flush (gimage);
}
}
@ -476,13 +473,13 @@ layers_alpha_to_selection_cmd_callback (GtkAction *action,
{
GimpChannelOps op;
GimpImage *gimage;
GimpLayer *active_layer;
return_if_no_layer (gimage, active_layer, data);
GimpLayer *layer;
return_if_no_layer (gimage, layer, data);
op = (GimpChannelOps) value;
gimp_channel_select_alpha (gimp_image_get_mask (gimage),
GIMP_DRAWABLE (active_layer),
GIMP_DRAWABLE (layer),
op, FALSE, 0.0, 0.0);
gimp_image_flush (gimage);
}
@ -506,7 +503,7 @@ layers_flatten_image_cmd_callback (GtkAction *action,
GimpImage *gimage;
return_if_no_image (gimage, data);
gimp_image_flatten (gimage, gimp_get_user_context (gimage->gimp));
gimp_image_flatten (gimage, action_data_get_context (data));
gimp_image_flush (gimage);
}
@ -515,12 +512,12 @@ layers_text_tool_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GtkWidget *widget;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
return_if_no_widget (widget, data);
layers_text_tool (active_layer, widget);
layers_text_tool (layer, widget);
}
void
@ -528,12 +525,12 @@ layers_edit_attributes_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpLayer *active_layer;
GimpLayer *layer;
GtkWidget *widget;
return_if_no_layer (gimage, active_layer, data);
return_if_no_layer (gimage, layer, data);
return_if_no_widget (widget, data);
layers_edit_layer_query (active_layer, widget);
layers_edit_layer_query (layer, widget);
}
void

View File

@ -41,21 +41,27 @@
static GimpActionEntry select_actions[] =
{
{ "select-menu", NULL,
N_("_Select") },
{ "selection-editor-popup", GIMP_STOCK_TOOL_RECT_SELECT,
N_("Selection Editor Menu"), NULL, NULL, NULL,
GIMP_HELP_SELECTION_DIALOG },
{ "select-menu", NULL, N_("_Select") },
{ "select-all", GIMP_STOCK_SELECTION_ALL,
N_("_All"), "<control>A", NULL,
N_("_All"), "<control>A",
N_("Select all"),
G_CALLBACK (select_all_cmd_callback),
GIMP_HELP_SELECTION_ALL },
{ "select-none", GIMP_STOCK_SELECTION_NONE,
N_("_None"), "<control><shift>A", NULL,
N_("_None"), "<control><shift>A",
N_("Select none"),
G_CALLBACK (select_none_cmd_callback),
GIMP_HELP_SELECTION_NONE },
{ "select-invert", GIMP_STOCK_INVERT,
N_("_Invert"), "<control>I", NULL,
N_("_Invert"), "<control>I",
N_("Invert selection"),
G_CALLBACK (select_invert_cmd_callback),
GIMP_HELP_SELECTION_INVERT },
@ -95,12 +101,20 @@ static GimpActionEntry select_actions[] =
GIMP_HELP_SELECTION_BORDER },
{ "select-save", GIMP_STOCK_SELECTION_TO_CHANNEL,
N_("Save to _Channel"), NULL, NULL,
N_("Save to _Channel"), NULL,
N_("Save selection to channel"),
G_CALLBACK (select_save_cmd_callback),
GIMP_HELP_SELECTION_TO_CHANNEL },
{ "select-stroke", GIMP_STOCK_SELECTION_STROKE,
N_("_Stroke Selection..."), NULL,
N_("Stroke selection"),
G_CALLBACK (select_stroke_cmd_callback),
GIMP_HELP_SELECTION_STROKE },
{ "select-to-vectors", GIMP_STOCK_SELECTION_TO_PATH,
N_("To _Path"), NULL, NULL,
N_("To _Path"), NULL,
N_("Selection to path"),
G_CALLBACK (vectors_selection_to_vectors_cmd_callback),
GIMP_HELP_SELECTION_TO_PATH }
};
@ -118,40 +132,41 @@ void
select_actions_update (GimpActionGroup *group,
gpointer data)
{
GimpImage *gimage;
GimpVectors *vectors = NULL;
gboolean fs = FALSE;
gboolean lp = FALSE;
gboolean sel = FALSE;
GimpImage *gimage;
GimpDrawable *drawable = NULL;
GimpVectors *vectors = NULL;
gboolean fs = FALSE;
gboolean sel = FALSE;
gimage = action_data_get_image (data);
if (gimage)
{
fs = (gimp_image_floating_sel (gimage) != NULL);
lp = ! gimp_image_is_empty (gimage);
sel = ! gimp_channel_is_empty (gimp_image_get_mask (gimage));
drawable = gimp_image_active_drawable (gimage);
vectors = gimp_image_get_active_vectors (gimage);
vectors = gimp_image_get_active_vectors (gimage);
fs = (gimp_image_floating_sel (gimage) != NULL);
sel = ! gimp_channel_is_empty (gimp_image_get_mask (gimage));
}
#define SET_SENSITIVE(action,condition) \
gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
SET_SENSITIVE ("select-all", lp);
SET_SENSITIVE ("select-none", lp && sel);
SET_SENSITIVE ("select-invert", lp && sel);
SET_SENSITIVE ("select-from-vectors", lp && vectors);
SET_SENSITIVE ("select-float", lp && sel);
SET_SENSITIVE ("select-all", drawable);
SET_SENSITIVE ("select-none", drawable && sel);
SET_SENSITIVE ("select-invert", drawable && sel);
SET_SENSITIVE ("select-from-vectors", vectors);
SET_SENSITIVE ("select-float", drawable && sel);
SET_SENSITIVE ("select-feather", lp && sel);
SET_SENSITIVE ("select-sharpen", lp && sel);
SET_SENSITIVE ("select-shrink", lp && sel);
SET_SENSITIVE ("select-grow", lp && sel);
SET_SENSITIVE ("select-border", lp && sel);
SET_SENSITIVE ("select-feather", drawable && sel);
SET_SENSITIVE ("select-sharpen", drawable && sel);
SET_SENSITIVE ("select-shrink", drawable && sel);
SET_SENSITIVE ("select-grow", drawable && sel);
SET_SENSITIVE ("select-border", drawable && sel);
SET_SENSITIVE ("select-save", sel && !fs);
SET_SENSITIVE ("select-to-vectors", sel && !fs);
SET_SENSITIVE ("select-save", drawable && sel && !fs);
SET_SENSITIVE ("select-stroke", drawable && sel);
SET_SENSITIVE ("select-to-vectors", drawable && sel && !fs);
#undef SET_SENSITIVE
}

View File

@ -38,6 +38,7 @@
#include "display/gimpdisplayshell.h"
#include "gui/dialogs.h"
#include "gui/stroke-dialog.h"
#include "actions.h"
#include "select-commands.h"
@ -274,6 +275,46 @@ select_save_cmd_callback (GtkAction *action,
"gimp-channel-list", -1);
}
void
select_stroke_cmd_callback (GtkAction *action,
gpointer data)
{
GimpImage *gimage;
GimpDrawable *drawable;
GtkWidget *widget;
return_if_no_drawable (gimage, drawable, data);
return_if_no_widget (widget, data);
select_stroke (GIMP_ITEM (gimp_image_get_mask (gimage)), widget);
}
void
select_stroke (GimpItem *item,
GtkWidget *parent)
{
GimpImage *gimage;
GimpDrawable *active_drawable;
GtkWidget *dialog;
g_return_if_fail (GIMP_IS_ITEM (item));
g_return_if_fail (GTK_IS_WIDGET (parent));
gimage = gimp_item_get_image (item);
active_drawable = gimp_image_active_drawable (gimage);
if (! active_drawable)
{
g_message (_("There is no active layer or channel to stroke to."));
return;
}
dialog = stroke_dialog_new (item, GIMP_STOCK_SELECTION_STROKE,
GIMP_HELP_SELECTION_STROKE,
parent);
gtk_widget_show (dialog);
}
/* private functions */

View File

@ -42,6 +42,11 @@ void select_grow_cmd_callback (GtkAction *action,
gpointer data);
void select_save_cmd_callback (GtkAction *action,
gpointer data);
void select_stroke_cmd_callback (GtkAction *action,
gpointer data);
void select_stroke (GimpItem *item,
GtkWidget *parent);
#endif /* __SELECT_COMMANDS_H__ */

View File

@ -93,13 +93,9 @@ static GimpActionEntry vectors_actions[] =
G_CALLBACK (vectors_lower_to_bottom_cmd_callback),
GIMP_HELP_PATH_LOWER_TO_BOTTOM },
{ "vectors-selection-to-vectors", GIMP_STOCK_SELECTION_TO_PATH,
N_("Selecti_on to Path"), NULL, NULL,
G_CALLBACK (vectors_selection_to_vectors_cmd_callback),
GIMP_HELP_SELECTION_TO_PATH },
{ "vectors-stroke", GIMP_STOCK_PATH_STROKE,
N_("Stro_ke Path..."), NULL, NULL,
N_("Stro_ke Path..."), NULL,
N_("Stroke path"),
G_CALLBACK (vectors_stroke_cmd_callback),
GIMP_HELP_PATH_STROKE },
@ -147,6 +143,19 @@ static GimpEnumActionEntry vectors_to_selection_actions[] =
GIMP_HELP_PATH_SELECTION_INTERSECT }
};
static GimpEnumActionEntry vectors_selection_to_vectors_actions[] =
{
{ "vectors-selection-to-vectors", GIMP_STOCK_SELECTION_TO_PATH,
N_("Selecti_on to Path"), NULL, NULL,
FALSE,
GIMP_HELP_SELECTION_TO_PATH },
{ "vectors-selection-to-vectors-advanced", GIMP_STOCK_SELECTION_TO_PATH,
N_("Selection to Path (_Advanced)"), NULL, NULL,
TRUE,
GIMP_HELP_SELECTION_TO_PATH }
};
void
vectors_actions_setup (GimpActionGroup *group)
@ -159,6 +168,11 @@ vectors_actions_setup (GimpActionGroup *group)
vectors_to_selection_actions,
G_N_ELEMENTS (vectors_to_selection_actions),
G_CALLBACK (vectors_to_selection_cmd_callback));
gimp_action_group_add_enum_actions (group,
vectors_selection_to_vectors_actions,
G_N_ELEMENTS (vectors_selection_to_vectors_actions),
G_CALLBACK (vectors_selection_to_vectors_cmd_callback));
}
void

View File

@ -194,12 +194,13 @@ vectors_to_selection_cmd_callback (GtkAction *action,
void
vectors_selection_to_vectors_cmd_callback (GtkAction *action,
gint value,
gpointer data)
{
GimpImage *gimage;
return_if_no_image (gimage, data);
vectors_selection_to_vectors (gimage, FALSE);
vectors_selection_to_vectors (gimage, value);
}
void

View File

@ -40,6 +40,7 @@ void vectors_to_selection_cmd_callback (GtkAction *action,
gint value,
gpointer data);
void vectors_selection_to_vectors_cmd_callback (GtkAction *action,
gint value,
gpointer data);
void vectors_stroke_cmd_callback (GtkAction *action,
gpointer data);

View File

@ -411,7 +411,6 @@ dialogs_document_list_new (GimpDialogFactory *factory,
context->gimp->documents,
context,
preview_size, 1,
file_file_open_dialog,
factory->menu_factory);
return dialogs_dockable_new (view,
@ -614,7 +613,6 @@ dialogs_document_grid_new (GimpDialogFactory *factory,
context->gimp->documents,
context,
preview_size, 1,
file_file_open_dialog,
factory->menu_factory);
return dialogs_dockable_new (view,
@ -695,9 +693,8 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpVectorsTreeView *vectors_view;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
if (preview_size < 1)
preview_size = context->gimp->config->layer_preview_size;
@ -713,11 +710,6 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory,
factory->menu_factory, "<Vectors>",
"/vectors-popup");
vectors_view = GIMP_VECTORS_TREE_VIEW (view);
vectors_view->stroke_item_func = vectors_stroke_vectors;
vectors_view->selection_to_vectors_func = vectors_selection_to_vectors;
dockable = dialogs_dockable_new (view,
_("Paths"), NULL,
GIMP_STOCK_PATHS,
@ -758,14 +750,11 @@ dialogs_histogram_editor_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpHistogramEditor *histogram_editor;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
view = gimp_histogram_editor_new (gimp_context_get_image (context));
histogram_editor = GIMP_HISTOGRAM_EDITOR (view);
dockable = dialogs_dockable_new (view,
_("Histogram"), NULL,
GIMP_STOCK_HISTOGRAM,
@ -781,16 +770,11 @@ dialogs_selection_editor_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpSelectionEditor *selection_editor;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
view = gimp_selection_editor_new (gimp_context_get_image (context));
selection_editor = GIMP_SELECTION_EDITOR (view);
selection_editor->stroke_item_func = edit_stroke_selection;
selection_editor->selection_to_vectors_func = vectors_selection_to_vectors;
view = gimp_selection_editor_new (gimp_context_get_image (context),
factory->menu_factory);
dockable = dialogs_dockable_new (view,
_("Selection"), _("Selection Editor"),
@ -811,7 +795,8 @@ dialogs_undo_history_new (GimpDialogFactory *factory,
GtkWidget *dockable;
GimpImage *gimage;
editor = gimp_undo_editor_new (context->gimp->config);
editor = gimp_undo_editor_new (context->gimp->config,
factory->menu_factory);
gimage = gimp_context_get_image (context);
if (gimage)

View File

@ -411,7 +411,6 @@ dialogs_document_list_new (GimpDialogFactory *factory,
context->gimp->documents,
context,
preview_size, 1,
file_file_open_dialog,
factory->menu_factory);
return dialogs_dockable_new (view,
@ -614,7 +613,6 @@ dialogs_document_grid_new (GimpDialogFactory *factory,
context->gimp->documents,
context,
preview_size, 1,
file_file_open_dialog,
factory->menu_factory);
return dialogs_dockable_new (view,
@ -695,9 +693,8 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpVectorsTreeView *vectors_view;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
if (preview_size < 1)
preview_size = context->gimp->config->layer_preview_size;
@ -713,11 +710,6 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory,
factory->menu_factory, "<Vectors>",
"/vectors-popup");
vectors_view = GIMP_VECTORS_TREE_VIEW (view);
vectors_view->stroke_item_func = vectors_stroke_vectors;
vectors_view->selection_to_vectors_func = vectors_selection_to_vectors;
dockable = dialogs_dockable_new (view,
_("Paths"), NULL,
GIMP_STOCK_PATHS,
@ -758,14 +750,11 @@ dialogs_histogram_editor_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpHistogramEditor *histogram_editor;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
view = gimp_histogram_editor_new (gimp_context_get_image (context));
histogram_editor = GIMP_HISTOGRAM_EDITOR (view);
dockable = dialogs_dockable_new (view,
_("Histogram"), NULL,
GIMP_STOCK_HISTOGRAM,
@ -781,16 +770,11 @@ dialogs_selection_editor_new (GimpDialogFactory *factory,
GimpContext *context,
gint preview_size)
{
GimpSelectionEditor *selection_editor;
GtkWidget *view;
GtkWidget *dockable;
GtkWidget *view;
GtkWidget *dockable;
view = gimp_selection_editor_new (gimp_context_get_image (context));
selection_editor = GIMP_SELECTION_EDITOR (view);
selection_editor->stroke_item_func = edit_stroke_selection;
selection_editor->selection_to_vectors_func = vectors_selection_to_vectors;
view = gimp_selection_editor_new (gimp_context_get_image (context),
factory->menu_factory);
dockable = dialogs_dockable_new (view,
_("Selection"), _("Selection Editor"),
@ -811,7 +795,8 @@ dialogs_undo_history_new (GimpDialogFactory *factory,
GtkWidget *dockable;
GimpImage *gimage;
editor = gimp_undo_editor_new (context->gimp->config);
editor = gimp_undo_editor_new (context->gimp->config,
factory->menu_factory);
gimage = gimp_context_get_image (context);
if (gimage)

View File

@ -260,6 +260,19 @@ menus_init (Gimp *gimp)
"colormap-editor-menu.xml", NULL,
NULL);
gimp_menu_factory_manager_register (global_menu_factory, "<SelectionEditor>",
"select",
"vectors",
NULL,
"/selection-editor-popup",
"selection-editor-menu.xml", NULL,
NULL);
gimp_menu_factory_manager_register (global_menu_factory, "<UndoEditor>",
"edit",
NULL,
NULL);
gimp_menu_factory_manager_register (global_menu_factory, "<ErrorConsole>",
"error-console",
NULL,

View File

@ -45,8 +45,6 @@
static void gimp_buffer_view_class_init (GimpBufferViewClass *klass);
static void gimp_buffer_view_init (GimpBufferView *view);
static void gimp_buffer_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_buffer_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
@ -89,7 +87,6 @@ gimp_buffer_view_class_init (GimpBufferViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_buffer_view_select_item;
editor_class->activate_item = gimp_buffer_view_activate_item;
}
@ -131,19 +128,19 @@ gimp_buffer_view_new (GimpViewType view_type,
buffer_view->paste_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "buffers",
"buffers-paste");
"buffers-paste", NULL);
buffer_view->paste_into_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "buffers",
"buffers-paste-into");
"buffers-paste-into", NULL);
buffer_view->paste_as_new_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "buffers",
"buffers-paste-as-new");
"buffers-paste-as-new", NULL);
buffer_view->delete_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "buffers",
"buffers-delete");
"buffers-delete", NULL);
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (buffer_view->paste_button),
@ -163,16 +160,6 @@ gimp_buffer_view_new (GimpViewType view_type,
return GTK_WIDGET (buffer_view);
}
static void
gimp_buffer_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
}
static void
gimp_buffer_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)

View File

@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpchanneltreeview.c
* Copyright (C) 2001-2003 Michael Natterer <mitch@gimp.org>
* Copyright (C) 2001-2004 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
@ -23,13 +23,11 @@
#include <gtk/gtk.h>
#include "libgimpmath/gimpmath.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
#include "core/gimpchannel.h"
#include "core/gimpchannel-select.h"
#include "core/gimpcontainer.h"
#include "core/gimpimage.h"
@ -48,22 +46,14 @@ static void gimp_channel_tree_view_init (GimpChannelTreeView *view)
static void gimp_channel_tree_view_view_iface_init (GimpContainerViewInterface *view_iface);
static void gimp_channel_tree_view_set_image (GimpItemTreeView *item_view,
GimpImage *gimage);
static GObject * gimp_channel_tree_view_constructor (GType type,
guint n_params,
GObjectConstructParam *params);
static void gimp_channel_tree_view_set_image (GimpItemTreeView *item_view,
GimpImage *gimage);
static gboolean gimp_channel_tree_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data);
static void gimp_channel_tree_view_set_preview_size (GimpContainerView *view);
static void gimp_channel_tree_view_toselection_clicked
(GtkWidget *widget,
GimpChannelTreeView *view);
static void gimp_channel_tree_view_toselection_extended_clicked
(GtkWidget *widget,
guint state,
GimpChannelTreeView *view);
static GimpDrawableTreeViewClass *parent_class = NULL;
static GimpContainerViewInterface *parent_view_iface = NULL;
@ -110,10 +100,13 @@ gimp_channel_tree_view_get_type (void)
static void
gimp_channel_tree_view_class_init (GimpChannelTreeViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpItemTreeViewClass *item_view_class = GIMP_ITEM_TREE_VIEW_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->constructor = gimp_channel_tree_view_constructor;
item_view_class->set_image = gimp_channel_tree_view_set_image;
item_view_class->get_container = gimp_image_get_channels;
@ -145,7 +138,30 @@ gimp_channel_tree_view_class_init (GimpChannelTreeViewClass *klass)
static void
gimp_channel_tree_view_init (GimpChannelTreeView *view)
{
gchar *str;
}
static void
gimp_channel_tree_view_view_iface_init (GimpContainerViewInterface *view_iface)
{
parent_view_iface = g_type_interface_peek_parent (view_iface);
view_iface->set_preview_size = gimp_channel_tree_view_set_preview_size;
}
static GObject *
gimp_channel_tree_view_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object;
GimpEditor *editor;
GimpChannelTreeView *view;
gchar *str;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
editor = GIMP_EDITOR (object);
view = GIMP_CHANNEL_TREE_VIEW (object);
str = g_strdup_printf (_("Channel to Selection\n"
"%s Add\n"
@ -158,12 +174,18 @@ gimp_channel_tree_view_init (GimpChannelTreeView *view)
gimp_get_mod_name_control ());
view->toselection_button =
gimp_editor_add_button (GIMP_EDITOR (view),
GIMP_STOCK_SELECTION_REPLACE, str,
GIMP_HELP_CHANNEL_SELECTION_REPLACE,
G_CALLBACK (gimp_channel_tree_view_toselection_clicked),
G_CALLBACK (gimp_channel_tree_view_toselection_extended_clicked),
view);
gimp_editor_add_action_button (GIMP_EDITOR (view), "channels",
"channels-selection-replace",
"channels-selection-intersect",
GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"channels-selection-subtract",
GDK_CONTROL_MASK,
"channels-selection-add",
GDK_SHIFT_MASK,
NULL);
gimp_help_set_help_data (view->toselection_button, str,
GIMP_HELP_CHANNEL_SELECTION_REPLACE);
g_free (str);
@ -174,16 +196,7 @@ gimp_channel_tree_view_init (GimpChannelTreeView *view)
GTK_BUTTON (view->toselection_button),
GIMP_TYPE_CHANNEL);
gtk_widget_set_sensitive (view->toselection_button, FALSE);
}
static void
gimp_channel_tree_view_view_iface_init (GimpContainerViewInterface *view_iface)
{
parent_view_iface = g_type_interface_peek_parent (view_iface);
view_iface->select_item = gimp_channel_tree_view_select_item;
view_iface->set_preview_size = gimp_channel_tree_view_set_preview_size;
return object;
}
@ -226,32 +239,6 @@ gimp_channel_tree_view_set_image (GimpItemTreeView *item_view,
/* GimpContainerView methods */
static gboolean
gimp_channel_tree_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
GimpChannelTreeView *tree_view = GIMP_CHANNEL_TREE_VIEW (view);
gboolean success;
success = parent_view_iface->select_item (view, item, insert_data);
if (item_view->gimage)
{
gboolean floating_sel;
floating_sel = (gimp_image_floating_sel (item_view->gimage) != NULL);
gtk_widget_set_sensitive (GIMP_EDITOR (view)->button_box, ! floating_sel);
}
gtk_widget_set_sensitive (tree_view->toselection_button,
success && item != NULL);
return success;
}
static void
gimp_channel_tree_view_set_preview_size (GimpContainerView *view)
{
@ -266,48 +253,3 @@ gimp_channel_tree_view_set_preview_size (GimpContainerView *view)
gimp_component_editor_set_preview_size (GIMP_COMPONENT_EDITOR (channel_view->component_editor),
preview_size);
}
static void
gimp_channel_tree_view_toselection_clicked (GtkWidget *widget,
GimpChannelTreeView *view)
{
gimp_channel_tree_view_toselection_extended_clicked (widget, 0, view);
}
static void
gimp_channel_tree_view_toselection_extended_clicked (GtkWidget *widget,
guint state,
GimpChannelTreeView *view)
{
GimpImage *gimage;
GimpItem *item;
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
if (item)
{
GimpChannelOps operation = GIMP_CHANNEL_OP_REPLACE;
if (state & GDK_SHIFT_MASK)
{
if (state & GDK_CONTROL_MASK)
operation = GIMP_CHANNEL_OP_INTERSECT;
else
operation = GIMP_CHANNEL_OP_ADD;
}
else if (state & GDK_CONTROL_MASK)
{
operation = GIMP_CHANNEL_OP_SUBTRACT;
}
gimp_channel_select_channel (gimp_image_get_mask (gimage),
_("Channel to Selection"),
GIMP_CHANNEL (item),
0, 0,
operation,
FALSE, 0.0, 0.0);
gimp_image_flush (gimage);
}
}

View File

@ -333,14 +333,14 @@ gimp_colormap_editor_new (GimpImage *gimage,
GtkWidget *frame;
GtkWidget *table;
g_return_val_if_fail (! gimage || GIMP_IS_IMAGE (gimage), NULL);
g_return_val_if_fail (gimage == NULL || GIMP_IS_IMAGE (gimage), NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
editor = g_object_new (GIMP_TYPE_COLORMAP_EDITOR, NULL);
gimp_editor_create_menu (GIMP_EDITOR (editor),
menu_factory, "<ColormapEditor>",
"/colormap-editor-popup", editor);
editor = g_object_new (GIMP_TYPE_COLORMAP_EDITOR,
"menu-factory", menu_factory,
"menu-identifier", "<ColormapEditor>",
"ui-path", "/colormap-editor-popup",
NULL);
/* The palette frame */
frame = gtk_frame_new (NULL);
@ -758,7 +758,7 @@ gimp_colormap_preview_button_press (GtkWidget *widget,
GIMP_EDITOR (editor)->popup_data);
gimp_ui_manager_ui_popup (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->ui_path,
GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->popup_data,
GTK_WIDGET (editor),
NULL, NULL, NULL);
return TRUE;

View File

@ -219,6 +219,9 @@ gimp_container_editor_select_item (GtkWidget *widget,
if (klass->select_item)
klass->select_item (editor, viewable);
if (GIMP_EDITOR (editor->view)->ui_manager)
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
return TRUE;
}

View File

@ -234,7 +234,6 @@ gimp_container_grid_view_view_iface_init (GimpContainerViewInterface *view_iface
view_iface->select_item = gimp_container_grid_view_select_item;
view_iface->clear_items = gimp_container_grid_view_clear_items;
view_iface->set_preview_size = gimp_container_grid_view_set_preview_size;
}
GtkWidget *

View File

@ -714,8 +714,19 @@ gimp_container_view_item_selected (GimpContainerView *view,
private = GIMP_CONTAINER_VIEW_GET_PRIVATE (view);
/* HACK */
if (private->container && private->context)
{
gimp_context_set_by_type (private->context,
private->container->children_type,
GIMP_OBJECT (viewable));
return TRUE;
}
success = gimp_container_view_select_item (view, viewable);
#if 0
if (success && private->container && private->context)
{
GimpContext *context;
@ -739,6 +750,7 @@ gimp_container_view_item_selected (GimpContainerView *view,
g_object_unref (context);
}
#endif
return success;
}
@ -967,18 +979,8 @@ gimp_container_view_context_changed (GimpContext *context,
GimpViewable *viewable,
GimpContainerView *view)
{
GimpContainerViewPrivate *private = GIMP_CONTAINER_VIEW_GET_PRIVATE (view);
gpointer insert_data;
gboolean success = FALSE;
insert_data = g_hash_table_lookup (private->hash_table, viewable);
g_signal_emit (view, view_signals[SELECT_ITEM], 0,
viewable, insert_data, &success);
if (! success)
g_warning ("gimp_container_view_context_changed(): select_item() failed "
"(should not happen)");
if (! gimp_container_view_select_item (view, viewable))
g_warning ("%s: select_item() failed (should not happen)", G_STRFUNC);
}
static void
@ -989,10 +991,11 @@ gimp_container_view_viewable_dropped (GtkWidget *widget,
GimpContainerView *view = GIMP_CONTAINER_VIEW (data);
GimpContainerViewPrivate *private = GIMP_CONTAINER_VIEW_GET_PRIVATE (view);
if (private->context && private->container)
gimp_context_set_by_type (private->context,
private->container->children_type,
GIMP_OBJECT (viewable));
if (viewable && private->container &&
gimp_container_have (private->container, GIMP_OBJECT (viewable)))
{
gimp_container_view_item_selected (view, viewable);
}
}
static void

View File

@ -51,8 +51,6 @@
static void gimp_data_factory_view_class_init (GimpDataFactoryViewClass *klass);
static void gimp_data_factory_view_init (GimpDataFactoryView *view);
static void gimp_data_factory_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_data_factory_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_data_factory_view_tree_name_edited (GtkCellRendererText *cell,
@ -99,7 +97,6 @@ gimp_data_factory_view_class_init (GimpDataFactoryViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_data_factory_view_select_item;
editor_class->activate_item = gimp_data_factory_view_activate_item;
}
@ -211,7 +208,7 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
factory_view->edit_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), action_group,
str);
str, NULL);
g_free (str);
}
@ -222,7 +219,7 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
factory_view->new_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), action_group,
str);
str, NULL);
g_free (str);
}
@ -231,7 +228,7 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
factory_view->duplicate_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), action_group,
str);
str, NULL);
g_free (str);
@ -239,7 +236,7 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
factory_view->delete_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), action_group,
str);
str, NULL);
g_free (str);
@ -247,7 +244,7 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
factory_view->refresh_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), action_group,
str);
str, NULL);
g_free (str);
@ -268,16 +265,6 @@ gimp_data_factory_view_construct (GimpDataFactoryView *factory_view,
return TRUE;
}
static void
gimp_data_factory_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
}
static void
gimp_data_factory_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)

View File

@ -909,7 +909,7 @@ gimp_dockable_menu_end (GimpDockable *dockable)
&dialog_ui_path,
&dialog_popup_data);
if (dialog_ui_manager)
if (dialog_ui_manager && dialog_ui_path)
{
GtkWidget *child_menu_widget;
@ -942,7 +942,7 @@ gimp_dockable_show_menu (GimpDockable *dockable)
&dialog_ui_path,
&dialog_popup_data);
if (dialog_ui_manager)
if (dialog_ui_manager && dialog_ui_path)
{
GtkWidget *child_menu_widget;
GtkAction *child_menu_action;

View File

@ -21,64 +21,34 @@
#include "config.h"
#include <string.h>
#include <gtk/gtk.h>
#include "libgimpthumb/gimpthumb.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
#ifdef __GNUC__
#warning FIXME #include "display/display-types.h"
#endif
#include "display/display-types.h"
#include "core/gimp.h"
#include "core/gimpcontainer.h"
#include "core/gimpcontext.h"
#include "core/gimpimage.h"
#include "core/gimpimagefile.h"
#include "file/file-open.h"
#include "file/file-utils.h"
#include "display/gimpdisplay.h"
#include "gimpcontainerview.h"
#include "gimpdocumentview.h"
#include "gimpdnd.h"
#include "gimphelp-ids.h"
#include "gimpuimanager.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h"
static void gimp_document_view_class_init (GimpDocumentViewClass *klass);
static void gimp_document_view_init (GimpDocumentView *view);
static void gimp_document_view_class_init (GimpDocumentViewClass *klass);
static void gimp_document_view_init (GimpDocumentView *view);
static void gimp_document_view_open_clicked (GtkWidget *widget,
GimpDocumentView *view);
static void gimp_document_view_open_extended_clicked (GtkWidget *widget,
guint state,
GimpDocumentView *view);
static void gimp_document_view_remove_clicked (GtkWidget *widget,
GimpDocumentView *view);
static void gimp_document_view_refresh_clicked (GtkWidget *widget,
GimpDocumentView *view);
static void gimp_document_view_refresh_extended_clicked (GtkWidget *widget,
guint state,
GimpDocumentView *view);
static void gimp_document_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_document_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_document_view_open_image (GimpDocumentView *view,
GimpImagefile *imagefile);
static GList * gimp_document_view_drag_file (GtkWidget *widget,
gpointer data);
static void gimp_document_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static GList * gimp_document_view_drag_file (GtkWidget *widget,
gpointer data);
static GimpContainerEditorClass *parent_class = NULL;
@ -119,7 +89,6 @@ gimp_document_view_class_init (GimpDocumentViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_document_view_select_item;
editor_class->activate_item = gimp_document_view_activate_item;
}
@ -132,20 +101,17 @@ gimp_document_view_init (GimpDocumentView *view)
}
GtkWidget *
gimp_document_view_new (GimpViewType view_type,
GimpContainer *container,
GimpContext *context,
gint preview_size,
gint preview_border_width,
GimpFileOpenDialogFunc file_open_dialog_func,
GimpMenuFactory *menu_factory)
gimp_document_view_new (GimpViewType view_type,
GimpContainer *container,
GimpContext *context,
gint preview_size,
gint preview_border_width,
GimpMenuFactory *menu_factory)
{
GimpDocumentView *document_view;
GimpContainerEditor *editor;
gchar *str;
g_return_val_if_fail (file_open_dialog_func != NULL, NULL);
document_view = g_object_new (GIMP_TYPE_DOCUMENT_VIEW, NULL);
if (! gimp_container_editor_construct (GIMP_CONTAINER_EDITOR (document_view),
@ -160,8 +126,6 @@ gimp_document_view_new (GimpViewType view_type,
return NULL;
}
document_view->file_open_dialog_func = file_open_dialog_func;
editor = GIMP_CONTAINER_EDITOR (document_view);
str = g_strdup_printf (_("Open the selected entry\n"
@ -171,22 +135,27 @@ gimp_document_view_new (GimpViewType view_type,
gimp_get_mod_name_control ());
document_view->open_button =
gimp_editor_add_button (GIMP_EDITOR (editor->view),
GTK_STOCK_OPEN, str,
GIMP_HELP_DOCUMENT_OPEN,
G_CALLBACK (gimp_document_view_open_clicked),
G_CALLBACK (gimp_document_view_open_extended_clicked),
editor);
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "documents",
"documents-open",
"documents-raise-or-open",
GDK_SHIFT_MASK,
"documents-file-open-dialog",
GDK_CONTROL_MASK,
NULL);
gimp_help_set_help_data (document_view->open_button, str,
GIMP_HELP_DOCUMENT_OPEN);
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (document_view->open_button),
GIMP_TYPE_IMAGEFILE);
g_free (str);
document_view->remove_button =
gimp_editor_add_button (GIMP_EDITOR (editor->view),
GTK_STOCK_REMOVE, _("Remove selected entry"),
GIMP_HELP_DOCUMENT_REMOVE,
G_CALLBACK (gimp_document_view_remove_clicked),
NULL,
editor);
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "documents",
"documents-remove");
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (document_view->remove_button),
GIMP_TYPE_IMAGEFILE);
str = g_strdup_printf (_("Recreate preview\n"
"%s Reload all previews\n"
@ -195,27 +164,18 @@ gimp_document_view_new (GimpViewType view_type,
gimp_get_mod_name_control ());
document_view->refresh_button =
gimp_editor_add_button (GIMP_EDITOR (editor->view),
GTK_STOCK_REFRESH, str,
GIMP_HELP_DOCUMENT_REFRESH,
G_CALLBACK (gimp_document_view_refresh_clicked),
G_CALLBACK (gimp_document_view_refresh_extended_clicked),
editor);
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "documents",
"documents-recreate-preview",
"documents-reload-previews",
GDK_SHIFT_MASK,
"documents-remove-dangling",
GDK_CONTROL_MASK,
NULL);
gimp_help_set_help_data (document_view->refresh_button, str,
GIMP_HELP_DOCUMENT_REFRESH);
g_free (str);
/* set button sensitivity */
if (GIMP_CONTAINER_EDITOR_GET_CLASS (editor)->select_item)
GIMP_CONTAINER_EDITOR_GET_CLASS (editor)->select_item
(editor, (GimpViewable *) gimp_context_get_imagefile (context));
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (document_view->open_button),
GIMP_TYPE_IMAGEFILE);
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (document_view->remove_button),
GIMP_TYPE_IMAGEFILE);
if (view_type == GIMP_VIEW_TYPE_LIST)
{
GtkWidget *dnd_widget;
@ -227,204 +187,11 @@ gimp_document_view_new (GimpViewType view_type,
editor);
}
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
return GTK_WIDGET (document_view);
}
static void
gimp_document_view_open_clicked (GtkWidget *widget,
GimpDocumentView *view)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
gimp_document_view_open_image (view, imagefile);
}
else
{
view->file_open_dialog_func (context->gimp, NULL, GTK_WIDGET (view));
}
}
typedef struct _RaiseClosure RaiseClosure;
struct _RaiseClosure
{
const gchar *name;
gboolean found;
};
static void
gimp_document_view_raise_display (gpointer data,
gpointer user_data)
{
GimpDisplay *gdisp = (GimpDisplay *) data;
RaiseClosure *closure = (RaiseClosure *) user_data;
const gchar *uri;
uri = gimp_object_get_name (GIMP_OBJECT (gdisp->gimage));
if (uri && ! strcmp (closure->name, uri))
{
closure->found = TRUE;
gtk_window_present (GTK_WINDOW (gdisp->shell));
}
}
static void
gimp_document_view_open_extended_clicked (GtkWidget *widget,
guint state,
GimpDocumentView *view)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
if (state & GDK_CONTROL_MASK)
{
view->file_open_dialog_func (context->gimp,
gimp_object_get_name (GIMP_OBJECT (imagefile)),
GTK_WIDGET (view));
}
else if (state & GDK_SHIFT_MASK)
{
RaiseClosure closure;
closure.name = gimp_object_get_name (GIMP_OBJECT (imagefile));
closure.found = FALSE;
gimp_container_foreach (context->gimp->displays,
gimp_document_view_raise_display,
&closure);
if (! closure.found)
gimp_document_view_open_image (view, imagefile);
}
}
else
{
view->file_open_dialog_func (context->gimp, NULL, GTK_WIDGET (view));
}
}
static void
gimp_document_view_remove_clicked (GtkWidget *widget,
GimpDocumentView *view)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
gimp_container_remove (container, GIMP_OBJECT (imagefile));
}
}
static void
gimp_document_view_refresh_clicked (GtkWidget *widget,
GimpDocumentView *view)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
GimpContext *context;
GimpContainer *container;
GimpImagefile *imagefile;
context = gimp_container_view_get_context (editor->view);
container = gimp_container_view_get_container (editor->view);
imagefile = gimp_context_get_imagefile (context);
if (imagefile && gimp_container_have (container, GIMP_OBJECT (imagefile)))
{
gint preview_size;
preview_size = gimp_container_view_get_preview_size (editor->view, NULL);
gimp_imagefile_create_thumbnail (imagefile, context, preview_size);
}
}
static void
gimp_document_view_delete_dangling_foreach (GimpImagefile *imagefile,
GimpContainerView *view)
{
if (gimp_thumbnail_peek_image (imagefile->thumbnail) ==
GIMP_THUMB_STATE_NOT_FOUND)
{
gimp_container_remove (gimp_container_view_get_container (view),
GIMP_OBJECT (imagefile));
}
}
static void
gimp_document_view_refresh_extended_clicked (GtkWidget *widget,
guint state,
GimpDocumentView *view)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
GimpContainer *container;
container = gimp_container_view_get_container (editor->view);
if (state & GDK_CONTROL_MASK)
{
gimp_container_foreach (container,
(GFunc) gimp_document_view_delete_dangling_foreach,
editor->view);
}
else if (state & GDK_SHIFT_MASK)
{
gimp_container_foreach (container,
(GFunc) gimp_imagefile_update,
editor->view);
}
}
static void
gimp_document_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
GimpDocumentView *view = GIMP_DOCUMENT_VIEW (editor);
GimpContainer *container;
gboolean remove_sensitive = FALSE;
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
container = gimp_container_view_get_container (editor->view);
if (viewable && gimp_container_have (container, GIMP_OBJECT (viewable)))
{
remove_sensitive = TRUE;
}
gtk_widget_set_sensitive (view->remove_button, remove_sensitive);
}
static void
gimp_document_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)
@ -439,39 +206,7 @@ gimp_document_view_activate_item (GimpContainerEditor *editor,
if (viewable && gimp_container_have (container, GIMP_OBJECT (viewable)))
{
gimp_document_view_open_clicked (NULL, view);
}
}
static void
gimp_document_view_open_image (GimpDocumentView *view,
GimpImagefile *imagefile)
{
GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (view);
Gimp *gimp;
const gchar *uri;
GimpImage *gimage;
GimpPDBStatusType status;
GError *error = NULL;
gimp = gimp_container_view_get_context (editor->view)->gimp;
uri = gimp_object_get_name (GIMP_OBJECT (imagefile));
gimage = file_open_with_display (gimp, gimp_get_user_context (gimp),
uri, &status, &error);
if (! gimage && status != GIMP_PDB_CANCEL)
{
gchar *filename;
filename = file_utils_uri_to_utf8_filename (uri);
g_message (_("Opening '%s' failed:\n\n%s"),
filename, error->message);
g_clear_error (&error);
g_free (filename);
gtk_button_clicked (GTK_BUTTON (view->open_button));
}
}
@ -482,8 +217,11 @@ gimp_document_view_drag_file (GtkWidget *widget,
GimpViewable *viewable = gimp_dnd_get_drag_data (widget);
if (viewable)
return g_list_append (NULL,
g_strdup (gimp_object_get_name (GIMP_OBJECT (viewable))));
{
const gchar *uri = gimp_object_get_name (GIMP_OBJECT (viewable));
return g_list_append (NULL, g_strdup (uri));
}
return NULL;
}

View File

@ -26,11 +26,6 @@
#include "gimpcontainereditor.h"
typedef void (* GimpFileOpenDialogFunc) (Gimp *gimp,
const gchar *uri,
GtkWidget *parent);
#define GIMP_TYPE_DOCUMENT_VIEW (gimp_document_view_get_type ())
#define GIMP_DOCUMENT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DOCUMENT_VIEW, GimpDocumentView))
#define GIMP_DOCUMENT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DOCUMENT_VIEW, GimpDocumentViewClass))
@ -43,13 +38,11 @@ typedef struct _GimpDocumentViewClass GimpDocumentViewClass;
struct _GimpDocumentView
{
GimpContainerEditor parent_instance;
GimpContainerEditor parent_instance;
GimpFileOpenDialogFunc file_open_dialog_func;
GtkWidget *open_button;
GtkWidget *remove_button;
GtkWidget *refresh_button;
GtkWidget *open_button;
GtkWidget *remove_button;
GtkWidget *refresh_button;
};
struct _GimpDocumentViewClass
@ -60,13 +53,12 @@ struct _GimpDocumentViewClass
GType gimp_document_view_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_document_view_new (GimpViewType view_type,
GimpContainer *container,
GimpContext *context,
gint preview_size,
gint preview_border_width,
GimpFileOpenDialogFunc file_open_dialog_func,
GimpMenuFactory *menu_factory);
GtkWidget * gimp_document_view_new (GimpViewType view_type,
GimpContainer *container,
GimpContext *context,
gint preview_size,
gint preview_border_width,
GimpMenuFactory *menu_factory);
#endif /* __GIMP_DOCUMENT_VIEW_H__ */

View File

@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpeditor.c
* Copyright (C) 2001 Michael Natterer <mitch@gimp.org>
* Copyright (C) 2001-2004 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
@ -40,10 +40,31 @@
#define DEFAULT_BUTTON_ICON_SIZE GTK_ICON_SIZE_MENU
enum
{
PROP_0,
PROP_MENU_FACTORY,
PROP_MENU_IDENTIFIER,
PROP_UI_PATH,
PROP_POPUP_DATA
};
static void gimp_editor_class_init (GimpEditorClass *klass);
static void gimp_editor_init (GimpEditor *editor);
static void gimp_editor_docked_iface_init (GimpDockedInterface *docked_iface);
static GObject * gimp_editor_constructor (GType type,
guint n_params,
GObjectConstructParam *params);
static void gimp_editor_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_editor_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
static void gimp_editor_destroy (GtkObject *object);
static void gimp_editor_style_set (GtkWidget *widget,
GtkStyle *prev_style);
@ -98,17 +119,46 @@ gimp_editor_get_type (void)
static void
gimp_editor_class_init (GimpEditorClass *klass)
{
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = GTK_OBJECT_CLASS (klass);
widget_class = GTK_WIDGET_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->destroy = gimp_editor_destroy;
object_class->constructor = gimp_editor_constructor;
object_class->set_property = gimp_editor_set_property;
object_class->get_property = gimp_editor_get_property;
widget_class->style_set = gimp_editor_style_set;
gtk_object_class->destroy = gimp_editor_destroy;
widget_class->style_set = gimp_editor_style_set;
g_object_class_install_property (object_class, PROP_MENU_FACTORY,
g_param_spec_object ("menu-factory",
NULL, NULL,
GIMP_TYPE_MENU_FACTORY,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_MENU_IDENTIFIER,
g_param_spec_string ("menu-identifier",
NULL, NULL,
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_UI_PATH,
g_param_spec_string ("ui-path",
NULL, NULL,
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_POPUP_DATA,
g_param_spec_pointer ("popup-data",
NULL, NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
gtk_widget_class_install_style_property (widget_class,
g_param_spec_int ("content_spacing",
@ -137,11 +187,12 @@ gimp_editor_class_init (GimpEditorClass *klass)
static void
gimp_editor_init (GimpEditor *editor)
{
editor->menu_factory = NULL;
editor->ui_manager = NULL;
editor->ui_path = NULL;
editor->popup_data = NULL;
editor->button_box = NULL;
editor->menu_factory = NULL;
editor->menu_identifier = NULL;
editor->ui_manager = NULL;
editor->ui_path = NULL;
editor->popup_data = editor;
editor->button_box = NULL;
}
static void
@ -150,11 +201,106 @@ gimp_editor_docked_iface_init (GimpDockedInterface *docked_iface)
docked_iface->get_menu = gimp_editor_get_menu;
}
static GObject *
gimp_editor_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object;
GimpEditor *editor;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
editor = GIMP_EDITOR (object);
if (! editor->popup_data)
editor->popup_data = editor;
if (editor->menu_factory && editor->menu_identifier)
{
editor->ui_manager =
gimp_menu_factory_manager_new (editor->menu_factory,
editor->menu_identifier,
editor->popup_data,
FALSE);
}
return object;
}
static void
gimp_editor_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpEditor *editor = GIMP_EDITOR (object);
switch (property_id)
{
case PROP_MENU_FACTORY:
editor->menu_factory = (GimpMenuFactory *) g_value_dup_object (value);
break;
case PROP_MENU_IDENTIFIER:
editor->menu_identifier = g_value_dup_string (value);
break;
case PROP_UI_PATH:
editor->ui_path = g_value_dup_string (value);
break;
case PROP_POPUP_DATA:
editor->popup_data = g_value_get_pointer (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_editor_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GimpEditor *editor = GIMP_EDITOR (object);
switch (property_id)
{
case PROP_MENU_FACTORY:
g_value_set_object (value, editor->menu_factory);
break;
case PROP_MENU_IDENTIFIER:
g_value_set_string (value, editor->menu_identifier);
break;
case PROP_UI_PATH:
g_value_set_string (value, editor->ui_path);
break;
case PROP_POPUP_DATA:
g_value_set_pointer (value, editor->popup_data);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_editor_destroy (GtkObject *object)
{
GimpEditor *editor = GIMP_EDITOR (object);
if (editor->menu_factory)
{
g_object_unref (editor->menu_factory);
editor->menu_factory = NULL;
}
if (editor->menu_identifier)
{
g_free (editor->menu_identifier);
editor->menu_identifier = NULL;
}
if (editor->ui_manager)
{
g_object_unref (editor->ui_manager);
@ -216,21 +362,24 @@ gimp_editor_create_menu (GimpEditor *editor,
GimpMenuFactory *menu_factory,
const gchar *menu_identifier,
const gchar *ui_path,
gpointer callback_data)
gpointer popup_data)
{
g_return_if_fail (GIMP_IS_EDITOR (editor));
g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory));
g_return_if_fail (menu_identifier != NULL);
g_return_if_fail (ui_path != NULL);
editor->menu_factory = menu_factory;
if (editor->menu_factory)
g_object_unref (editor->menu_factory);
editor->menu_factory = g_object_ref (menu_factory);
if (editor->ui_manager)
g_object_unref (editor->ui_manager);
editor->ui_manager = gimp_menu_factory_manager_new (menu_factory,
menu_identifier,
callback_data,
popup_data,
FALSE);
if (editor->ui_path)
@ -238,7 +387,7 @@ gimp_editor_create_menu (GimpEditor *editor,
editor->ui_path = g_strdup (ui_path);
editor->popup_data = callback_data;
editor->popup_data = popup_data;
}
GtkWidget *
@ -328,10 +477,47 @@ gimp_editor_add_stock_box (GimpEditor *editor,
return first_button;
}
typedef struct _ExtendedAction ExtendedAction;
struct _ExtendedAction
{
GdkModifierType mod_mask;
GtkAction *action;
};
static void
gimp_editor_button_extended_actions_free (GList *list)
{
g_list_foreach (list, (GFunc) g_free, NULL);
g_list_free (list);
}
static void
gimp_editor_button_extended_clicked (GtkWidget *button,
GdkModifierType mask,
gpointer data)
{
GList *extended = g_object_get_data (G_OBJECT (button), "extended-actions");
GList *list;
for (list = extended; list; list = g_list_next (list))
{
ExtendedAction *ext = list->data;
if ((ext->mod_mask & mask) == ext->mod_mask &&
gtk_action_get_sensitive (ext->action))
{
gtk_action_activate (ext->action);
break;
}
}
}
GtkWidget *
gimp_editor_add_action_button (GimpEditor *editor,
const gchar *group_name,
const gchar *action_name)
const gchar *action_name,
...)
{
GimpActionGroup *group;
GtkAction *action;
@ -342,6 +528,8 @@ gimp_editor_add_action_button (GimpEditor *editor,
gchar *stock_id;
gchar *tooltip;
const gchar *help_id;
GList *extended = NULL;
va_list args;
g_return_val_if_fail (GIMP_IS_EDITOR (editor), NULL);
g_return_val_if_fail (action_name != NULL, NULL);
@ -373,13 +561,6 @@ gimp_editor_add_action_button (GimpEditor *editor,
if (tooltip || help_id)
gimp_help_set_help_data (button, tooltip, help_id);
#if 0
if (extended_callback)
g_signal_connect (button, "extended_clicked",
extended_callback,
callback_data);
#endif
old_child = gtk_bin_get_child (GTK_BIN (button));
if (old_child)
@ -392,6 +573,44 @@ gimp_editor_add_action_button (GimpEditor *editor,
g_free (stock_id);
g_free (tooltip);
va_start (args, action_name);
action_name = va_arg (args, const gchar *);
while (action_name)
{
GdkModifierType mod_mask;
mod_mask = va_arg (args, GdkModifierType);
action = gtk_action_group_get_action (GTK_ACTION_GROUP (group),
action_name);
if (action && mod_mask)
{
ExtendedAction *ext = g_new0 (ExtendedAction, 1);
ext->mod_mask = mod_mask;
ext->action = action;
extended = g_list_append (extended, ext);
}
action_name = va_arg (args, const gchar *);
}
va_end (args);
if (extended)
{
g_object_set_data_full (G_OBJECT (button), "extended-actions", extended,
(GDestroyNotify) gimp_editor_button_extended_actions_free);
g_signal_connect (button, "extended_clicked",
G_CALLBACK (gimp_editor_button_extended_clicked),
NULL);
}
return button;
}

View File

@ -41,6 +41,7 @@ struct _GimpEditor
GtkVBox parent_instance;
GimpMenuFactory *menu_factory;
gchar *menu_identifier;
GimpUIManager *ui_manager;
gchar *ui_path;
gpointer popup_data;
@ -62,7 +63,7 @@ void gimp_editor_create_menu (GimpEditor *editor,
GimpMenuFactory *menu_factory,
const gchar *menu_identifier,
const gchar *ui_path,
gpointer callback_data);
gpointer popup_data);
GtkWidget * gimp_editor_add_button (GimpEditor *editor,
const gchar *stock_id,
@ -79,7 +80,8 @@ GtkWidget * gimp_editor_add_stock_box (GimpEditor *editor,
GtkWidget * gimp_editor_add_action_button (GimpEditor *editor,
const gchar *group_name,
const gchar *action_name);
const gchar *action_name,
...);
void gimp_editor_set_box_style (GimpEditor *editor,
GtkBox *box);

View File

@ -41,8 +41,6 @@
static void gimp_font_view_class_init (GimpFontViewClass *klass);
static void gimp_font_view_init (GimpFontView *view);
static void gimp_font_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_font_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
@ -85,7 +83,6 @@ gimp_font_view_class_init (GimpFontViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_font_view_select_item;
editor_class->activate_item = gimp_font_view_activate_item;
}
@ -124,23 +121,13 @@ gimp_font_view_new (GimpViewType view_type,
font_view->refresh_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "fonts",
"fonts-refresh");
"fonts-refresh", NULL);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
return GTK_WIDGET (font_view);
}
static void
gimp_font_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
}
static void
gimp_font_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)

View File

@ -27,6 +27,7 @@
#include "gimpdocked.h"
#include "gimpimageeditor.h"
#include "gimpuimanager.h"
static void gimp_image_editor_class_init (GimpImageEditorClass *klass);
@ -37,10 +38,12 @@ static void gimp_image_editor_set_docked_context (GimpDocked *docked,
GimpContext *context,
GimpContext *prev_context);
static void gimp_image_editor_destroy (GtkObject *object);
static void gimp_image_editor_destroy (GtkObject *object);
static void gimp_image_editor_real_set_image (GimpImageEditor *editor,
GimpImage *gimage);
static void gimp_image_editor_real_set_image (GimpImageEditor *editor,
GimpImage *gimage);
static void gimp_image_editor_image_flush (GimpImage *gimage,
GimpImageEditor *editor);
static GimpEditorClass *parent_class = NULL;
@ -86,9 +89,7 @@ gimp_image_editor_get_type (void)
static void
gimp_image_editor_class_init (GimpImageEditorClass *klass)
{
GtkObjectClass *object_class;
object_class = GTK_OBJECT_CLASS (klass);
GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
@ -147,9 +148,7 @@ gimp_image_editor_set_docked_context (GimpDocked *docked,
static void
gimp_image_editor_destroy (GtkObject *object)
{
GimpImageEditor *editor;
editor = GIMP_IMAGE_EDITOR (object);
GimpImageEditor *editor = GIMP_IMAGE_EDITOR (object);
if (editor->gimage)
gimp_image_editor_set_image (editor, NULL);
@ -161,8 +160,18 @@ static void
gimp_image_editor_real_set_image (GimpImageEditor *editor,
GimpImage *gimage)
{
if (editor->gimage)
g_signal_handlers_disconnect_by_func (editor->gimage,
gimp_image_editor_image_flush,
editor);
editor->gimage = gimage;
if (editor->gimage)
g_signal_connect (editor->gimage, "flush",
G_CALLBACK (gimp_image_editor_image_flush),
editor);
gtk_widget_set_sensitive (GTK_WIDGET (editor), gimage != NULL);
}
@ -174,10 +183,26 @@ gimp_image_editor_set_image (GimpImageEditor *editor,
GimpImage *gimage)
{
g_return_if_fail (GIMP_IS_IMAGE_EDITOR (editor));
g_return_if_fail (! gimage || GIMP_IS_IMAGE (gimage));
g_return_if_fail (gimage == NULL || GIMP_IS_IMAGE (gimage));
if (gimage == editor->gimage)
return;
if (gimage != editor->gimage)
{
GIMP_IMAGE_EDITOR_GET_CLASS (editor)->set_image (editor, gimage);
GIMP_IMAGE_EDITOR_GET_CLASS (editor)->set_image (editor, gimage);
if (GIMP_EDITOR (editor)->ui_manager)
gimp_ui_manager_update (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->popup_data);
}
}
/* private functions */
static void
gimp_image_editor_image_flush (GimpImage *gimage,
GimpImageEditor *editor)
{
if (GIMP_EDITOR (editor)->ui_manager)
gimp_ui_manager_update (GIMP_EDITOR (editor)->ui_manager,
GIMP_EDITOR (editor)->popup_data);
}

View File

@ -42,8 +42,6 @@
static void gimp_image_view_class_init (GimpImageViewClass *klass);
static void gimp_image_view_init (GimpImageView *view);
static void gimp_image_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_image_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
@ -86,7 +84,6 @@ gimp_image_view_class_init (GimpImageViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_image_view_select_item;
editor_class->activate_item = gimp_image_view_activate_item;
}
@ -127,15 +124,15 @@ gimp_image_view_new (GimpViewType view_type,
image_view->raise_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "images",
"images-raise-views");
"images-raise-views", NULL);
image_view->new_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "images",
"images-new-view");
"images-new-view", NULL);
image_view->delete_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "images",
"images-delete");
"images-delete", NULL);
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (image_view->raise_button),
@ -153,16 +150,6 @@ gimp_image_view_new (GimpViewType view_type,
return GTK_WIDGET (image_view);
}
static void
gimp_image_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
}
static void
gimp_image_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)

View File

@ -625,7 +625,7 @@ gimp_item_tree_view_new (gint preview_size,
GimpActivateItemFunc activate_item_func,
GimpMenuFactory *menu_factory,
const gchar *menu_identifier,
const gchar *ui_identifier)
const gchar *ui_path)
{
GimpItemTreeView *item_view;
GType view_type;
@ -642,7 +642,7 @@ gimp_item_tree_view_new (gint preview_size,
g_return_val_if_fail (activate_item_func != NULL, NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
g_return_val_if_fail (menu_identifier != NULL, NULL);
g_return_val_if_fail (ui_identifier != NULL, NULL);
g_return_val_if_fail (ui_path != NULL, NULL);
if (item_type == GIMP_TYPE_LAYER)
{
@ -664,9 +664,12 @@ gimp_item_tree_view_new (gint preview_size,
}
item_view = g_object_new (view_type,
"reorderable", TRUE,
"item-type", item_type,
"signal-name", signal_name,
"reorderable", TRUE,
"menu-factory", menu_factory,
"menu-identifier", menu_identifier,
"ui-path", ui_path,
"item-type", item_type,
"signal-name", signal_name,
NULL);
gimp_container_view_set_preview_size (GIMP_CONTAINER_VIEW (item_view),
@ -676,10 +679,6 @@ gimp_item_tree_view_new (gint preview_size,
item_view->new_item_func = new_item_func;
item_view->activate_item_func = activate_item_func;
gimp_editor_create_menu (GIMP_EDITOR (item_view),
menu_factory, menu_identifier, ui_identifier,
item_view);
gimp_item_tree_view_set_image (item_view, gimage);
return GTK_WIDGET (item_view);
@ -734,6 +733,10 @@ gimp_item_tree_view_real_set_image (GimpItemTreeView *view,
gimp_item_tree_view_item_changed (view->gimage, view);
}
else
{
gimp_ui_manager_update (GIMP_EDITOR (view)->ui_manager, view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
@ -856,6 +859,8 @@ gimp_item_tree_view_select_item (GimpContainerView *view,
gtk_widget_set_sensitive (tree_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (tree_view->delete_button, delete_sensitive);
gimp_ui_manager_update (GIMP_EDITOR (tree_view)->ui_manager, tree_view);
return success;
}

View File

@ -45,6 +45,7 @@
#include "gimphelp-ids.h"
#include "gimplayertreeview.h"
#include "gimppreviewrenderer.h"
#include "gimpuimanager.h"
#include "gimpwidgets-constructors.h"
#include "gimp-intl.h"
@ -89,9 +90,6 @@ static void gimp_layer_tree_view_floating_selection_changed
(GimpImage *gimage,
GimpLayerTreeView *view);
static void gimp_layer_tree_view_anchor_clicked (GtkWidget *widget,
GimpLayerTreeView *view);
static void gimp_layer_tree_view_paint_mode_menu_callback
(GtkWidget *widget,
GimpLayerTreeView *view);
@ -319,25 +317,7 @@ gimp_layer_tree_view_init (GimpLayerTreeView *view)
gtk_widget_hide (GIMP_ITEM_TREE_VIEW (view)->edit_button);
/* Anchor button */
view->anchor_button =
gimp_editor_add_button (GIMP_EDITOR (view),
GIMP_STOCK_ANCHOR, _("Anchor Floating Layer"),
GIMP_HELP_LAYER_ANCHOR,
G_CALLBACK (gimp_layer_tree_view_anchor_clicked),
NULL,
view);
gtk_box_reorder_child (GTK_BOX (GIMP_EDITOR (view)->button_box),
view->anchor_button, 5);
gimp_container_view_enable_dnd (GIMP_CONTAINER_VIEW (view),
GTK_BUTTON (view->anchor_button),
GIMP_TYPE_LAYER);
gtk_widget_set_sensitive (view->options_box, FALSE);
gtk_widget_set_sensitive (view->anchor_button, FALSE);
view->italic_attrs = pango_attr_list_new ();
attr = pango_attr_style_new (PANGO_STYLE_ITALIC);
@ -404,6 +384,17 @@ gimp_layer_tree_view_constructor (GType type,
G_CALLBACK (gimp_layer_tree_view_mask_clicked),
layer_view);
layer_view->anchor_button =
gimp_editor_add_action_button (GIMP_EDITOR (layer_view), "layers",
"layers-anchor", NULL);
gtk_box_reorder_child (GTK_BOX (GIMP_EDITOR (layer_view)->button_box),
layer_view->anchor_button, 5);
gimp_container_view_enable_dnd (GIMP_CONTAINER_VIEW (layer_view),
GTK_BUTTON (layer_view->anchor_button),
GIMP_TYPE_LAYER);
return object;
}
@ -559,7 +550,6 @@ gimp_layer_tree_view_select_item (GimpContainerView *view,
GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (view);
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
gboolean options_sensitive = FALSE;
gboolean anchor_sensitive = FALSE;
gboolean raise_sensitive = FALSE;
gboolean success;
@ -578,8 +568,6 @@ gimp_layer_tree_view_select_item (GimpContainerView *view,
if (! success || gimp_layer_is_floating_sel (GIMP_LAYER (item)))
{
anchor_sensitive = TRUE;
gtk_widget_set_sensitive (item_view->edit_button, FALSE);
gtk_widget_set_sensitive (item_view->lower_button, FALSE);
gtk_widget_set_sensitive (item_view->duplicate_button, FALSE);
@ -598,9 +586,8 @@ gimp_layer_tree_view_select_item (GimpContainerView *view,
}
}
gtk_widget_set_sensitive (layer_view->options_box, options_sensitive);
gtk_widget_set_sensitive (item_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (layer_view->anchor_button, anchor_sensitive);
gtk_widget_set_sensitive (layer_view->options_box, options_sensitive);
gtk_widget_set_sensitive (item_view->raise_button, raise_sensitive);
return success;
}
@ -750,25 +737,6 @@ gimp_layer_tree_view_floating_selection_changed (GimpImage *gimage,
}
}
static void
gimp_layer_tree_view_anchor_clicked (GtkWidget *widget,
GimpLayerTreeView *view)
{
GimpImage *gimage;
GimpLayer *layer;
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
layer = (GimpLayer *)
GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
if (layer && gimp_layer_is_floating_sel (layer))
{
floating_sel_anchor (layer);
gimp_image_flush (gimage);
}
}
/* Paint Mode, Opacity and Preserve trans. callbacks */

View File

@ -45,6 +45,7 @@
#include "gimpselectioneditor.h"
#include "gimpdnd.h"
#include "gimphelp-ids.h"
#include "gimpmenufactory.h"
#include "gimppreview.h"
#include "gimppreviewrenderer.h"
#include "gimpwidgets-utils.h"
@ -55,25 +56,13 @@
static void gimp_selection_editor_class_init (GimpSelectionEditorClass *klass);
static void gimp_selection_editor_init (GimpSelectionEditor *selection_editor);
static GObject * gimp_selection_editor_constructor (GType type,
guint n_params,
GObjectConstructParam *params);
static void gimp_selection_editor_set_image (GimpImageEditor *editor,
GimpImage *gimage);
static void gimp_selection_editor_invert_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_selection_editor_all_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_selection_editor_none_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_selection_editor_save_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_selection_editor_path_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_selection_editor_path_extended_clicked (GtkWidget *widget,
guint state,
GimpImageEditor *editor);
static void gimp_selection_editor_stroke_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static gboolean gimp_selection_preview_button_press(GtkWidget *widget,
GdkEventButton *bevent,
GimpSelectionEditor *editor);
@ -119,104 +108,98 @@ gimp_selection_editor_get_type (void)
static void
gimp_selection_editor_class_init (GimpSelectionEditorClass* klass)
{
GimpImageEditorClass *image_editor_class;
image_editor_class = GIMP_IMAGE_EDITOR_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpImageEditorClass *image_editor_class = GIMP_IMAGE_EDITOR_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->constructor = gimp_selection_editor_constructor;
image_editor_class->set_image = gimp_selection_editor_set_image;
}
static void
gimp_selection_editor_init (GimpSelectionEditor *selection_editor)
gimp_selection_editor_init (GimpSelectionEditor *editor)
{
GtkWidget *frame;
gchar *str;
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (selection_editor), frame, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (editor), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
selection_editor->selection_to_vectors_func = NULL;
selection_editor->preview = gimp_preview_new_by_types (GIMP_TYPE_PREVIEW,
GIMP_TYPE_SELECTION,
GIMP_PREVIEW_SIZE_HUGE,
0, TRUE);
gtk_widget_set_size_request (selection_editor->preview,
editor->preview = gimp_preview_new_by_types (GIMP_TYPE_PREVIEW,
GIMP_TYPE_SELECTION,
GIMP_PREVIEW_SIZE_HUGE,
0, TRUE);
gimp_preview_renderer_set_background (GIMP_PREVIEW (editor->preview)->renderer,
GIMP_STOCK_TEXTURE);
gtk_widget_set_size_request (editor->preview,
GIMP_PREVIEW_SIZE_HUGE, GIMP_PREVIEW_SIZE_HUGE);
gimp_preview_set_expand (GIMP_PREVIEW (selection_editor->preview), TRUE);
gtk_container_add (GTK_CONTAINER (frame), selection_editor->preview);
gtk_widget_show (selection_editor->preview);
gimp_preview_set_expand (GIMP_PREVIEW (editor->preview), TRUE);
gtk_container_add (GTK_CONTAINER (frame), editor->preview);
gtk_widget_show (editor->preview);
g_signal_connect (selection_editor->preview, "button_press_event",
g_signal_connect (editor->preview, "button_press_event",
G_CALLBACK (gimp_selection_preview_button_press),
selection_editor);
editor);
gimp_dnd_color_dest_add (selection_editor->preview,
gimp_dnd_color_dest_add (editor->preview,
gimp_selection_editor_drop_color,
selection_editor);
editor);
selection_editor->all_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_SELECTION_ALL, _("Select All"),
GIMP_HELP_SELECTION_ALL,
G_CALLBACK (gimp_selection_editor_all_clicked),
NULL,
selection_editor);
gtk_widget_set_sensitive (GTK_WIDGET (editor), FALSE);
}
selection_editor->none_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_SELECTION_NONE, _("Select None"),
GIMP_HELP_SELECTION_NONE,
G_CALLBACK (gimp_selection_editor_none_clicked),
NULL,
selection_editor);
static GObject *
gimp_selection_editor_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object;
GimpSelectionEditor *editor;
gchar *str;
selection_editor->invert_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_INVERT, _("Invert Selection"),
GIMP_HELP_SELECTION_INVERT,
G_CALLBACK (gimp_selection_editor_invert_clicked),
NULL,
selection_editor);
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
selection_editor->save_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_SELECTION_TO_CHANNEL,
_("Save Selection to Channel"),
GIMP_HELP_SELECTION_TO_CHANNEL,
G_CALLBACK (gimp_selection_editor_save_clicked),
NULL,
selection_editor);
editor = GIMP_SELECTION_EDITOR (object);
str = g_strdup_printf (_("Selection to Path\n"
"%s Advanced Options"),
editor->all_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "select",
"select-all", NULL);
editor->none_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "select",
"select-none", NULL);
editor->invert_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "select",
"select-invert", NULL);
editor->save_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "select",
"select-save", NULL);
str = g_strdup_printf (_("Selection to path\n"
"%s Advanced options"),
gimp_get_mod_name_shift ());
selection_editor->path_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_SELECTION_TO_PATH, str,
GIMP_HELP_SELECTION_TO_PATH,
G_CALLBACK (gimp_selection_editor_path_clicked),
G_CALLBACK (gimp_selection_editor_path_extended_clicked),
selection_editor);
editor->path_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "vectors",
"vectors-selection-to-vectors",
"vectors-selection-to-vectors-advanced",
GDK_SHIFT_MASK,
NULL);
gimp_help_set_help_data (editor->path_button, str,
GIMP_HELP_SELECTION_TO_PATH);
g_free (str);
selection_editor->stroke_button =
gimp_editor_add_button (GIMP_EDITOR (selection_editor),
GIMP_STOCK_SELECTION_STROKE,
_("Stroke Selection"),
GIMP_HELP_SELECTION_STROKE,
G_CALLBACK (gimp_selection_editor_stroke_clicked),
NULL,
selection_editor);
editor->stroke_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor), "select",
"select-stroke", NULL);
gtk_widget_set_sensitive (GTK_WIDGET (selection_editor), FALSE);
return object;
}
static void
@ -252,20 +235,20 @@ gimp_selection_editor_set_image (GimpImageEditor *image_editor,
/* public functions */
#define PREVIEW_WIDTH 256
#define PREVIEW_HEIGHT 256
GtkWidget *
gimp_selection_editor_new (GimpImage *gimage)
gimp_selection_editor_new (GimpImage *gimage,
GimpMenuFactory *menu_factory)
{
GimpSelectionEditor *editor;
g_return_val_if_fail (gimage == NULL || GIMP_IS_IMAGE (gimage), NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
editor = g_object_new (GIMP_TYPE_SELECTION_EDITOR, NULL);
gimp_preview_renderer_set_background (GIMP_PREVIEW (editor->preview)->renderer,
GIMP_STOCK_TEXTURE);
editor = g_object_new (GIMP_TYPE_SELECTION_EDITOR,
"menu-factory", menu_factory,
"menu-identifier", "<SelectionEditor>",
"ui-path", "/selection-editor-popup",
NULL);
if (gimage)
gimp_image_editor_set_image (GIMP_IMAGE_EDITOR (editor), gimage);
@ -273,85 +256,6 @@ gimp_selection_editor_new (GimpImage *gimage)
return GTK_WIDGET (editor);
}
static void
gimp_selection_editor_invert_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
gimp_channel_invert (gimp_image_get_mask (editor->gimage), TRUE);
gimp_image_flush (editor->gimage);
}
}
static void
gimp_selection_editor_all_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
gimp_channel_all (gimp_image_get_mask (editor->gimage), TRUE);
gimp_image_flush (editor->gimage);
}
}
static void
gimp_selection_editor_none_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
gimp_channel_clear (gimp_image_get_mask (editor->gimage), NULL, TRUE);
gimp_image_flush (editor->gimage);
}
}
static void
gimp_selection_editor_save_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
gimp_selection_save (gimp_image_get_mask (editor->gimage));
}
}
static void
gimp_selection_editor_path_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
gimp_selection_editor_path_extended_clicked (widget, 0, editor);
}
static void
gimp_selection_editor_path_extended_clicked (GtkWidget *widget,
guint state,
GimpImageEditor *editor)
{
if (editor->gimage)
{
GimpSelectionEditor *sel_editor = GIMP_SELECTION_EDITOR (editor);
if (sel_editor->selection_to_vectors_func)
sel_editor->selection_to_vectors_func (editor->gimage,
(state & GDK_SHIFT_MASK) != 0);
}
}
static void
gimp_selection_editor_stroke_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
GimpSelectionEditor *sel_editor = GIMP_SELECTION_EDITOR (editor);
if (sel_editor->stroke_item_func)
sel_editor->stroke_item_func (GIMP_ITEM (gimp_image_get_mask (editor->gimage)),
GTK_WIDGET (editor));
}
}
static gboolean
gimp_selection_preview_button_press (GtkWidget *widget,
GdkEventButton *bevent,

View File

@ -35,19 +35,16 @@ typedef struct _GimpSelectionEditorClass GimpSelectionEditorClass;
struct _GimpSelectionEditor
{
GimpImageEditor parent_instance;
GimpImageEditor parent_instance;
GimpStrokeItemFunc stroke_item_func;
GimpSelectionToVectorsFunc selection_to_vectors_func;
GtkWidget *preview;
GtkWidget *preview;
GtkWidget *all_button;
GtkWidget *none_button;
GtkWidget *invert_button;
GtkWidget *save_button;
GtkWidget *path_button;
GtkWidget *stroke_button;
GtkWidget *all_button;
GtkWidget *none_button;
GtkWidget *invert_button;
GtkWidget *save_button;
GtkWidget *path_button;
GtkWidget *stroke_button;
};
struct _GimpSelectionEditorClass
@ -58,7 +55,8 @@ struct _GimpSelectionEditorClass
GType gimp_selection_editor_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_selection_editor_new (GimpImage *gimage);
GtkWidget * gimp_selection_editor_new (GimpImage *gimage,
GimpMenuFactory *menu_factory);
#endif /* __GIMP_SELECTION_EDITOR_H__ */

View File

@ -49,14 +49,11 @@
#include "gimp-intl.h"
static void gimp_template_view_class_init (GimpTemplateViewClass *klass);
static void gimp_template_view_init (GimpTemplateView *view);
static void gimp_template_view_class_init (GimpTemplateViewClass *klass);
static void gimp_template_view_init (GimpTemplateView *view);
static void gimp_template_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_template_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable);
static void gimp_template_view_tree_name_edited (GtkCellRendererText *cell,
const gchar *path_str,
const gchar *new_name,
@ -101,7 +98,6 @@ gimp_template_view_class_init (GimpTemplateViewClass *klass)
parent_class = g_type_class_peek_parent (klass);
editor_class->select_item = gimp_template_view_select_item;
editor_class->activate_item = gimp_template_view_activate_item;
}
@ -161,23 +157,23 @@ gimp_template_view_new (GimpViewType view_type,
template_view->create_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "templates",
"templates-create-image");
"templates-create-image", NULL);
template_view->new_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "templates",
"templates-new");
"templates-new", NULL);
template_view->duplicate_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "templates",
"templates-duplicate");
"templates-duplicate", NULL);
template_view->edit_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "templates",
"templates-edit");
"templates-edit", NULL);
template_view->delete_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "templates",
"templates-delete");
"templates-delete", NULL);
gimp_container_view_enable_dnd (editor->view,
GTK_BUTTON (template_view->create_button),
@ -197,16 +193,6 @@ gimp_template_view_new (GimpViewType view_type,
return GTK_WIDGET (template_view);
}
static void
gimp_template_view_select_item (GimpContainerEditor *editor,
GimpViewable *viewable)
{
if (GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item)
GIMP_CONTAINER_EDITOR_CLASS (parent_class)->select_item (editor, viewable);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);
}
static void
gimp_template_view_activate_item (GimpContainerEditor *editor,
GimpViewable *viewable)

View File

@ -125,7 +125,7 @@ gimp_tool_view_new (GimpViewType view_type,
tool_view->reset_button =
gimp_editor_add_action_button (GIMP_EDITOR (editor->view), "tools",
"tools-reset");
"tools-reset", NULL);
gimp_ui_manager_update (GIMP_EDITOR (editor->view)->ui_manager, editor);

View File

@ -35,6 +35,7 @@
#include "gimpcontainertreeview.h"
#include "gimpcontainerview.h"
#include "gimphelp-ids.h"
#include "gimpmenufactory.h"
#include "gimpundoeditor.h"
#include "gimp-intl.h"
@ -63,13 +64,6 @@ static void gimp_undo_editor_set_image (GimpImageEditor *editor,
static void gimp_undo_editor_fill (GimpUndoEditor *editor);
static void gimp_undo_editor_clear (GimpUndoEditor *editor);
static void gimp_undo_editor_undo_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_undo_editor_redo_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_undo_editor_clear_clicked (GtkWidget *widget,
GimpImageEditor *editor);
static void gimp_undo_editor_undo_event (GimpImage *gimage,
GimpUndoEvent event,
GimpUndo *undo,
@ -80,8 +74,6 @@ static void gimp_undo_editor_select_item (GimpContainerView *view,
gpointer insert_data,
GimpUndoEditor *editor);
static void gimp_undo_editor_update_buttons (GimpUndoEditor *editor);
static GimpImageEditorClass *parent_class = NULL;
@ -140,31 +132,6 @@ gimp_undo_editor_class_init (GimpUndoEditorClass *klass)
static void
gimp_undo_editor_init (GimpUndoEditor *undo_editor)
{
undo_editor->container = NULL;
undo_editor->undo_button =
gimp_editor_add_button (GIMP_EDITOR (undo_editor),
GTK_STOCK_UNDO, _("Undo"),
GIMP_HELP_EDIT_UNDO,
G_CALLBACK (gimp_undo_editor_undo_clicked),
NULL,
undo_editor);
undo_editor->redo_button =
gimp_editor_add_button (GIMP_EDITOR (undo_editor),
GTK_STOCK_REDO, _("Redo"),
GIMP_HELP_EDIT_REDO,
G_CALLBACK (gimp_undo_editor_redo_clicked),
NULL,
undo_editor);
undo_editor->clear_button =
gimp_editor_add_button (GIMP_EDITOR (undo_editor),
GTK_STOCK_CLEAR, _("Clear Undo History"),
GIMP_HELP_EDIT_UNDO_CLEAR,
G_CALLBACK (gimp_undo_editor_clear_clicked),
NULL,
undo_editor);
}
static GObject *
@ -189,6 +156,18 @@ gimp_undo_editor_constructor (GType type,
G_CALLBACK (gimp_undo_editor_select_item),
undo_editor);
undo_editor->undo_button =
gimp_editor_add_action_button (GIMP_EDITOR (undo_editor), "edit",
"edit-undo", NULL);
undo_editor->redo_button =
gimp_editor_add_action_button (GIMP_EDITOR (undo_editor), "edit",
"edit-redo", NULL);
undo_editor->clear_button =
gimp_editor_add_action_button (GIMP_EDITOR (undo_editor), "edit",
"edit-undo-clear", NULL);
return object;
}
@ -243,15 +222,20 @@ gimp_undo_editor_set_image (GimpImageEditor *image_editor,
/* public functions */
GtkWidget *
gimp_undo_editor_new (GimpCoreConfig *config)
gimp_undo_editor_new (GimpCoreConfig *config,
GimpMenuFactory *menu_factory)
{
g_return_val_if_fail (GIMP_IS_CORE_CONFIG (config), NULL);
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
return g_object_new (GIMP_TYPE_UNDO_EDITOR,
"preview-size", config->undo_preview_size,
"menu-factory", menu_factory,
"menu-identifier", "<UndoEditor>",
"preview-size", config->undo_preview_size,
NULL);
}
/* private functions */
static void
@ -329,8 +313,6 @@ gimp_undo_editor_fill (GimpUndoEditor *editor)
g_signal_handlers_unblock_by_func (editor->view,
gimp_undo_editor_select_item,
editor);
gimp_undo_editor_update_buttons (editor);
}
static void
@ -351,66 +333,6 @@ gimp_undo_editor_clear (GimpUndoEditor *editor)
}
}
static void
gimp_undo_editor_undo_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
if (gimp_image_undo (editor->gimage))
gimp_image_flush (editor->gimage);
}
}
static void
gimp_undo_editor_redo_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
if (gimp_image_redo (editor->gimage))
gimp_image_flush (editor->gimage);
}
}
static void
gimp_undo_editor_clear_callback (GtkWidget *widget,
gboolean clear,
gpointer data)
{
if (clear)
{
GimpImage *gimage = data;
gimp_image_undo_disable (gimage);
gimp_image_undo_enable (gimage);
gimp_image_flush (gimage);
}
}
static void
gimp_undo_editor_clear_clicked (GtkWidget *widget,
GimpImageEditor *editor)
{
if (editor->gimage)
{
GtkWidget *dialog;
dialog = gimp_query_boolean_box (_("Clear Undo History"),
GTK_WIDGET (editor),
gimp_standard_help_func,
GIMP_HELP_EDIT_UNDO_CLEAR,
GIMP_STOCK_QUESTION,
_("Really clear image's undo history?"),
GTK_STOCK_CLEAR, GTK_STOCK_CANCEL,
G_OBJECT (editor->gimage),
"disconnect",
gimp_undo_editor_clear_callback,
editor->gimage);
gtk_widget_show (dialog);
}
}
static void
gimp_undo_editor_undo_event (GimpImage *gimage,
GimpUndoEvent event,
@ -480,8 +402,6 @@ gimp_undo_editor_undo_event (GimpImage *gimage,
gimp_undo_editor_fill (editor);
break;
}
gimp_undo_editor_update_buttons (editor);
}
static void
@ -537,20 +457,4 @@ gimp_undo_editor_select_item (GimpContainerView *view,
}
gimp_image_flush (gimage);
gimp_undo_editor_update_buttons (editor);
}
static void
gimp_undo_editor_update_buttons (GimpUndoEditor *editor)
{
GimpImage *gimage = GIMP_IMAGE_EDITOR (editor)->gimage;
GimpUndo *top_undo_item = gimp_undo_stack_peek (gimage->undo_stack);
GimpUndo *top_redo_item = gimp_undo_stack_peek (gimage->redo_stack);
gboolean enabled = gimp_image_undo_is_enabled (gimage);
gtk_widget_set_sensitive (editor->undo_button, enabled && top_undo_item);
gtk_widget_set_sensitive (editor->redo_button, enabled && top_redo_item);
gtk_widget_set_sensitive (editor->clear_button, enabled && (top_undo_item ||
top_redo_item));
}

View File

@ -56,7 +56,8 @@ struct _GimpUndoEditorClass
GType gimp_undo_editor_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_undo_editor_new (GimpCoreConfig *config);
GtkWidget * gimp_undo_editor_new (GimpCoreConfig *config,
GimpMenuFactory *menu_factory);
#endif /* __GIMP_UNDO_EDITOR_H__ */

View File

@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpvectorstreeview.c
* Copyright (C) 2001 Michael Natterer <mitch@gimp.org>
* Copyright (C) 2001-2004 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
@ -23,14 +23,11 @@
#include <gtk/gtk.h>
#include "libgimpmath/gimpmath.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
#include "core/gimp.h"
#include "core/gimpchannel.h"
#include "core/gimpchannel-select.h"
#include "core/gimpcontainer.h"
#include "core/gimpcontext.h"
#include "core/gimpimage.h"
@ -49,35 +46,12 @@
static void gimp_vectors_tree_view_class_init (GimpVectorsTreeViewClass *klass);
static void gimp_vectors_tree_view_init (GimpVectorsTreeView *view);
static void gimp_vectors_tree_view_view_iface_init (GimpContainerViewInterface *view_iface);
static gboolean gimp_vectors_tree_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data);
static void gimp_vectors_tree_view_set_image (GimpItemTreeView *view,
GimpImage *gimage);
static void gimp_vectors_tree_view_toselection_clicked
(GtkWidget *widget,
GimpVectorsTreeView *view);
static void gimp_vectors_tree_view_toselection_extended_clicked
(GtkWidget *widget,
guint state,
GimpVectorsTreeView *view);
static void gimp_vectors_tree_view_tovectors_clicked
(GtkWidget *widget,
GimpVectorsTreeView *view);
static void gimp_vectors_tree_view_tovectors_extended_clicked
(GtkWidget *widget,
guint state,
GimpVectorsTreeView *view);
static void gimp_vectors_tree_view_stroke_clicked (GtkWidget *widget,
GimpVectorsTreeView *view);
static GObject * gimp_vectors_tree_view_constructor (GType type,
guint n_params,
GObjectConstructParam *params);
static GimpItemTreeViewClass *parent_class = NULL;
static GimpContainerViewInterface *parent_view_iface = NULL;
static GimpItemTreeViewClass *parent_class = NULL;
GType
@ -100,19 +74,9 @@ gimp_vectors_tree_view_get_type (void)
(GInstanceInitFunc) gimp_vectors_tree_view_init,
};
static const GInterfaceInfo view_iface_info =
{
(GInterfaceInitFunc) gimp_vectors_tree_view_view_iface_init,
NULL, /* iface_finalize */
NULL /* iface_data */
};
view_type = g_type_register_static (GIMP_TYPE_ITEM_TREE_VIEW,
"GimpVectorsTreeView",
&view_info, 0);
g_type_add_interface_static (view_type, GIMP_TYPE_CONTAINER_VIEW,
&view_iface_info);
}
return view_type;
@ -121,11 +85,12 @@ gimp_vectors_tree_view_get_type (void)
static void
gimp_vectors_tree_view_class_init (GimpVectorsTreeViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpItemTreeViewClass *item_view_class = GIMP_ITEM_TREE_VIEW_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
item_view_class->set_image = gimp_vectors_tree_view_set_image;
object_class->constructor = gimp_vectors_tree_view_constructor;
item_view_class->get_container = gimp_image_get_vectors;
item_view_class->get_active_item = (GimpGetItemFunc) gimp_image_get_active_vectors;
@ -156,8 +121,22 @@ gimp_vectors_tree_view_class_init (GimpVectorsTreeViewClass *klass)
static void
gimp_vectors_tree_view_init (GimpVectorsTreeView *view)
{
GimpEditor *editor = GIMP_EDITOR (view);
gchar *str;
}
static GObject *
gimp_vectors_tree_view_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
GObject *object;
GimpEditor *editor;
GimpVectorsTreeView *view;
gchar *str;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
editor = GIMP_EDITOR (object);
view = GIMP_VECTORS_TREE_VIEW (object);
/* Hide basically useless Edit button */
@ -174,12 +153,18 @@ gimp_vectors_tree_view_init (GimpVectorsTreeView *view)
gimp_get_mod_name_control ());
view->toselection_button =
gimp_editor_add_button (editor,
GIMP_STOCK_SELECTION_REPLACE, str,
GIMP_HELP_PATH_SELECTION_REPLACE,
G_CALLBACK (gimp_vectors_tree_view_toselection_clicked),
G_CALLBACK (gimp_vectors_tree_view_toselection_extended_clicked),
view);
gimp_editor_add_action_button (editor, "vectors",
"vectors-selection-replace",
"vectors-selection-intersect",
GDK_SHIFT_MASK | GDK_CONTROL_MASK,
"vectors-selection-subtract",
GDK_CONTROL_MASK,
"vectors-selection-add",
GDK_SHIFT_MASK,
NULL);
gimp_help_set_help_data (view->toselection_button, str,
GIMP_HELP_PATH_SELECTION_REPLACE);
g_free (str);
@ -188,22 +173,20 @@ gimp_vectors_tree_view_init (GimpVectorsTreeView *view)
gimp_get_mod_name_shift ());
view->tovectors_button =
gimp_editor_add_button (editor,
GIMP_STOCK_SELECTION_TO_PATH, str,
GIMP_HELP_SELECTION_TO_PATH,
G_CALLBACK (gimp_vectors_tree_view_tovectors_clicked),
G_CALLBACK (gimp_vectors_tree_view_tovectors_extended_clicked),
view);
gimp_editor_add_action_button (editor, "vectors",
"vectors-selection-to-vectors",
"vectors-selection-to-vectors-advanced",
GDK_SHIFT_MASK,
NULL);
gimp_help_set_help_data (view->tovectors_button, str,
GIMP_HELP_SELECTION_TO_PATH);
g_free (str);
view->stroke_button =
gimp_editor_add_button (editor,
GIMP_STOCK_PATH_STROKE, _("Stroke Path"),
GIMP_HELP_PATH_STROKE,
G_CALLBACK (gimp_vectors_tree_view_stroke_clicked),
NULL,
view);
gimp_editor_add_action_button (editor, "vectors",
"vectors-stroke", NULL);
gtk_box_reorder_child (GTK_BOX (editor->button_box),
view->toselection_button, 5);
@ -219,121 +202,5 @@ gimp_vectors_tree_view_init (GimpVectorsTreeView *view)
GTK_BUTTON (view->stroke_button),
GIMP_TYPE_VECTORS);
gtk_widget_set_sensitive (view->toselection_button, FALSE);
gtk_widget_set_sensitive (view->tovectors_button, FALSE);
gtk_widget_set_sensitive (view->stroke_button, FALSE);
}
static void
gimp_vectors_tree_view_view_iface_init (GimpContainerViewInterface *view_iface)
{
parent_view_iface = g_type_interface_peek_parent (view_iface);
view_iface->select_item = gimp_vectors_tree_view_select_item;
}
/* GimpContainerView methods */
static gboolean
gimp_vectors_tree_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpVectorsTreeView *tree_view = GIMP_VECTORS_TREE_VIEW (view);
gboolean success;
success = parent_view_iface->select_item (view, item, insert_data);
gtk_widget_set_sensitive (tree_view->toselection_button, item != NULL);
gtk_widget_set_sensitive (tree_view->stroke_button, item != NULL);
return success;
}
static void
gimp_vectors_tree_view_set_image (GimpItemTreeView *view,
GimpImage *gimage)
{
GIMP_ITEM_TREE_VIEW_CLASS (parent_class)->set_image (view, gimage);
gtk_widget_set_sensitive (GIMP_VECTORS_TREE_VIEW (view)->tovectors_button,
gimage != NULL);
}
static void
gimp_vectors_tree_view_toselection_clicked (GtkWidget *widget,
GimpVectorsTreeView *view)
{
gimp_vectors_tree_view_toselection_extended_clicked (widget, 0, view);
}
static void
gimp_vectors_tree_view_toselection_extended_clicked (GtkWidget *widget,
guint state,
GimpVectorsTreeView *view)
{
GimpImage *gimage;
GimpItem *item;
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
if (item)
{
GimpChannelOps operation = GIMP_CHANNEL_OP_REPLACE;
if (state & GDK_SHIFT_MASK)
{
if (state & GDK_CONTROL_MASK)
operation = GIMP_CHANNEL_OP_INTERSECT;
else
operation = GIMP_CHANNEL_OP_ADD;
}
else if (state & GDK_CONTROL_MASK)
{
operation = GIMP_CHANNEL_OP_SUBTRACT;
}
gimp_channel_select_vectors (gimp_image_get_mask (gimage),
_("Path to Selection"),
GIMP_VECTORS (item),
operation,
TRUE,
FALSE, 0, 0);
gimp_image_flush (gimage);
}
}
static void
gimp_vectors_tree_view_tovectors_clicked (GtkWidget *widget,
GimpVectorsTreeView *view)
{
gimp_vectors_tree_view_tovectors_extended_clicked (widget, 0, view);
}
static void
gimp_vectors_tree_view_tovectors_extended_clicked (GtkWidget *widget,
guint state,
GimpVectorsTreeView *view)
{
if (view->selection_to_vectors_func)
view->selection_to_vectors_func (GIMP_ITEM_TREE_VIEW (view)->gimage,
(state & GDK_SHIFT_MASK) != 0);
}
static void
gimp_vectors_tree_view_stroke_clicked (GtkWidget *widget,
GimpVectorsTreeView *view)
{
GimpImage *gimage;
GimpItem *item;
gimage = GIMP_ITEM_TREE_VIEW (view)->gimage;
item = GIMP_ITEM_TREE_VIEW_GET_CLASS (view)->get_active_item (gimage);
if (item && view->stroke_item_func)
view->stroke_item_func (item, GTK_WIDGET (view));
return object;
}

View File

@ -38,14 +38,11 @@ typedef struct _GimpVectorsTreeViewClass GimpVectorsTreeViewClass;
struct _GimpVectorsTreeView
{
GimpItemTreeView parent_instance;
GimpItemTreeView parent_instance;
GimpStrokeItemFunc stroke_item_func;
GimpSelectionToVectorsFunc selection_to_vectors_func;
GtkWidget *toselection_button;
GtkWidget *tovectors_button;
GtkWidget *stroke_button;
GtkWidget *toselection_button;
GtkWidget *tovectors_button;
GtkWidget *stroke_button;
};
struct _GimpVectorsTreeViewClass

View File

@ -147,22 +147,17 @@ typedef struct _GimpSessionInfoAux GimpSessionInfoAux;
/* function types */
typedef void (* GimpActionGroupSetupFunc) (GimpActionGroup *group);
typedef void (* GimpActionGroupUpdateFunc) (GimpActionGroup *group,
gpointer data);
typedef void (* GimpActionGroupSetupFunc) (GimpActionGroup *group);
typedef void (* GimpActionGroupUpdateFunc) (GimpActionGroup *group,
gpointer data);
typedef void (* GimpUIManagerSetupFunc) (GimpUIManager *manager,
const gchar *ui_path);
typedef void (* GimpUIManagerSetupFunc) (GimpUIManager *manager,
const gchar *ui_path);
typedef void (* GimpMenuPositionFunc) (GtkMenu *menu,
gint *x,
gint *y,
gpointer data);
typedef void (* GimpStrokeItemFunc) (GimpItem *item,
GtkWidget *parent);
typedef void (* GimpSelectionToVectorsFunc) (GimpImage *gimage,
gboolean advanced);
typedef void (* GimpMenuPositionFunc) (GtkMenu *menu,
gint *x,
gint *y,
gpointer data);
#endif /* __WIDGETS_TYPES_H__ */

View File

@ -28,6 +28,7 @@ menudata_DATA = \
palettes-menu.xml \
patterns-menu.xml \
qmask-menu.xml \
selection-editor-menu.xml \
templates-menu.xml \
tool-options-menu.xml \
tools-menu.xml \

View File

@ -65,7 +65,7 @@
<menuitem action="edit-fill-pattern" />
</placeholder>
<placeholder name="Stroke">
<menuitem action="edit-stroke" />
<menuitem action="select-stroke" />
<menuitem action="vectors-stroke" />
</placeholder>
<separator />

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ui SYSTEM "gtkuimanager.dtd">
<ui>
<popup action="selection-editor-popup">
<menuitem action="select-all" />
<menuitem action="select-none" />
<menuitem action="select-invert" />
<menuitem action="select-from-vectors" />
<menuitem action="select-float" />
<separator />
<placeholder name="Outline">
<menuitem action="select-feather" />
<menuitem action="select-sharpen" />
<menuitem action="select-shrink" />
<menuitem action="select-grow" />
<menuitem action="select-border" />
</placeholder>
<separator />
<menuitem action="select-save" />
<menuitem action="select-to-vectors" />
<menuitem action="select-stroke" />
</popup>
</ui>

24
menus/selection-menu.xml Normal file
View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ui SYSTEM "gtkuimanager.dtd">
<ui>
<popup action="selection-editor-popup">
<menuitem action="select-all" />
<menuitem action="select-none" />
<menuitem action="select-invert" />
<menuitem action="select-from-vectors" />
<menuitem action="select-float" />
<separator />
<placeholder name="Outline">
<menuitem action="select-feather" />
<menuitem action="select-sharpen" />
<menuitem action="select-shrink" />
<menuitem action="select-grow" />
<menuitem action="select-border" />
</placeholder>
<separator />
<menuitem action="select-save" />
<menuitem action="select-to-vectors" />
<menuitem action="select-stroke" />
</popup>
</ui>