Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable undo/redo buttons when there is nothing to undo/redo #291

Merged
merged 2 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lorien/Main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -238,13 +238,17 @@ func _on_files_dropped(files: PackedStringArray) -> void:

# -------------------------------------------------------------------------------------------------
func _make_project_active(project: Project) -> void:
var previous_project: Project = ProjectManager.get_active_project()

ProjectManager.make_project_active(project)
_canvas.use_project(project)

if !_menubar.has_tab(project):
_menubar.make_tab(project)
_menubar.set_tab_active(project)

_toolbar._on_active_project_changed(previous_project, project)

# -------------------------------------------------------------------------------------------------
func _is_mouse_on_ui() -> bool:
var on_ui := Utils.is_mouse_in_control(_menubar)
Expand Down
10 changes: 9 additions & 1 deletion lorien/ProjectManager/Project.gd
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
class_name Project

# Emitted whenever something marks the project as dirty, even if it's already dirty.
signal dirtied

var id: int # this is used at runtime only and will not be persisted; project ids are not garanteed to be the same between restarts
var undo_redo: UndoRedo

var dirty := false
var dirty := false:
set(value):
dirty = value
if value == true:
dirtied.emit()

var loaded := false

var filepath: String
Expand Down
43 changes: 24 additions & 19 deletions lorien/UI/Components/FlatTextureButton.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,51 @@ extends TextureButton
# -------------------------------------------------------------------------------------------------
@export var hover_tint := Color.WHITE
@export var pressed_tint := Color.WHITE
@export var disabled_tint := Color(0.4, 0.4, 0.4)
var _normal_tint: Color

# -------------------------------------------------------------------------------------------------
func _ready() -> void:
_normal_tint = self_modulate
mouse_entered.connect(_on_mouse_entered)
mouse_exited.connect(_on_mouse_exited)
pressed.connect(_on_pressed)

if toggle_mode && button_pressed:
self_modulate = pressed_tint
toggled.connect(_on_toggled)
_update_tint()

# -------------------------------------------------------------------------------------------------
func _exit_tree() -> void:
mouse_entered.disconnect(_on_mouse_entered)
mouse_exited.disconnect(_on_mouse_exited)
pressed.disconnect(_on_pressed)
toggled.disconnect(_on_toggled)

# -------------------------------------------------------------------------------------------------
func _on_mouse_entered() -> void:
if !button_pressed:
self_modulate = hover_tint
call_deferred("_update_tint")

# -------------------------------------------------------------------------------------------------
func _on_mouse_exited() -> void:
if !button_pressed:
self_modulate = _normal_tint
call_deferred("_update_tint")

# -------------------------------------------------------------------------------------------------
func toggle() -> void:
if button_pressed:
self_modulate = _normal_tint
else:
self_modulate = pressed_tint
button_pressed = !button_pressed

# -------------------------------------------------------------------------------------------------
func _on_pressed() -> void:
if toggle_mode:
if button_pressed:
self_modulate = pressed_tint
else:
self_modulate = _normal_tint
func _on_toggled(_toggled_on: bool) -> void:
_update_tint()

# -------------------------------------------------------------------------------------------------
func set_is_disabled(value: bool) -> void:
disabled = value
_update_tint()

# -------------------------------------------------------------------------------------------------
func _update_tint() -> void:
if disabled:
self_modulate = disabled_tint
elif button_pressed:
self_modulate = pressed_tint
elif is_hovered():
self_modulate = hover_tint
else:
self_modulate = _normal_tint
31 changes: 31 additions & 0 deletions lorien/UI/Toolbar.gd
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,34 @@ func _change_active_tool_button(btn: TextureButton) -> void:
# -------------------------------------------------------------------------------------------------
func get_brush_color_button() -> Control:
return _color_button

# -------------------------------------------------------------------------------------------------
func _on_active_project_changed(previous_project: Project, current_project: Project) -> void:
mbrlabs marked this conversation as resolved.
Show resolved Hide resolved
_update_undo_redo_buttons()

if previous_project != null:
previous_project.dirtied.disconnect(_on_project_dirtied)
previous_project.undo_redo.version_changed.disconnect(_on_undo_or_redo_occured)

if current_project != null:
current_project.dirtied.connect(_on_project_dirtied)
current_project.undo_redo.version_changed.connect(_on_undo_or_redo_occured)

# -------------------------------------------------------------------------------------------------
func _on_project_dirtied() -> void:
_update_undo_redo_buttons()

# -------------------------------------------------------------------------------------------------
func _on_undo_or_redo_occured() -> void:
_update_undo_redo_buttons()

# -------------------------------------------------------------------------------------------------
func _update_undo_redo_buttons() -> void:
var active_project: Project = ProjectManager.get_active_project()
if active_project == null:
_undo_button.set_is_disabled(true)
_redo_button.set_is_disabled(true)
return

_undo_button.set_is_disabled(!active_project.undo_redo.has_undo())
_redo_button.set_is_disabled(!active_project.undo_redo.has_redo())
Loading