extends HBoxContainer class_name OwniverseAction signal action_pressed(page_id, amount: float) @onready var action_labels: Array = [ $ActionControl0/Label, $ActionControl1/Label, $ActionControl2/Label, $ActionControl3/Label, $ActionControl4/Label, ] var page_id: int = -1 var current_item_id = "" var action_values: Dictionary = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, } func set_actions(item_id: String, value: float, preview: Callable = Callable()) -> void: current_item_id = item_id var requests: Array = _get_distribution(value) var unique_requests: Array = [] var displayed: Array = [] var labels: Dictionary = {} # Prefer the largest request (including MAX) when previews or rounded # scientific labels coincide. Keep the request paired with its preview. for i in range(requests.size() - 1, -1, -1): if requests[i] <= 0.0: continue var amount: float = preview.call(requests[i]) if preview.is_valid() else requests[i] if not is_finite(amount) or amount < 1.0 or amount != floorf(amount): continue var text: String = _format_action_value(amount) if displayed.has(amount) or labels.has(text): continue labels[text] = true unique_requests.push_front(requests[i]) displayed.push_front(amount) while unique_requests.size() < 5: unique_requests.append(0.0) displayed.append(0.0) _set_action_values(unique_requests, displayed) func _get_distribution(value: float) -> Array: if value < 1.0 or not is_finite(value): return [0.0, 0.0, 0.0, 0.0, 0.0] value = floorf(value) var distribution: Array = [] var power: float = 1.0 while power < value: distribution.append(power) if distribution.size() > 4: distribution.pop_front() power *= 10.0 distribution.append(value) while distribution.size() < 5: distribution.append(0.0) return distribution func _set_action_values(values: Array, displayed: Array) -> void: for ind in range(0, 5): action_values[ind] = values[ind] # Keep the original request for execution; show the exact planned output. var text: String = _format_action_value(displayed[ind]) if action_labels[ind].text != text: action_labels[ind].text = text action_labels[ind].get_parent().get_node("TextureButton").disabled = values[ind] <= 0.0 func _format_action_value(value: float) -> String: if value < 1.0 or not is_finite(value) or value != floorf(value): return "" return Global.format_number(value) func _on_action_button_pressed(button_id: int) -> void: if action_values.get(button_id, 0.0) > 0.0: action_pressed.emit(page_id, action_values[button_id])