Skip to content

Commit

Permalink
Add native global menu support
Browse files Browse the repository at this point in the history
  • Loading branch information
aaronfranke committed Apr 9, 2024
1 parent 7bf719d commit 63c47dc
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 2 deletions.
7 changes: 6 additions & 1 deletion project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ config/version="v1.0-alpha2"
config/tags=PackedStringArray("project")
run/main_scene="res://src/ui_parts/main_scene.tscn"
config/use_custom_user_dir=true
config/features=PackedStringArray("4.2")
config/features=PackedStringArray("4.3")
run/low_processor_mode=true
boot_splash/bg_color=Color(0.1065, 0.1181, 0.15, 1)
boot_splash/image="res://visual/splash.png"
Expand All @@ -34,6 +34,11 @@ SVG="*res://src/SVG.gd"
Indications="*res://src/Indications.gd"
HandlerGUI="*res://src/HandlerGUI.gd"

[debug]

gdscript/warnings/int_as_enum_without_cast=0
gdscript/warnings/int_as_enum_without_match=0

[display]

window/size/viewport_width=1024
Expand Down
160 changes: 160 additions & 0 deletions src/ui_parts/global_menu.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
extends Node


var global_rid: RID

var file_rid: RID
var file_clear_svg_index: int
var file_optimize_index: int
var file_clear_assoc_index: int
var file_reset_svg_index: int

var view_rid: RID
var view_show_grid_index: int
var view_show_handles_index: int
var view_rasterized_svg_index: int

var snap_rid: RID
var snap_enable_index: int
var snap_0125_index: int
var snap_025_index: int
var snap_05_index: int
var snap_1_index: int
var snap_2_index: int
var snap_4_index: int


func _enter_tree() -> void:
if not DisplayServer.has_feature(DisplayServer.FEATURE_GLOBAL_MENU):
queue_free()
return
# Create new menu and add items:
global_rid = NativeMenu.get_system_menu(NativeMenu.MAIN_MENU_ID)

var app_rid: RID = NativeMenu.get_system_menu(NativeMenu.APPLICATION_MENU_ID)
NativeMenu.add_item(app_rid, "GodSVG Settings...", _action, _action, &"open_settings")

file_rid = NativeMenu.create_menu()
NativeMenu.add_item(file_rid, "Import SVG", _action, _action, &"import", KEY_MASK_META + KEY_I)
NativeMenu.add_item(file_rid, "Export Image", _action, _action, &"export", KEY_MASK_META + KEY_E)
NativeMenu.add_item(file_rid, "Export SVG", _action, _action, &"save", KEY_MASK_META + KEY_S)
NativeMenu.add_separator(file_rid)
NativeMenu.add_item(file_rid, "Copy SVG Text", _action, _action, &"copy_svg_text")
file_clear_svg_index = NativeMenu.add_item(file_rid, "Clear SVG", _action, _action, &"clear_svg")
file_optimize_index = NativeMenu.add_item(file_rid, "Optimize SVG", _action, _action, &"optimize_svg")
NativeMenu.add_separator(file_rid)
file_clear_assoc_index = NativeMenu.add_item(file_rid, "Clear Association", _action, _action, &"clear_file_path")
file_reset_svg_index = NativeMenu.add_item(file_rid, "Reset SVG", _action, _action, &"reset_svg")
NativeMenu.add_submenu_item(global_rid, "File", file_rid)
SVG.svg_text_changed.connect(_on_svg_text_changed)
_on_svg_text_changed()

var edit_rid: RID = NativeMenu.create_menu()
NativeMenu.add_item(edit_rid, "Undo", _action, _action, &"undo", KEY_MASK_META + KEY_Z)
NativeMenu.add_item(edit_rid, "Redo", _action, _action, &"redo", KEY_MASK_META + KEY_Y)
NativeMenu.add_item(edit_rid, "Duplicate", _action, _action, &"duplicate", KEY_MASK_META + KEY_D)
NativeMenu.add_item(edit_rid, "Select All", _action, _action, &"select_all", KEY_MASK_META + KEY_A)
NativeMenu.add_item(edit_rid, "Delete", _action, _action, &"delete", KEY_DELETE)
NativeMenu.add_item(edit_rid, "Move Up", _action, _action, &"move_up", KEY_MASK_META + KEY_UP)
NativeMenu.add_item(edit_rid, "Move Down", _action, _action, &"move_down", KEY_MASK_META + KEY_DOWN)
NativeMenu.add_submenu_item(global_rid, "Edit", edit_rid)

var tool_rid: RID = NativeMenu.create_menu()
NativeMenu.add_item(tool_rid, "Move Relative", _action, _action, &"move_relative", KEY_M)
NativeMenu.add_item(tool_rid, "Move Absolute", _action, _action, &"move_absolute", KEY_MASK_SHIFT + KEY_M)
NativeMenu.add_item(tool_rid, "Line Relative", _action, _action, &"line_relative", KEY_L)
NativeMenu.add_item(tool_rid, "Line Absolute", _action, _action, &"line_absolute", KEY_MASK_SHIFT + KEY_L)
NativeMenu.add_item(tool_rid, "Horizontal Line Relative", _action, _action, &"horizontal_line_relative", KEY_H)
NativeMenu.add_item(tool_rid, "Horizontal Line Absolute", _action, _action, &"horizontal_line_absolute", KEY_MASK_SHIFT + KEY_H)
NativeMenu.add_item(tool_rid, "Vertical Line Relative", _action, _action, &"vertical_line_relative", KEY_V)
NativeMenu.add_item(tool_rid, "Vertical Line Absolute", _action, _action, &"vertical_line_absolute", KEY_MASK_SHIFT + KEY_V)
NativeMenu.add_item(tool_rid, "Close Path Relative", _action, _action, &"close_path_relative", KEY_Z)
NativeMenu.add_item(tool_rid, "Close Path Absolute", _action, _action, &"close_path_absolute", KEY_MASK_SHIFT + KEY_Z)
NativeMenu.add_item(tool_rid, "Elliptical Arc Relative", _action, _action, &"elliptical_arc_relative", KEY_A)
NativeMenu.add_item(tool_rid, "Elliptical Arc Absolute", _action, _action, &"elliptical_arc_absolute", KEY_MASK_SHIFT + KEY_A)
NativeMenu.add_item(tool_rid, "Quadratic Bezier Relative", _action, _action, &"quadratic_bezier_relative", KEY_Q)
NativeMenu.add_item(tool_rid, "Quadratic Bezier Absolute", _action, _action, &"quadratic_bezier_absolute", KEY_MASK_SHIFT + KEY_Q)
NativeMenu.add_item(tool_rid, "Shorthand Quadratic Bezier Relative", _action, _action, &"shorthand_quadratic_bezier_relative", KEY_T)
NativeMenu.add_item(tool_rid, "Shorthand Quadratic Bezier Absolute", _action, _action, &"shorthand_quadratic_bezier_absolute", KEY_MASK_SHIFT + KEY_T)
NativeMenu.add_item(tool_rid, "Cubic Bezier Relative", _action, _action, &"cubic_bezier_relative", KEY_C)
NativeMenu.add_item(tool_rid, "Cubic Bezier Absolute", _action, _action, &"cubic_bezier_absolute", KEY_MASK_SHIFT + KEY_C)
NativeMenu.add_item(tool_rid, "Shorthand Cubic Bezier Relative", _action, _action, &"shorthand_cubic_bezier_relative", KEY_S)
NativeMenu.add_item(tool_rid, "Shorthand Cubic Bezier Absolute", _action, _action, &"shorthand_cubic_bezier_absolute", KEY_MASK_SHIFT + KEY_S)
NativeMenu.add_submenu_item(global_rid, "Tool", tool_rid)

view_rid = NativeMenu.create_menu()
view_show_grid_index = NativeMenu.add_check_item(view_rid, "Show Grid", _action, _action, &"view_show_grid")
view_show_handles_index = NativeMenu.add_check_item(view_rid, "Show Handles", _action, _action, &"view_show_handles")
view_rasterized_svg_index = NativeMenu.add_check_item(view_rid, "Rasterized SVG", _action, _action, &"view_rasterized_svg")
_on_display_view_settings_updated(true, true, false)
NativeMenu.add_separator(view_rid)
NativeMenu.add_item(view_rid, "Zoom In", _action, _action, &"zoom_in", KEY_MASK_META + KEY_EQUAL)
NativeMenu.add_item(view_rid, "Zoom Out", _action, _action, &"zoom_out", KEY_MASK_META + KEY_MINUS)
NativeMenu.add_item(view_rid, "Zoom Reset", _action, _action, &"zoom_reset", KEY_MASK_META + KEY_0)
NativeMenu.add_submenu_item(global_rid, "View", view_rid)

snap_rid = NativeMenu.create_menu()
snap_enable_index = NativeMenu.add_check_item(snap_rid, "Enable Snap", _action, _action, &"snap_toggle")
NativeMenu.add_separator(snap_rid)
snap_0125_index = NativeMenu.add_radio_check_item(snap_rid, "0.125", _set_snap, _set_snap, 0.125)
snap_025_index = NativeMenu.add_radio_check_item(snap_rid, "0.25", _set_snap, _set_snap, 0.25)
snap_05_index = NativeMenu.add_radio_check_item(snap_rid, "0.5", _set_snap, _set_snap, 0.5)
snap_1_index = NativeMenu.add_radio_check_item(snap_rid, "1", _set_snap, _set_snap, 1)
snap_2_index = NativeMenu.add_radio_check_item(snap_rid, "2", _set_snap, _set_snap, 2)
snap_4_index = NativeMenu.add_radio_check_item(snap_rid, "4", _set_snap, _set_snap, 4)
NativeMenu.add_submenu_item(global_rid, "Snap", snap_rid)

var help_rid: RID = NativeMenu.get_system_menu(NativeMenu.HELP_MENU_ID)
NativeMenu.add_icon_item(help_rid, load("res://visual/icons/Link.svg"), "GodSVG Repository", _action, _action, &"about_repo")
NativeMenu.add_icon_item(help_rid, load("res://visual/icon.svg"), "About GodSVG", _action, _action, &"about_info")
NativeMenu.add_icon_item(help_rid, load("res://visual/icons/Heart.svg"), "Donate to GodSVG", _action, _action, &"about_donate")


func _on_svg_text_changed() -> void:
NativeMenu.set_item_disabled(file_rid, file_clear_svg_index, SVG.text == SVG.DEFAULT)
var empty_path: bool = GlobalSettings.save_data.current_file_path.is_empty()
NativeMenu.set_item_disabled(file_rid, file_clear_assoc_index, empty_path)
NativeMenu.set_item_disabled(file_rid, file_reset_svg_index, empty_path or SVG.does_svg_data_match_disk_contents())


func _on_code_editor_optimize_button_enable_updated(is_optimize_enabled: bool) -> void:
NativeMenu.set_item_disabled(file_rid, file_optimize_index, not is_optimize_enabled)


func _on_display_view_settings_updated(show_grid: bool, show_handles: bool, rasterized_svg: bool) -> void:
NativeMenu.set_item_checked(view_rid, view_show_grid_index, show_grid)
NativeMenu.set_item_checked(view_rid, view_show_handles_index, show_handles)
NativeMenu.set_item_checked(view_rid, view_rasterized_svg_index, rasterized_svg)


func _on_display_snap_settings_updated(snap_enabled: bool, snap_amount: float) -> void:
NativeMenu.set_item_checked(snap_rid, snap_enable_index, snap_enabled)
NativeMenu.set_item_checked(snap_rid, snap_0125_index, false)
NativeMenu.set_item_checked(snap_rid, snap_025_index, false)
NativeMenu.set_item_checked(snap_rid, snap_05_index, false)
NativeMenu.set_item_checked(snap_rid, snap_1_index, false)
NativeMenu.set_item_checked(snap_rid, snap_2_index, false)
NativeMenu.set_item_checked(snap_rid, snap_4_index, false)
if is_equal_approx(snap_amount, 0.125):
NativeMenu.set_item_checked(snap_rid, snap_0125_index, true)
elif is_equal_approx(snap_amount, 0.25):
NativeMenu.set_item_checked(snap_rid, snap_025_index, true)
elif is_equal_approx(snap_amount, 0.5):
NativeMenu.set_item_checked(snap_rid, snap_05_index, true)
elif is_equal_approx(snap_amount, 1):
NativeMenu.set_item_checked(snap_rid, snap_1_index, true)
elif is_equal_approx(snap_amount, 2):
NativeMenu.set_item_checked(snap_rid, snap_2_index, true)
elif is_equal_approx(snap_amount, 4):
NativeMenu.set_item_checked(snap_rid, snap_4_index, true)


func _set_snap(tag: float) -> void:
%Display.set_snap_amount(tag)


func _action(tag: StringName) -> void:
var a = InputEventAction.new()
a.action = tag
a.pressed = true
Input.parse_input_event(a)
10 changes: 9 additions & 1 deletion src/ui_parts/main_scene.tscn
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[gd_scene load_steps=6 format=3 uid="uid://ce6j54x27pom"]
[gd_scene load_steps=7 format=3 uid="uid://ce6j54x27pom"]

[ext_resource type="PackedScene" uid="uid://cr1fdlmbknnko" path="res://src/ui_parts/code_editor.tscn" id="1_0jgh3"]
[ext_resource type="Texture2D" uid="uid://co75w07yqmcro" path="res://visual/icons/theme/SplitGrabber2.svg" id="1_7y812"]
[ext_resource type="PackedScene" uid="uid://ccynisiuyn5qn" path="res://src/ui_parts/inspector.tscn" id="1_afxvd"]
[ext_resource type="PackedScene" uid="uid://bvrncl7e6yn5b" path="res://src/ui_parts/display.tscn" id="3_qbqbs"]
[ext_resource type="Script" path="res://src/ui_parts/global_menu.gd" id="5_wda5e"]

[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_082e3"]
content_margin_left = 6.0
Expand Down Expand Up @@ -50,3 +51,10 @@ layout_mode = 2
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3

[node name="GlobalMenu" type="Node" parent="."]
script = ExtResource("5_wda5e")

[connection signal="optimize_button_enable_updated" from="HSplitContainer/PanelContainer/MainContainer/CodeEditor" to="GlobalMenu" method="_on_code_editor_optimize_button_enable_updated"]
[connection signal="snap_settings_updated" from="HSplitContainer/Display" to="GlobalMenu" method="_on_display_snap_settings_updated"]
[connection signal="view_settings_updated" from="HSplitContainer/Display" to="GlobalMenu" method="_on_display_view_settings_updated"]

0 comments on commit 63c47dc

Please sign in to comment.