Skip to content

Commit

Permalink
Save all tool settings in EditorSettings
Browse files Browse the repository at this point in the history
  • Loading branch information
TokisanGames committed Aug 4, 2024
1 parent b715625 commit 6faf932
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 36 deletions.
13 changes: 13 additions & 0 deletions project/addons/terrain_3d/editor.gd
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ var _last_terrain: Terrain3D
var nav_region: NavigationRegion3D

var editor: Terrain3DEditor
var editor_settings: EditorSettings
var ui: Node # Terrain3DUI see Godot #75388
var asset_dock: PanelContainer
var region_gizmo: RegionGizmo
Expand All @@ -24,6 +25,7 @@ var mouse_global_position: Vector3 = Vector3.ZERO

func _enter_tree() -> void:
editor = Terrain3DEditor.new()
editor_settings = EditorInterface.get_editor_settings()
ui = UI.new()
ui.plugin = self
add_child(ui)
Expand Down Expand Up @@ -286,3 +288,14 @@ func select_terrain() -> void:
var es: EditorSelection = get_editor_interface().get_selection()
es.clear()
es.add_node(_last_terrain)


func set_setting(p_str: String, p_value: Variant) -> void:
editor_settings.set_setting(p_str, p_value)


func get_setting(p_str: String, p_default: Variant) -> Variant:
if editor_settings.has_setting(p_str):
return editor_settings.get_setting(p_str)
else:
return p_default
73 changes: 42 additions & 31 deletions project/addons/terrain_3d/src/asset_dock.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ signal confirmation_closed
signal confirmation_confirmed
signal confirmation_canceled

const PS_DOCK_SLOT: String = "terrain3d/config/dock_slot"
const PS_DOCK_TILE_SIZE: String = "terrain3d/config/dock_tile_size"
const PS_DOCK_FLOATING: String = "terrain3d/config/dock_floating"
const PS_DOCK_PINNED: String = "terrain3d/config/dock_always_on_top"
const PS_DOCK_WINDOW_POSITION: String = "terrain3d/config/dock_window_position"
const PS_DOCK_WINDOW_SIZE: String = "terrain3d/config/dock_window_size"
const ES_DOCK_SLOT: String = "terrain3d/dock/slot"
const ES_DOCK_TILE_SIZE: String = "terrain3d/dock/tile_size"
const ES_DOCK_FLOATING: String = "terrain3d/dock/floating"
const ES_DOCK_PINNED: String = "terrain3d/dock/always_on_top"
const ES_DOCK_WINDOW_POSITION: String = "terrain3d/dock/window_position"
const ES_DOCK_WINDOW_SIZE: String = "terrain3d/dock/window_size"
const ES_DOCK_TAB: String = "terrain3d/dock/tab"

var texture_list: ListContainer
var mesh_list: ListContainer
Expand Down Expand Up @@ -59,7 +60,6 @@ enum {
var slot: int = POS_RIGHT_BR
var _initialized: bool = false
var plugin: EditorPlugin
var editor_settings: EditorSettings


func initialize(p_plugin: EditorPlugin) -> void:
Expand Down Expand Up @@ -93,7 +93,6 @@ func initialize(p_plugin: EditorPlugin) -> void:
asset_container.add_child(mesh_list)
_current_list = texture_list

editor_settings = EditorInterface.get_editor_settings()
load_editor_settings()

# Connect signals
Expand All @@ -103,7 +102,7 @@ func initialize(p_plugin: EditorPlugin) -> void:
placement_opt.item_selected.connect(set_slot)
floating_btn.pressed.connect(make_dock_float)
pinned_btn.toggled.connect(_on_pin_changed)
pinned_btn.visible = false
pinned_btn.visible = ( window != null )
size_slider.value_changed.connect(_on_slider_changed)
plugin.ui.toolbar.tool_changed.connect(_on_tool_changed)

Expand Down Expand Up @@ -279,6 +278,7 @@ func _on_textures_pressed() -> void:
texture_list.set_selected_id(texture_list.selected_id)
if plugin.is_terrain_valid():
plugin.get_editor_interface().edit_node(plugin.terrain)
save_editor_settings()


func _on_meshes_pressed() -> void:
Expand All @@ -292,6 +292,7 @@ func _on_meshes_pressed() -> void:
if plugin.is_terrain_valid():
plugin.get_editor_interface().edit_node(plugin.terrain)
update_thumbnails()
save_editor_settings()


func _on_tool_changed(p_tool: Terrain3DEditor.Tool, p_operation: Terrain3DEditor.Operation) -> void:
Expand Down Expand Up @@ -355,8 +356,8 @@ func create_window() -> void:
mc.add_child(self)
window.add_child(mc)
window.set_transient(false)
window.set_size(get_setting(PS_DOCK_WINDOW_SIZE, Vector2i(512, 512)))
window.set_position(get_setting(PS_DOCK_WINDOW_POSITION, Vector2i(704, 284)))
window.set_size(plugin.get_setting(ES_DOCK_WINDOW_SIZE, Vector2i(512, 512)))
window.set_position(plugin.get_setting(ES_DOCK_WINDOW_POSITION, Vector2i(704, 284)))
plugin.add_child(window)
window.show()

Expand All @@ -375,7 +376,7 @@ func clamp_window_position() -> void:


func _on_window_input(event: InputEvent) -> void:
# Capture CTRL+S when doc focused to save scene)
# Capture CTRL+S when doc focused to save scene
if event is InputEventKey and event.keycode == KEY_S and event.pressed and event.is_command_or_control_pressed():
save_editor_settings()
plugin.get_editor_interface().save_scene()
Expand Down Expand Up @@ -403,33 +404,43 @@ func _on_godot_focus_exited() -> void:

## Manage Editor Settings


func get_setting(p_str: String, p_default: Variant) -> Variant:
if editor_settings.has_setting(p_str):
return editor_settings.get_setting(p_str)
else:
return p_default


func load_editor_settings() -> void:
floating_btn.button_pressed = get_setting(PS_DOCK_FLOATING, false)
pinned_btn.button_pressed = get_setting(PS_DOCK_PINNED, true)
size_slider.value = get_setting(PS_DOCK_TILE_SIZE, 83)
## Deprecated 0.9.2 Remove in 1.0 - Move settings to new config category
var value: Variant
for es: String in [ "terrain3d/config/dock_slot", "terrain3d/config/dock_tile_size",
"terrain3d/config/dock_floating", "terrain3d/config/dock_always_on_top",
"terrain3d/config/dock_window_size", "terrain3d/config/dock_window_position", ]:
if plugin.editor_settings.has_setting(es):
value = plugin.editor_settings.get_setting(es)
plugin.editor_settings.erase(es)
plugin.editor_settings.set_setting(es.replace("/config/dock_", "/dock/"), value)
## Deprecated End - Load settings as normal

floating_btn.button_pressed = plugin.get_setting(ES_DOCK_FLOATING, false)
pinned_btn.button_pressed = plugin.get_setting(ES_DOCK_PINNED, true)
size_slider.value = plugin.get_setting(ES_DOCK_TILE_SIZE, 83)
_on_slider_changed(size_slider.value)
set_slot(get_setting(PS_DOCK_SLOT, POS_BOTTOM))
set_slot(plugin.get_setting(ES_DOCK_SLOT, POS_BOTTOM))
if floating_btn.button_pressed:
make_dock_float()
# TODO Don't save tab until thumbnail generation more reliable
#if plugin.get_setting(ES_DOCK_TAB, 0) == 1:
# _on_meshes_pressed()


func save_editor_settings() -> void:
if not _initialized:
return
clamp_window_position()
editor_settings.set_setting(PS_DOCK_SLOT, slot)
editor_settings.set_setting(PS_DOCK_TILE_SIZE, size_slider.value)
editor_settings.set_setting(PS_DOCK_FLOATING, floating_btn.button_pressed)
editor_settings.set_setting(PS_DOCK_PINNED, pinned_btn.button_pressed)
plugin.set_setting(ES_DOCK_SLOT, slot)
plugin.set_setting(ES_DOCK_TILE_SIZE, size_slider.value)
plugin.set_setting(ES_DOCK_FLOATING, floating_btn.button_pressed)
plugin.set_setting(ES_DOCK_PINNED, pinned_btn.button_pressed)
# TODO Don't save tab until thumbnail generation more reliable
# plugin.set_setting(ES_DOCK_TAB, 0 if _current_list == texture_list else 1)
if window:
editor_settings.set_setting(PS_DOCK_WINDOW_SIZE, window.size)
editor_settings.set_setting(PS_DOCK_WINDOW_POSITION, window.position)
plugin.set_setting(ES_DOCK_WINDOW_SIZE, window.size)
plugin.set_setting(ES_DOCK_WINDOW_POSITION, window.position)


##############################################################
Expand Down Expand Up @@ -703,7 +714,7 @@ class ListEntry extends VBoxContainer:
else:
name_label.text = "Add Mesh"


func _notification(p_what) -> void:
match p_what:
NOTIFICATION_DRAW:
Expand Down
27 changes: 22 additions & 5 deletions project/addons/terrain_3d/src/tool_settings.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const MultiPicker: Script = preload("res://addons/terrain_3d/src/multi_picker.gd
const DEFAULT_BRUSH: String = "circle0.exr"
const BRUSH_PATH: String = "res://addons/terrain_3d/brushes"
const PICKER_ICON: String = "res://addons/terrain_3d/icons/picker.svg"
const ES_TOOL_SETTINGS: String = "terrain3d/tool_settings/"

# Add settings flags
const NONE: int = 0x0
Expand All @@ -35,9 +36,9 @@ const NO_LABEL: int = 0x4
const ADD_SEPARATOR: int = 0x8
const ADD_SPACER: int = 0x10

var plugin: EditorPlugin # Actually Terrain3DEditorPlugin, but Godot still has CRC errors
var brush_preview_material: ShaderMaterial
var select_brush_button: Button

var main_list: HBoxContainer
var advanced_list: VBoxContainer
var height_list: VBoxContainer
Expand Down Expand Up @@ -361,18 +362,29 @@ func add_setting(p_args: Dictionary) -> void:

SettingType.CHECKBOX:
var checkbox := CheckBox.new()
checkbox.set_pressed_no_signal(p_default)
checkbox.set_pressed_no_signal(plugin.get_setting(ES_TOOL_SETTINGS + p_name, p_default))
checkbox.toggled.connect( (
func(value, path):
plugin.set_setting(path, value)
).bind(ES_TOOL_SETTINGS + p_name) )

checkbox.pressed.connect(_on_setting_changed)
pending_children.push_back(checkbox)
control = checkbox

SettingType.COLOR_SELECT:
var picker := ColorPickerButton.new()
picker.set_custom_minimum_size(Vector2(100, 25))
picker.color = Color.WHITE
picker.edit_alpha = false
picker.get_picker().set_color_mode(ColorPicker.MODE_HSV)

picker.set_pick_color(plugin.get_setting(ES_TOOL_SETTINGS + p_name, p_default))
picker.color_changed.connect( (
func(value, path):
plugin.set_setting(path, value)
).bind(ES_TOOL_SETTINGS + p_name) )
picker.color_changed.connect(_on_setting_changed)

var popup: PopupPanel = picker.get_popup()
popup.mouse_exited.connect(Callable(func(p): p.hide()).bind(popup))
pending_children.push_back(picker)
Expand Down Expand Up @@ -414,7 +426,6 @@ func add_setting(p_args: Dictionary) -> void:
spin_slider.set_max(p_maximum)
spin_slider.set_min(p_minimum)
spin_slider.set_step(p_step)
spin_slider.set_value(p_default)
spin_slider.set_suffix(p_suffix)
spin_slider.set_v_size_flags(SIZE_SHRINK_CENTER)
spin_slider.set_custom_minimum_size(Vector2(75, 0))
Expand All @@ -429,7 +440,7 @@ func add_setting(p_args: Dictionary) -> void:
pending_children.push_back(slider)
pending_children.push_back(spin_slider)
control = spin_slider

else: # DOUBLE_SLIDER
var label := Label.new()
label.set_custom_minimum_size(Vector2(75, 0))
Expand All @@ -448,6 +459,12 @@ func add_setting(p_args: Dictionary) -> void:
slider.set_v_size_flags(SIZE_SHRINK_CENTER)
slider.set_custom_minimum_size(Vector2(60, 10))

slider.set_value(plugin.get_setting(ES_TOOL_SETTINGS + p_name, p_default))
slider.value_changed.connect( (
func(value, path):
plugin.set_setting(path, value)
).bind(ES_TOOL_SETTINGS + p_name) )

control.name = p_name.to_pascal_case()
settings[p_name] = control

Expand Down
1 change: 1 addition & 0 deletions project/addons/terrain_3d/src/ui.gd
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ func _enter_tree() -> void:
tool_settings = ToolSettings.new()
tool_settings.connect("setting_changed", _on_setting_changed)
tool_settings.connect("picking", _on_picking)
tool_settings.plugin = plugin
tool_settings.hide()

terrain_menu = TerrainMenu.new()
Expand Down

0 comments on commit 6faf932

Please sign in to comment.