Skip to content

Commit

Permalink
Initial placement of page indicator bar on home screen, for device te…
Browse files Browse the repository at this point in the history
…sting.
  • Loading branch information
lanceewing committed Apr 3, 2024
1 parent f314855 commit 73524a3
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 15 deletions.
Binary file added assets/png/next.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/png/prev.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
87 changes: 72 additions & 15 deletions core/src/main/java/com/agifans/agile/HomeScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand All @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -380,6 +384,8 @@ public void dispose() {
skin.dispose();
disposeButtonTextureMap();
whitePixelTexture.dispose();
landscapePaginationWidget.dispose();
portraitPaginationWidget.dispose();

saveAppConfigMap();
}
Expand Down Expand Up @@ -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<Image> iconContainer = new Container<Image>();
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<Image> iconContainer = new Container<Image>();
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.
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/com/agifans/agile/ui/PagedScrollPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
87 changes: 87 additions & 0 deletions core/src/main/java/com/agifans/agile/ui/PaginationWidget.java
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 73524a3

Please sign in to comment.