|
| 1 | +extends ScrollContainer |
| 2 | + |
| 3 | +@onready var vBoxContainer = $VBoxContainer |
| 4 | +@onready var templateItem = $VBoxContainer/TemplateItem |
| 5 | + |
| 6 | +var is_pressed : bool = false |
| 7 | +var is_set_scolle_size : bool = false |
| 8 | +var scroll_min : int = -1 |
| 9 | +var scroll_max : int = -1 |
| 10 | + |
| 11 | +var data_list = [] |
| 12 | +var box_container_list = [] |
| 13 | + |
| 14 | +var is_flash = false |
| 15 | +var vertical_value = 0 |
| 16 | +var container_index = 0 |
| 17 | +var end_line = 0 #520 |
| 18 | +var data_index = 0 #8 max scroll |
| 19 | +var max_container = 12 |
| 20 | +var v_item_size = 0 |
| 21 | +var v_item_last_size = 0 |
| 22 | + |
| 23 | +var delay_release : float = 0 |
| 24 | +var is_delay : bool = false |
| 25 | + |
| 26 | +# Called when the node enters the scene tree for the first time. |
| 27 | +func _ready(): |
| 28 | + |
| 29 | + # create data |
| 30 | + for i in 50: |
| 31 | + data_list.append(i) |
| 32 | + |
| 33 | + templateItem.hide() |
| 34 | + data_index = max_container |
| 35 | + for i in max_container: |
| 36 | + if templateItem: |
| 37 | + var newBoxContainer = templateItem.duplicate() |
| 38 | + box_container_list.append(newBoxContainer) |
| 39 | + vBoxContainer.add_child(newBoxContainer) |
| 40 | + (newBoxContainer as Control).visible = true |
| 41 | + newBoxContainer.connect("on_button_event", on_select_index) |
| 42 | + newBoxContainer.set_data(i) |
| 43 | + newBoxContainer.name = "Box%d" % i |
| 44 | + |
| 45 | +# Called every frame. 'delta' is the elapsed time since the previous frame. |
| 46 | +func _process(delta): |
| 47 | + if is_delay: |
| 48 | + delay_release += delta |
| 49 | + if delay_release >= 0.3: |
| 50 | + is_delay = false |
| 51 | + is_pressed = false |
| 52 | + pass |
| 53 | + |
| 54 | + |
| 55 | +func on_select_index(index): |
| 56 | + if !is_pressed: |
| 57 | + print("select button %d" % index) |
| 58 | + |
| 59 | +func _on_gui_input(event): |
| 60 | + |
| 61 | + if is_pressed: |
| 62 | + if event is InputEventScreenTouch and event.is_pressed() == false: |
| 63 | + is_delay = true |
| 64 | + delay_release = 0 |
| 65 | + |
| 66 | + if event is InputEventScreenDrag: |
| 67 | + init_scroll() |
| 68 | + # Scrolling |
| 69 | + is_pressed = true |
| 70 | + |
| 71 | + vertical_value += -event.relative.y |
| 72 | + if vertical_value <= 0: |
| 73 | + vertical_value = 0 |
| 74 | + elif vertical_value >= end_line: |
| 75 | + vertical_value = end_line |
| 76 | + |
| 77 | + scroll_vertical = vertical_value |
| 78 | + # Down Scroll |
| 79 | + if scroll_vertical >= end_line and data_index < data_list.size(): |
| 80 | + scroll_vertical = v_item_last_size |
| 81 | + vertical_value = v_item_last_size |
| 82 | + |
| 83 | + var box = box_container_list[container_index] |
| 84 | + box.set_data(data_index) |
| 85 | + vBoxContainer.move_child(box, max_container) |
| 86 | + |
| 87 | + data_index += 1 |
| 88 | + container_index += 1 |
| 89 | + if container_index >= box_container_list.size(): |
| 90 | + container_index = 0 |
| 91 | + |
| 92 | + # UP Scroll |
| 93 | + if scroll_vertical <= 0 and data_index > max_container: |
| 94 | + data_index -= 1 |
| 95 | + container_index -= 1 |
| 96 | + if container_index < 0: |
| 97 | + container_index = box_container_list.size() - 1 |
| 98 | + |
| 99 | + scroll_vertical = v_item_size |
| 100 | + vertical_value = v_item_size |
| 101 | + |
| 102 | + var new_index = data_index - max_container |
| 103 | + var box = box_container_list[container_index] |
| 104 | + box.set_data(new_index) |
| 105 | + vBoxContainer.move_child(box, 0) |
| 106 | + |
| 107 | +func init_scroll(): |
| 108 | + if !is_set_scolle_size: |
| 109 | + |
| 110 | + is_set_scolle_size = true |
| 111 | + var bar = self.get_v_scroll_bar() |
| 112 | + scroll_min = bar.min_value |
| 113 | + scroll_max = bar.max_value |
| 114 | + end_line = bar.max_value - get_rect().size.y |
| 115 | + v_item_size = templateItem.get_rect().size.y |
| 116 | + |
| 117 | + var rest_item_size = int(v_item_size) - int(get_rect().size.y) % int(v_item_size) |
| 118 | + v_item_last_size = v_item_size * 2 + rest_item_size |
| 119 | + |
| 120 | + |
| 121 | + print(get_rect().size.y) |
| 122 | + print(v_item_last_size) |
| 123 | + print(v_item_size) |
| 124 | + print("min = %d" % bar.min_value) |
| 125 | + print("max = %d" % bar.max_value) |
| 126 | + print(end_line) |
0 commit comments