From 73524a323a405716a158132e3f7f6362735df8e8 Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Wed, 3 Apr 2024 06:59:42 +0100 Subject: [PATCH] Initial placement of page indicator bar on home screen, for device testing. --- assets/png/next.png | Bin 0 -> 1341 bytes assets/png/prev.png | Bin 0 -> 1366 bytes .../java/com/agifans/agile/HomeScreen.java | 87 +++++++++++++++--- .../com/agifans/agile/ui/PagedScrollPane.java | 4 + .../agifans/agile/ui/PaginationWidget.java | 87 ++++++++++++++++++ 5 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 assets/png/next.png create mode 100644 assets/png/prev.png create mode 100644 core/src/main/java/com/agifans/agile/ui/PaginationWidget.java diff --git a/assets/png/next.png b/assets/png/next.png new file mode 100644 index 0000000000000000000000000000000000000000..0bef5f15e2db8a4a3d025b3bdd846e3600d242a5 GIT binary patch literal 1341 zcmV-D1;YA?P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5dZ)S5dnW>Uy%R+1ky=FK~#8N?VU}i zRaF>`MxuFIC9t8d#&w2a0W3n zG&F8-aBvGbL~i!mK^+h_hCE6BK;)1mF7d}f4$FI#{4RMtczu|x(C01gWyCtZCm^;Za`}$Y-{7>>6rx&;_5J)+n>`0pOP zYpH-GzCwfo3iw+8|*mmuZEq^OJ~&Ubqt z@G=o8PmsToraaVrM{ad{An?*b%1UxPY05+0Pvk*PNBS!QffUU`eoLD2P^SU+YEDPF zJwS$jiOb26uB8IhX~4af#MG|}LT)5`?I{a&8Y^xflieN&gv=(N+EWo~-{Ekn+XI1= ztH{SmQ5kA?k{NCf1VXMLZ`)B3YIl*DZVv=PrjiYIRD{|+WS-jtfsk{F2Hb=8l!dYb ztmQVh z2Ldl6k)i?j(WEI4by}CRoYNR^S3%0%VS(ENft2w?_mu0d%h^x<*DrB|k8Ndar_*V>g9JaQ#{Y!L z^=@xB_>jCNe?)eZYu(;%5TWJ8@7qlgYTqR>j1h=fOg^`pEYyk3oKA9kyFrGga{H5> zGStRYt_LEPk|q}up5-(yCJ1CSxt#S2S<7jxdPRaRsIDPe-cf|QBV-w;9e+i8K|jD{b$j+pu47FO?5ew1 zy=6B=sMUVCS#EDPh`5q8*=+a`iG6Yc5n9Kx+ir?byNyh9d%Hn|2FP{yfAlt7U+DJs zf{%W-{A*YfTmA(i;-M4$fCSAh;;|?FfCN2wXElij?=%GwTBo;()ZIiKkACWb2t9nP z$>N@P_*f4_XqoLBc2k5}E$)fO-{C@kEOZ6=!=$DRwJ(#HT?j-peFUiPu*Kq@DoDA5 zWVc`Oc|3&nzd(v+8xN2ZU0cJ@`y?KNoC8l|5wwc@W7ffIE$)d2ao0hT$TOsSg_)xs z1s_{Zn}DzhWUJ-He@4&`h|_wO>3(^ZGcfQste{)U^KcY!00000NkvXXu0mjf3ruX3 literal 0 HcmV?d00001 diff --git a/assets/png/prev.png b/assets/png/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b648b1e9a6cc299c556d62f4ccfa59e91d4217 GIT binary patch literal 1366 zcmV-c1*!UpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5dZ)S5dnW>Uy%R+1nWseK~#8N?VVkS zRaF><$3{z?CVyy9At7xPM3g{?!I6|M6EZ77in>ry1gjfGFdfmLi*5`gA&@|V8Zndn zsR%`hF|xTRe+dlyNmC*frcumv?0L`n4(vHJd+j~PtJe3x%h_kn_szw_k=bkQwU!O3 z(AU@3N?Po#QwGE>AeYEz_+$5?y1AfXW%Z;?MLb|O&s7g@!n|FJ;AP<@lg z&5E4})M?bQ!rIdY5gM9xklY*OD%4#eOStsW1|r6i4@uD*)}Ag%7>10M9@FNAgH@Y-mvzx z!N;S>*h2b(o_r{~Kwh%;v_XVcM(GbgA*ek|d~_l3p~XF)kfPtbAIWppo;HZk`joHC zO%!UsC4Pe}5TW%cWfu47A<=kiPa8yNbaA3$rU2A-^5XIYA|&r(#Y_b1G=r>XyG_>q zzo4!eU3uZj5dxlH);99BOwHU#FJ^FHa-oa8MM7+AoPOv(17K zJ>w{IBmF(`Y5FV(@u6J3;6;-Ox@9RdnXu5>9f1&i6ZO2e*F5Dyolj@gf)}l4UP`V6 zP5Dr#?N=MP^a<502w8*}pVF@fr1(RndO=9($C|wOs3i+R^kDs)ilG8ftCgoStlbfK z(Yly2OFOzro3%RvArnZM#YLycY-@J}LNxT-O75DcT&U9uEq{iR1ur9!vX=A&P5Dsw z8(C`Yj=+m9x?RhH%wVL_yjW$^jqJ45l%~2F;_Y>dhl?5SFNSXa|zS*!AgiIn|o1-Yy>RUU@ z+8u!u-Ef!LaD9^ahU+W{(U$*>#JBtp7GzWpohZ63%nzNY1uq)4yiLj;d*a{3EJ!JP z@Xlr~M_aoikW%>QCqeBF;^$^%K}gxd$3Az7H6TRGi+?ajQK;QZe0gyegy?)39c@>1 zHN;UemrLLEUIiJWk)j#yLO0xSgjzqaA`4QA9zxqgUbQwS3u0o&Am1XZxg2IKPAv$k z9>m>mqa*KihV(o7+)AB15cLA79tHn5dDrEY1Y!Em2riRP@#yPq1_R=>hWh~@AJEY7 YFUM (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(); + } +}