Add UI edge padding setting (#11741)

* feat(ui): added edge padding support and translations

* Bundles: added uiEdgePadding translations

* add Jovinull in contributors

* refactor(ui): extract updateMargins and apply padding to longest axis

* refactor(settings): use Intc and call updateMargins directly
This commit is contained in:
Felipe Jovino
2026-03-17 20:15:09 -03:00
committed by GitHub
parent 29b54f0a93
commit 18c57bb9a3
6 changed files with 63 additions and 21 deletions

View File

@@ -1280,6 +1280,8 @@ setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Scaling setting.uiscale.name = UI Scaling
setting.uiscale.description = Restart required to apply changes. setting.uiscale.description = Restart required to apply changes.
setting.uiEdgePadding.name = UI Edge Padding
setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches.
setting.swapdiagonal.name = Always Diagonal Placement setting.swapdiagonal.name = Always Diagonal Placement
setting.screenshake.name = Screen Shake setting.screenshake.name = Screen Shake
setting.bloomintensity.name = Bloom Intensity setting.bloomintensity.name = Bloom Intensity

View File

@@ -1279,8 +1279,10 @@ setting.fpscap.name = Límite de FPS
setting.fpscap.none = No setting.fpscap.none = No
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Escala de interfaz setting.uiscale.name = Escala de interfaz
setting.uiscale.description = Es necesario reiniciar para aplicar los cambios. setting.uiscale.description = Se requiere reiniciar para aplicar los cambios.
setting.swapdiagonal.name = Construir siempre en diagonal setting.uiEdgePadding.name = Espaciado de bordes de UI
setting.uiEdgePadding.description = Añade espaciado a los bordes de la UI. Útil para pantallas con esquinas redondeadas o muescas.
setting.swapdiagonal.name = Colocación siempre diagonal
setting.screenshake.name = Vibración de pantalla setting.screenshake.name = Vibración de pantalla
setting.bloomintensity.name = Intensidad de desenfoque de Bloom setting.bloomintensity.name = Intensidad de desenfoque de Bloom
setting.bloomblur.name = Difuminado de puntos de luz (Bloom) setting.bloomblur.name = Difuminado de puntos de luz (Bloom)

View File

@@ -1279,8 +1279,10 @@ setting.fpscap.name = FPS Máximo
setting.fpscap.none = Nenhum setting.fpscap.none = Nenhum
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Escala da\ninterface[lightgray] (reinicialização requerida)[] setting.uiscale.name = Escala da\ninterface[lightgray] (reinicialização requerida)[]
setting.uiscale.description = Reinicialização necessária para aplicar as alterações. setting.uiscale.description = É necessário reiniciar para aplicar as mudanças.
setting.swapdiagonal.name = Sempre colocação diagonal setting.uiEdgePadding.name = Espaçamento de bordas da UI
setting.uiEdgePadding.description = Adiciona espaçamento às bordas da UI. Útil para telas com cantos arredondados ou entalhes (notches).
setting.swapdiagonal.name = Colocação sempre diagonal
setting.screenshake.name = Vibração da Tela setting.screenshake.name = Vibração da Tela
setting.bloomintensity.name = Itensidade do Bloom setting.bloomintensity.name = Itensidade do Bloom
setting.bloomblur.name = Desfoque do Bloom setting.bloomblur.name = Desfoque do Bloom

View File

@@ -1279,8 +1279,10 @@ setting.fpscap.name = Limite de FPS
setting.fpscap.none = Nenhum setting.fpscap.none = Nenhum
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Escala da IU[lightgray] (reinicío requerida)[] setting.uiscale.name = Escala da IU[lightgray] (reinicío requerida)[]
setting.uiscale.description = Reinicío necessário para aplicar as alterações. setting.uiscale.description = É necessário reiniciar para aplicar as mudanças.
setting.swapdiagonal.name = Colocação Diagonal Sempre setting.uiEdgePadding.name = Espaçamento de bordas da UI
setting.uiEdgePadding.description = Adiciona espaçamento às bordas da UI. Útil para telas com cantos arredondados ou entalhes (notches).
setting.swapdiagonal.name = Colocação sempre diagonal
setting.screenshake.name = Vibração do Ecrã setting.screenshake.name = Vibração do Ecrã
setting.bloomintensity.name = Intensidade do Bloom setting.bloomintensity.name = Intensidade do Bloom
setting.bloomblur.name = Bloom Blur setting.bloomblur.name = Bloom Blur

View File

@@ -117,11 +117,7 @@ public class UI implements ApplicationListener, Loadable{
Core.scene = new Scene(); Core.scene = new Scene();
Core.input.addProcessor(Core.scene); Core.input.addProcessor(Core.scene);
int[] insets = Core.graphics.getSafeInsets(); updateMargins();
Core.scene.marginLeft = insets[0];
Core.scene.marginRight = insets[1];
Core.scene.marginTop = insets[2];
Core.scene.marginBottom = insets[3];
Tex.load(); Tex.load();
Icon.load(); Icon.load();
@@ -248,16 +244,31 @@ public class UI implements ApplicationListener, Loadable{
new FadeInFragment().build(group); new FadeInFragment().build(group);
} }
@Override /** Updates scene margins based on safe insets and custom edge padding setting. */
public void resize(int width, int height){ public void updateMargins(){
if(Core.scene == null) return;
int[] insets = Core.graphics.getSafeInsets(); int[] insets = Core.graphics.getSafeInsets();
int customPadding = (int)Scl.scl(Core.settings.getInt("uiEdgePadding", 0));
Core.scene.marginLeft = insets[0]; Core.scene.marginLeft = insets[0];
Core.scene.marginRight = insets[1]; Core.scene.marginRight = insets[1];
Core.scene.marginTop = insets[2]; Core.scene.marginTop = insets[2];
Core.scene.marginBottom = insets[3]; Core.scene.marginBottom = insets[3];
if(Core.graphics.getHeight() > Core.graphics.getWidth()){
Core.scene.marginTop += customPadding;
Core.scene.marginBottom += customPadding;
}else{
Core.scene.marginLeft += customPadding;
Core.scene.marginRight += customPadding;
}
}
@Override
public void resize(int width, int height){
if(Core.scene == null) return;
updateMargins();
Core.scene.resize(width, height); Core.scene.resize(width, height);
Events.fire(new ResizeEvent()); Events.fire(new ResizeEvent());
} }

View File

@@ -54,11 +54,16 @@ public class SettingsMenuDialog extends BaseDialog{
rebuildMenu(); rebuildMenu();
}); });
int[] lastRebuildSize = {Core.graphics.getWidth(), Core.graphics.getHeight()};
onResize(() -> { onResize(() -> {
graphics.rebuild(); if(lastRebuildSize[0] != Core.graphics.getWidth() || lastRebuildSize[1] != Core.graphics.getHeight()){
sound.rebuild(); graphics.rebuild();
game.rebuild(); sound.rebuild();
updateScrollFocus(); game.rebuild();
updateScrollFocus();
lastRebuildSize[0] = Core.graphics.getWidth();
lastRebuildSize[1] = Core.graphics.getHeight();
}
}); });
cont.clearChildren(); cont.clearChildren();
@@ -374,6 +379,13 @@ public class SettingsMenuDialog extends BaseDialog{
game.checkPref("console", false); game.checkPref("console", false);
} }
graphics.sliderPref("uiEdgePadding", 0, 0, 100, s -> s + "px", s -> {
if(ui != null){
ui.updateMargins();
Core.scene.resize(Core.graphics.getWidth(), Core.graphics.getHeight());
}
});
int[] lastUiScale = {settings.getInt("uiscale", 100)}; int[] lastUiScale = {settings.getInt("uiscale", 100)};
graphics.sliderPref("uiscale", 100, 25, 300, 5, s -> { graphics.sliderPref("uiscale", 100, 25, 300, 5, s -> {
@@ -674,8 +686,16 @@ public class SettingsMenuDialog extends BaseDialog{
} }
public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s){ public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s){
return sliderPref(name, def, min, max, step, s, null);
}
public SliderSetting sliderPref(String name, int def, int min, int max, StringProcessor s, Intc changed){
return sliderPref(name, def, min, max, 1, s, changed);
}
public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s, Intc changed){
SliderSetting res; SliderSetting res;
list.add(res = new SliderSetting(name, def, min, max, step, s)); list.add(res = new SliderSetting(name, def, min, max, step, s, changed));
settings.defaults(name, def); settings.defaults(name, def);
rebuild(); rebuild();
return res; return res;
@@ -784,14 +804,16 @@ public class SettingsMenuDialog extends BaseDialog{
public static class SliderSetting extends Setting{ public static class SliderSetting extends Setting{
int def, min, max, step; int def, min, max, step;
StringProcessor sp; StringProcessor sp;
Intc changed;
public SliderSetting(String name, int def, int min, int max, int step, StringProcessor s){ public SliderSetting(String name, int def, int min, int max, int step, StringProcessor s, Intc changed){
super(name); super(name);
this.def = def; this.def = def;
this.min = min; this.min = min;
this.max = max; this.max = max;
this.step = step; this.step = step;
this.sp = s; this.sp = s;
this.changed = changed;
} }
@Override @Override
@@ -810,6 +832,7 @@ public class SettingsMenuDialog extends BaseDialog{
slider.changed(() -> { slider.changed(() -> {
settings.put(name, (int)slider.getValue()); settings.put(name, (int)slider.getValue());
value.setText(sp.get((int)slider.getValue())); value.setText(sp.get((int)slider.getValue()));
if(changed != null) changed.get((int)slider.getValue());
}); });
slider.change(); slider.change();