add kanban
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
@tool
|
||||
extends HBoxContainer
|
||||
|
||||
## Visual representation of a step.
|
||||
|
||||
|
||||
signal action_triggered(entry: __StepEntry, action: Actions)
|
||||
|
||||
const __EditLabel := preload("../../edit_label/edit_label.gd")
|
||||
const __StepData := preload("../../data/step.gd")
|
||||
const __Singletons := preload("../../plugin_singleton/singletons.gd")
|
||||
const __Shortcuts := preload("../shortcuts.gd")
|
||||
const __StepEntry := preload("step_entry.gd")
|
||||
|
||||
enum Actions {
|
||||
DELETE,
|
||||
MOVE_UP,
|
||||
MOVE_DOWN,
|
||||
EDIT_HARD, ## Forces the step details to open.
|
||||
EDIT_SOFT, ## Only switches to this step if the details are opened.
|
||||
CLOSE,
|
||||
}
|
||||
|
||||
@export var context_menu_enabled: bool = true
|
||||
|
||||
var done: CheckBox
|
||||
var title_label: Label
|
||||
var focus_box: StyleBoxFlat
|
||||
var context_menu: PopupMenu
|
||||
|
||||
var step_data: __StepData
|
||||
|
||||
var being_edited := false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
|
||||
context_menu = PopupMenu.new()
|
||||
context_menu.id_pressed.connect(__action)
|
||||
add_child(context_menu)
|
||||
|
||||
done = CheckBox.new()
|
||||
done.focus_mode = Control.FOCUS_NONE
|
||||
done.toggled.connect(__set_done)
|
||||
add_child(done)
|
||||
|
||||
title_label = Label.new()
|
||||
title_label.set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
title_label.text = step_data.details
|
||||
title_label.max_lines_visible = 1
|
||||
title_label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS
|
||||
add_child(title_label)
|
||||
|
||||
focus_box = StyleBoxFlat.new()
|
||||
focus_box.bg_color = Color(1, 1, 1, 0.1)
|
||||
|
||||
notification(NOTIFICATION_THEME_CHANGED)
|
||||
|
||||
step_data.changed.connect(update)
|
||||
update()
|
||||
|
||||
|
||||
func _shortcut_input(event: InputEvent) -> void:
|
||||
if not __Shortcuts.should_handle_shortcut(self):
|
||||
return
|
||||
var shortcuts: __Shortcuts = __Singletons.instance_of(__Shortcuts, self)
|
||||
if not event.is_echo() and event.is_pressed():
|
||||
if shortcuts.rename.matches_event(event):
|
||||
get_viewport().set_input_as_handled()
|
||||
__action(Actions.EDIT_HARD)
|
||||
elif shortcuts.confirm.matches_event(event):
|
||||
get_viewport().set_input_as_handled()
|
||||
done.button_pressed = not done.button_pressed
|
||||
|
||||
|
||||
func _gui_input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT:
|
||||
accept_event()
|
||||
if context_menu_enabled:
|
||||
__update_context_menu()
|
||||
context_menu.position = get_global_mouse_position()
|
||||
if not get_window().gui_embed_subwindows:
|
||||
context_menu.position += get_window().position
|
||||
context_menu.popup()
|
||||
|
||||
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.is_pressed() and event.is_double_click():
|
||||
__action(Actions.EDIT_HARD)
|
||||
|
||||
|
||||
func _notification(what) -> void:
|
||||
match(what):
|
||||
NOTIFICATION_DRAW:
|
||||
if has_focus() or being_edited:
|
||||
focus_box.draw(get_canvas_item(), Rect2(Vector2.ZERO, get_rect().size))
|
||||
NOTIFICATION_FOCUS_ENTER:
|
||||
__action(Actions.EDIT_SOFT)
|
||||
|
||||
|
||||
func update() -> void:
|
||||
tooltip_text = step_data.details
|
||||
done.set_pressed_no_signal(step_data.done)
|
||||
|
||||
title_label.text = step_data.details
|
||||
|
||||
|
||||
func __action(what: Actions) -> void:
|
||||
action_triggered.emit(self, what)
|
||||
|
||||
|
||||
func __update_context_menu() -> void:
|
||||
var shortcuts: __Shortcuts = __Singletons.instance_of(__Shortcuts, self)
|
||||
|
||||
context_menu.clear()
|
||||
context_menu.size = Vector2.ZERO
|
||||
|
||||
if being_edited:
|
||||
context_menu.add_icon_item(get_theme_icon(&"Close", &"EditorIcons"), "Close", Actions.CLOSE)
|
||||
else:
|
||||
context_menu.add_icon_item(get_theme_icon(&"Rename", &"EditorIcons"), "Edit", Actions.EDIT_HARD)
|
||||
context_menu.set_item_shortcut(context_menu.get_item_index(Actions.EDIT_HARD), shortcuts.rename)
|
||||
|
||||
context_menu.add_icon_item(get_theme_icon(&"MoveUp", &"EditorIcons"), "Move Up", Actions.MOVE_UP)
|
||||
context_menu.set_item_disabled(context_menu.get_item_index(Actions.MOVE_UP), get_index() == 0)
|
||||
context_menu.add_icon_item(get_theme_icon(&"MoveDown", &"EditorIcons"), "Move Down", Actions.MOVE_DOWN)
|
||||
context_menu.set_item_disabled(context_menu.get_item_index(Actions.MOVE_DOWN), get_index() == get_parent().get_child_count() - 1)
|
||||
|
||||
context_menu.add_separator()
|
||||
|
||||
context_menu.add_icon_item(get_theme_icon(&"Remove", &"EditorIcons"), "Delete", Actions.DELETE)
|
||||
|
||||
|
||||
func __set_done(done: bool) -> void:
|
||||
__action(Actions.CLOSE)
|
||||
step_data.done = done
|
||||
Reference in New Issue
Block a user