diff --git a/assets/png/next.png b/assets/png/next.png new file mode 100644 index 0000000..0bef5f1 Binary files /dev/null and b/assets/png/next.png differ diff --git a/assets/png/prev.png b/assets/png/prev.png new file mode 100644 index 0000000..c0b648b Binary files /dev/null and b/assets/png/prev.png differ diff --git a/core/src/main/java/com/agifans/agile/HomeScreen.java b/core/src/main/java/com/agifans/agile/HomeScreen.java index b706443..13e73ab 100644 --- a/core/src/main/java/com/agifans/agile/HomeScreen.java +++ b/core/src/main/java/com/agifans/agile/HomeScreen.java @@ -14,6 +14,7 @@ import com.agifans.agile.ui.ImportType; import com.agifans.agile.ui.OpenFileResponseHandler; import com.agifans.agile.ui.PagedScrollPane; +import com.agifans.agile.ui.PaginationWidget; import com.agifans.agile.ui.TextInputResponseHandler; import com.agifans.agile.ui.ViewportManager; import com.agifans.agile.util.StringUtils; @@ -73,6 +74,8 @@ public class HomeScreen extends InputAdapter implements Screen { private Texture backgroundPortrait; private MenuWidget portraitMenuWidget; private MenuWidget landscapeMenuWidget; + private PaginationWidget portraitPaginationWidget; + private PaginationWidget landscapePaginationWidget; private Texture whitePixelTexture; /** @@ -149,8 +152,10 @@ public HomeScreen(Agile agile, DialogHandler dialogHandler) { backgroundPortrait = new Texture("jpg/portrait_back.jpg"); backgroundPortrait.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); viewportManager = ViewportManager.getInstance(); - portraitStage = createStage(viewportManager.getPortraitViewport(), appConfig, 3, 5); - landscapeStage = createStage(viewportManager.getLandscapeViewport(), appConfig, 5, 3); + portraitPaginationWidget = new PaginationWidget(this, 1080); + landscapePaginationWidget = new PaginationWidget(this, 1920); + portraitStage = createStage(viewportManager.getPortraitViewport(), portraitPaginationWidget, appConfig); + landscapeStage = createStage(viewportManager.getLandscapeViewport(), landscapePaginationWidget, appConfig); whitePixelTexture = createWhitePixelTexture(); portraitMenuWidget = createMenuWidget(portraitStage); @@ -208,9 +213,9 @@ private MenuWidget createMenuWidget(Stage stage) { return widget; } - private Stage createStage(Viewport viewport, AppConfig appConfig, int columns, int rows) { + private Stage createStage(Viewport viewport, PaginationWidget paginationWidget, AppConfig appConfig) { Stage stage = new Stage(viewport); - addAppButtonsToStage(stage, appConfig, columns, rows); + addAppButtonsToStage(stage, paginationWidget, appConfig); return stage; } @@ -223,7 +228,7 @@ private MenuWidget getCurrentMenuWidget() { } } - private void addAppButtonsToStage(Stage stage, AppConfig appConfig, int columns, int rows) { + private void addAppButtonsToStage(Stage stage, PaginationWidget paginationWidget, AppConfig appConfig) { Table container = new Table(); stage.addActor(container); container.setFillParent(true); @@ -233,14 +238,9 @@ private void addAppButtonsToStage(Stage stage, AppConfig appConfig, int columns, int sidePadding = (viewportHeight > (viewportWidth / 1.32f))? 15 : 85; - columns = (int)((viewportWidth - sidePadding) / ICON_IMAGE_WIDTH); - rows = (int)((viewportHeight - sidePadding) / (ICON_IMAGE_HEIGHT + ICON_LABEL_HEIGHT)); - - //System.out.print("width: " + viewportWidth + - // ", height: " + viewportHeight + - // ", rows: " + rows + - // ", columns: " + columns + - // "\n"); + int availableHeight = (int)(viewportHeight - PAGINATION_HEIGHT); + int columns = (int)((viewportWidth - sidePadding) / ICON_IMAGE_WIDTH); + int rows = (int)(availableHeight / (ICON_IMAGE_HEIGHT + ICON_LABEL_HEIGHT + 30)); int totalHorizPadding = 0; int horizPaddingUnit = 0; @@ -325,6 +325,10 @@ private void addAppButtonsToStage(Stage stage, AppConfig appConfig, int columns, } container.add(pagedScrollPane).expand().fill(); + + container.row(); + container.add(paginationWidget).expand().fill(); + stage.addActor(paginationWidget); } @Override @@ -380,6 +384,8 @@ public void dispose() { skin.dispose(); disposeButtonTextureMap(); whitePixelTexture.dispose(); + landscapePaginationWidget.dispose(); + portraitPaginationWidget.dispose(); saveAppConfigMap(); } @@ -502,9 +508,60 @@ public Texture drawEmptyIcon(int iconWidth, int iconHeight) { return texture; } + private Button buildPageIndicatorDots(int currentPage, int numOfPages) { + int imageWidth = numOfPages * 100; + Pixmap pixmap = new Pixmap(imageWidth, 80, Pixmap.Format.RGBA8888); + Texture texture = new Texture(pixmap, Pixmap.Format.RGBA8888, false); + pixmap.setColor(1.0f, 1.0f, 1.0f, 0.10f); + pixmap.fill(); + texture.draw(pixmap, 0, 0); + Image icon = new Image(texture); + icon.setAlign(Align.center); + Container iconContainer = new Container(); + iconContainer.setActor(icon); + iconContainer.align(Align.center); + iconContainer.setWidth(imageWidth); + iconContainer.setHeight(80); + Button pageIndicator = new Button(skin); + ButtonStyle style = pageIndicator.getStyle(); + style.up = style.down = null; + pageIndicator.stack(new Image(skin.getDrawable("top")), iconContainer) + .width(imageWidth) + .height(80); + return pageIndicator; + } + + private Button buildNavButton(String iconPath) { + Button button = new Button(skin); + ButtonStyle style = button.getStyle(); + style.up = style.down = null; + + Pixmap iconPixmap = new Pixmap(Gdx.files.internal(iconPath)); + Texture iconTexture = new Texture(iconPixmap); + iconPixmap.dispose(); + iconTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); + + Image icon = new Image(iconTexture); + icon.setAlign(Align.center); + Container iconContainer = new Container(); + iconContainer.setActor(icon); + iconContainer.align(Align.center); + iconContainer.setWidth(80); + iconContainer.setHeight(80); + button.stack(new Image(skin.getDrawable("top")), iconContainer) + .width(80) + .height(80); + button.row(); + + button.addListener(appClickListener); + button.addListener(appGestureListener); + return button; + } + private static final int ICON_IMAGE_WIDTH = 320; private static final int ICON_IMAGE_HEIGHT = 240; private static final int ICON_LABEL_HEIGHT = 90; + private static final int PAGINATION_HEIGHT = 80; /** * Creates a button to represent the given AppConfigItem. @@ -675,8 +732,8 @@ public void updateHomeScreenButtonStages() { AppConfig appConfig = convertAppConfigItemMapToAppConfig(appConfigMap); portraitStage.clear(); landscapeStage.clear(); - addAppButtonsToStage(portraitStage, appConfig, 3, 5); - addAppButtonsToStage(landscapeStage, appConfig, 5, 3); + addAppButtonsToStage(portraitStage, portraitPaginationWidget, appConfig); + addAppButtonsToStage(landscapeStage, landscapePaginationWidget, appConfig); saveAppConfigMap(); agile.getPreferences().flush(); portraitStage.addActor(portraitMenuWidget); diff --git a/core/src/main/java/com/agifans/agile/ui/PagedScrollPane.java b/core/src/main/java/com/agifans/agile/ui/PagedScrollPane.java index 97af04c..1a10a69 100644 --- a/core/src/main/java/com/agifans/agile/ui/PagedScrollPane.java +++ b/core/src/main/java/com/agifans/agile/ui/PagedScrollPane.java @@ -103,6 +103,10 @@ public void reset() { this.wasPanDragFling = false; setScrollX(0); } + + public int getNumOfPages() { + return content.getChildren().size; + } private void scrollToPage() { final float width = getWidth(); diff --git a/core/src/main/java/com/agifans/agile/ui/PaginationWidget.java b/core/src/main/java/com/agifans/agile/ui/PaginationWidget.java new file mode 100644 index 0000000..1d0b618 --- /dev/null +++ b/core/src/main/java/com/agifans/agile/ui/PaginationWidget.java @@ -0,0 +1,87 @@ +package com.agifans.agile.ui; + +import com.agifans.agile.HomeScreen; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.ui.Widget; + +/** + * A widget from drawing the pagination at the bottom of the PagedScrollPane. + */ +public class PaginationWidget extends Widget { + + private static final int ICON_SIZE = 80; + + private HomeScreen homeScreen; + + private Pixmap pixmap; + + private Texture texture; + + private Pixmap nextIconPixmap; + + private Pixmap prevIconPixmap; + + private int width; + + /** + * Constructor for PaginationWidget. + * + * @param homeScreen + * @param width + */ + public PaginationWidget(HomeScreen homeScreen, float width) { + this.homeScreen = homeScreen; + this.width = (int)width; + + prevIconPixmap = new Pixmap(Gdx.files.internal("png/prev.png")); + nextIconPixmap = new Pixmap(Gdx.files.internal("png/next.png")); + pixmap = new Pixmap((int)width, ICON_SIZE, Pixmap.Format.RGBA8888); + texture = new Texture(pixmap, Pixmap.Format.RGBA8888, false); + + setSize(getPrefWidth(), getPrefHeight()); + + addListener(new InputListener() { + // TODO: Handle click/touch + }); + } + + public void draw(Batch batch, float parentAlpha) { + validate(); + + Color c = getColor(); + batch.setColor(c.r, c.g, c.b, c.a * parentAlpha); + + pixmap.setColor(1.0f, 1.0f, 1.0f, 0.10f); + pixmap.fill(); + pixmap.drawPixmap(prevIconPixmap, 0, 0); + pixmap.drawPixmap(nextIconPixmap, width - ICON_SIZE, 0); + + texture.draw(pixmap, 0, 0); + + batch.draw(texture, 0, 0); + } + + public float getPrefWidth () { + return width; + } + + public float getPrefHeight () { + return ICON_SIZE; + } + + public float getMaxHeight() { + return ICON_SIZE; + } + + public void dispose() { + texture.dispose(); + pixmap.dispose(); + nextIconPixmap.dispose(); + prevIconPixmap.dispose(); + } +}