material-maker/material_maker/main_window_layout.gd

161 lines
6.8 KiB
GDScript

extends HSplitContainer
const PANEL_POSITIONS = {
TopLeft="Left/Top",
BottomLeft="Left/Bottom",
TopRight="SplitRight/Right/Top",
BottomRight="SplitRight/Right/Bottom"
}
const PANELS = [
{ name="Library", scene=preload("res://material_maker/panels/library/library.tscn"), position="TopLeft" },
{ name="Preview2D", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="BottomLeft" },
{ name="Preview3D", scene=preload("res://material_maker/panels/preview_3d/preview_3d_panel.tscn"), position="BottomLeft" },
{ name="Preview2D (2)", scene=preload("res://material_maker/panels/preview_2d/preview_2d_panel.tscn"), position="BottomLeft", parameters={ config_var_suffix="_2" } },
{ name="Histogram", scene=preload("res://material_maker/widgets/histogram/histogram.tscn"), position="BottomLeft" },
{ name="Hierarchy", scene=preload("res://material_maker/panels/hierarchy/hierarchy_panel.tscn"), position="TopRight" },
{ name="Reference", scene=preload("res://material_maker/panels/reference/reference_panel.tscn"), position="BottomLeft" },
{ name="Brushes", scene=preload("res://material_maker/panels/brushes/brushes.tscn"), position="TopLeft" },
{ name="Layers", scene=preload("res://material_maker/panels/layers/layers.tscn"), position="BottomRight" },
{ name="Parameters", scene=preload("res://material_maker/panels/parameters/parameters.tscn"), position="TopRight" },
]
const HIDE_PANELS = {
material=[ "Brushes", "Layers", "Parameters" ],
paint=[ "Preview3D", "Histogram", "Hierarchy" ]
}
var panels = {}
var previous_width : float
var current_mode : String = "material"
func _ready() -> void:
previous_width = rect_size.x
func toggle_side_panels() -> void:
# Toggle side docks' visibility to maximize the space available
# for the graph panel. This is useful on smaller displays.
$Left.visible = not $Left.visible
$SplitRight/Right.visible = not $SplitRight/Right.visible
func load_panels() -> void:
# Create panels
for panel_pos in PANEL_POSITIONS.keys():
get_node(PANEL_POSITIONS[panel_pos]).set_tabs_rearrange_group(1)
for panel in PANELS:
var node : Node = panel.scene.instance()
node.name = panel.name
if panel.has("parameters"):
for p in panel.parameters.keys():
node.set(p, panel.parameters[p])
panels[panel.name] = node
var tab = get_node(PANEL_POSITIONS[panel.position])
var config_panel_name = panel.name.replace(" ", "_").replace("(", "_").replace(")", "_")
if mm_globals.config.has_section_key("layout", config_panel_name+"_location"):
tab = get_node(PANEL_POSITIONS[mm_globals.config.get_value("layout", config_panel_name+"_location")])
if mm_globals.config.has_section_key("layout", config_panel_name+"_hidden") && mm_globals.config.get_value("layout", config_panel_name+"_hidden"):
node.set_meta("parent_tab_container", tab)
node.set_meta("hidden", true)
else:
tab.add_child(node)
node.set_meta("hidden", false)
# Split positions
yield(get_tree(), "idle_frame")
if mm_globals.config.has_section_key("layout", "LeftVSplitOffset"):
split_offset = mm_globals.config.get_value("layout", "LeftVSplitOffset")
if mm_globals.config.has_section_key("layout", "LeftHSplitOffset"):
$Left.split_offset = mm_globals.config.get_value("layout", "LeftHSplitOffset")
if mm_globals.config.has_section_key("layout", "RightVSplitOffset"):
$SplitRight.split_offset = mm_globals.config.get_value("layout", "RightVSplitOffset")
if mm_globals.config.has_section_key("layout", "RightHSplitOffset"):
$SplitRight/Right.split_offset = mm_globals.config.get_value("layout", "RightHSplitOffset")
func save_config() -> void:
for p in panels:
var config_panel_name = p.replace(" ", "_").replace("(", "_").replace(")", "_")
var location = panels[p].get_parent()
var hidden = false
if location == null:
hidden = panels[p].get_meta("hidden")
location = panels[p].get_meta("parent_tab_container")
mm_globals.config.set_value("layout", config_panel_name+"_hidden", hidden)
for l in PANEL_POSITIONS.keys():
if location == get_node(PANEL_POSITIONS[l]):
mm_globals.config.set_value("layout", config_panel_name+"_location", l)
mm_globals.config.set_value("layout", "LeftVSplitOffset", split_offset)
mm_globals.config.set_value("layout", "LeftHSplitOffset", $Left.split_offset)
mm_globals.config.set_value("layout", "RightVSplitOffset", $SplitRight.split_offset)
mm_globals.config.set_value("layout", "RightHSplitOffset", $SplitRight/Right.split_offset)
func get_panel(n) -> Control:
return panels[n]
func get_panel_list() -> Array:
var panels_list = panels.keys()
panels_list.sort()
return panels_list
func is_panel_visible(panel_name : String) -> bool:
return panels[panel_name].get_parent() != null
func set_panel_visible(panel_name : String, v : bool) -> void:
var panel = panels[panel_name]
panel.set_meta("hidden", !v)
if panel.is_inside_tree():
panel.set_meta("parent_tab_container", panel.get_parent())
if v and HIDE_PANELS[current_mode].find(panel_name) == -1:
if ! panel.is_inside_tree():
panel.get_meta("parent_tab_container").add_child(panel)
elif panel.is_inside_tree():
panel.get_parent().remove_child(panel)
update_panels()
func change_mode(m : String) -> void:
current_mode = m
for p in panels:
set_panel_visible(p, !panels[p].get_meta("hidden"))
update_panels()
func update_panels() -> void:
var left_width = $Left.rect_size.x
var left_requested = left_width
var right_width = $SplitRight/Right.rect_size.x
var right_requested = right_width
if $Left/Top.get_tab_count() == 0:
if $Left/Bottom.get_tab_count() == 0:
left_requested = 10
$Left.split_offset -= ($Left/Top.rect_size.y-$Left/Bottom.rect_size.y)/2
$Left.clamp_split_offset()
else:
$Left.split_offset -= $Left/Top.rect_size.y-10
$Left.clamp_split_offset()
elif $Left/Bottom.get_tab_count() == 0:
$Left.split_offset += $Left/Bottom.rect_size.y-10
$Left.clamp_split_offset()
if $SplitRight/Right/Top.get_tab_count() == 0:
if $SplitRight/Right/Bottom.get_tab_count() == 0:
right_requested = 10
$SplitRight/Right.split_offset -= ($SplitRight/Right/Top.rect_size.y-$SplitRight/Right/Bottom.rect_size.y)/2
$SplitRight/Right.clamp_split_offset()
else:
$SplitRight/Right.split_offset -= $SplitRight/Right/Top.rect_size.y-10
$SplitRight/Right.clamp_split_offset()
elif $SplitRight/Right/Bottom.get_tab_count() == 0:
$SplitRight/Right.split_offset += $SplitRight/Right/Bottom.rect_size.y-10
$SplitRight/Right.clamp_split_offset()
split_offset += left_requested - left_width + right_requested - right_width
clamp_split_offset()
$SplitRight.split_offset += right_width - right_requested
func _on_Left_dragged(_offset : int) -> void:
$Left.clamp_split_offset()
func _on_Right_dragged(_offset : int) -> void:
$SplitRight/Right.clamp_split_offset()
func _on_tab_changed(_tab):
update_panels()
func _on_Layout_resized():
# warning-ignore:narrowing_conversion
split_offset -= rect_size.x - previous_width
previous_width = rect_size.x