extends Control const ITEM_BUTTON = preload("uid://d3xjfxwe3w16v") const SPEED_TEXTURE_NAME_TEMPLATE = "res://UI/TopMenu/Time&Speed/Time%s.png" const PAGE_COUNT = 5 const PAGE_WIDTH = 1080 const DRAG_TOLERANCE = 360 const SWIPE_DURATION: float = 2 const SWIPE_DELAY = 2000 # msec @onready var stage_page_scroller: ScrollContainer = $StageRows/PageScroller @onready var item_pages: Array[Control] = [ $StageRows/PageScroller/HBoxContainer/ForcePage/Forces, $StageRows/PageScroller/HBoxContainer/ResourcePage/HBoxContainer/Resources, $StageRows/PageScroller/HBoxContainer/StarPage/Stars, $StageRows/PageScroller/HBoxContainer/StructurePage/Structures, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Life, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/LivingPlanet, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ0, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ1, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ2, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ3, $StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ4 ] @onready var g_entity_descriptions: Array = [ $StageRows/PageScroller/HBoxContainer/ForcePage/Description, $StageRows/PageScroller/HBoxContainer/ResourcePage/Description, $StageRows/PageScroller/HBoxContainer/StarPage/Description, $StageRows/PageScroller/HBoxContainer/StructurePage/Description, $StageRows/PageScroller/HBoxContainer/LifePage/Description ] @onready var date_time: Label = $StageRows/TopMenu/InfoPanel/DateTime @onready var g_speed_icons: Array = [ $StageRows/TopMenu/InfoPanel/Speed/Speed1, $StageRows/TopMenu/InfoPanel/Speed/Speed2, $StageRows/TopMenu/InfoPanel/Speed/Speed3, $StageRows/TopMenu/InfoPanel/Speed/Speed4, $StageRows/TopMenu/InfoPanel/Speed/Speed5, $StageRows/TopMenu/InfoPanel/Speed/Speed6, $StageRows/TopMenu/InfoPanel/Speed/Speed7, $StageRows/TopMenu/InfoPanel/Speed/Speed8 ] @onready var g_time_minus: TextureButton = $StageRows/TopMenu/TimeMinus @onready var g_time_plus: TextureButton = $StageRows/TopMenu/TimePlus var g_tween: Tween = null var g_dragged_start: Vector2 = Vector2.ZERO var g_scroll_start: int = 0 var g_current_page: int = 0 var g_last_scroll_updated: int = 0 var f_check_swipe: bool = false var g_swipe_time_delta: float = 0 var g_counters: Dictionary[String, Counter] = { "swipe": Counter.new(), } var ActiveEntities: Dictionary = {} var owniverse = Owniverse.new() func set_datetime(value: String): date_time.text = value func _on_indicator_pressed(indicator_name: String, page: int = 0): _set_description(indicator_name, page) func entity_activated(entity: OwniverseEntity) -> void: _control_page(entity) _set_entity_description(entity) func _set_entity_description(entity: OwniverseEntity) -> void: var description: String = "[b]" \ + Global.get_localized_item_description(entity.entity_name, "label") \ +"[/b]" \ +"\n" \ + Global.get_localized_item_description(entity.entity_name, "description") var desc_page = clamp(entity.entity_page, 0, 4) g_entity_descriptions[desc_page].text = description func _set_description(item_name: String, page: int) -> void: var description = Global.get_description(item_name + ".Name") description += "\n" description += Global.get_description(item_name + ".Description") g_entity_descriptions[page].text = description func _control_page(entity: OwniverseEntity) -> void: if !ActiveEntities.has(entity.entity_page): ActiveEntities[entity.entity_page] = null var current_entity: OwniverseEntity = ActiveEntities[entity.entity_page] if current_entity == entity: return ActiveEntities[entity.entity_page] = entity if current_entity != null and current_entity.entity_page == entity.entity_page: current_entity.set_selection(false) entity.set_selection(true) # subpages if entity.sub_page != -1: item_pages[entity.sub_page].visible = true if current_entity == null \ or current_entity.sub_page == -1 \ or current_entity.sub_page == entity.sub_page: return item_pages[current_entity.sub_page].visible = false func _init_entities() -> bool: for e_id in Global.Entities: var entity_properties: Dictionary = Global.Entities[e_id] var entity: OwniverseEntity = ITEM_BUTTON.instantiate() if !entity_properties.has("page"): printerr("Entity `", e_id, "` has no `page` key.") return false var page: int = int(entity_properties.page) item_pages[page].add_child(entity) entity.init_button(entity_properties) entity.entity_activated.connect(entity_activated) return false func _check_counters(delta: float) -> Array: var actions: Array = [] for k in g_counters: var cnt: Counter = g_counters[k] if not cnt.is_active: continue cnt.value += delta if cnt.value >= cnt.sec: actions.append(k) cnt.value = 0 cnt.is_active = false return actions func _do_actions(actions: Array) -> void: for action: String in actions: match action: "swipe": _swipe_to_nearest_page() #region Swipe func _swipe_to_nearest_page() -> void: if stage_page_scroller.scroll_horizontal % PAGE_WIDTH == 0: return var new_page: int = round(1.0 * stage_page_scroller.scroll_horizontal / PAGE_WIDTH) if g_tween != null: if g_tween.is_running(): return g_tween = stage_page_scroller.get_tree().create_tween() g_tween.tween_property(stage_page_scroller, "scroll_horizontal", new_page * PAGE_WIDTH, SWIPE_DURATION).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) func _input(event: InputEvent) -> void: if event is InputEventScreenDrag: stage_page_scroller.scroll_horizontal = clamp( stage_page_scroller.scroll_horizontal - PAGE_COUNT * event.screen_relative.x, 0, PAGE_WIDTH * (PAGE_COUNT - 1)) g_counters.swipe.is_active = true g_counters.swipe.value = 0 elif event is InputEventPanGesture: g_counters.swipe.is_active = true g_counters.swipe.value = 0 elif event is InputEventScreenTouch: pass #endregion func _ready() -> void: _init_entities() func _process(delta: float) -> void: # Update date var sdt: String = str(snapped(owniverse.add_time_delta(delta), 0.1)) set_datetime(sdt) var actions = _check_counters(delta) _do_actions(actions) func _on_burger_button_pressed() -> void: print("b") pass # Replace with function body. func _on_report_button_pressed() -> void: print("r") pass # Replace with function body. func _change_speed(delta: int) -> void: var speed: int = owniverse.change_speed(delta) var ind: int = 1 for icon in g_speed_icons: if ind <= speed: icon.visible = true else: icon.visible = false ind += 1 if speed == 1: g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "x") g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "2") elif speed == Global.SPEED_LIMIT: g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(Global.SPEED_LIMIT - 1)) g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % "x") else: g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed - 1)) g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed + 1)) func _on_topmenu_button_pressed(ButtonName) -> void: print(ButtonName)