diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java new file mode 100644 index 0000000..bbd2c19 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java @@ -0,0 +1,15 @@ +package org.agp8x.android.games.fillgrid; + +import android.graphics.Paint; +import android.support.annotation.NonNull; + +import org.agp8x.android.games.fillgrid.data.Cell; + +/** + * Created by clemensk on 09.04.17. + */ + +public interface CellPaintProvider { + @NonNull + Paint getPaint(Cell cell); +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java new file mode 100644 index 0000000..eadb8a2 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java @@ -0,0 +1,20 @@ +package org.agp8x.android.games.fillgrid; + +import android.graphics.Paint; +import android.support.annotation.NonNull; + +import org.agp8x.android.games.fillgrid.data.Cell; + +/** + * Created by clemensk on 09.04.17. + */ + +public class CellPaintProviderBackground implements CellPaintProvider { + @NonNull + @Override + public Paint getPaint(Cell cell) { + Paint paint = new Paint(); + paint.setAlpha(128); + return paint; + } +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java new file mode 100644 index 0000000..0eb446f --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java @@ -0,0 +1,39 @@ +package org.agp8x.android.games.fillgrid; + +import android.graphics.Color; +import android.graphics.Paint; +import android.support.annotation.NonNull; + +import org.agp8x.android.games.fillgrid.data.Cell; +import org.agp8x.android.games.fillgrid.data.GroupCell; + +/** + * Created by clemensk on 09.04.17. + */ + +public class CellPaintProviderDefault implements CellPaintProvider { + + @NonNull + @Override + public Paint getPaint(Cell cell) { + Paint paint = new Paint(); + if (cell instanceof GroupCell) { + GroupCell groupCell = (GroupCell) cell; + switch (groupCell.getGroup()) { + case 0: + paint.setColor(Color.RED); + break; + case 1: + paint.setColor(Color.GREEN); + break; + case 2: + paint.setColor(Color.BLUE); + break; + default: + paint.setColor(Color.MAGENTA); + } + paint.setAlpha(192); + } + return paint; + } +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/FillGrid.java b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGrid.java index 15699c6..2525bff 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/FillGrid.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGrid.java @@ -2,6 +2,7 @@ package org.agp8x.android.games.fillgrid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.widget.RelativeLayout; import org.agp8x.android.games.fillgrid.data.GridBlock; import org.agp8x.android.games.fillgrid.data.GridObject; @@ -15,6 +16,10 @@ public class FillGrid extends AppCompatActivity { //GridObject sgo = new GridBlock<>("asdf"); //GridObject ago = new GridBlock<>(Asdf.A); + RelativeLayout layout = (RelativeLayout) findViewById(R.id.mainLayout); + + FillGridView gridview = new FillGridView(this); + layout.addView(gridview); } private enum Asdf{ A,B,C; diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java new file mode 100644 index 0000000..d0105ae --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java @@ -0,0 +1,122 @@ +package org.agp8x.android.games.fillgrid; + +import android.content.Context; +import android.graphics.Canvas; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.util.Pair; +import android.view.View; + +import org.agp8x.android.games.fillgrid.data.GridBlock; +import org.agp8x.android.games.fillgrid.data.GridBoard; +import org.agp8x.android.games.fillgrid.data.GroupCell; +import org.agp8x.android.games.fillgrid.data.Offset; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by clemensk on 07.04.17. + */ + +public class FillGridView extends View { + protected Pair contentSize = null; + protected GridBoard, GroupCell> board; + protected List> blocks; + protected Map background; + protected GroupGridPainter painter; + protected GroupGridPainter bgPainter; + + public FillGridView(Context context) { + super(context); + init(null, 0); + } + + public FillGridView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(attrs, 0); + } + + public FillGridView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(attrs, defStyleAttr); + } + + public FillGridView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(attrs, defStyleAttr); + } + + protected void init(AttributeSet attrs, int defStyleAttr) { + Offset dimensions = new Offset(10, 10); + board = new GridBoard<>(dimensions); + + blocks = new ArrayList<>(); + GridBlock block0 = new GridBlock<>(); + block0.getObjects().put(new Offset(0, 0), new GroupCell(0)); + blocks.add(block0); + block0 = new GridBlock<>(); + block0.getObjects().put(new Offset(0, 0), new GroupCell(1)); + block0.getObjects().put(new Offset(0, 1), new GroupCell(1)); + blocks.add(block0); + block0 = new GridBlock<>(); + block0.getObjects().put(new Offset(0, 0), new GroupCell(2)); + block0.getObjects().put(new Offset(0, 1), new GroupCell(2)); + block0.getObjects().put(new Offset(0, 2), new GroupCell(2)); + blocks.add(block0); + + background = new HashMap<>(); + GroupCell bgCell = new GroupCell(-1); + for (int i = 0; i < dimensions.x; i++) { + for (int j = 0; j < dimensions.y; j++) { + background.put(new Offset(i, j), bgCell); + } + } + + CellPaintProvider bgCpp = new CellPaintProviderBackground(); + bgPainter = new GroupGridPainter(dimensions,bgCpp); + + CellPaintProvider cpp = new CellPaintProviderDefault(); + painter = new GroupGridPainter(dimensions, cpp); + board.drop(new Offset(4, 4), makeSquare()); + board.drop(new Offset(4,4), makeAngle()); + } + + private GridBlock makeSquare() { + GridBlock grid = new GridBlock<>(new HashMap<>()); + grid.getObjects().put(new Offset(0, 0), new GroupCell(0)); + grid.getObjects().put(new Offset(0, 1), new GroupCell(0)); + grid.getObjects().put(new Offset(1, 0), new GroupCell(0)); + grid.getObjects().put(new Offset(1, 1), new GroupCell(0)); + return grid; + } + + private GridBlock makeAngle() { + GridBlock grid = new GridBlock<>(new HashMap<>()); + grid.getObjects().put(new Offset(0, 2), new GroupCell(1)); + grid.getObjects().put(new Offset(1, 2), new GroupCell(1)); + grid.getObjects().put(new Offset(2, 2), new GroupCell(1)); + grid.getObjects().put(new Offset(2, 1), new GroupCell(1)); + grid.getObjects().put(new Offset(2, 0), new GroupCell(1)); + return grid; + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (contentSize == null) { + //TODO: maybe fix for square? optional? + int paddingTop = getPaddingTop(); + int paddingBottom = getPaddingBottom(); + int paddingLeft = getPaddingLeft(); + int paddingRight = getPaddingRight(); + contentSize = new Pair<>(getHeight() - paddingTop - paddingBottom, getWidth() - paddingLeft - paddingRight); + } + + bgPainter.draw(canvas, background, contentSize); + painter.draw(canvas, board.getGrid(), contentSize); + } +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java b/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java new file mode 100644 index 0000000..82547fc --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java @@ -0,0 +1,18 @@ +package org.agp8x.android.games.fillgrid; + +import android.graphics.Canvas; +import android.util.Pair; + +import org.agp8x.android.games.fillgrid.data.GroupCell; +import org.agp8x.android.games.fillgrid.data.Offset; + +import java.util.Map; + +/** + * Created by clemensk on 07.04.17. + */ + +public interface GridPainter { + + void draw(Canvas canvas, Map cells, Pair realDimensions); +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java b/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java new file mode 100644 index 0000000..965c526 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java @@ -0,0 +1,37 @@ +package org.agp8x.android.games.fillgrid; + +import android.graphics.Canvas; +import android.util.Pair; + +import org.agp8x.android.games.fillgrid.data.GroupCell; +import org.agp8x.android.games.fillgrid.data.Offset; + +import java.util.Map; + +/** + * Created by clemensk on 07.04.17. + */ + +public class GroupGridPainter implements GridPainter { + private Offset dimensions; + private CellPaintProvider styleInfo; + private int margin; + private int radius; + + public GroupGridPainter(Offset dimensions, CellPaintProvider styleInfo) { + this.dimensions = dimensions; + this.styleInfo = styleInfo; + radius = 30; + margin = radius + radius / 4; + } + + @Override + public void draw(Canvas canvas, Map cells, Pair realDimensions) { + cells.forEach((offset, groupCell) -> drawCell(canvas, offset, groupCell, realDimensions)); + } + + private void drawCell(Canvas canvas, Offset offset, GroupCell cell, Pair realDimensions) { + Pair origin = new Pair<>((offset.x / (float) dimensions.x) * realDimensions.first, (offset.y / (float) dimensions.y) * realDimensions.second); + canvas.drawCircle(origin.second + margin, origin.first + margin, 30, styleInfo.getPaint(cell)); + } +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java index 0bbf86e..1395a32 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Cell.java @@ -8,4 +8,5 @@ public interface Cell { String getTableSymbol(); void markCollapsed(); + boolean isCollapsed(); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBlock.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBlock.java index 406f980..a149203 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBlock.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBlock.java @@ -10,6 +10,10 @@ import java.util.Map; public class GridBlock implements GridObject { private final Map content; + public GridBlock() { + content = new HashMap<>(); + } + public GridBlock(Map content) { this.content = new HashMap<>(content); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java index bbdd1ad..28cb70e 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GridBoard.java @@ -17,8 +17,12 @@ public class GridBoard, C extends Cell> implements Grid< private final Offset dimensions; public GridBoard(int heigth, int width) { + this(new Offset(width, heigth)); + } + + public GridBoard(Offset dimensions) { this.contents = new HashMap<>(); - dimensions = new Offset(width, heigth); + this.dimensions = dimensions; } @Override @@ -45,6 +49,10 @@ public class GridBoard, C extends Cell> implements Grid< contents.clear(); } + public void removeCollapsed() { + contents.entrySet().stream().filter(offsetCEntry -> offsetCEntry.getValue().isCollapsed()).forEach(offsetCEntry -> contents.remove(offsetCEntry.getKey())); + } + /** * Find lines with all cells filled and mark them as collapsed * diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/GroupCell.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GroupCell.java new file mode 100644 index 0000000..f13c3a3 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/GroupCell.java @@ -0,0 +1,39 @@ +package org.agp8x.android.games.fillgrid.data; + +/** + * Created by clemensk on 07.04.17. + */ + +public class GroupCell implements Cell { + private int group; + private boolean collapsed = false; + private boolean collapsionMark = false; + + public GroupCell(int group) { + this.group = group; + } + + public int getGroup() { + return group; + } + + public boolean isCollapsionMark() { + return collapsionMark; + } + + @Override + public String getTableSymbol() { + return "" + group; + } + + @Override + public void markCollapsed() { + collapsionMark =true; + } + + @Override + public boolean isCollapsed() { + return collapsed; + } + +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Offset.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Offset.java index 58080b0..0c42b53 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/Offset.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/Offset.java @@ -4,7 +4,7 @@ package org.agp8x.android.games.fillgrid.data; * Created by clemensk on 29.03.17. */ -class Offset { +public class Offset { public final int x; public final int y; diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java b/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java index 0174117..be2d3a3 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/data/StringCell.java @@ -35,4 +35,9 @@ public class StringCell implements Cell { public void markCollapsed() { } + + @Override + public boolean isCollapsed() { + return false; + } } diff --git a/app/src/main/res/layout/activity_fill_grid.xml b/app/src/main/res/layout/activity_fill_grid.xml index 1f1763c..b461cac 100644 --- a/app/src/main/res/layout/activity_fill_grid.xml +++ b/app/src/main/res/layout/activity_fill_grid.xml @@ -1,19 +1,12 @@ - + tools:context="org.agp8x.android.games.fillgrid.FillGrid" + android:id="@+id/mainLayout"> - - +