Skip to content

Commit 1089cc8

Browse files
Add setting for custom UI scaling (#24)
1 parent ebfa234 commit 1089cc8

File tree

3 files changed

+54
-43
lines changed

3 files changed

+54
-43
lines changed

project.godot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ config_version=5
1111
[application]
1212

1313
config/name="GodSVG Mobile"
14-
config/version="1.0-alpha1"
14+
config/version="1.0-alpha2"
1515
config/tags=PackedStringArray("application", "mobile", "project")
1616
run/main_scene="uid://bihwwoedqcyo8"
1717
config/use_custom_user_dir=true

src/autoload/HandlerGUI.gd

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -365,33 +365,44 @@ func get_min_ui_scale() -> float:
365365
return maxf(snappedf(get_max_ui_scale() / 2.0 - 0.125, 0.25), 0.75)
366366

367367
func get_auto_ui_scale() -> float:
368-
# Usable rect might not be reliable on web, so attempt to use devicePixelRatio.
369-
if OS.get_name() == "Web":
370-
var pixel_ratio: float = JavaScriptBridge.eval("window.devicePixelRatio || 1", true)
371-
if is_finite(pixel_ratio):
372-
return snappedf(pixel_ratio, 0.25)
373-
374-
var screen_size := get_usable_rect()
375-
if screen_size.x == 0 or screen_size.y == 0:
376-
return 1.0
377-
378-
# The wider the screen, the bigger the automatically chosen UI scale.
379-
var aspect_ratio := screen_size.aspect()
380-
var auto_scale := get_max_ui_scale() * clampf(aspect_ratio * 0.375, 0.6, 0.8)
381-
if OS.get_name() == "Android":
382-
auto_scale *= 1.1 # Default to giving mobile a bit more space.
383-
return clampf(snappedf(auto_scale, 0.25), get_min_ui_scale(), get_max_ui_scale())
368+
var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen())
369+
print(dpi)
370+
if dpi <= 120:
371+
return 0.75 # ldpi
372+
elif dpi <= 160:
373+
return 1.0 # mdpi
374+
elif dpi <= 240:
375+
return 1.5 # hdpi
376+
elif dpi <= 320:
377+
return 2.0 # xhdpi
378+
elif dpi <= 400:
379+
return 2.5
380+
elif dpi <= 480:
381+
return 3.0 # xxhdpi
382+
elif dpi <= 640:
383+
return 4.0 # xxxhdpi
384+
else:
385+
return 5.0
384386

385387

386388
func update_ui_scale() -> void:
387389
var window := get_window()
388390
if not window.is_node_ready():
389391
await window.ready
390-
if Configs.savedata.ui_scale == SaveData.ScalingApproach.AUTO:
391-
window.content_scale_factor = _calculate_auto_scale()
392-
else:
393-
var final_scale := minf(Configs.savedata.ui_scale, 4.0)
394-
window.content_scale_factor = final_scale
392+
var ui_scaling_approach := Configs.savedata.ui_scale
393+
var final_scale: float
394+
match ui_scaling_approach:
395+
SaveData.ScalingApproach.AUTO: final_scale = get_auto_ui_scale()
396+
SaveData.ScalingApproach.CONSTANT_075: final_scale = 0.75
397+
SaveData.ScalingApproach.CONSTANT_100: final_scale = 1.0
398+
SaveData.ScalingApproach.CONSTANT_125: final_scale = 1.25
399+
SaveData.ScalingApproach.CONSTANT_150: final_scale = 1.50
400+
SaveData.ScalingApproach.CONSTANT_175: final_scale = 1.75
401+
SaveData.ScalingApproach.CONSTANT_200: final_scale = 2.0
402+
SaveData.ScalingApproach.CONSTANT_250: final_scale = 2.5
403+
SaveData.ScalingApproach.CONSTANT_300: final_scale = 3.0
404+
SaveData.ScalingApproach.CONSTANT_400: final_scale = 4.0
405+
window.content_scale_factor = final_scale
395406

396407

397408
func prompt_quit() -> void:
@@ -482,25 +493,6 @@ func open_export() -> void:
482493
confirm_dialog.setup(Translator.translate("Export SVG"), message,
483494
Translator.translate("Export"), FileUtils.open_export_dialog.bind(svg_export_data))
484495

485-
func _calculate_auto_scale() -> float:
486-
var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen())
487-
488-
#if dpi <= 120:
489-
#return 0.75 # ldpi
490-
if dpi <= 160:
491-
return 1.0 # mdpi (baseline)
492-
elif dpi <= 240:
493-
return 1.5 # hdpi
494-
elif dpi <= 320:
495-
return 2.0 # xhdpi
496-
elif dpi <= 480:
497-
return 3.0 # xxhdpi
498-
elif dpi <= 640:
499-
return 4.0 # xxxhdpi
500-
else:
501-
return 5.0 # Beyond xxxhdpi
502-
503-
504496
func update_window_title() -> void:
505497
if Configs.savedata.use_filename_for_window_title and\
506498
not Configs.savedata.get_active_tab().svg_file_path.is_empty():

src/ui_parts/settings_menu.gd

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,26 @@ func setup_content() -> void:
246246
add_advice(Translator.translate(
247247
"Changes the visual size and grabbing area of handles."))
248248

249+
current_setup_setting = "ui_scale"
250+
var dropdown_values := [
251+
SaveData.ScalingApproach.AUTO,
252+
SaveData.ScalingApproach.CONSTANT_150,
253+
SaveData.ScalingApproach.CONSTANT_175,
254+
SaveData.ScalingApproach.CONSTANT_200,
255+
SaveData.ScalingApproach.CONSTANT_250,
256+
SaveData.ScalingApproach.CONSTANT_300
257+
]
258+
# Dictionary[SaveData.ScalingApproach, String]
259+
var dropdown_map: Dictionary = {
260+
SaveData.ScalingApproach.AUTO: "Auto (%d%%)" % int(HandlerGUI.get_auto_ui_scale() / 2.0 * 100),
261+
SaveData.ScalingApproach.CONSTANT_150: "75%",
262+
SaveData.ScalingApproach.CONSTANT_175: "88%",
263+
SaveData.ScalingApproach.CONSTANT_200: "100%",
264+
SaveData.ScalingApproach.CONSTANT_250: "125%",
265+
SaveData.ScalingApproach.CONSTANT_300: "150%"
266+
}
267+
add_dropdown(Translator.translate("UI scale"), dropdown_values, dropdown_map)
268+
add_advice(Translator.translate("Changes the scale factor for the interface."))
249269
# Disable mouse wrap if not available.
250270
if not DisplayServer.has_feature(DisplayServer.FEATURE_MOUSE_WARP):
251271
wraparound_panning.permanent_disable_checkbox(false)
@@ -278,8 +298,7 @@ func add_checkbox(text: String, dim_text := false) -> Control:
278298
return frame
279299

280300
# TODO Typed Dictionary wonkiness
281-
func add_dropdown(text: String, values: Array[Variant],
282-
value_text_map: Dictionary) -> Control: # Dictionary[Variant, String]
301+
func add_dropdown(text: String, values: Array[Variant], value_text_map: Dictionary) -> Control: # Dictionary[Variant, String]
283302
var frame := SettingFrameScene.instantiate()
284303
frame.text = text
285304
setup_frame(frame)

0 commit comments

Comments
 (0)