Action system refactor
Sven Langkamp
sven.langkamp at gmail.com
Fri Feb 15 01:17:00 UTC 2013
On Wed, Feb 13, 2013 at 9:41 PM, Sven Langkamp <sven.langkamp at gmail.com> wrote:
> Hi,
>
>
> I recently got a bit fed up with the way in which we handle action
> enable/disable. Currently every place that adds new actions needs to
> implement a updateGUI method and update every action manually. In
> several place this updating logic is broke because it doesn't cover
> all the cases. I started a refactoring to clear this situation.
>
> The basic idea is as following: There is a central class which updates
> the action (KisActionManager), every KisAction (inherits from KAction
> and is a drop in replacement) has flags to control activation and
> condition that need to be met.
>
> Exampe:
> m_fillForegroundColor = new KisAction(i18n("Fill with Foreground
> Color"), this);
> m_fillForegroundColor->setActivationFlags(KisAction::ACTIVE_DEVICE);
> m_fillForegroundColor->setActivationConditions(KisAction::ACTIVE_NODE_EDITABLE);
> actionManager->addAction("fill_selection_foreground_color",
> m_fillForegroundColor, collection);
>
> In this case the action would be enabled if there is an active device
> and the active node is editable. There can ActivationFlags be multiple
> flags/conditions by combing them like option1 | option2. The action
> will only be active if one of the flags and all of the conditions are
> active.
>
> Currently I have identified these:
> enum ActivationFlag {
> NONE = 0,
> ACTIVE_NODE = 1,
> ACTIVE_DEVICE = 2,
> ACTIVE_LAYER = 4,
> ACTIVE_SHAPE_LAYER = 8,
> PIXELS_SELECTED = 16,
> SHAPES_SELECTED = 32,
> PIXEL_SELECTION_WITH_PIXELS = 64,
> PIXELS_IN_CLIPBOARD = 128,
> SHAPES_IN_CLIPBOARD = 256
> };
>
> enum ActivationCondition {
> NO_CONDITION = 0,
> ACTIVE_NODE_EDITABLE = 1,
> SELECTION_EDITABLE = 2
> };
>
> The advantage of the system is that for many actions no explicit
> update is needed, it's easier to see what the action does and it's
> consistent. One downside is that not every action is covered by this
> e.g. some action need special cases so some of the updateGUI code will
> remain.
>
> Comments?
>
>
> Sven
After going through porting more action I noticed that a few things
are currently underdefined e.g. if a layer shoud be able to be
mirrored if one of it's children is locked or if a the layer is
invisible.
I think some artists needs to go through all the action and define
when it should be enabled and disabled.
I have made a function to dump all the flags and conditions. Current
state is this:
-------- Copy merged --------
Action will activate on:
Pixels selected
Action will only activate if the following conditions are met:
-
-------- &Invert Selection --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- Copy Selection to New Layer --------
Action will activate on:
Pixels selected
Action will only activate if the following conditions are met:
-
-------- Cut Selection to New Layer --------
Action will activate on:
Action will only activate if the following conditions are met:
Active Node editable
-------- Fill with Foreground Color --------
Action will activate on:
Active device
Action will only activate if the following conditions are met:
Active Node editable
-------- Fill with Background Color --------
Action will activate on:
Active device
Action will only activate if the following conditions are met:
Active Node editable
-------- Fill with Pattern --------
Action will activate on:
Active device
Action will only activate if the following conditions are met:
Active Node editable
-------- Stroke selected shapes --------
Action will activate on:
Shapes selected
Action will only activate if the following conditions are met:
-
-------- Size Canvas to Size of Selection --------
Action will activate on:
Pixels selected
Action will only activate if the following conditions are met:
-
-------- Save Layer as Image... --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Size Canvas to Size of Current Layer --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Mirror Horizontally --------
Action will activate on:
Active node
Action will only activate if the following conditions are met:
Active Node editable
-------- Mirror Vertically --------
Action will activate on:
Active node
Action will only activate if the following conditions are met:
Active Node editable
-------- Duplicate current layer --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Delete current layer --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Activate next layer --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Activate previous layer --------
Action will activate on:
Active layer
Action will only activate if the following conditions are met:
-
-------- Select from Color Range... --------
Action will activate on:
Active device
Action will only activate if the following conditions are met:
Selection is editable
-------- Select Opaque --------
Action will activate on:
Active device
Action will only activate if the following conditions are met:
Selection is editable
-------- Grow Selection... --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- Shrink Selection... --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- Border Selection... --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- Feather Selection... --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- Smooth... --------
Action will activate on:
Pixel selection with pixels
Action will only activate if the following conditions are met:
Selection is editable
-------- &Scale... --------
Action will activate on:
Pixels selected
Action will only activate if the following conditions are met:
Selection is editable
More information about the kimageshop
mailing list