diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptions.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptions.java index 64ad57a72..61e61c116 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptions.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptions.java @@ -31,11 +31,11 @@ import com.watabou.noosa.Image; public class WndOptions extends Window { - private static final int WIDTH_P = 120; - private static final int WIDTH_L = 144; + protected static final int WIDTH_P = 120; + protected static final int WIDTH_L = 144; - private static final int MARGIN = 2; - private static final int BUTTON_HEIGHT = 18; + protected static final int MARGIN = 2; + protected static final int BUTTON_HEIGHT = 18; public WndOptions(Image icon, String title, String message, String... options) { super(); @@ -73,7 +73,7 @@ public class WndOptions extends Window { layoutBody(pos, message, options); } - private void layoutBody(float pos, String message, String... options){ + protected void layoutBody(float pos, String message, String... options){ int width = PixelScene.landscape() ? WIDTH_L : WIDTH_P; RenderedTextBlock tfMesage = PixelScene.renderTextBlock( 6 ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptionsCondensed.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptionsCondensed.java new file mode 100644 index 000000000..d72bb264a --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndOptionsCondensed.java @@ -0,0 +1,163 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2023 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.windows; + +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.watabou.noosa.Image; + +import java.util.ArrayList; + +//similar to WndOptions, but tries to place multiple buttons per row +public class WndOptionsCondensed extends WndOptions { + + public WndOptionsCondensed(Image icon, String title, String message, String... options) { + super(icon, title, message, options); + } + + public WndOptionsCondensed( String title, String message, String... options ) { + super(title, message, options); + } + + @Override + protected void layoutBody(float pos, String message, String... options) { + int width = PixelScene.landscape() ? WIDTH_L : WIDTH_P; + + RenderedTextBlock tfMesage = PixelScene.renderTextBlock( 6 ); + tfMesage.text(message, width); + tfMesage.setPos( 0, pos ); + add( tfMesage ); + + pos = tfMesage.bottom() + 2*MARGIN; + + ArrayList buttons = new ArrayList<>(); + + for (int i=0; i < options.length; i++) { + final int index = i; + RedButton btn = new RedButton( options[i] ) { + @Override + protected void onClick() { + hide(); + onSelect( index ); + } + }; + if (hasIcon(i)) btn.icon(getIcon(i)); + btn.enable(enabled(i)); + btn.setSize(btn.reqWidth(), BUTTON_HEIGHT); + add( btn ); + buttons.add(btn); + } + + ArrayList curRow = new ArrayList<>(); + float widthLeftThisRow = width; + + while( !buttons.isEmpty() ){ + RedButton btn = buttons.get(0); + + widthLeftThisRow -= btn.width(); + if (curRow.isEmpty()) { + curRow.add(btn); + buttons.remove(btn); + } else { + widthLeftThisRow -= MARGIN; + if (widthLeftThisRow >= 0) { + curRow.add(btn); + buttons.remove(btn); + } + } + + //layout current row. Currently forces a max of 5 buttons but can work with more + if (buttons.isEmpty() || widthLeftThisRow <= 0 || curRow.size() >= 5){ + + //re-use this variable for laying out the buttons + widthLeftThisRow = width - (curRow.size()-1); + for (RedButton b : curRow){ + widthLeftThisRow -= b.width(); + } + + //while we still have space in this row, find the shortest button(s) and extend them + while (widthLeftThisRow > 0){ + + ArrayList shortest = new ArrayList<>(); + RedButton secondShortest = null; + + for (RedButton b : curRow) { + if (shortest.isEmpty()) { + shortest.add(b); + } else { + if (b.width() < shortest.get(0).width()) { + secondShortest = shortest.get(0); + shortest.clear(); + shortest.add(b); + } else if (b.width() == shortest.get(0).width()) { + shortest.add(b); + } else if (secondShortest == null || secondShortest.width() > b.width()){ + secondShortest = b; + } + } + } + + float widthToGrow; + + if (secondShortest == null){ + widthToGrow = widthLeftThisRow / shortest.size(); + widthLeftThisRow = 0; + } else { + widthToGrow = secondShortest.width() - shortest.get(0).width(); + if ((widthToGrow * shortest.size()) >= widthLeftThisRow){ + widthToGrow = widthLeftThisRow / shortest.size(); + widthLeftThisRow = 0; + } else { + widthLeftThisRow -= widthToGrow * shortest.size(); + } + } + + for (RedButton toGrow : shortest){ + toGrow.setRect(0, 0, toGrow.width()+widthToGrow, toGrow.height()); + } + } + + //finally set positions + float x = 0; + for (RedButton b : curRow){ + b.setRect(x, pos, b.width(), b.height()); + x += b.width() + 1; + } + + //move to next line and reset variables + pos += BUTTON_HEIGHT+MARGIN; + widthLeftThisRow = width; + curRow.clear(); + + } + + } + + resize( width, (int)(pos - MARGIN) ); + } + + @Override + protected boolean hasInfo(int index) { + return false; //does nothing here, no room + } +}