aboutsummaryrefslogtreecommitdiff
path: root/game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd
diff options
context:
space:
mode:
Diffstat (limited to 'game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd')
-rw-r--r--game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd174
1 files changed, 174 insertions, 0 deletions
diff --git a/game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd b/game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd
new file mode 100644
index 0000000..617e457
--- /dev/null
+++ b/game/addons/zylann.hterrain/tools/resize_dialog/resize_dialog.gd
@@ -0,0 +1,174 @@
+@tool
+extends AcceptDialog
+
+const HT_Util = preload("../../util/util.gd")
+const HT_Logger = preload("../../util/logger.gd")
+const HTerrain = preload("../../hterrain.gd")
+const HTerrainData = preload("../../hterrain_data.gd")
+
+const ANCHOR_TOP_LEFT = 0
+const ANCHOR_TOP = 1
+const ANCHOR_TOP_RIGHT = 2
+const ANCHOR_LEFT = 3
+const ANCHOR_CENTER = 4
+const ANCHOR_RIGHT = 5
+const ANCHOR_BOTTOM_LEFT = 6
+const ANCHOR_BOTTOM = 7
+const ANCHOR_BOTTOM_RIGHT = 8
+const ANCHOR_COUNT = 9
+
+const _anchor_dirs = [
+ [-1, -1],
+ [0, -1],
+ [1, -1],
+ [-1, 0],
+ [0, 0],
+ [1, 0],
+ [-1, 1],
+ [0, 1],
+ [1, 1]
+]
+
+const _anchor_icon_names = [
+ "anchor_top_left",
+ "anchor_top",
+ "anchor_top_right",
+ "anchor_left",
+ "anchor_center",
+ "anchor_right",
+ "anchor_bottom_left",
+ "anchor_bottom",
+ "anchor_bottom_right"
+]
+
+signal permanent_change_performed(message)
+
+@onready var _resolution_dropdown : OptionButton = $VBoxContainer/GridContainer/ResolutionDropdown
+@onready var _stretch_checkbox : CheckBox = $VBoxContainer/GridContainer/StretchCheckBox
+@onready var _anchor_control : Control = $VBoxContainer/GridContainer/HBoxContainer/AnchorControl
+
+const _resolutions = HTerrainData.SUPPORTED_RESOLUTIONS
+
+var _anchor_buttons := []
+var _anchor_buttons_grid := {}
+var _anchor_button_group : ButtonGroup = null
+var _selected_anchor = ANCHOR_TOP_LEFT
+var _logger = HT_Logger.get_for(self)
+
+var _terrain : HTerrain = null
+
+
+func set_terrain(terrain: HTerrain):
+ _terrain = terrain
+
+
+static func _get_icon(name) -> Texture2D:
+ return load("res://addons/zylann.hterrain/tools/icons/icon_" + name + ".svg")
+
+
+func _init():
+ get_ok_button().hide()
+
+
+func _ready():
+ if HT_Util.is_in_edited_scene(self):
+ return
+ # TEST
+ #show()
+
+ for i in len(_resolutions):
+ _resolution_dropdown.add_item(str(_resolutions[i]), i)
+
+ _anchor_button_group = ButtonGroup.new()
+ _anchor_buttons.resize(ANCHOR_COUNT)
+ var x := 0
+ var y := 0
+ for i in _anchor_control.get_child_count():
+ var child_node = _anchor_control.get_child(i)
+ assert(child_node is Button)
+ var child := child_node as Button
+ child.toggle_mode = true
+ child.custom_minimum_size = child.size
+ child.icon = null
+ child.pressed.connect(_on_AnchorButton_pressed.bind(i, x, y))
+ child.button_group = _anchor_button_group
+ _anchor_buttons[i] = child
+ _anchor_buttons_grid[Vector2(x, y)] = child
+ x += 1
+ if x >= 3:
+ x = 0
+ y += 1
+
+ _anchor_buttons[_selected_anchor].button_pressed = true
+ # The signal apparently doesn't trigger in this case
+ _on_AnchorButton_pressed(_selected_anchor, 0, 0)
+
+
+func _notification(what: int):
+ if what == NOTIFICATION_VISIBILITY_CHANGED:
+ if visible:
+ # Select current resolution
+ if _terrain != null and _terrain.get_data() != null:
+ var res := _terrain.get_data().get_resolution()
+ for i in len(_resolutions):
+ if res == _resolutions[i]:
+ _resolution_dropdown.select(i)
+ break
+
+
+func _on_AnchorButton_pressed(anchor0: int, x0: int, y0: int):
+ _selected_anchor = anchor0
+
+ for button in _anchor_buttons:
+ button.icon = null
+
+ for anchor in ANCHOR_COUNT:
+ var d = _anchor_dirs[anchor]
+ var nx = x0 + d[0]
+ var ny = y0 + d[1]
+ var k = Vector2(nx, ny)
+ if not _anchor_buttons_grid.has(k):
+ continue
+ var button : Button = _anchor_buttons_grid[k]
+ var icon := _get_icon(_anchor_icon_names[anchor])
+ button.icon = icon
+
+
+func _set_anchor_control_active(active: bool):
+ for button in _anchor_buttons:
+ button.disabled = not active
+
+
+func _on_ResolutionDropdown_item_selected(id):
+ pass
+
+
+func _on_StretchCheckBox_toggled(button_pressed: bool):
+ _set_anchor_control_active(not button_pressed)
+
+
+func _on_ApplyButton_pressed():
+ var stretch = _stretch_checkbox.button_pressed
+ var res = _resolutions[_resolution_dropdown.get_selected_id()]
+ var dir = _anchor_dirs[_selected_anchor]
+ _apply(res, stretch, Vector2(dir[0], dir[1]))
+ hide()
+
+
+func _on_CancelButton_pressed():
+ hide()
+
+
+func _apply(p_resolution: int, p_stretch: bool, p_anchor: Vector2):
+ if _terrain == null:
+ _logger.error("Cannot apply resize, terrain is not set")
+ return
+
+ var data = _terrain.get_data()
+ if data == null:
+ _logger.error("Cannot apply resize, terrain has no data")
+ return
+
+ data.resize(p_resolution, p_stretch, p_anchor)
+ data.notify_full_change()
+ permanent_change_performed.emit("Resize terrain")