diff --git a/project.godot b/project.godot index 76bb333..4e74675 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="GodSVG Mobile" -config/version="1.0-alpha1" +config/version="1.0-alpha2" config/tags=PackedStringArray("application", "mobile", "project") run/main_scene="uid://bihwwoedqcyo8" config/use_custom_user_dir=true diff --git a/src/autoload/HandlerGUI.gd b/src/autoload/HandlerGUI.gd index e8fd4f9..0c4b61a 100644 --- a/src/autoload/HandlerGUI.gd +++ b/src/autoload/HandlerGUI.gd @@ -365,33 +365,44 @@ func get_min_ui_scale() -> float: return maxf(snappedf(get_max_ui_scale() / 2.0 - 0.125, 0.25), 0.75) func get_auto_ui_scale() -> float: - # Usable rect might not be reliable on web, so attempt to use devicePixelRatio. - if OS.get_name() == "Web": - var pixel_ratio: float = JavaScriptBridge.eval("window.devicePixelRatio || 1", true) - if is_finite(pixel_ratio): - return snappedf(pixel_ratio, 0.25) - - var screen_size := get_usable_rect() - if screen_size.x == 0 or screen_size.y == 0: - return 1.0 - - # The wider the screen, the bigger the automatically chosen UI scale. - var aspect_ratio := screen_size.aspect() - var auto_scale := get_max_ui_scale() * clampf(aspect_ratio * 0.375, 0.6, 0.8) - if OS.get_name() == "Android": - auto_scale *= 1.1 # Default to giving mobile a bit more space. - return clampf(snappedf(auto_scale, 0.25), get_min_ui_scale(), get_max_ui_scale()) + var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen()) + print(dpi) + if dpi <= 120: + return 0.75 # ldpi + elif dpi <= 160: + return 1.0 # mdpi + elif dpi <= 240: + return 1.5 # hdpi + elif dpi <= 320: + return 2.0 # xhdpi + elif dpi <= 400: + return 2.5 + elif dpi <= 480: + return 3.0 # xxhdpi + elif dpi <= 640: + return 4.0 # xxxhdpi + else: + return 5.0 func update_ui_scale() -> void: var window := get_window() if not window.is_node_ready(): await window.ready - if Configs.savedata.ui_scale == SaveData.ScalingApproach.AUTO: - window.content_scale_factor = _calculate_auto_scale() - else: - var final_scale := minf(Configs.savedata.ui_scale, 4.0) - window.content_scale_factor = final_scale + var ui_scaling_approach := Configs.savedata.ui_scale + var final_scale: float + match ui_scaling_approach: + SaveData.ScalingApproach.AUTO: final_scale = get_auto_ui_scale() + SaveData.ScalingApproach.CONSTANT_075: final_scale = 0.75 + SaveData.ScalingApproach.CONSTANT_100: final_scale = 1.0 + SaveData.ScalingApproach.CONSTANT_125: final_scale = 1.25 + SaveData.ScalingApproach.CONSTANT_150: final_scale = 1.50 + SaveData.ScalingApproach.CONSTANT_175: final_scale = 1.75 + SaveData.ScalingApproach.CONSTANT_200: final_scale = 2.0 + SaveData.ScalingApproach.CONSTANT_250: final_scale = 2.5 + SaveData.ScalingApproach.CONSTANT_300: final_scale = 3.0 + SaveData.ScalingApproach.CONSTANT_400: final_scale = 4.0 + window.content_scale_factor = final_scale func prompt_quit() -> void: @@ -482,25 +493,6 @@ func open_export() -> void: confirm_dialog.setup(Translator.translate("Export SVG"), message, Translator.translate("Export"), FileUtils.open_export_dialog.bind(svg_export_data)) -func _calculate_auto_scale() -> float: - var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen()) - - #if dpi <= 120: - #return 0.75 # ldpi - if dpi <= 160: - return 1.0 # mdpi (baseline) - elif dpi <= 240: - return 1.5 # hdpi - elif dpi <= 320: - return 2.0 # xhdpi - elif dpi <= 480: - return 3.0 # xxhdpi - elif dpi <= 640: - return 4.0 # xxxhdpi - else: - return 5.0 # Beyond xxxhdpi - - func update_window_title() -> void: if Configs.savedata.use_filename_for_window_title and\ not Configs.savedata.get_active_tab().svg_file_path.is_empty(): diff --git a/src/ui_parts/settings_menu.gd b/src/ui_parts/settings_menu.gd index 913c9e6..8714256 100644 --- a/src/ui_parts/settings_menu.gd +++ b/src/ui_parts/settings_menu.gd @@ -246,6 +246,26 @@ func setup_content() -> void: add_advice(Translator.translate( "Changes the visual size and grabbing area of handles.")) + current_setup_setting = "ui_scale" + var dropdown_values := [ + SaveData.ScalingApproach.AUTO, + SaveData.ScalingApproach.CONSTANT_150, + SaveData.ScalingApproach.CONSTANT_175, + SaveData.ScalingApproach.CONSTANT_200, + SaveData.ScalingApproach.CONSTANT_250, + SaveData.ScalingApproach.CONSTANT_300 + ] + # Dictionary[SaveData.ScalingApproach, String] + var dropdown_map: Dictionary = { + SaveData.ScalingApproach.AUTO: "Auto (%d%%)" % int(HandlerGUI.get_auto_ui_scale() / 2.0 * 100), + SaveData.ScalingApproach.CONSTANT_150: "75%", + SaveData.ScalingApproach.CONSTANT_175: "88%", + SaveData.ScalingApproach.CONSTANT_200: "100%", + SaveData.ScalingApproach.CONSTANT_250: "125%", + SaveData.ScalingApproach.CONSTANT_300: "150%" + } + add_dropdown(Translator.translate("UI scale"), dropdown_values, dropdown_map) + add_advice(Translator.translate("Changes the scale factor for the interface.")) # Disable mouse wrap if not available. if not DisplayServer.has_feature(DisplayServer.FEATURE_MOUSE_WARP): wraparound_panning.permanent_disable_checkbox(false) @@ -278,8 +298,7 @@ func add_checkbox(text: String, dim_text := false) -> Control: return frame # TODO Typed Dictionary wonkiness -func add_dropdown(text: String, values: Array[Variant], -value_text_map: Dictionary) -> Control: # Dictionary[Variant, String] +func add_dropdown(text: String, values: Array[Variant], value_text_map: Dictionary) -> Control: # Dictionary[Variant, String] var frame := SettingFrameScene.instantiate() frame.text = text setup_frame(frame)