Example usage: *
{@code
* AsciiTable table = new AsciiTable(BorderStyle.UNICODE, 3);
- * table.addHeader("Name", "🍗", "⭐");
+ * table.addHeader("Name", "🍖", "⭐");
* table.addRow("Alice", "4", "12");
* table.addRow("Bob", "2", "8");
* System.out.println(table.build());
@@ -122,7 +122,7 @@ public class AsciiTable {
/**
* Returns {@code true} when {@code cp} is a wide (2-column) character.
* Covers CJK blocks, Hangul, full-width forms, and emoji (including
- * the specific emoji used in this project: 🍗 U+1F357, ⭐ U+2B50).
+ * the specific emoji used in this project: 🍖 U+1F357, ⭐ U+2B50).
*/
private static boolean isWide(int cp) {
if (cp < 0x1100) return false;
@@ -151,7 +151,7 @@ public class AsciiTable {
if (cp <= 0xFFE6) return true; // Fullwidth Signs
if (cp < 0x1F004) return false;
if (cp <= 0x1FAFF) return true; // Emoji (mahjong, playing cards, flags,
- // misc symbols, transport, 🍗 U+1F357, ...)
+ // misc symbols, transport, 🍖 U+1F357, ...)
if (cp < 0x20000) return false;
return cp <= 0x3FFFD; // CJK Extension B through G
}
diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java
index 45c2af1..fd5b60a 100644
--- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java
+++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java
@@ -9,7 +9,6 @@ import org.jline.reader.LineReader;
import org.jline.terminal.Terminal;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -143,8 +142,8 @@ public class TUI implements IView {
*/
private String buildBoardContent() {
List left = List.of(BoardStamp().split("\n"));
- List right = List.of(printMenuOptions().split("\n"));
- return AsciiTable.sideBySide(left, right, 3) + "\n" + buildAllHandsContent();
+ List right = List.of(buildAllHandsContent().split("\n"));
+ return AsciiTable.sideBySide(left, right, 3);
}
/**
@@ -154,35 +153,9 @@ public class TUI implements IView {
private String buildAllHandsContent() {
List players = new ArrayList<>(model.players.values());
if (players.isEmpty()) return "";
-
- int termWidth = (terminal != null && terminal.getWidth() > 0) ? terminal.getWidth() : 80;
- int gap = 3;
-
- List> panels = new ArrayList<>();
- List panelWidths = new ArrayList<>();
- for (Player p : players) {
- List lines = Arrays.asList(p.toString().split("\n"));
- panels.add(lines);
- panelWidths.add(lines.stream().mapToInt(l -> visibleLength(l)).max().orElse(0));
- }
-
StringBuilder result = new StringBuilder();
- int i = 0;
- while (i < panels.size()) {
- int rowWidth = panelWidths.get(i);
- int j = i + 1;
- while (j < panels.size()
- && rowWidth + gap + panelWidths.get(j) <= termWidth) {
- rowWidth += gap + panelWidths.get(j);
- j++;
- }
- List merged = panels.get(i);
- for (int k = i + 1; k < j; k++) {
- merged = Arrays.asList(
- AsciiTable.sideBySide(merged, panels.get(k), gap).split("\n"));
- }
- result.append(String.join("\n", merged)).append("\n");
- i = j;
+ for (Player p : players) {
+ result.append(p.toString()).append("\n");
}
return result.toString();
}
@@ -317,62 +290,58 @@ public class TUI implements IView {
slotPlayers.add(entry.getValue() != null ? entry.getValue().getUserName() : " ");
}
- var TribeUpper = new AsciiTable(BorderStyle.ROUNDED, 1);
- var TribeLower = new AsciiTable(BorderStyle.ROUNDED, 1);
- var BuildUpper = new AsciiTable(BorderStyle.ROUNDED, 1);
- BuildUpper.addHeader("Building ");
- var BuildLower = new AsciiTable(BorderStyle.ROUNDED, 1);
- BuildLower.addHeader("Building ");
+ var UpperCards = new AsciiTable(BorderStyle.ROUNDED, 2);
+ var LowerCards = new AsciiTable(BorderStyle.ROUNDED, 2);
+ UpperCards.addHeader("Char/Events", "Building");
+ LowerCards.addHeader("Char/Events", "Building");
- List upperTribeRows = new ArrayList<>();
- List lowerTribeRows = new ArrayList<>();
- upperTribeRows.add("Char/Events");
- lowerTribeRows.add("Char/Events");
-
- int max = Math.max(model.upperListTribeCards.size(), model.lowerListTribeCards.size());
- for (int i = 0; i < max; i++) {
- if (i < model.upperListTribeCards.size())
- upperTribeRows.add(i + model.upperListTribeCards.get(i).toStringBoard());
- if (i < model.lowerListTribeCards.size())
- lowerTribeRows.add(i + "" + model.lowerListTribeCards.get(i).toStringBoard());
+ int maxU = Math.max(model.upperListTribeCards.size(), model.upperListBuildingCards.size());
+ for (int i = 0; i < maxU; i++) {
+ String t = i < model.upperListTribeCards.size() ? i + model.upperListTribeCards.get(i).toStringBoard() : "";
+ String b = i < model.upperListBuildingCards.size() ? i + model.upperListBuildingCards.get(i).toString() : "";
+ UpperCards.addRow(t, b);
}
- int maxB = Math.max(model.upperListBuildingCards.size(), model.lowerListBuildingCards.size());
- for (int i = 0; i < maxB; i++) {
- if (i < model.upperListBuildingCards.size())
- BuildUpper.addRow(i + model.upperListBuildingCards.get(i).toString());
- if (i < model.lowerListBuildingCards.size())
- BuildLower.addRow(i + model.lowerListBuildingCards.get(i).toString());
+ int maxL = Math.max(model.lowerListTribeCards.size(), model.lowerListBuildingCards.size());
+ for (int i = 0; i < maxL; i++) {
+ String t = i < model.lowerListTribeCards.size() ? i + model.lowerListTribeCards.get(i).toStringBoard() : "";
+ String b = i < model.lowerListBuildingCards.size() ? i + model.lowerListBuildingCards.get(i).toString() : "";
+ LowerCards.addRow(t, b);
}
- upperTribeRows.forEach(TribeUpper::addRow);
- lowerTribeRows.forEach(TribeLower::addRow);
offerTrack.addRow(slotPlayers);
offerTrack.addRow(slotNames);
- return "CURRENT STATE\n" + model.currentState + "\n" + model.orderLogicCard + "\n"
- + AsciiTable.sideBySide(
- Arrays.stream(TribeUpper.build().split("\n")).toList(),
- Arrays.stream(BuildUpper.build().split("\n")).toList(), 2)
- + "\n" + offerTrack.build() + "\n"
- + AsciiTable.sideBySide(
- List.of(TribeLower.build().split("\n")),
- Arrays.stream(BuildLower.build().split("\n")).toList(), 2);
+ String upperSection = UpperCards.build();
+
+ String middleSection = AsciiTable.sideBySide(
+ List.of(model.orderLogicCard.toString().split("\n")),
+ List.of(offerTrack.build().split("\n")), 3);
+
+ String lowerSection = LowerCards.build();
+
+ return model.currentState + "\n"
+ + upperSection + "\n"
+ + middleSection + "\n"
+ + lowerSection;
}
- // ── Menu options ──────────────────────────────────────────────────────────
+ // ── Help ──────────────────────────────────────────────────────────────────
- private String printMenuOptions() {
+ /** Displays the command help panel. */
+ public void renderHelp() {
+ display(buildHelpContent());
+ }
+
+ private String buildHelpContent() {
var table = new AsciiTable(BorderStyle.ROUNDED, 1);
table.addHeader("Commands");
table.addRow("slot ");
- table.addRow("draw upper tribe ");
- table.addRow("draw upper building ");
- table.addRow("draw lower tribe ");
- table.addRow("draw lower building ");
+ table.addRow("draw upper|lower tribe|building ");
table.addRow("totem ");
table.addRow("skip");
table.addRow("render");
+ table.addRow("help");
table.addRow("rematch | quit");
return table.build();
}