Having no active selection no longer treats all the pixels of the canvas as selected

A performance boost for when opening large images. Also fixed an issue with pixels being selected outside of the canvas boundaries, when the selection rectangle was outside the canvas and its size got reduced.
This commit is contained in:
Manolis Papadeas 2021-01-31 15:09:54 +02:00
parent 7f1594e1bc
commit c54b74f829
9 changed files with 31 additions and 19 deletions

View file

@ -75,7 +75,7 @@ func set_pixel(image: Image, position: Vector2, color: Color) -> void:
var mirror_y = project.y_symmetry_point - position.y
var mirror_x_inside : bool
var mirror_y_inside : bool
var entire_image_selected : bool = project.selected_pixels.size() == project.size.x * project.size.y
var entire_image_selected : bool = project.selected_pixels.empty()
if entire_image_selected:
mirror_x_inside = mirror_x >= 0 and mirror_x < project.size.x
mirror_y_inside = mirror_y >= 0 and mirror_y < project.size.y

View file

@ -66,7 +66,7 @@ func _confirmed() -> void:
elif affect == ALL_PROJECTS:
for project in Global.projects:
var _pixels := []
if selection_checkbox.pressed:
if selection_checkbox.pressed and project.selected_pixels:
_pixels = project.selected_pixels.duplicate()
else:
for x in project.size.x:
@ -90,7 +90,7 @@ func set_nodes() -> void:
func _on_SelectionCheckBox_toggled(button_pressed : bool) -> void:
pixels.clear()
if button_pressed:
if button_pressed and Global.current_project.selected_pixels:
pixels = Global.current_project.selected_pixels.duplicate()
else:
for x in Global.current_project.size.x:

View file

@ -42,7 +42,6 @@ func _init(_frames := [], _name := tr("untitled"), _size := Vector2(64, 64)) ->
name = _name
size = _size
update_tile_mode_rects()
select_all_pixels()
undo_redo = UndoRedo.new()
@ -295,7 +294,6 @@ func deserialize(dict : Dictionary) -> void:
size.x = dict.size_x
size.y = dict.size_y
update_tile_mode_rects()
select_all_pixels()
if dict.has("save_path"):
OpenSave.current_save_paths[Global.projects.find(self)] = dict.save_path
if dict.has("frames"):
@ -366,8 +364,7 @@ func name_changed(value : String) -> void:
func size_changed(value : Vector2) -> void:
size = value
update_tile_mode_rects()
if Global.selection_rectangle._selected_rect.has_no_area():
select_all_pixels()
Global.selection_rectangle.set_rect(Global.selection_rectangle.get_rect())
func frames_changed(value : Array) -> void:

View file

@ -204,7 +204,7 @@ func create_palette_from_sprite() -> void:
var palette : Palette = Global.palettes[current_palette]
var pixels := []
if selection_checkbox.pressed:
if selection_checkbox.pressed and current_project.selected_pixels:
pixels = current_project.selected_pixels.duplicate()
else:
for x in current_project.size.x:

View file

@ -39,7 +39,7 @@ func set_rect(rect : Rect2) -> void:
var project : Project = Global.current_project
if rect.has_no_area():
project.select_all_pixels()
project.selected_pixels = []
else:
project.clear_selection()
for x in range(rect.position.x, rect.end.x):

View file

@ -77,8 +77,11 @@ func draw_indicator() -> void:
func _get_draw_rect() -> Rect2:
var selected_pixels = Global.current_project.selected_pixels
return Rect2(selected_pixels[0].x, selected_pixels[0].y, selected_pixels[-1].x - selected_pixels[0].x + 1, selected_pixels[-1].y - selected_pixels[0].y + 1)
if Global.current_project.selected_pixels.empty():
return Global.current_project.tile_mode_rects[Global.TileMode.NONE]
else:
var selected_pixels = Global.current_project.selected_pixels
return Rect2(selected_pixels[0].x, selected_pixels[0].y, selected_pixels[-1].x - selected_pixels[0].x + 1, selected_pixels[-1].y - selected_pixels[0].y + 1)
func _get_draw_image() -> Image:

View file

@ -94,7 +94,9 @@ func update_pattern() -> void:
func draw_start(position : Vector2) -> void:
if not position in Global.current_project.selected_pixels or Global.current_project.layers[Global.current_project.current_layer].locked:
if Global.current_project.layers[Global.current_project.current_layer].locked or !Global.current_project.tile_mode_rects[Global.TileMode.NONE].has_point(position):
return
if Global.current_project.selected_pixels and not position in Global.current_project.selected_pixels:
return
var undo_data = _get_undo_data()
if _fill_area == 0:
@ -121,7 +123,15 @@ func fill_in_color(position : Vector2) -> void:
return
image.lock()
for i in project.selected_pixels:
var pixels := []
if project.selected_pixels:
pixels = project.selected_pixels.duplicate()
else:
for x in Global.current_project.size.x:
for y in Global.current_project.size.y:
pixels.append(Vector2(x, y))
for i in pixels:
if image.get_pixelv(i).is_equal_approx(color):
_set_pixel(image, i.x, i.y, tool_slot.color)
@ -135,7 +145,7 @@ func fill_in_area(position : Vector2) -> void:
var mirror_y = project.y_symmetry_point - position.y
var mirror_x_inside : bool
var mirror_y_inside : bool
var entire_image_selected : bool = project.selected_pixels.size() == project.size.x * project.size.y
var entire_image_selected : bool = project.selected_pixels.empty()
if entire_image_selected:
mirror_x_inside = mirror_x >= 0 and mirror_x < project.size.x
mirror_y_inside = mirror_y >= 0 and mirror_y < project.size.y
@ -192,7 +202,7 @@ func _flood_fill(position : Vector2) -> void:
func _set_pixel(image : Image, x : int, y : int, color : Color) -> void:
var project : Project = Global.current_project
var entire_image_selected : bool = project.selected_pixels.size() == project.size.x * project.size.y
var entire_image_selected : bool = project.selected_pixels.empty()
if entire_image_selected:
if not _get_draw_rect().has_point(Vector2(x, y)):
return

View file

@ -281,7 +281,7 @@ func draw_tool_brush(position : Vector2) -> void:
var mirror_y = (project.y_symmetry_point + 1) - dst.y - src_rect.size.y
var mirror_x_inside : bool
var mirror_y_inside : bool
var entire_image_selected : bool = project.selected_pixels.size() == project.size.x * project.size.y
var entire_image_selected : bool = project.selected_pixels.empty()
if entire_image_selected:
mirror_x_inside = mirror_x >= 0 and mirror_x < project.size.x
mirror_y_inside = mirror_y >= 0 and mirror_y < project.size.y
@ -307,7 +307,7 @@ func draw_indicator() -> void:
draw_indicator_at(_cursor, Vector2.ZERO, Color.blue)
if Global.current_project.tile_mode and Global.current_project.get_tile_mode_rect().has_point(_cursor):
var tile := _line_start if _draw_line else _cursor
if not tile in Global.current_project.selected_pixels:
if not Global.current_project.tile_mode_rects[Global.TileMode.NONE].has_point(tile):
var offset := tile - tile.posmodv(Global.current_project.size)
draw_indicator_at(_cursor, offset, Color.green)
@ -339,7 +339,7 @@ func _set_pixel(position : Vector2) -> void:
if project.tile_mode and project.get_tile_mode_rect().has_point(position):
position = position.posmodv(project.size)
var entire_image_selected : bool = project.selected_pixels.size() == project.size.x * project.size.y
var entire_image_selected : bool = project.selected_pixels.empty()
if entire_image_selected:
if not _get_draw_rect().has_point(position):
return