2025-03-07 08:03:18 +01:00

292 lines
9.8 KiB
Python

# SPDX-FileCopyrightText: © 2022-2023 Wojciech Trybus <wojtryb@gmail.com>
# SPDX-License-Identifier: GPL-3.0-or-later
"""
Implementation of complex actions.
Make sure that every complex action implemented here has a definition in
`shortcut_composer.action` file. Otherwise the action will not be
visible in `keyboard shortcuts` menu in krita settings.
"""
import templates
from typing import List
from PyQt5.QtGui import QColor
from api_krita.enums import Tool, Toggle, BlendingMode, TransformMode
from core_components import instructions, controllers
from data_components import (
CurrentLayerStack,
PickStrategy,
Slider,
Range,
Tag,
)
infinity = float("inf")
def create_actions() -> List[templates.RawInstructions]: return [
# Switch between FREEHAND BRUSH and the MOVE tool
templates.TemporaryKey(
name="Temporary move tool",
controller=controllers.ToolController(),
low_value=Tool.FREEHAND_BRUSH,
high_value=Tool.MOVE,
),
# Switch the eraser toggle ON and OFF
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
# Ensure the preserve alpha is OFF
templates.TemporaryKey(
name="Temporary eraser",
controller=controllers.ToggleController(Toggle.ERASER),
high_value=True,
instructions=[
instructions.SetBrushOnNonPaintable(),
instructions.EnsureOff(Toggle.PRESERVE_ALPHA),
],
),
# Switch the preserve alpha toggle ON and OFF
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
# Ensure the eraser toggle is OFF
templates.TemporaryKey(
name="Temporary preserve alpha",
controller=controllers.ToggleController(Toggle.PRESERVE_ALPHA),
high_value=True,
instructions=[
instructions.SetBrushOnNonPaintable(),
instructions.EnsureOff(Toggle.ERASER),
],
),
# Run the ToggleLayerVisibility instruction
# It toggles the current layer's visibility on key press and release
templates.RawInstructions(
name="Preview current layer visibility",
instructions=[instructions.ToggleLayerVisibility()],
),
# Run the ToggleShowBelow instruction
# It toggles the visibility of layers above
templates.RawInstructions(
name="Preview projection below",
instructions=[instructions.ToggleVisibilityAbove()],
),
# Cycle between painting opacity values from values_to_cycle list
# After a long key press, go back to opacity of 100%
templates.MultipleAssignment(
name="Cycle painting opacity",
controller=controllers.OpacityController(),
instructions=[instructions.SetBrushOnNonPaintable()],
default_value=100,
values=[70, 50, 30, 100],
),
# Cycle between selection tools from values_to_cycle list.
# After a long key press, go back to the FREEHAND BRUSH tool
templates.MultipleAssignment(
name="Cycle selection tools",
controller=controllers.ToolController(),
default_value=Tool.FREEHAND_BRUSH,
values=[
Tool.FREEHAND_SELECTION,
Tool.RECTANGULAR_SELECTION,
Tool.CONTIGUOUS_SELECTION,
],
),
# Control undo and redo actions by sliding the cursor horizontally
# Start triggering the actions after passing a deadzone of 100 px
# Use UndoOnPress instruction to trigger undo key press
templates.CursorTracker(
name="Scroll undo stack",
instructions=[instructions.UndoOnPress()],
horizontal_slider=Slider(
controller=controllers.UndoController(),
values=Range(-infinity, infinity),
deadzone=100,
),
),
# Scroll all active layers by sliding the cursor vertically
# Use TemporaryOn instruction to temporarily isolate active layer
templates.CursorTracker(
name="Scroll isolated layers",
instructions=[instructions.TemporaryOn(Toggle.ISOLATE_LAYER)],
vertical_slider=Slider(
controller=controllers.ActiveLayerController(),
values=CurrentLayerStack(PickStrategy.ALL),
),
),
# Scroll timeline by sliding the cursor horizontally or
# animated layers by sliding it vertically
# Use TemporaryOn instruction to temporarily isolate active layer
templates.CursorTracker(
name="Scroll timeline or animated layers",
instructions=[instructions.TemporaryOn(Toggle.ISOLATE_LAYER)],
horizontal_slider=Slider(
controller=controllers.TimeController(),
values=Range(0, infinity),
),
vertical_slider=Slider(
controller=controllers.ActiveLayerController(),
values=CurrentLayerStack(PickStrategy.PINNED),
),
),
# Scroll brush sizes by sliding the cursor horizontally or
# brush opacity layers by sliding it vertically
# Opacity is contiguous from 10% to 100%, sizes come from a list
# Switch 1% of opacity every 5 px (instead of default 50 px)
templates.CursorTracker(
name="Scroll brush size or opacity",
horizontal_slider=Slider(
controller=controllers.BrushSizeController(),
values=[
1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 12, 14, 16, 20, 25, 30, 35, 40, 50, 60, 70, 80,
100, 120, 160, 200, 250, 300, 350, 400, 450,
500, 600, 700, 800, 900, 1000
],
sensitivity_scale=2,
),
vertical_slider=Slider(
controller=controllers.OpacityController(),
values=Range(10, 100),
sensitivity_scale=10,
),
),
# Scroll canvas rotation sizes by sliding the cursor
# horizontally or canvas zoom by sliding it vertically
templates.CursorTracker(
name="Scroll canvas zoom or rotation",
horizontal_slider=Slider(
controller=controllers.CanvasRotationController(),
values=Range(-infinity, infinity),
sensitivity_scale=10,
),
vertical_slider=Slider(
controller=controllers.CanvasZoomController(),
values=Range(0, infinity),
sensitivity_scale=10,
),
),
# Use pie menu to pick one of the sporadically used tools.
templates.PieMenu(
name="Pick misc tools",
controller=controllers.ToolController(),
values=[
Tool.CROP,
Tool.REFERENCE,
Tool.GRADIENT,
Tool.MULTI_BRUSH,
Tool.ASSISTANTS,
],
pie_radius_scale=0.9
),
# Use pie menu to pick one of the brush blending modes.
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
templates.PieMenu(
name="Pick painting blending modes",
controller=controllers.BlendingModeController(),
instructions=[instructions.SetBrushOnNonPaintable()],
values=[
BlendingMode.NORMAL,
BlendingMode.OVERLAY,
BlendingMode.COLOR,
BlendingMode.MULTIPLY,
BlendingMode.ADD,
BlendingMode.SCREEN,
BlendingMode.DARKEN,
BlendingMode.LIGHTEN,
]
),
# Use pie menu to create painting layer with selected blending mode.
templates.PieMenu(
name="Create painting layer with blending mode",
controller=controllers.CreateLayerWithBlendingController(),
values=[
BlendingMode.NORMAL,
BlendingMode.ERASE,
BlendingMode.OVERLAY,
BlendingMode.COLOR,
BlendingMode.MULTIPLY,
BlendingMode.ADD,
BlendingMode.SCREEN,
BlendingMode.DARKEN,
BlendingMode.LIGHTEN,
],
),
# Pick one of the transform tool modes.
templates.PieMenu(
name="Pick transform tool modes",
controller=controllers.TransformModeController(),
values=[
TransformMode.FREE,
TransformMode.PERSPECTIVE,
TransformMode.WARP,
TransformMode.CAGE,
TransformMode.LIQUIFY,
TransformMode.MESH,
]
),
# Use pie menu to pick one of presets from tag specified in settings.
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
templates.PieMenu(
name="Pick brush presets (red)",
controller=controllers.PresetController(),
instructions=[instructions.SetBrushOnNonPaintable()],
values=Tag("★ My Favorites"),
background_color=QColor(95, 65, 65, 190),
active_color=QColor(200, 70, 70),
),
# Use pie menu to pick one of presets from tag specified in settings.
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
templates.PieMenu(
name="Pick brush presets (green)",
controller=controllers.PresetController(),
instructions=[instructions.SetBrushOnNonPaintable()],
values=Tag("RGBA"),
background_color=QColor(65, 95, 65, 190),
active_color=QColor(70, 200, 70),
),
# Use pie menu to pick one of presets from tag specified in settings.
# Set tool to FREEHAND BRUSH if current tool does not allow to paint
templates.PieMenu(
name="Pick brush presets (blue)",
controller=controllers.PresetController(),
instructions=[instructions.SetBrushOnNonPaintable()],
values=Tag("Erasers"),
background_color=QColor(70, 70, 105, 190),
active_color=QColor(110, 160, 235),
),
templates.PieMenu(
name="Pick local brush presets",
controller=controllers.PresetController(),
instructions=[instructions.SetBrushOnNonPaintable()],
values=[],
save_local=True,
active_color=QColor(234, 172, 0),
),
# .......................................
# Insert your actions implementation here
# .......................................
]