From 68a5295b89b78bd37039a129b1f0cd87b5cf0a2e Mon Sep 17 00:00:00 2001 From: Martin Hunt Date: Fri, 12 Jun 2026 11:55:41 +0100 Subject: [PATCH 1/2] Add open file button --- scenes/Main.tscn | 6 ++++ scripts/main.gd | 55 +++++++++++++++++++++++++++++++++++ scripts/top_bar_controller.gd | 1 + 3 files changed, 62 insertions(+) diff --git a/scenes/Main.tscn b/scenes/Main.tscn index b0cb917..7ae325b 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -130,6 +130,12 @@ grow_horizontal = 2 grow_vertical = 2 theme_override_constants/separation = 8 +[node name="OpenFileButton" type="Button" parent="Root/TopBar/ActionClipper/ActionStrip"] +layout_mode = 2 +tooltip_text = "Open genome files" +theme_override_fonts/font = ExtResource("2_0bbpv") +text = "A" + [node name="ComparisonButton" type="Button" parent="Root/TopBar/ActionClipper/ActionStrip"] layout_mode = 2 tooltip_text = "Switch to comparison view" diff --git a/scripts/main.gd b/scripts/main.gd index 5e26574..566511c 100644 --- a/scripts/main.gd +++ b/scripts/main.gd @@ -105,6 +105,7 @@ const READ_FILTER_FLAG_LABELS := [ @onready var _settings_header: HBoxContainer = $Root/ContentMargin/ViewportLayer/SettingsPanel/SettingsMargin/SettingsLayout/SettingsHeader @onready var top_bar: HBoxContainer = $Root/TopBar @onready var settings_toggle_button: Button = $Root/TopBar/SettingsToggleButton +@onready var open_file_button: Button = $Root/TopBar/ActionClipper/ActionStrip/OpenFileButton @onready var screenshot_button: Button = $Root/TopBar/ActionClipper/ActionStrip/ScreenshotButton @onready var search_button: Button = $Root/TopBar/ActionClipper/ActionStrip/SearchButton @onready var go_button: Button = $Root/TopBar/ActionClipper/ActionStrip/GoButton @@ -209,6 +210,8 @@ var _download_action_button: Button var _download_status_label: RichTextLabel var _download_thread: Thread var _download_in_progress := false +var _open_file_dialog: FileDialog +var _open_file_last_dir := "" var _screenshot_dialog: FileDialog var _comparison_save_dialog: FileDialog var _startup_zem_prepare_thread: Thread @@ -412,6 +415,7 @@ func _ready() -> void: call_deferred("_startup_connect_local_zem") if get_window().has_signal("files_dropped"): get_window().files_dropped.connect(_on_files_dropped) + _setup_open_file_dialog() if screenshot_button != null: screenshot_button.pressed.connect(_on_screenshot_pressed) _setup_screenshot_dialog() @@ -419,6 +423,32 @@ func _ready() -> void: _comparison_controller.configure(self, _zem, _themes_lib, comparison_view) _comparison_controller.setup() +func _setup_open_file_dialog() -> void: + _open_file_dialog = FileDialog.new() + _open_file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILES + _open_file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _open_file_dialog.use_native_dialog = true + _open_file_dialog.title = "Open Genome Files" + _open_file_last_dir = _user_home_dir() + _open_file_dialog.current_dir = _open_file_last_dir + _open_file_dialog.files_selected.connect(_on_open_files_selected) + if _open_file_dialog.has_signal("canceled"): + _open_file_dialog.connect("canceled", Callable(self, "_remember_open_file_dialog_dir")) + add_child(_open_file_dialog) + +func _user_home_dir() -> String: + var home := OS.get_environment("HOME") + if home.is_empty(): + home = OS.get_environment("USERPROFILE") + if home.is_empty(): + var home_drive := OS.get_environment("HOMEDRIVE") + var home_path := OS.get_environment("HOMEPATH") + if not home_drive.is_empty() and not home_path.is_empty(): + home = home_drive + home_path + if home.is_empty(): + home = OS.get_system_dir(OS.SYSTEM_DIR_DESKTOP).get_base_dir() + return home + func _setup_screenshot_dialog() -> void: _screenshot_dialog = FileDialog.new() _screenshot_dialog.file_mode = FileDialog.FILE_MODE_SAVE_FILE @@ -571,6 +601,29 @@ func _on_comparison_save_file_selected(path: String) -> void: if _top_bar_controller != null: _top_bar_controller.on_comparison_save_file_selected(path) +func _on_open_file_pressed() -> void: + if _open_file_dialog == null: + return + if open_file_button != null: + open_file_button.set_pressed_no_signal(false) + open_file_button.release_focus() + _open_file_dialog.current_dir = _open_file_last_dir if not _open_file_last_dir.is_empty() else _user_home_dir() + _open_file_dialog.popup_centered_ratio(0.7) + +func _on_open_files_selected(paths: PackedStringArray) -> void: + if paths.is_empty(): + return + var first_path := str(paths[0]) + if not first_path.is_empty(): + _open_file_last_dir = first_path.get_base_dir() + _on_files_dropped(paths) + +func _remember_open_file_dialog_dir() -> void: + if _open_file_dialog == null: + return + if not _open_file_dialog.current_dir.is_empty(): + _open_file_last_dir = _open_file_dialog.current_dir + func _initialize_settings_panel() -> void: _set_status("Disconnected") genome_view.set_empty_state_status("") @@ -719,6 +772,7 @@ func _setup_font_size_control() -> void: func _connect_ui() -> void: settings_toggle_button.pressed.connect(_toggle_settings) close_settings_button.pressed.connect(_close_settings) + open_file_button.pressed.connect(_on_open_file_pressed) pan_left_button.pressed.connect(func() -> void: _play_ui_sound(SoundControllerScript.SOUND_PAN_LEFT) if _app_mode == APP_MODE_COMPARISON: @@ -862,6 +916,7 @@ func _pan_view_by_fraction(fraction: float, duration: float = 0.35, linear: bool func _disable_button_focus() -> void: var controls := [ settings_toggle_button, + open_file_button, comparison_button, comparison_save_button, comparison_clear_button, diff --git a/scripts/top_bar_controller.gd b/scripts/top_bar_controller.gd index 285cce6..8aeed08 100644 --- a/scripts/top_bar_controller.gd +++ b/scripts/top_bar_controller.gd @@ -305,6 +305,7 @@ func apply_topbar_button_font_size() -> void: var topbar_button_size := Vector2(topbar_font_size + 14, topbar_font_size + 14) var topbar_buttons := [ host.settings_toggle_button, + host.open_file_button, host.comparison_button, host.comparison_save_button, host.comparison_clear_button, From 99e912197427dbbdbef109a757ebd969994dc5ec Mon Sep 17 00:00:00 2001 From: Martin Hunt Date: Fri, 12 Jun 2026 16:26:58 +0100 Subject: [PATCH 2/2] Add file load icon --- fonts/magrathea.sfd | 56 ++++++++++- fonts/magrathea.ttf | Bin 4252 -> 4440 bytes fonts/magrathea_svgs/load_file.svg | 110 ++++++++++++++++++++++ fonts/magrathea_svgs/load_file.svg.import | 43 +++++++++ scenes/Main.tscn | 2 +- 5 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 fonts/magrathea_svgs/load_file.svg create mode 100644 fonts/magrathea_svgs/load_file.svg.import diff --git a/fonts/magrathea.sfd b/fonts/magrathea.sfd index c1cd691..db34145 100644 --- a/fonts/magrathea.sfd +++ b/fonts/magrathea.sfd @@ -22,7 +22,7 @@ OS2Version: 0 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 1 CreationTime: 1772828475 -ModificationTime: 1775220549 +ModificationTime: 1781277780 OS2TypoAscent: 0 OS2TypoAOffset: 1 OS2TypoDescent: 0 @@ -36,6 +36,7 @@ HheadAscent: 0 HheadAOffset: 1 HheadDescent: 0 HheadDOffset: 1 +OS2Vendor: 'PfEd' MarkAttachClasses: 1 DEI: 91125 Encoding: ISO8859-1 @@ -47,7 +48,7 @@ FitToEm: 0 WinInfo: 38 19 5 BeginPrivate: 0 EndPrivate -BeginChars: 256 21 +BeginChars: 256 22 StartChar: A Encoding: 65 65 0 @@ -824,6 +825,57 @@ SplineSet 573 -1 l 1 573 223 l 1 EndSplineSet +Validated: 1 +EndChar + +StartChar: a +Encoding: 97 97 21 +Width: 1000 +Flags: HO +LayerCount: 2 +Fore +SplineSet +701 182 m 2 + 551 182 l 1 + 551 32 l 2 + 551 13 535 -3 516 -3 c 0 + 497 -3 481 13 481 32 c 2 + 481 182 l 1 + 331 182 l 2 + 312 182 296 198 296 217 c 0 + 296 236 312 252 331 252 c 2 + 481 252 l 1 + 481 402 l 2 + 481 421 497 437 516 437 c 0 + 535 437 551 421 551 402 c 2 + 551 252 l 1 + 701 252 l 2 + 720 252 736 236 736 217 c 0 + 736 198 720 182 701 182 c 2 +637 672 m 1 + 202 672 l 1 + 204 -67 l 1 + 828 -67 l 1 + 828 470 l 1 + 672 470 l 2 + 653 470 637 486 637 505 c 2 + 637 672 l 1 +169 -137 m 2 + 150 -137 134 -121 134 -102 c 2 + 132 707 l 0 + 132 726 148 742 167 742 c 2 + 672 742 l 2 + 687 742 695 736 700 731 c 2 + 886 532 l 2 + 890 527 898 518 898 505 c 2 + 898 -102 l 2 + 898 -121 882 -137 863 -137 c 2 + 169 -137 l 2 +707 621 m 1 + 707 540 l 1 + 783 540 l 1 + 707 621 l 1 +EndSplineSet EndChar EndChars EndSplineFont diff --git a/fonts/magrathea.ttf b/fonts/magrathea.ttf index 563bd89b744e3fcebf73231bd13e471efee6aa5e..a792669a940497db8713e1970efd95a89b165085 100644 GIT binary patch delta 720 zcmX|8Ur19?82_Df?&fTEx7p56nz_48ElJe5UHYSfVY9+nmPCn_7d3~t95_k|Qo@Iz z7va*LMifC$K}b+g2oXZjOF=&LYSfB|-ijjh_FbEC`S^Z+zI!;|?-aE6;W;n>D&`?D zoJ297cY3)f52TSzL0@WZ$Ce?d$E6Y)%3CsR&DmNbJ7qYYaa#$ z#{)9$q`-^jbJlfq!N&Gxn-%=$p_iCF6@-Eo>Mr^?^&Skupd^4Uq-{- zGpx#7;stY_JIs_waL0{D3u0{BoPq`Ginz{;*oi1~><8*1((eq{cd$sfKCT~RiMSpM z)UdW#!0!~=4$Vh;f>DXM-loNBSwQ;y&WMn0d^s3->{Sieg@{_KZY+@5Ht!-rA~3d-45 zBo263vZOmnpD+)pO%2D8x1&3Dq#n9vHB8rl78CEt8dC$5knJnbHcM*X^l1M Z<}FXoba^#;qegEl>o$kH?TY!rb(SU(s_wZPHCojNdCDg)8K0!1rfw*z=b284wNfQpI(=(wAHjFo>d9dD_gN z&sYcK6b-ZPta`rB%uoyD_WJVrW2xis8GiHpXE~#cb_%ts66Kw4nDfWD*ZVKq0t}!zh#6MIuZ1(^F diff --git a/fonts/magrathea_svgs/load_file.svg b/fonts/magrathea_svgs/load_file.svg new file mode 100644 index 0000000..ae7bc42 --- /dev/null +++ b/fonts/magrathea_svgs/load_file.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + diff --git a/fonts/magrathea_svgs/load_file.svg.import b/fonts/magrathea_svgs/load_file.svg.import new file mode 100644 index 0000000..9c86217 --- /dev/null +++ b/fonts/magrathea_svgs/load_file.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://detwpr10q5v4x" +path="res://.godot/imported/load_file.svg-558594d713f483f5bbda472ddc8739ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://fonts/magrathea_svgs/load_file.svg" +dest_files=["res://.godot/imported/load_file.svg-558594d713f483f5bbda472ddc8739ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/scenes/Main.tscn b/scenes/Main.tscn index 7ae325b..504bd6b 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -134,7 +134,7 @@ theme_override_constants/separation = 8 layout_mode = 2 tooltip_text = "Open genome files" theme_override_fonts/font = ExtResource("2_0bbpv") -text = "A" +text = "a" [node name="ComparisonButton" type="Button" parent="Root/TopBar/ActionClipper/ActionStrip"] layout_mode = 2