blob: 7ff43cfbb55ec146b9e5e347aef38a464dbd2527 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
class_name CharacterSelectionList
extends Control
signal selected(slot_idx: int)
signal requested_login(slot_idx: int)
var item_scene := preload("res://ui/login/character_selection_item.tscn")
var slot_offset := 0
@export var displayed_slots_count: int = 3:
set = set_displayed_slots_count
@export var selected_slot_index: int = -1:
set = set_selected_slot_index
@export var login_character_list: LoginCharacterList:
set = set_login_character_list
func _ready() -> void:
if %CharacterList.get_child_count() != displayed_slots_count:
set_displayed_slots_count(displayed_slots_count)
func set_displayed_slots_count(value: int) -> void:
displayed_slots_count = value
for node in %CharacterList.get_children():
node.queue_free()
for _idx in displayed_slots_count:
var item = preload("res://ui/login/character_selection_item.tscn").instantiate()
%CharacterList.add_child(item)
draw()
func set_selected_slot_index(value: int) -> void:
if selected_slot_index == value:
return
var maximum_slot_count := login_character_list.slot_count
%CharacterList.get_child(selected_slot_index - slot_offset).is_selected = false
if value >= maximum_slot_count:
selected_slot_index = 0
elif value < 0:
selected_slot_index = maximum_slot_count - 1
else:
selected_slot_index = value
if selected_slot_index > slot_offset + (displayed_slots_count - 1):
#slot_offset = selected_slot_index - (displayed_slots_count - 1)
slot_offset = min(selected_slot_index, maximum_slot_count - displayed_slots_count)
elif selected_slot_index < slot_offset:
#slot_offset = selected_slot_index
slot_offset = max(0, selected_slot_index - (displayed_slots_count - 1))
draw()
%CharacterList.get_child(selected_slot_index - slot_offset).is_selected = true
var info = login_character_list.get_info_for_slot(selected_slot_index)
if info:
%CharacterSelectionStatus.set_info(info)
else:
$CharacterSelectionStatus.clear()
selected.emit(selected_slot_index)
func set_login_character_list(value: LoginCharacterList) -> void:
login_character_list = value
draw()
func add_character_information(info: CharacterInformation) -> void:
login_character_list.add_character_information(info)
draw()
func draw():
if not login_character_list:
return
for display_slot_idx in displayed_slots_count:
var item: CharacterSelectionItem = %CharacterList.get_child(display_slot_idx)
var slot_idx = slot_offset + display_slot_idx
var info = login_character_list.get_info_for_slot(slot_idx)
if info:
item.initialize_with_info(info)
else:
item.clear()
if item.selected.is_connected(_on_item_selected):
item.selected.disconnect(_on_item_selected)
item.selected.connect(_on_item_selected.bind(slot_idx))
if item.gui_input.is_connected(_on_item_gui_input):
item.gui_input.disconnect(_on_item_gui_input)
item.gui_input.connect(_on_item_gui_input.bind(slot_idx))
func select(slot_idx: int):
selected_slot_index = slot_idx
func _on_item_selected(slot_idx: int):
selected_slot_index = slot_idx
func _on_item_gui_input(event: InputEvent, slot_idx: int) -> void:
if event is InputEventMouseButton and event.double_click:
requested_login.emit(slot_idx)
func _input(event: InputEvent) -> void:
if event.is_action_pressed("ui_accept"):
requested_login.emit(selected_slot_index)
if event.is_action_pressed("ui_left"):
%ButtonLeft.pressed.emit()
if event.is_action_pressed("ui_right"):
%ButtonRight.pressed.emit()
func _on_button_left_pressed() -> void:
selected_slot_index -= 1
func _on_button_right_pressed() -> void:
selected_slot_index += 1
|