Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
42dc518
Upgraded Godot to 4.8dev4
williamchange Aug 28, 2026
875f2e2
Fixed tabbar and panels positions
williamchange Aug 28, 2026
2d10870
update ci
williamchange Aug 29, 2026
d8814c1
Fixed graph menubar and graphui positions
williamchange Aug 29, 2026
0582484
remove unused
williamchange Aug 29, 2026
179ce9e
Upgraded to 4.8dev5
williamchange Sep 11, 2026
ecacea9
preliminary support for iOS
williamchange Sep 12, 2026
22d305a
clear export path
williamchange Sep 12, 2026
e52d22b
disable paste image in reference since ios does not support it
williamchange Sep 12, 2026
0a298bd
support two-finger pan and node popup via tap
williamchange Sep 12, 2026
f1f09d4
use vulkan for ios
williamchange Sep 13, 2026
b9b9a47
display shortcut combination correctly on ios menu
williamchange Sep 13, 2026
5164438
avg pos for add-node popup, support node context via two-finger tap
williamchange Sep 13, 2026
78f28ec
small fix
williamchange Sep 13, 2026
fdccc17
make touch variables static
williamchange Sep 13, 2026
f31447c
support touch dragging items from library panel
williamchange Sep 13, 2026
dfbd0d3
fix
williamchange Sep 13, 2026
7b3fb9b
undocking panels on ios doesnt make much sense
williamchange Sep 13, 2026
574e640
support access to user data on ios
williamchange Sep 13, 2026
789e397
limit filedialog access to user data on ios
williamchange Sep 13, 2026
b5ddd97
removed single-window mode option
williamchange Sep 13, 2026
a6a65d2
support orbit via touch in 3d previews
williamchange Sep 13, 2026
f13d590
Merge branch 'master' into ios
williamchange Sep 13, 2026
387cbe7
upgrade to 4.8 dev6
williamchange Sep 15, 2026
11b2ea3
Merge branch 'master' into 4.8
williamchange Sep 16, 2026
a9c5c6c
updated to 4.8dev7
williamchange Sep 30, 2026
58541c6
trigger ci
williamchange Oct 1, 2026
05db874
upgrade to 4.8beta1
williamchange Oct 15, 2026
fe0f932
godot macos builds are now per-arch?
williamchange Oct 16, 2026
83f31bc
Merge branch 'master' into 4.8
williamchange Oct 16, 2026
a92dcf3
fix path again
williamchange Oct 16, 2026
6c3b30a
Implemented Android Support
williamchange Oct 14, 2026
7f9acbd
fix icons
williamchange Oct 16, 2026
f408acd
fix icons and accents
williamchange Oct 16, 2026
c98fbad
Fixed loading theme causing app to hang in some cases
williamchange Oct 16, 2026
01d4763
Merge branch 'fix-theme-load' into android
williamchange Oct 16, 2026
17899f5
fix android theme overrides
williamchange Oct 16, 2026
6c87d5f
fix icons
williamchange Oct 16, 2026
625138a
update dragger custom theme colors
williamchange Oct 16, 2026
1eba3f8
Merge branch 'android' into ios
williamchange Oct 17, 2026
7d30388
fix from merge
williamchange Oct 17, 2026
88def7c
Merge branch '4.8' into ios
williamchange Oct 17, 2026
e528f3b
fix from merge
williamchange Oct 17, 2026
69f6d3e
fix node position init
williamchange Oct 17, 2026
a9c277d
Merge branch 'fix-theme-load' into ios
williamchange Oct 17, 2026
489f247
ios checks for touch autoload
williamchange Oct 17, 2026
a426fe1
disable ci completely for now
williamchange Oct 17, 2026
00cbb63
fix exports
williamchange Oct 17, 2026
a639563
unused signal
williamchange Oct 17, 2026
d9d2524
format and naming
williamchange Oct 17, 2026
0061fea
Fixed missing sub-nodes settings in preferences
williamchange Oct 20, 2026
5c59b0c
dont show quit on ios
williamchange Oct 20, 2026
db8bae2
ios changes
williamchange Oct 20, 2026
cc7b0a9
Merge branch 'master' into ios
williamchange Oct 20, 2026
4b7eec2
Merge branch 'missing-sub-node-pref' into ios
williamchange Oct 20, 2026
88823c1
Merge branch 'master' into ios
williamchange Oct 31, 2026
6735096
opened in b2
williamchange Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
550 changes: 278 additions & 272 deletions .github/workflows/dev-desktop-builds.yml

Large diffs are not rendered by default.

37 changes: 34 additions & 3 deletions addons/flexible_layout/flexible_dragger.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,24 @@ var dragging : bool = false
var flex_split : WeakRef
var dragger_index : int
var vertical : bool
var half_grip_size : int

var touch_dragger : TouchDragger

func _init():
set_meta("flexlayout", true)

func _ready() -> void:
if mm_globals.get_config("touch_optimization"):
touch_dragger = TouchDragger.new()
touch_dragger.name = "TouchDragger"
add_child(touch_dragger)
mouse_entered.disconnect($TextureRect.show)
mouse_exited.disconnect($TextureRect.hide)

func set_split(s, i : int, v : bool):
flex_split = weakref(s)
half_grip_size = flex_split.get_ref().grip_size * 0.5
dragger_index = i
vertical = v
if vertical:
Expand All @@ -20,10 +32,14 @@ func set_split(s, i : int, v : bool):
mouse_default_cursor_shape = Control.CURSOR_HSPLIT
$TextureRect.texture = get_theme_icon("grabber", "HSplitContainer")

if mm_globals.get_config("touch_optimization"):
touch_dragger.setup()
mouse_filter = Control.MOUSE_FILTER_IGNORE

var drag_limits : Vector2i
var drag_position : int

func _on_gui_input(event):
func _on_gui_input(event : InputEvent, is_touch_dragger_input : bool = false):
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT:
dragging = event.pressed
Expand All @@ -34,15 +50,30 @@ func _on_gui_input(event):
drag_limits = flex_split.get_ref().start_flexlayout_drag(dragger_index, drag_position)
elif event is InputEventMouseMotion:
if dragging:
accept_event()
if vertical:
drag_position = position.y+event.position.y-5
drag_position = position.y+event.position.y - half_grip_size

if is_touch_dragger_input:
drag_position -= touch_dragger.get_drag_offset()

var new_position_y = clampi(drag_position, drag_limits.x, drag_limits.y)
if position.y != new_position_y:
position.y = new_position_y
flex_split.get_ref().drag(dragger_index, position.y)

if is_touch_dragger_input:
touch_dragger.update_position(new_position_y)
else:
drag_position = position.x+event.position.x-5
drag_position = position.x+event.position.x - half_grip_size

if is_touch_dragger_input:
drag_position -= touch_dragger.get_drag_offset()

var new_position_x = clampi(drag_position, drag_limits.x, drag_limits.y)
if position.x != new_position_x:
position.x = new_position_x
flex_split.get_ref().drag(dragger_index, position.x)

if is_touch_dragger_input:
touch_dragger.update_position(new_position_x)
12 changes: 5 additions & 7 deletions addons/flexible_layout/flexible_dragger.tscn
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
[gd_scene load_steps=2 format=3 uid="uid://cucx3oayvvxhu"]
[gd_scene format=3 uid="uid://cucx3oayvvxhu"]

[ext_resource type="Script" path="res://addons/flexible_layout/flexible_dragger.gd" id="1_3i5mx"]
[ext_resource type="Script" uid="uid://dgwcni3ebvc8s" path="res://addons/flexible_layout/flexible_dragger.gd" id="1_3i5mx"]

[node name="Dragger" type="HBoxContainer"]
anchors_preset = 8
[node name="Dragger" type="HBoxContainer" unique_id=1107978390]
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_3i5mx")

[node name="TextureRect" type="TextureRect" parent="."]
[node name="TextureRect" type="TextureRect" parent="." unique_id=1116440276]
visible = false
layout_mode = 2
size_flags_horizontal = 6
Expand Down
94 changes: 94 additions & 0 deletions addons/flexible_layout/flexible_dragger_touch.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
class_name TouchDragger
extends Control

var is_pressed : bool = false

static var sb_normal : StyleBoxFlat
static var sb_pressed : StyleBoxFlat

func _ready() -> void:
set_notify_transform(true)
gui_input.connect(get_parent()._on_gui_input.bind(true))

mouse_filter = Control.MOUSE_FILTER_STOP
size_flags_horizontal = Control.SIZE_SHRINK_CENTER
size_flags_vertical = Control.SIZE_SHRINK_CENTER
top_level = true

init_styleboxes()

func _draw() -> void:
if sb_pressed and sb_normal:
draw_style_box(sb_pressed if is_pressed else sb_normal, Rect2(Vector2.ZERO, size))

func _gui_input(event : InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
is_pressed = event.pressed
queue_redraw()

func _notification(what : int) -> void:
match what:
NOTIFICATION_THEME_CHANGED:
update_theme_colors()
NOTIFICATION_TRANSFORM_CHANGED:
update_dragger_global_pos()

func update_stylebox_colors(base_color : Color, border : Color,
normal_opacity : float, pressed_opacity : float) -> void:
sb_normal.bg_color = base_color
sb_normal.bg_color.a = normal_opacity
sb_normal.border_color = border

sb_pressed.bg_color = base_color
sb_pressed.bg_color.a = pressed_opacity
sb_pressed.border_color = border

func init_styleboxes() -> void:
if not sb_normal:
sb_normal = StyleBoxFlat.new()
sb_normal.set_border_width_all(2)
sb_normal.set_corner_radius_all(5)
sb_normal.border_blend = true
sb_normal.corner_detail = 4

if not sb_pressed:
sb_pressed = sb_normal.duplicate(true)

func setup() -> void:
show()
if get_parent().vertical:
mouse_default_cursor_shape = Control.CURSOR_VSPLIT
custom_minimum_size = Vector2(52, 16)
else:
mouse_default_cursor_shape = Control.CURSOR_HSPLIT
custom_minimum_size = Vector2(16, 52)
update_theme_colors()
update_dragger_global_pos.call_deferred()

func update_dragger_global_pos() -> void:
global_position = get_parent().global_position + (get_parent().size - size) * 0.5

func update_position(v : float) -> void:
if get_parent().vertical:
position.y = v
else:
position.x = v
queue_redraw()

func get_drag_offset() -> int:
return mini(custom_minimum_size.x, custom_minimum_size.y) / 2

func update_theme_colors() -> void:
if not sb_normal or not sb_pressed:
init_styleboxes()
match ThemeUtils.current_theme:
ThemeUtils.CUSTOM_THEME:
update_stylebox_colors(ThemeUtils.base_color.lightened(0.3),
ThemeUtils.base_color.darkened(0.2), 0.25, 0.8)
ThemeUtils.DARK_THEME:
update_stylebox_colors(Color.WHITE, Color.BLACK, 0.25, 0.8)
ThemeUtils.LIGHT_THEME:
update_stylebox_colors(Color.BLACK, Color.WHITE, 0.6, 0.25)
ThemeUtils.CLASSIC_THEME:
update_stylebox_colors(Color("506396ff"), Color("768ac2ff"), .25, .8)
queue_redraw()
1 change: 1 addition & 0 deletions addons/flexible_layout/flexible_dragger_touch.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://dgeyah0cwww2p
16 changes: 8 additions & 8 deletions addons/flexible_layout/flexible_layout.gd
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ class FlexSplit:
var draggers : Array[Control] = []

const DRAGGER_SCENE = preload("res://addons/flexible_layout/flexible_dragger.tscn")

var grip_size : int = 4 if mm_globals.get_config("touch_optimization") else 10

func _init(p : FlexNode, fl : FlexLayout):
super._init(p, fl, "FlexSplit")

Expand All @@ -122,13 +123,13 @@ class FlexSplit:
func get_minimum_size() -> Vector2i:
var s : Vector2i
if vertical:
s = Vector2i(0, (10*children.size()-1))
s = Vector2i(0, (grip_size*children.size()-1))
for c in children:
var ms : Vector2i = c.get_minimum_size()
s.x = max(s.x, ms.x)
s.y += ms.y
else:
s = Vector2i(10*(children.size()-1), 0)
s = Vector2i(grip_size*(children.size()-1), 0)
for c in children:
var ms : Vector2i = c.get_minimum_size()
s.x += ms.x
Expand Down Expand Up @@ -185,7 +186,6 @@ class FlexSplit:

func layout(r : Rect2):
#print("Layout FlexSplit (%d children) - %s" % [ children.size(), str(r) ])
var grip_size : int = 10
rect = r
var children_count : int = children.size()
var draggers_count : int = draggers.size()
Expand Down Expand Up @@ -240,19 +240,19 @@ class FlexSplit:
var min_c1_size : Vector2i = c1.get_minimum_size()
var min_c2_size : Vector2i = c2.get_minimum_size()
if vertical:
return Vector2i(c1.rect.position.y+min_c1_size.y, c2.rect.position.y+c2.rect.size.y-min_c2_size.y-10)
return Vector2i(c1.rect.position.y+min_c1_size.y, c2.rect.position.y+c2.rect.size.y-min_c2_size.y-grip_size)
else:
return Vector2i(c1.rect.position.x+min_c1_size.x, c2.rect.position.x+c2.rect.size.x-min_c2_size.x-10)
return Vector2i(c1.rect.position.x+min_c1_size.x, c2.rect.position.x+c2.rect.size.x-min_c2_size.x-grip_size)

func drag(dragger_index : int, p : int):
var c1 = children[dragger_index]
var c2 = children[dragger_index+1]
if vertical:
c1.layout(Rect2(c1.rect.position, Vector2(c1.rect.size.x, p-c1.rect.position.y)))
c2.layout(Rect2(c2.rect.position.x, p+10, c1.rect.size.x, c2.rect.position.y+c2.rect.size.y-(p+10)))
c2.layout(Rect2(c2.rect.position.x, p+grip_size, c1.rect.size.x, c2.rect.position.y+c2.rect.size.y-(p+grip_size)))
else:
c1.layout(Rect2(c1.rect.position, Vector2(p-c1.rect.position.x, c1.rect.size.y)))
c2.layout(Rect2(p+10, c2.rect.position.y, c2.rect.position.x+c2.rect.size.x-(p+10), c1.rect.size.y))
c2.layout(Rect2(p+grip_size, c2.rect.position.y, c2.rect.position.x+c2.rect.size.x-(p+grip_size), c1.rect.size.y))


class FlexTab:
Expand Down
10 changes: 7 additions & 3 deletions addons/flexible_layout/flexible_tab.gd
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,17 @@ func get_flex_layout():
func update():
%Close.texture_normal = get_theme_icon("close", "MM_FlexibleTab")
%Close.modulate = get_theme_color("font_selected_color", "MM_FlexibleTab")
%Undock.texture_normal = get_theme_icon("undock", "MM_FlexibleTab")
%Undock.modulate = get_theme_color("font_selected_color", "MM_FlexibleTab")

if not OS.get_name() == "Android":
%Undock.texture_normal = get_theme_icon("undock", "MM_FlexibleTab")
%Undock.modulate = get_theme_color("font_selected_color", "MM_FlexibleTab")

if not updating:
updating = true
var is_current: bool = (get_index() == get_parent().get_parent().current)
add_theme_stylebox_override("panel", get_theme_stylebox("tab_selected" if is_current else "tab_unselected", "MM_FlexibleTab"))
%Undock.visible = is_current and get_flex_layout().main_control.allow_undock
if not OS.get_name() == "Android":
%Undock.visible = is_current and get_flex_layout().main_control.allow_undock
%Close.visible = is_current
%Label.add_theme_color_override("font_color", get_theme_color("font_selected_color" if is_current else "font_unselected_color", "MM_FlexibleTab") )
updating = false
Expand Down
5 changes: 5 additions & 0 deletions addons/godotsteam/godotsteam.gdextension
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,14 @@ linux.debug.x86_32 = "res://addons/godotsteam/linux32/libgodotsteam.linux.templa
linux.release.x86_64 = "res://addons/godotsteam/linux64/libgodotsteam.linux.template_release.x86_64.so"
linux.release.x86_32 = "res://addons/godotsteam/linux32/libgodotsteam.linux.template_release.x86_32.so"

ios.debug.arm64 = { }
ios.release.arm64 = { }

[dependencies]
macos.universal = { "res://addons/godotsteam/osx/libsteam_api.dylib": "" }
windows.x86_64 = { "res://addons/godotsteam/win64/steam_api64.dll": "" }
windows.x86_32 = { "res://addons/godotsteam/win32/steam_api.dll": "" }
linux.x86_64 = { "res://addons/godotsteam/linux64/libsteam_api.so": "" }
linux.x86_32 = { "res://addons/godotsteam/linux32/libsteam_api.so": "" }

ios.arm64 = { }
4 changes: 2 additions & 2 deletions addons/material_maker/engine/nodes/gen_sdf.gd
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ func _deserialize(data : Dictionary) -> void:

func edit(node, tab : String = "") -> void:
if scene != null:
var edit_window = load("res://material_maker/windows/sdf_builder/sdf_builder.tscn").instantiate()
node.get_parent().add_child(edit_window)
var edit_window : Window = load("res://material_maker/windows/sdf_builder/sdf_builder.tscn").instantiate()
mm_globals.main_window.add_dialog(edit_window)
edit_window.set_node_parameter_defs(node_parameters)
edit_window.set_sdf_scene(scene)
edit_window.connect("node_changed", Callable(node, "update_sdf_generator"))
Expand Down
9 changes: 7 additions & 2 deletions addons/material_maker/engine/nodes/gen_shader.gd
Original file line number Diff line number Diff line change
Expand Up @@ -822,8 +822,13 @@ func do_edit(node, edit_window_scene : PackedScene, tab : String = "") -> void:
edit_window.title = "%s - %s" % [material, edit_window.title]
edit_window.get_window().content_scale_factor = mm_globals.ui_scale_factor()
edit_window.get_window().min_size = Vector2(950, 450) * edit_window.get_window().content_scale_factor
edit_window.hide()
edit_window.popup_centered()

if OS.get_name() == "Android":
mm_touch.make_dialog_fullscreen.call_deferred(edit_window, true)
else:
edit_window.hide()
edit_window.popup_centered()

if tab != "":
edit_window.show_tab(tab)

Expand Down
4 changes: 4 additions & 0 deletions addons/material_maker/engine/paths.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@ const WEBSITE_ADDRESS : String = "https://www.materialmaker.org"

const STD_GENDEF_PATH = "res://addons/material_maker/nodes"

const DOC_ADDRESS : String = "https://rodzill4.github.io/material-maker/doc"

static func get_resource_dir() -> String:
if Engine.is_editor_hint():
return ProjectSettings.globalize_path("res://material_maker")
if OS.get_name() == "Android":
return "user:/"
return OS.get_executable_path().get_base_dir()

static func get_nodes_paths() -> Array:
Expand Down
Loading