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.uiscale.name = UI Scaling
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.screenshake.name = Screen Shake
setting.bloomintensity.name = Bloom Intensity

View File

@@ -1279,8 +1279,10 @@ setting.fpscap.name = Límite de FPS
setting.fpscap.none = No
setting.fpscap.text = {0} FPS
setting.uiscale.name = Escala de interfaz
setting.uiscale.description = Es necesario reiniciar para aplicar los cambios.
setting.swapdiagonal.name = Construir siempre en diagonal
setting.uiscale.description = Se requiere reiniciar para aplicar los cambios.
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.bloomintensity.name = Intensidad de desenfoque de 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.text = {0} FPS
setting.uiscale.name = Escala da\ninterface[lightgray] (reinicialização requerida)[]
setting.uiscale.description = Reinicialização necessária para aplicar as alterações.
setting.swapdiagonal.name = Sempre colocação diagonal
setting.uiscale.description = É necessário reiniciar para aplicar as mudanças.
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.bloomintensity.name = Itensidade 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.text = {0} FPS
setting.uiscale.name = Escala da IU[lightgray] (reinicío requerida)[]
setting.uiscale.description = Reinicío necessário para aplicar as alterações.
setting.swapdiagonal.name = Colocação Diagonal Sempre
setting.uiscale.description = É necessário reiniciar para aplicar as mudanças.
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.bloomintensity.name = Intensidade do Bloom
setting.bloomblur.name = Bloom Blur

View File

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

View File

@@ -54,11 +54,16 @@ public class SettingsMenuDialog extends BaseDialog{
rebuildMenu();
});
int[] lastRebuildSize = {Core.graphics.getWidth(), Core.graphics.getHeight()};
onResize(() -> {
graphics.rebuild();
sound.rebuild();
game.rebuild();
updateScrollFocus();
if(lastRebuildSize[0] != Core.graphics.getWidth() || lastRebuildSize[1] != Core.graphics.getHeight()){
graphics.rebuild();
sound.rebuild();
game.rebuild();
updateScrollFocus();
lastRebuildSize[0] = Core.graphics.getWidth();
lastRebuildSize[1] = Core.graphics.getHeight();
}
});
cont.clearChildren();
@@ -374,6 +379,13 @@ public class SettingsMenuDialog extends BaseDialog{
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)};
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){
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;
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);
rebuild();
return res;
@@ -784,14 +804,16 @@ public class SettingsMenuDialog extends BaseDialog{
public static class SliderSetting extends Setting{
int def, min, max, step;
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);
this.def = def;
this.min = min;
this.max = max;
this.step = step;
this.sp = s;
this.changed = changed;
}
@Override
@@ -810,6 +832,7 @@ public class SettingsMenuDialog extends BaseDialog{
slider.changed(() -> {
settings.put(name, (int)slider.getValue());
value.setText(sp.get((int)slider.getValue()));
if(changed != null) changed.get((int)slider.getValue());
});
slider.change();