diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 284c0b779..5b70881a9 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -2377,10 +2377,16 @@ msgstr "" msgid "Add Frame Tag" msgstr "" -msgid "Link Cels to" +#. An option found in the right click menu of a cel. If selected, all non-transparent pixels of that cel get selected. +msgid "Select pixels" msgstr "" -msgid "Unlink Cels" +#. An option found in the right click menu of a cel. If selected, all selected cels get linked together. +msgid "Link cels to" +msgstr "" + +#. An option found in the right click menu of a cel. If selected, all selected cels get unlinked. +msgid "Unlink cels" msgstr "" #. An option found in the right click menu of an audio cel. If selected, the audio of the audio layer will start playing from this frame. diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd index 3c3f56f09..f78441581 100644 --- a/src/UI/Canvas/Selection.gd +++ b/src/UI/Canvas/Selection.gd @@ -1042,6 +1042,25 @@ func select_cel_rect() -> void: commit_undo("Select", undo_data_tmp) +func select_cel_pixels(layer: BaseLayer, frame: Frame) -> void: + transform_content_confirm() + var project := Global.current_project + var undo_data_tmp := get_undo_data(false) + project.selection_map.crop(project.size.x, project.size.y) + project.selection_map.clear() + var current_cel := frame.cels[layer.index] + var cel_image: Image + if current_cel is GroupCel: + cel_image = (layer as GroupLayer).blend_children(frame) + else: + cel_image = current_cel.get_image() + project.selection_map.copy_from(cel_image) + project.selection_map_changed() + big_bounding_rectangle = project.selection_map.get_used_rect() + project.selection_offset = Vector2.ZERO + commit_undo("Select", undo_data_tmp) + + func _project_switched() -> void: marching_ants_outline.offset = Global.current_project.selection_offset big_bounding_rectangle = Global.current_project.selection_map.get_used_rect() diff --git a/src/UI/Timeline/CelButton.gd b/src/UI/Timeline/CelButton.gd index d145292a9..0904f4c34 100644 --- a/src/UI/Timeline/CelButton.gd +++ b/src/UI/Timeline/CelButton.gd @@ -1,6 +1,6 @@ extends Button -enum MenuOptions { PROPERTIES, DELETE, LINK, UNLINK } +enum MenuOptions { PROPERTIES, SELECT_PIXELS, DELETE, LINK, UNLINK } var frame := 0 var layer := 0 @@ -25,13 +25,7 @@ func _ready() -> void: for selected in Global.current_project.selected_cels: if selected[1] == layer and selected[0] == frame: button_pressed = true - if cel is PixelCel: - popup_menu.add_item("Delete") - popup_menu.add_item("Link Cels to") - popup_menu.add_item("Unlink Cels") - elif cel is GroupCel: - transparent_checker.visible = false - elif cel is AudioCel: + if cel is AudioCel: popup_menu.add_item("Play audio here") _is_playing_audio() Global.cel_switched.connect(_is_playing_audio) @@ -39,6 +33,14 @@ func _ready() -> void: Global.current_project.fps_changed.connect(_is_playing_audio) Global.current_project.layers[layer].audio_changed.connect(_is_playing_audio) Global.current_project.layers[layer].playback_frame_changed.connect(_is_playing_audio) + else: + popup_menu.add_item("Select pixels") + if cel is PixelCel: + popup_menu.add_item("Delete") + popup_menu.add_item("Link cels to") + popup_menu.add_item("Unlink cels") + elif cel is GroupCel: + transparent_checker.visible = false func _notification(what: int) -> void: @@ -132,19 +134,21 @@ func _on_CelButton_pressed() -> void: func _on_PopupMenu_id_pressed(id: int) -> void: + var project := Global.current_project match id: MenuOptions.PROPERTIES: properties.cel_indices = _get_cel_indices() properties.popup_centered() - MenuOptions.DELETE: - var layer_class := Global.current_project.layers[layer] + MenuOptions.SELECT_PIXELS: + var layer_class := project.layers[layer] if layer_class is AudioLayer: layer_class.playback_frame = frame else: - _delete_cel_content() + Global.canvas.selection.select_cel_pixels(layer_class, project.frames[frame]) + MenuOptions.DELETE: + _delete_cel_content() MenuOptions.LINK, MenuOptions.UNLINK: - var project := Global.current_project if id == MenuOptions.UNLINK: project.undo_redo.create_action("Unlink Cel") var selected_cels := _get_cel_indices(true)