@@ -2,6 +2,7 @@ class_name Project
22extends Resource
33
44signal new_current_page (page : Page )
5+ signal frames_update
56
67@export var title : String = "New Animation"
78@export var framerate : float = 1.0
@@ -18,8 +19,8 @@ signal new_current_page(page: Page)
1819
1920@export var last_saved : String = "No Date"
2021
21- var _current_layer : int = 0
22- var _current_frame : int = 0
22+ var current_layer : int = 1
23+ var current_frame : int = 0
2324
2425
2526## Initializes a new project. [br]
@@ -28,62 +29,64 @@ func new_project(w: int, h: int) -> void:
2829 width = w
2930 height = h
3031
31- frames . append ( Page . new ( width , height ) )
32+ new_page ( )
3233 new_current_page .emit (frames [0 ])
34+
35+ frames_update .connect (_on_frame_update )
3336 print ("[Project] New project created" )
3437
3538
3639## Returns the current focused page in the project.
3740func get_current_page () -> Page :
38- return frames [_current_frame ]
41+ return frames [current_frame ]
3942
4043
4144## Sets the current frame to a specific index. [br]
4245## Returns [code]null[/code] if the page does not exist. [br]
4346## [param index]: The index of the page.
4447func get_page_by_index (index : int = 0 ) -> Page :
4548 if index >= 0 and index < len (frames ):
46- _current_frame = index
47- new_current_page .emit (frames [_current_frame ])
48- return frames [_current_frame ]
49+ current_frame = index
50+ new_current_page .emit (frames [current_frame ])
51+ return frames [current_frame ]
4952 return null
5053
5154
5255## Returns a page some distance removed from the focused page in the project. [br]
5356## Returns [code]null[/code] if the page does not exist. [br]
5457## [param distance]: Determines how far to grab the page.
5558func get_distant_page (distance : int = 1 ) -> Page :
56- if _current_frame + distance >= 0 and _current_frame + distance < len (frames ):
57- return frames [_current_frame + distance ]
59+ if current_frame + distance >= 0 and current_frame + distance < len (frames ):
60+ return frames [current_frame + distance ]
5861 return null
5962
6063
6164## Changes the current project page to the next page. [br]
6265## [param is_loop]: Goes back to page 0 if at the end. Adds a new page otherwise.
6366func next_page (is_loop : bool ) -> Page :
64- _current_frame += 1
65- if len (frames ) < (_current_frame + 1 ):
67+ current_frame += 1
68+ if len (frames ) < (current_frame + 1 ):
6669 if is_loop :
67- _current_frame = 0
70+ current_frame = 0
6871 else :
69- frames . append ( Page . new ( width , height ) )
70- new_current_page .emit (frames [_current_frame ])
71- return frames [_current_frame ]
72+ new_page ( )
73+ new_current_page .emit (frames [current_frame ])
74+ return frames [current_frame ]
7275
7376
7477## Changes the current project page to the previous page. Stops at frame 0.
7578func prev_page () -> Page :
76- if _current_frame > 0 :
77- _current_frame -= 1
78- new_current_page .emit (frames [_current_frame ])
79- return frames [_current_frame ]
79+ if current_frame > 0 :
80+ current_frame -= 1
81+ new_current_page .emit (frames [current_frame ])
82+ return frames [current_frame ]
8083
8184
8285## Triggers project saving elements.
8386func on_project_save () -> void :
8487 last_saved = Time .get_datetime_string_from_system (false , true )
8588
86- var tn = frames [_current_frame ].flatten ()
89+ var tn = frames [current_frame ].flatten ()
8790 if tn :
8891 tn .resize (128 , 96 , Image .INTERPOLATE_NEAREST )
8992 thumbnail = tn
@@ -95,3 +98,37 @@ func get_thumbnail() -> Texture2D:
9598 if img != null :
9699 return ImageTexture .create_from_image (img )
97100 return load ("res://system/project/placeholder_thumbnail.png" )
101+
102+
103+ ## Emit signal when page updates
104+ func _on_page_update () -> void :
105+ frames_update .emit ()
106+
107+
108+ ## Create a new blank page
109+ func new_page () -> void :
110+ var pg := Page .new (width , height )
111+ pg .page_update .connect (_on_page_update )
112+ frames .append (pg )
113+ frames_update .emit ()
114+
115+
116+ ## Switch to new frame
117+ func set_frame (idx : int ) -> void :
118+ current_frame = idx
119+ new_current_page .emit (frames [current_frame ])
120+
121+
122+ func set_layer (idx : int ) -> void :
123+ current_layer = idx
124+
125+
126+ func delete_frame (idx : int ) -> void :
127+ frames .remove_at (idx )
128+ if current_frame >= frames .size ():
129+ current_frame = frames .size () - 1
130+ new_current_page .emit (frames [current_frame ])
131+
132+
133+ func _on_frame_update () -> void :
134+ new_current_page .emit (frames [current_frame ])
0 commit comments