From 93c91d394447fc5f7585e38911821570eb083a24 Mon Sep 17 00:00:00 2001 From: Plan3t Date: Tue, 17 Feb 2026 12:17:05 +0100 Subject: [PATCH] Move invites into members sub-section button row --- .../client/gui/FactionMainScreen.java | 290 ++++++++++++------ .../client/gui/FactionMapRenderer.java | 4 +- .../mcprotector/client/gui/FactionTab.java | 21 +- 3 files changed, 205 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/mcprotector/client/gui/FactionMainScreen.java b/src/main/java/com/mcprotector/client/gui/FactionMainScreen.java index 8d88a79..75a6414 100644 --- a/src/main/java/com/mcprotector/client/gui/FactionMainScreen.java +++ b/src/main/java/com/mcprotector/client/gui/FactionMainScreen.java @@ -25,8 +25,8 @@ import java.util.Set; public class FactionMainScreen extends Screen { - private static final int TAB_BUTTON_HEIGHT = 18; - private static final int TAB_BUTTON_WIDTH = 72; + private static final int TAB_BUTTON_HEIGHT = 16; + private static final int TAB_BUTTON_WIDTH = 66; private static final int PANEL_PADDING = 16; private static final int CONTROL_TOP_OFFSET = 6; private static final int CONTROL_ROW_SPACING = 24; @@ -43,9 +43,14 @@ public class FactionMainScreen extends Screen { private static final int MAP_COLOR_PERSONAL = 0xFF9C27B0; private static final int SAFEZONE_FIELD_WIDTH = 90; private static final int CLAIM_CONTROL_GAP = 6; - private static final int MIN_TAB_BUTTON_WIDTH = 52; - private static final int TAB_BUTTON_GAP = 4; + private static final int MIN_TAB_BUTTON_WIDTH = 44; + private static final int TAB_BUTTON_GAP = 3; private static final int PANEL_CONTENT_WIDTH = 388; + private static final int TAB_COMPACT_LABEL_THRESHOLD = 58; + private static final int MEMBER_SECTION_BUTTON_WIDTH = 72; + private static final int MEMBER_SECTION_BUTTON_HEIGHT = 16; + private static final int MEMBER_SECTION_BUTTON_GAP = 4; + private static final int MIN_PANEL_CONTENT_WIDTH = 300; private static final DateTimeFormatter INVITE_TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm") .withZone(ZoneId.systemDefault()); @@ -78,12 +83,16 @@ public class FactionMainScreen extends Screen { private EditBox safeZoneFactionField; private Button claimTypeButton; private Button submitClaimsButton; + private Button membersSectionButton; + private Button invitesSectionButton; private int roleIndex; private int permissionIndex; private int memberRoleIndex; private int relationTypeIndex; private int relationPermissionIndex; private int panelTop; + private int panelContentWidth = PANEL_CONTENT_WIDTH; + private float horizontalScale = 1.0F; private int layoutPadding = PANEL_PADDING; private int tabButtonWidth = TAB_BUTTON_WIDTH; private int controlRowSpacing = CONTROL_ROW_SPACING; @@ -97,6 +106,7 @@ public class FactionMainScreen extends Screen { private boolean selectionActive; private ChunkPos selectionAnchor; private final Set selectedChunks = new LinkedHashSet<>(); + private MemberSection selectedMemberSection = MemberSection.MEMBERS; public FactionMainScreen() { super(Component.literal("Faction")); @@ -111,7 +121,8 @@ protected void init() { int y = 42; for (FactionTab tab : FactionTab.values()) { int x = startX + tab.ordinal() * (tabButtonWidth + TAB_BUTTON_GAP); - this.addRenderableWidget(Button.builder(Component.literal(tab.getLabel()), button -> { + String tabLabel = tabButtonWidth < TAB_COMPACT_LABEL_THRESHOLD ? tab.getCompactLabel() : tab.getLabel(); + this.addRenderableWidget(Button.builder(Component.literal(tabLabel), button -> { selectedTab = tab; updateVisibility(); }).bounds(x, y, tabButtonWidth, TAB_BUTTON_HEIGHT).build()); @@ -120,17 +131,17 @@ protected void init() { int controlRowOne = panelTop + CONTROL_TOP_OFFSET; int controlRowTwo = controlRowOne + controlRowSpacing; int controlRowThree = controlRowTwo + controlRowSpacing; - inviteNameField = new EditBox(this.font, panelLeft, controlRowOne, 140, 18, Component.literal("Player name")); + inviteNameField = new EditBox(this.font, panelLeft, controlRowOne, scaledWidth(140), 18, Component.literal("Player name")); inviteNameField.setMaxLength(32); this.addRenderableWidget(inviteNameField); inviteButton = this.addRenderableWidget(Button.builder(Component.literal("Send Invite"), button -> sendInvite()) - .bounds(panelLeft + 150, controlRowOne, 100, 20) + .bounds(panelX(150), controlRowOne, scaledWidth(100), 20) .build()); joinInviteButton = this.addRenderableWidget(Button.builder(Component.literal("Join Faction"), button -> acceptInvite()) - .bounds(panelLeft, controlRowTwo, 110, 20) + .bounds(panelLeft, controlRowTwo, scaledWidth(110), 20) .build()); declineInviteButton = this.addRenderableWidget(Button.builder(Component.literal("Decline"), button -> declineInvite()) - .bounds(panelLeft + 120, controlRowTwo, 80, 20) + .bounds(panelX(120), controlRowTwo, scaledWidth(80), 20) .build()); roleButton = this.addRenderableWidget(Button.builder(Component.literal("Role: " + currentRoleDisplay()), button -> { @@ -139,32 +150,32 @@ protected void init() { roleIndex = (roleIndex + 1) % roleCount; updatePermissionLabels(); } - }).bounds(panelLeft, controlRowOne, 140, 20).build()); + }).bounds(panelLeft, controlRowOne, scaledWidth(140), 20).build()); permissionButton = this.addRenderableWidget(Button.builder(Component.literal("Perm: " + currentPermission().name()), button -> { permissionIndex = (permissionIndex + 1) % FactionPermission.values().length; updatePermissionLabels(); - }).bounds(panelLeft + 150, controlRowOne, 140, 20).build()); + }).bounds(panelX(150), controlRowOne, scaledWidth(140), 20).build()); grantButton = this.addRenderableWidget(Button.builder(Component.literal("Grant"), button -> sendPermission(true)) - .bounds(panelLeft, controlRowTwo, 70, 20) + .bounds(panelLeft, controlRowTwo, scaledWidth(70), 20) .build()); revokeButton = this.addRenderableWidget(Button.builder(Component.literal("Revoke"), button -> sendPermission(false)) - .bounds(panelLeft + 80, controlRowTwo, 70, 20) + .bounds(panelX(80), controlRowTwo, scaledWidth(70), 20) .build()); - roleNameField = new EditBox(this.font, panelLeft, controlRowThree, 140, 18, Component.literal("Role name")); + roleNameField = new EditBox(this.font, panelLeft, controlRowThree, scaledWidth(140), 18, Component.literal("Role name")); roleNameField.setMaxLength(32); this.addRenderableWidget(roleNameField); createRoleButton = this.addRenderableWidget(Button.builder(Component.literal("Create Role"), button -> sendCreateRole()) - .bounds(panelLeft + 150, controlRowThree, 100, 20) + .bounds(panelX(150), controlRowThree, scaledWidth(100), 20) .build()); deleteRoleButton = this.addRenderableWidget(Button.builder(Component.literal("Delete Role"), button -> sendDeleteRole()) - .bounds(panelLeft + 260, controlRowThree, 100, 20) + .bounds(panelX(260), controlRowThree, scaledWidth(100), 20) .build()); - memberNameField = new EditBox(this.font, panelLeft, controlRowOne, 140, 18, Component.literal("Member name")); + memberNameField = new EditBox(this.font, panelLeft, controlRowOne, scaledWidth(140), 18, Component.literal("Member name")); memberNameField.setMaxLength(32); this.addRenderableWidget(memberNameField); kickMemberButton = this.addRenderableWidget(Button.builder(Component.literal("Kick"), button -> sendMemberAction()) - .bounds(panelLeft + 150, controlRowOne, 60, 20) + .bounds(panelX(150), controlRowOne, scaledWidth(60), 20) .build()); memberRoleButton = this.addRenderableWidget(Button.builder(Component.literal("Role: " + currentMemberRoleDisplay()), button -> { int roleCount = getRoleOptions().size(); @@ -172,34 +183,34 @@ protected void init() { memberRoleIndex = (memberRoleIndex + 1) % roleCount; updateMemberRoleLabel(); } - }).bounds(panelLeft + 215, controlRowOne, 90, 20).build()); + }).bounds(panelX(215), controlRowOne, scaledWidth(90), 20).build()); setRoleButton = this.addRenderableWidget(Button.builder(Component.literal("Set Role"), button -> sendMemberRole()) - .bounds(panelLeft + 310, controlRowOne, 70, 20) + .bounds(panelX(310), controlRowOne, scaledWidth(70), 20) .build()); - ruleField = new EditBox(this.font, panelLeft, controlRowOne, 200, 18, Component.literal("New rule")); + ruleField = new EditBox(this.font, panelLeft, controlRowOne, scaledWidth(200), 18, Component.literal("New rule")); ruleField.setMaxLength(120); this.addRenderableWidget(ruleField); addRuleButton = this.addRenderableWidget(Button.builder(Component.literal("Add"), button -> sendAddRule()) - .bounds(panelLeft + 210, controlRowOne, 60, 20) + .bounds(panelX(210), controlRowOne, scaledWidth(60), 20) .build()); removeRuleButton = this.addRenderableWidget(Button.builder(Component.literal("Remove selected"), button -> sendRemoveSelectedRule()) - .bounds(panelLeft, controlRowOne, 130, 20) + .bounds(panelLeft, controlRowOne, scaledWidth(130), 20) .build()); relationTypeButton = this.addRenderableWidget(Button.builder(Component.literal("Relation: " + currentRelation().name()), button -> { relationTypeIndex = (relationTypeIndex + 1) % relationOptions().size(); updateRelationLabels(); - }).bounds(panelLeft, controlRowOne, 140, 20).build()); + }).bounds(panelLeft, controlRowOne, scaledWidth(140), 20).build()); relationPermissionButton = this.addRenderableWidget(Button.builder(Component.literal("Perm: " + currentRelationPermission().name()), button -> { relationPermissionIndex = (relationPermissionIndex + 1) % FactionPermission.values().length; updateRelationLabels(); - }).bounds(panelLeft + 150, controlRowOne, 140, 20).build()); + }).bounds(panelX(150), controlRowOne, scaledWidth(140), 20).build()); relationGrantButton = this.addRenderableWidget(Button.builder(Component.literal("Grant"), button -> sendRelationPermission(true)) - .bounds(panelLeft, controlRowTwo, 70, 20) + .bounds(panelLeft, controlRowTwo, scaledWidth(70), 20) .build()); relationRevokeButton = this.addRenderableWidget(Button.builder(Component.literal("Revoke"), button -> sendRelationPermission(false)) - .bounds(panelLeft + 80, controlRowTwo, 70, 20) + .bounds(panelX(80), controlRowTwo, scaledWidth(70), 20) .build()); int bottomRowY = this.height - layoutPadding - 20; @@ -210,22 +221,31 @@ protected void init() { .bounds(this.width - layoutPadding - 80, bottomRowY, 80, 20) .build()); dynmapSyncButton = this.addRenderableWidget(Button.builder(Component.literal("Sync Dynmap"), button -> sendDynmapSync()) - .bounds(panelLeft, bottomRowY, 110, 20) + .bounds(panelLeft, bottomRowY, scaledWidth(110), 20) .build()); leaveFactionButton = this.addRenderableWidget(Button.builder(Component.literal("Leave Faction"), button -> leaveFaction()) - .bounds(panelLeft, bottomRowY, 110, 20) + .bounds(panelLeft, bottomRowY, scaledWidth(110), 20) .build()); - safeZoneFactionField = new EditBox(this.font, panelLeft, controlRowOne, SAFEZONE_FIELD_WIDTH, 16, + safeZoneFactionField = new EditBox(this.font, panelLeft, controlRowOne, scaledWidth(SAFEZONE_FIELD_WIDTH), 16, Component.literal("Safe zone faction")); safeZoneFactionField.setMaxLength(32); this.addRenderableWidget(safeZoneFactionField); claimTypeButton = this.addRenderableWidget(Button.builder(Component.literal("Claim: " + selectedClaimType.getLabel()), button -> cycleClaimType()) - .bounds(panelLeft + SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP, controlRowOne - 2, 120, 16) + .bounds(panelX(SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP), controlRowOne - 2, scaledWidth(120), 16) .build()); submitClaimsButton = this.addRenderableWidget(Button.builder(Component.literal("✓"), button -> promptClaimConfirm()) - .bounds(panelLeft + SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP + 124, controlRowOne - 2, 16, 16) + .bounds(panelX(SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP + 124), controlRowOne - 2, scaledWidth(16), 16) .build()); + membersSectionButton = this.addRenderableWidget(Button.builder(Component.literal("Members"), button -> { + selectedMemberSection = MemberSection.MEMBERS; + updateVisibility(); + }).bounds(panelLeft, panelTop, MEMBER_SECTION_BUTTON_WIDTH, MEMBER_SECTION_BUTTON_HEIGHT).build()); + invitesSectionButton = this.addRenderableWidget(Button.builder(Component.literal("Invites"), button -> { + selectedMemberSection = MemberSection.INVITES; + updateVisibility(); + }).bounds(panelLeft, panelTop, MEMBER_SECTION_BUTTON_WIDTH, MEMBER_SECTION_BUTTON_HEIGHT).build()); + layoutMemberSectionButtons(); updateVisibility(); FactionClientData.requestUpdate(); @@ -302,8 +322,7 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia } int contentStart = getContentStart(snapshot); switch (selectedTab) { - case MEMBERS -> renderMembers(guiGraphics, snapshot.members(), contentStart); - case INVITES -> renderInvites(guiGraphics, snapshot, contentStart); + case MEMBERS -> renderMembers(guiGraphics, snapshot, contentStart); case PERMISSIONS -> renderPermissions(guiGraphics, snapshot.permissions(), contentStart); case RULES -> renderRules(guiGraphics, snapshot.rules(), contentStart); case RELATIONS -> renderRelations(guiGraphics, snapshot.relations(), snapshot.relationPermissions(), contentStart); @@ -457,39 +476,43 @@ public void onClose() { } private void updateVisibility() { - boolean invites = selectedTab == FactionTab.INVITES; + boolean membersTab = selectedTab == FactionTab.MEMBERS; + boolean invites = membersTab && selectedMemberSection == MemberSection.INVITES; boolean permissions = selectedTab == FactionTab.PERMISSIONS; - boolean members = selectedTab == FactionTab.MEMBERS; + boolean members = membersTab && selectedMemberSection == MemberSection.MEMBERS; boolean rules = selectedTab == FactionTab.RULES; boolean relations = selectedTab == FactionTab.RELATIONS; - inviteNameField.setVisible(invites); - inviteButton.visible = invites; - joinInviteButton.visible = invites; - declineInviteButton.visible = invites; - dynmapSyncButton.visible = selectedTab == FactionTab.FACTION_MAP; - roleButton.visible = permissions; - permissionButton.visible = permissions; - grantButton.visible = permissions; - revokeButton.visible = permissions; - roleNameField.setVisible(permissions); - createRoleButton.visible = permissions; - deleteRoleButton.visible = permissions; - memberNameField.setVisible(members); - kickMemberButton.visible = members; - memberRoleButton.visible = members; - setRoleButton.visible = members; - ruleField.setVisible(rules); - addRuleButton.visible = rules; - removeRuleButton.visible = rules; - relationTypeButton.visible = relations; - relationPermissionButton.visible = relations; - relationGrantButton.visible = relations; - relationRevokeButton.visible = relations; - leaveFactionButton.visible = members; + setEditBoxVisible(inviteNameField, invites); + setButtonVisible(inviteButton, invites); + setButtonVisible(joinInviteButton, invites); + setButtonVisible(declineInviteButton, invites); + setButtonVisible(dynmapSyncButton, selectedTab == FactionTab.FACTION_MAP); + setButtonVisible(roleButton, permissions); + setButtonVisible(permissionButton, permissions); + setButtonVisible(grantButton, permissions); + setButtonVisible(revokeButton, permissions); + setEditBoxVisible(roleNameField, permissions); + setButtonVisible(createRoleButton, permissions); + setButtonVisible(deleteRoleButton, permissions); + setEditBoxVisible(memberNameField, members); + setButtonVisible(kickMemberButton, members); + setButtonVisible(memberRoleButton, members); + setButtonVisible(setRoleButton, members); + setEditBoxVisible(ruleField, rules); + setButtonVisible(addRuleButton, rules); + setButtonVisible(removeRuleButton, rules); + setButtonVisible(relationTypeButton, relations); + setButtonVisible(relationPermissionButton, relations); + setButtonVisible(relationGrantButton, relations); + setButtonVisible(relationRevokeButton, relations); + setButtonVisible(leaveFactionButton, membersTab); + setButtonVisible(membersSectionButton, membersTab); + setButtonVisible(invitesSectionButton, membersTab); + updateMemberSectionButtonState(); boolean mapTab = selectedTab == FactionTab.FACTION_MAP; - claimTypeButton.visible = mapTab; - submitClaimsButton.visible = mapTab; - safeZoneFactionField.setVisible(mapTab && selectedClaimType == ClaimType.SAFEZONE && isOperator()); + setButtonVisible(claimTypeButton, mapTab); + setButtonVisible(submitClaimsButton, mapTab); + setEditBoxVisible(safeZoneFactionField, mapTab && selectedClaimType == ClaimType.SAFEZONE && isOperator()); if (!mapTab) { selectionActive = false; selectionAnchor = null; @@ -509,44 +532,83 @@ private void updateVisibility() { } private void updateDynamicVisibility(FactionClientData.FactionSnapshot snapshot) { - boolean invites = selectedTab == FactionTab.INVITES; + boolean invites = selectedTab == FactionTab.MEMBERS && selectedMemberSection == MemberSection.INVITES; boolean inFaction = snapshot.inFaction(); updateRoleIndices(snapshot); - inviteNameField.setVisible(invites && inFaction); - inviteButton.visible = invites && inFaction; + setEditBoxVisible(inviteNameField, invites && inFaction); + setButtonVisible(inviteButton, invites && inFaction); boolean hasInvite = invites && !snapshot.pendingInviteFaction().isEmpty() && !snapshot.inFaction(); - joinInviteButton.visible = hasInvite; - declineInviteButton.visible = hasInvite; + setButtonVisible(joinInviteButton, hasInvite); + setButtonVisible(declineInviteButton, hasInvite); boolean permissions = selectedTab == FactionTab.PERMISSIONS; - roleButton.visible = permissions && inFaction; - permissionButton.visible = permissions && inFaction; - grantButton.visible = permissions && inFaction; - revokeButton.visible = permissions && inFaction; - roleNameField.setVisible(permissions && inFaction); - createRoleButton.visible = permissions && inFaction; - deleteRoleButton.visible = permissions && inFaction; + setButtonVisible(roleButton, permissions && inFaction); + setButtonVisible(permissionButton, permissions && inFaction); + setButtonVisible(grantButton, permissions && inFaction); + setButtonVisible(revokeButton, permissions && inFaction); + setEditBoxVisible(roleNameField, permissions && inFaction); + setButtonVisible(createRoleButton, permissions && inFaction); + setButtonVisible(deleteRoleButton, permissions && inFaction); if (permissions && inFaction) { roleButton.setMessage(Component.literal("Role: " + currentRoleDisplay())); permissionButton.setMessage(Component.literal("Perm: " + currentPermission().name())); } - boolean members = selectedTab == FactionTab.MEMBERS; - memberNameField.setVisible(members && inFaction); - kickMemberButton.visible = members && inFaction; - memberRoleButton.visible = members && inFaction; - setRoleButton.visible = members && inFaction; + boolean members = selectedTab == FactionTab.MEMBERS && selectedMemberSection == MemberSection.MEMBERS; + setEditBoxVisible(memberNameField, members && inFaction); + setButtonVisible(kickMemberButton, members && inFaction); + setButtonVisible(memberRoleButton, members && inFaction); + setButtonVisible(setRoleButton, members && inFaction); if (members && inFaction) { memberRoleButton.setMessage(Component.literal("Role: " + currentMemberRoleDisplay())); } - leaveFactionButton.visible = members && inFaction; + setButtonVisible(leaveFactionButton, members && inFaction); boolean rules = selectedTab == FactionTab.RULES; - ruleField.setVisible(rules && inFaction); - addRuleButton.visible = rules && inFaction; - removeRuleButton.visible = rules && inFaction && selectedRuleIndex >= 0; + setEditBoxVisible(ruleField, rules && inFaction); + setButtonVisible(addRuleButton, rules && inFaction); + setButtonVisible(removeRuleButton, rules && inFaction && selectedRuleIndex >= 0); boolean relations = selectedTab == FactionTab.RELATIONS; - relationTypeButton.visible = relations && inFaction; - relationPermissionButton.visible = relations && inFaction; - relationGrantButton.visible = relations && inFaction; - relationRevokeButton.visible = relations && inFaction; + setButtonVisible(relationTypeButton, relations && inFaction); + setButtonVisible(relationPermissionButton, relations && inFaction); + setButtonVisible(relationGrantButton, relations && inFaction); + setButtonVisible(relationRevokeButton, relations && inFaction); + } + + private void layoutMemberSectionButtons() { + if (membersSectionButton == null || invitesSectionButton == null) { + return; + } + int buttonWidth = scaledWidth(MEMBER_SECTION_BUTTON_WIDTH); + int buttonHeight = MEMBER_SECTION_BUTTON_HEIGHT; + int gap = scaledWidth(MEMBER_SECTION_BUTTON_GAP); + int right = getPanelRight(); + invitesSectionButton.setWidth(buttonWidth); + invitesSectionButton.setHeight(buttonHeight); + invitesSectionButton.setX(right - buttonWidth); + invitesSectionButton.setY(panelTop + CONTROL_TOP_OFFSET + controlRowSpacing + 2); + membersSectionButton.setWidth(buttonWidth); + membersSectionButton.setHeight(buttonHeight); + membersSectionButton.setX(invitesSectionButton.getX() - gap - buttonWidth); + membersSectionButton.setY(invitesSectionButton.getY()); + } + + private void updateMemberSectionButtonState() { + if (membersSectionButton != null) { + membersSectionButton.active = selectedMemberSection != MemberSection.MEMBERS; + } + if (invitesSectionButton != null) { + invitesSectionButton.active = selectedMemberSection != MemberSection.INVITES; + } + } + + private void setButtonVisible(Button button, boolean visible) { + if (button != null) { + button.visible = visible; + } + } + + private void setEditBoxVisible(EditBox field, boolean visible) { + if (field != null) { + field.setVisible(visible); + } } private void updatePermissionLabels() { @@ -878,13 +940,24 @@ private void recalculateLayout() { int tabCount = FactionTab.values().length; int availableWidth = this.width - layoutPadding * 2 - (tabCount - 1) * TAB_BUTTON_GAP; tabButtonWidth = Math.max(MIN_TAB_BUTTON_WIDTH, Math.min(TAB_BUTTON_WIDTH, availableWidth / tabCount)); + panelContentWidth = Math.max(MIN_PANEL_CONTENT_WIDTH, + Math.min(PANEL_CONTENT_WIDTH, this.width - (layoutPadding * 2) - 16)); + horizontalScale = panelContentWidth / (float) PANEL_CONTENT_WIDTH; } private int getPanelLeft() { - int maxLeft = Math.max(layoutPadding, (this.width - PANEL_CONTENT_WIDTH) / 2); + int maxLeft = Math.max(layoutPadding, (this.width - panelContentWidth) / 2); return Math.max(8, maxLeft); } + private int panelX(int baseOffset) { + return getPanelLeft() + Math.round(baseOffset * horizontalScale); + } + + private int scaledWidth(int baseWidth) { + return Math.max(14, Math.round(baseWidth * horizontalScale)); + } + private int getPanelRight() { return this.width - getPanelLeft(); } @@ -933,11 +1006,17 @@ private boolean isOperator() { return Minecraft.getInstance().player.hasPermissions(FactionConfig.SERVER.adminBypassPermissionLevel.get()); } - private void renderMembers(GuiGraphics guiGraphics, List members, int startY) { - guiGraphics.drawString(this.font, "Members:", getPanelLeft(), startY, 0xFFFFFF); - int y = startY + 12; - for (var member : members) { - String roleLabel = getRoleDisplayName(FactionClientData.getSnapshot(), member.role()); + private void renderMembers(GuiGraphics guiGraphics, FactionClientData.FactionSnapshot snapshot, int startY) { + layoutMemberSectionButtons(); + int contentY = startY + MEMBER_SECTION_BUTTON_HEIGHT + 8; + if (selectedMemberSection == MemberSection.INVITES) { + renderInvites(guiGraphics, snapshot, contentY); + return; + } + guiGraphics.drawString(this.font, "Members:", getPanelLeft(), contentY, 0xFFFFFF); + int y = contentY + 12; + for (var member : snapshot.members()) { + String roleLabel = getRoleDisplayName(snapshot, member.role()); guiGraphics.drawString(this.font, member.name() + " - " + roleLabel, getPanelLeft(), y, 0xCCCCCC); y += 10; } @@ -1203,8 +1282,7 @@ private void renderMapCardinalMarkers(GuiGraphics guiGraphics, FactionMapRendere } private int getContentStart(FactionClientData.FactionSnapshot snapshot) { - boolean hasControls = selectedTab == FactionTab.INVITES - || selectedTab == FactionTab.PERMISSIONS + boolean hasControls = selectedTab == FactionTab.PERMISSIONS || (selectedTab == FactionTab.RELATIONS && snapshot.inFaction()) || (selectedTab == FactionTab.MEMBERS && snapshot.inFaction()) || (selectedTab == FactionTab.RULES && snapshot.inFaction()); @@ -1212,6 +1290,9 @@ private int getContentStart(FactionClientData.FactionSnapshot snapshot) { if (selectedTab == FactionTab.PERMISSIONS) { controlOffset += controlRowSpacing; } + if (selectedTab == FactionTab.MEMBERS) { + controlOffset += MEMBER_SECTION_BUTTON_HEIGHT + 8; + } return panelTop + (hasControls ? controlOffset : CONTROL_TOP_OFFSET); } @@ -1243,23 +1324,32 @@ private int getFactionListBottom() { private void updateMapControlLayout() { int controlsY = getMapClaimsBottomRow(); boolean showSafeZoneField = safeZoneFactionField.isVisible(); - int claimBlockWidth = (showSafeZoneField ? SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP : 0) + 120 + CLAIM_CONTROL_GAP + 16; + int safeZoneWidth = scaledWidth(SAFEZONE_FIELD_WIDTH); + int claimTypeWidth = scaledWidth(120); + int submitWidth = scaledWidth(16); + int claimGap = scaledWidth(CLAIM_CONTROL_GAP); + int claimBlockWidth = (showSafeZoneField ? safeZoneWidth + claimGap : 0) + claimTypeWidth + claimGap + submitWidth; int leftLimit = getPanelLeft() + 120; int rightLimit = this.width - layoutPadding - 80 - 8; int claimStart = Math.max(leftLimit, (leftLimit + rightLimit - claimBlockWidth) / 2); if (showSafeZoneField) { safeZoneFactionField.setX(claimStart); - claimTypeButton.setX(claimStart + SAFEZONE_FIELD_WIDTH + CLAIM_CONTROL_GAP); + claimTypeButton.setX(claimStart + safeZoneWidth + claimGap); } else { claimTypeButton.setX(claimStart); - safeZoneFactionField.setX(claimStart - SAFEZONE_FIELD_WIDTH - CLAIM_CONTROL_GAP); + safeZoneFactionField.setX(claimStart - safeZoneWidth - claimGap); } safeZoneFactionField.setY(controlsY); claimTypeButton.setY(controlsY); - submitClaimsButton.setX(claimTypeButton.getX() + 120 + CLAIM_CONTROL_GAP); + submitClaimsButton.setX(claimTypeButton.getX() + claimTypeWidth + claimGap); submitClaimsButton.setY(controlsY); } + private enum MemberSection { + MEMBERS, + INVITES + } + private enum ClaimType { FACTION("Faction"), PERSONAL("Personal"), diff --git a/src/main/java/com/mcprotector/client/gui/FactionMapRenderer.java b/src/main/java/com/mcprotector/client/gui/FactionMapRenderer.java index 60d951d..cb90332 100644 --- a/src/main/java/com/mcprotector/client/gui/FactionMapRenderer.java +++ b/src/main/java/com/mcprotector/client/gui/FactionMapRenderer.java @@ -16,8 +16,8 @@ private FactionMapRenderer() { public static MapRegion buildMapRegion(int startY, int radius, int width, int height, int panelPadding) { int gridSize = radius * 2 + 1; int maxWidth = width - panelPadding * 2; - int maxHeight = height - startY - 40; - int cellSize = Math.max(8, Math.min(22, Math.min(maxWidth / gridSize, maxHeight / gridSize))); + int maxHeight = height - startY - 70; + int cellSize = Math.max(7, Math.min(18, Math.min(maxWidth / gridSize, maxHeight / gridSize))); int mapWidth = cellSize * gridSize; int mapHeight = cellSize * gridSize; int originX = (width - mapWidth) / 2; diff --git a/src/main/java/com/mcprotector/client/gui/FactionTab.java b/src/main/java/com/mcprotector/client/gui/FactionTab.java index abaa237..c7d3099 100644 --- a/src/main/java/com/mcprotector/client/gui/FactionTab.java +++ b/src/main/java/com/mcprotector/client/gui/FactionTab.java @@ -1,21 +1,26 @@ package com.mcprotector.client.gui; public enum FactionTab { - MEMBERS("Members"), - INVITES("Invites"), - PERMISSIONS("Permissions"), - RULES("Rules"), - RELATIONS("Relations"), - FACTION_LIST("Factions"), - FACTION_MAP("Faction Map"); + MEMBERS("Members", "Members"), + PERMISSIONS("Permissions", "Perms"), + RULES("Rules", "Rules"), + RELATIONS("Relations", "Relations"), + FACTION_LIST("Factions", "List"), + FACTION_MAP("Faction Map", "Map"); private final String label; + private final String compactLabel; - FactionTab(String label) { + FactionTab(String label, String compactLabel) { this.label = label; + this.compactLabel = compactLabel; } public String getLabel() { return label; } + + public String getCompactLabel() { + return compactLabel; + } }