Skip to content

Commit

Permalink
Fix #919. Add direct commands for flip h/v and rotate r/l.
Browse files Browse the repository at this point in the history
  • Loading branch information
cmeyer committed Feb 22, 2024
1 parent 7460af8 commit 24965f7
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 2 deletions.
62 changes: 60 additions & 2 deletions nion/swift/DocumentController.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# standard libraries
import copy
import contextlib
import dataclasses
import datetime
import functools
import gettext
Expand Down Expand Up @@ -5158,17 +5159,70 @@ def invoke(self, context: Window.ActionContext) -> Window.ActionResult:
return self.invoke_processing(context, context.model.get_subtract_region_average_new)


@dataclasses.dataclass
class TransformConfig:
flip_h: bool = False
flip_v: bool = False
transpose: bool = False


class TransformAction(ProcessingAction):
action_id = "processing.transform"
action_name = _("Transpose and Flip")

# define a general processing function which sets variables for transpose and flip
def __processing_fn(self, context: DocumentController.ActionContext, transform_config: TransformConfig, display_item: DisplayItem.DisplayItem, data_item: DataItem.DataItem, crop_region: typing.Optional[Graphics.Graphic]=None) -> typing.Optional[DataItem.DataItem]:
new_data_item = context.model.get_transpose_flip_new(display_item, data_item, crop_region)
if new_data_item:
computation = context.model.get_data_item_computation(new_data_item)
assert computation
computation.set_input_value("do_flip_h", transform_config.flip_h)
computation.set_input_value("do_flip_v", transform_config.flip_v)
computation.set_input_value("do_transpose", transform_config.transpose)
return new_data_item

def _get_default_transform_config(self) -> TransformConfig:
return TransformConfig()

def execute(self, context: Window.ActionContext) -> Window.ActionResult:
context = typing.cast(DocumentController.ActionContext, context)
return self.execute_processing(context, context.model.get_transpose_flip_new)
return self.execute_processing(context, functools.partial(self.__processing_fn, context, self._get_default_transform_config()))

def invoke(self, context: Window.ActionContext) -> Window.ActionResult:
context = typing.cast(DocumentController.ActionContext, context)
return self.invoke_processing(context, context.model.get_transpose_flip_new)
return self.invoke_processing(context, functools.partial(self.__processing_fn, context, self._get_default_transform_config()))


class FlipHorizontalAction(TransformAction):
action_id = "processing.flip_horizontal"
action_name = _("Flip Horizontal")

def _get_default_transform_config(self) -> TransformConfig:
return TransformConfig(flip_h=True)


class FlipVerticalAction(TransformAction):
action_id = "processing.flip_vertical"
action_name = _("Flip Vertical")

def _get_default_transform_config(self) -> TransformConfig:
return TransformConfig(flip_v=True)


class RotateLeftAction(TransformAction):
action_id = "processing.rotate_left"
action_name = _("Rotate Left")

def _get_default_transform_config(self) -> TransformConfig:
return TransformConfig(flip_v=True, transpose=True)


class RotateRightAction(TransformAction):
action_id = "processing.rotate_right"
action_name = _("Rotate Right")

def _get_default_transform_config(self) -> TransformConfig:
return TransformConfig(flip_h=True, transpose=True)


class UniformFilterAction(ProcessingAction):
Expand Down Expand Up @@ -5222,6 +5276,8 @@ def is_enabled(self, context: Window.ActionContext) -> bool:
Window.register_action(ExtractRedAction())
Window.register_action(FourierFilterAction())
Window.register_action(FFTAction())
Window.register_action(FlipHorizontalAction())
Window.register_action(FlipVerticalAction())
Window.register_action(GaussianFilterAction())
Window.register_action(HistogramAction())
Window.register_action(InverseFFTAction())
Expand All @@ -5242,6 +5298,8 @@ def is_enabled(self, context: Window.ActionContext) -> bool:
Window.register_action(ResampleAction())
Window.register_action(ResizeAction())
Window.register_action(RGBAction())
Window.register_action(RotateLeftAction())
Window.register_action(RotateRightAction())
Window.register_action(ScalarAction())
Window.register_action(SliceSumAction())
Window.register_action(SequenceAlignFourierAction())
Expand Down
4 changes: 4 additions & 0 deletions nion/swift/resources/changes.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
{
"version": "UNRELEASED",
"notes": [
{
"issues": ["https://github.com/nion-software/nionswift/issues/919"],
"summary": "Add menu items for flip horizontal/vertical and rotate right/left."
},
{
"issues": ["https://github.com/nion-software/nionswift/issues/1002"],
"summary": "Fix issue when removing workspace to select next most recent workspace."
Expand Down
16 changes: 16 additions & 0 deletions nion/swift/resources/menu_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,22 @@
"menu_id": "processing_transform",
"title": "Transform",
"items": [
{
"type": "item",
"action_id": "processing.flip_horizontal"
},
{
"type": "item",
"action_id": "processing.flip_vertical"
},
{
"type": "item",
"action_id": "processing.rotate_right"
},
{
"type": "item",
"action_id": "processing.rotate_left"
},
{
"type": "item",
"action_id": "processing.transform"
Expand Down

0 comments on commit 24965f7

Please sign in to comment.