mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
Replaced the TabContainer with a Tabs control
- Load material can now load several materials - the current tab now has a close button
This commit is contained in:
parent
467ba24a5f
commit
ec645a06f4
@ -66,6 +66,8 @@ func remove_node(node):
|
|||||||
# Global operations on graph
|
# Global operations on graph
|
||||||
|
|
||||||
func update_tab_title():
|
func update_tab_title():
|
||||||
|
if !get_parent().has_method("set_tab_title"):
|
||||||
|
return
|
||||||
var title = "[unnamed]"
|
var title = "[unnamed]"
|
||||||
if save_path != null:
|
if save_path != null:
|
||||||
title = save_path.right(save_path.rfind("/")+1)
|
title = save_path.right(save_path.rfind("/")+1)
|
||||||
@ -77,7 +79,6 @@ func update_tab_title():
|
|||||||
func set_need_save(ns):
|
func set_need_save(ns):
|
||||||
if ns != need_save:
|
if ns != need_save:
|
||||||
need_save = ns
|
need_save = ns
|
||||||
if get_parent() is TabContainer:
|
|
||||||
update_tab_title()
|
update_tab_title()
|
||||||
|
|
||||||
func set_save_path(path):
|
func set_save_path(path):
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
tool
|
tool
|
||||||
extends Panel
|
extends Panel
|
||||||
|
|
||||||
var current_tab = -1
|
var current_tab = null
|
||||||
|
|
||||||
const MENU = [
|
const MENU = [
|
||||||
{ menu="File", command="new_material", description="New material" },
|
{ menu="File", command="new_material", description="New material" },
|
||||||
@ -89,11 +89,16 @@ func load_material():
|
|||||||
add_child(dialog)
|
add_child(dialog)
|
||||||
dialog.rect_min_size = Vector2(500, 500)
|
dialog.rect_min_size = Vector2(500, 500)
|
||||||
dialog.access = FileDialog.ACCESS_FILESYSTEM
|
dialog.access = FileDialog.ACCESS_FILESYSTEM
|
||||||
dialog.mode = FileDialog.MODE_OPEN_FILE
|
dialog.mode = FileDialog.MODE_OPEN_FILES
|
||||||
dialog.add_filter("*.ptex;Procedural textures file")
|
dialog.add_filter("*.ptex;Procedural textures file")
|
||||||
dialog.connect("file_selected", self, "do_load_material")
|
#dialog.connect("file_selected", self, "do_load_material")
|
||||||
|
dialog.connect("files_selected", self, "do_load_materials")
|
||||||
dialog.popup_centered()
|
dialog.popup_centered()
|
||||||
|
|
||||||
|
func do_load_materials(filenames):
|
||||||
|
for f in filenames:
|
||||||
|
do_load_material(f)
|
||||||
|
|
||||||
func do_load_material(filename):
|
func do_load_material(filename):
|
||||||
var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
||||||
var node_count = 0
|
var node_count = 0
|
||||||
@ -120,9 +125,7 @@ func save_material_as():
|
|||||||
graph_edit.save_file_as()
|
graph_edit.save_file_as()
|
||||||
|
|
||||||
func close_material():
|
func close_material():
|
||||||
var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
$VBoxContainer/HBoxContainer/Projects.close_tab()
|
||||||
if graph_edit != null:
|
|
||||||
graph_edit.queue_free()
|
|
||||||
|
|
||||||
func export_material():
|
func export_material():
|
||||||
var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
||||||
@ -245,11 +248,13 @@ func update_preview_2d(node = null):
|
|||||||
graph_edit.setup_material(preview.get_2d_material(), node.get_textures(), node.generate_shader())
|
graph_edit.setup_material(preview.get_2d_material(), node.get_textures(), node.generate_shader())
|
||||||
|
|
||||||
func _on_Projects_tab_changed(tab):
|
func _on_Projects_tab_changed(tab):
|
||||||
if tab != current_tab:
|
var new_tab = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control()
|
||||||
|
if new_tab != current_tab:
|
||||||
|
if new_tab != null:
|
||||||
for c in get_incoming_connections():
|
for c in get_incoming_connections():
|
||||||
if c.method_name == "update_preview" or c.method_name == "update_preview_2d":
|
if c.method_name == "update_preview" or c.method_name == "update_preview_2d":
|
||||||
c.source.disconnect(c.signal_name, self, c.method_name)
|
c.source.disconnect(c.signal_name, self, c.method_name)
|
||||||
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().connect("graph_changed", self, "update_preview")
|
new_tab.connect("graph_changed", self, "update_preview")
|
||||||
$VBoxContainer/HBoxContainer/Projects.get_current_tab_control().connect("node_selected", self, "update_preview_2d")
|
new_tab.connect("node_selected", self, "update_preview_2d")
|
||||||
current_tab = tab
|
current_tab = new_tab
|
||||||
update_preview()
|
update_preview()
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=5 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://addons/procedural_material/main_window.gd" type="Script" id=1]
|
[ext_resource path="res://addons/procedural_material/main_window.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://addons/procedural_material/library.gd" type="Script" id=2]
|
[ext_resource path="res://addons/procedural_material/library.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://addons/procedural_material/preview.tscn" type="PackedScene" id=3]
|
[ext_resource path="res://addons/procedural_material/preview.tscn" type="PackedScene" id=3]
|
||||||
|
[ext_resource path="res://addons/procedural_material/widgets/tabs.gd" type="Script" id=4]
|
||||||
|
|
||||||
[node name="MainWindow" type="Panel" index="0"]
|
[node name="MainWindow" type="Panel" index="0"]
|
||||||
|
|
||||||
@ -222,7 +223,7 @@ margin_top = 354.0
|
|||||||
margin_right = 314.0
|
margin_right = 314.0
|
||||||
margin_bottom = 696.0
|
margin_bottom = 696.0
|
||||||
|
|
||||||
[node name="Projects" type="TabContainer" parent="VBoxContainer/HBoxContainer" index="1"]
|
[node name="Projects" type="Panel" parent="VBoxContainer/HBoxContainer" index="1"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
@ -238,16 +239,41 @@ mouse_default_cursor_shape = 0
|
|||||||
size_flags_horizontal = 3
|
size_flags_horizontal = 3
|
||||||
size_flags_vertical = 3
|
size_flags_vertical = 3
|
||||||
size_flags_stretch_ratio = 3.0
|
size_flags_stretch_ratio = 3.0
|
||||||
|
script = ExtResource( 4 )
|
||||||
|
_sections_unfolded = [ "custom_styles" ]
|
||||||
|
|
||||||
|
[node name="Tabs" type="Tabs" parent="VBoxContainer/HBoxContainer/Projects" index="1"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_right = 954.0
|
||||||
|
margin_bottom = 23.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
tab_align = 0
|
tab_align = 0
|
||||||
tabs_visible = true
|
tab_close_display_policy = 1
|
||||||
_sections_unfolded = [ "Size Flags" ]
|
scrolling_enabled = true
|
||||||
|
|
||||||
|
[connection signal="no_more_tabs" from="VBoxContainer/HBoxContainer/Projects" to="." method="new_material"]
|
||||||
|
|
||||||
|
[connection signal="resized" from="VBoxContainer/HBoxContainer/Projects" to="VBoxContainer/HBoxContainer/Projects" method="_on_Projects_resized"]
|
||||||
|
|
||||||
[connection signal="tab_changed" from="VBoxContainer/HBoxContainer/Projects" to="." method="_on_Projects_tab_changed"]
|
[connection signal="tab_changed" from="VBoxContainer/HBoxContainer/Projects" to="." method="_on_Projects_tab_changed"]
|
||||||
|
|
||||||
[connection signal="tab_selected" from="VBoxContainer/HBoxContainer/Projects" to="." method="_on_Projects_tab_changed"]
|
|
||||||
|
|
||||||
[connection signal="connection_request" from="VBoxContainer/HBoxContainer/Projects/GraphEdit" to="VBoxContainer/HBoxContainer/Projects/GraphEdit" method="connect_node"]
|
[connection signal="connection_request" from="VBoxContainer/HBoxContainer/Projects/GraphEdit" to="VBoxContainer/HBoxContainer/Projects/GraphEdit" method="connect_node"]
|
||||||
|
|
||||||
[connection signal="disconnection_request" from="VBoxContainer/HBoxContainer/Projects/GraphEdit" to="VBoxContainer/HBoxContainer/Projects/GraphEdit" method="disconnect_node"]
|
[connection signal="disconnection_request" from="VBoxContainer/HBoxContainer/Projects/GraphEdit" to="VBoxContainer/HBoxContainer/Projects/GraphEdit" method="disconnect_node"]
|
||||||
|
|
||||||
|
[connection signal="reposition_active_tab_request" from="VBoxContainer/HBoxContainer/Projects/Tabs" to="VBoxContainer/HBoxContainer/Projects" method="move_active_tab_to"]
|
||||||
|
|
||||||
|
[connection signal="tab_changed" from="VBoxContainer/HBoxContainer/Projects/Tabs" to="VBoxContainer/HBoxContainer/Projects" method="set_current_tab"]
|
||||||
|
|
||||||
|
[connection signal="tab_close" from="VBoxContainer/HBoxContainer/Projects/Tabs" to="VBoxContainer/HBoxContainer/Projects" method="close_tab"]
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ func _ready():
|
|||||||
$HBoxContainer1/size.add_item(str(int(pow(2, 5+i))), i)
|
$HBoxContainer1/size.add_item(str(int(pow(2, 5+i))), i)
|
||||||
$HBoxContainer1/size.selected = size
|
$HBoxContainer1/size.selected = size
|
||||||
initialize_properties([ $HBoxContainer1/size, $HBoxContainer2/density ])
|
initialize_properties([ $HBoxContainer1/size, $HBoxContainer2/density ])
|
||||||
print(size)
|
|
||||||
|
|
||||||
func _get_shader_code(uv):
|
func _get_shader_code(uv):
|
||||||
var rv = { defs="", code="" }
|
var rv = { defs="", code="" }
|
||||||
|
66
addons/procedural_material/widgets/tabs.gd
Normal file
66
addons/procedural_material/widgets/tabs.gd
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
tool
|
||||||
|
extends Panel
|
||||||
|
|
||||||
|
var current_tab = -1 setget set_current_tab
|
||||||
|
|
||||||
|
signal tab_changed
|
||||||
|
signal no_more_tabs
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
pass
|
||||||
|
|
||||||
|
func add_child(control):
|
||||||
|
.add_child(control)
|
||||||
|
if !(control is Tabs):
|
||||||
|
$Tabs.add_tab(control.name)
|
||||||
|
move_child(control, $Tabs.get_tab_count()-1)
|
||||||
|
|
||||||
|
func close_tab(tab = null):
|
||||||
|
if tab == null:
|
||||||
|
tab = $Tabs.get_current_tab()
|
||||||
|
get_child(tab).queue_free()
|
||||||
|
$Tabs.remove_tab(tab)
|
||||||
|
var control = get_child(tab)
|
||||||
|
remove_child(control)
|
||||||
|
control.free()
|
||||||
|
current_tab = -1
|
||||||
|
if $Tabs.get_tab_count() == 0:
|
||||||
|
emit_signal("no_more_tabs")
|
||||||
|
else:
|
||||||
|
set_current_tab(0)
|
||||||
|
|
||||||
|
func move_active_tab_to(idx_to):
|
||||||
|
$Tabs.move_tab(current_tab, idx_to)
|
||||||
|
move_child(get_child(current_tab), idx_to)
|
||||||
|
set_current_tab(idx_to)
|
||||||
|
|
||||||
|
func set_current_tab(t):
|
||||||
|
if t == current_tab:
|
||||||
|
return
|
||||||
|
var node
|
||||||
|
if current_tab >= 0 && current_tab < $Tabs.get_tab_count():
|
||||||
|
node = get_child(current_tab)
|
||||||
|
node.visible = false
|
||||||
|
current_tab = t
|
||||||
|
if current_tab >= 0 && current_tab < $Tabs.get_tab_count():
|
||||||
|
node = get_child(current_tab)
|
||||||
|
node.visible = true
|
||||||
|
node.rect_position = Vector2(0, $Tabs.rect_size.y)
|
||||||
|
node.rect_size = rect_size - node.rect_position
|
||||||
|
else:
|
||||||
|
print("Incorrect current tab "+str(current_tab))
|
||||||
|
$Tabs.current_tab = current_tab
|
||||||
|
emit_signal("tab_changed", current_tab)
|
||||||
|
|
||||||
|
func set_tab_title(index, title):
|
||||||
|
$Tabs.set_tab_title(index, title)
|
||||||
|
|
||||||
|
func get_current_tab_control():
|
||||||
|
return get_child(current_tab)
|
||||||
|
|
||||||
|
func _on_Tabs_tab_changed(tab):
|
||||||
|
set_current_tab(tab)
|
||||||
|
|
||||||
|
func _on_Projects_resized():
|
||||||
|
$Tabs.rect_size.x = rect_size.x
|
||||||
|
|
Loading…
Reference in New Issue
Block a user