Skip to content

Commit 73b7c65

Browse files
committed
Allow switching button anchor side, close #56
1 parent 26b4a4a commit 73b7c65

12 files changed

Lines changed: 76 additions & 24 deletions

File tree

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## 2.1.3
44

55
- Improved compatibility with Accessories mod
6+
- Added an option to anchor buttons to the left side of the inventory
67

78
## 2.1.2
89

common/src/main/java/dev/terminalmc/clientsort/client/config/Config.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ public enum ExtraSlotScope {
231231
public static final boolean showButtonsDefault = true;
232232
public boolean showButtons = showButtonsDefault;
233233

234+
public static final boolean anchorButtonsLeftDefault = false;
235+
public boolean anchorButtonsLeft = anchorButtonsLeftDefault;
236+
234237
private static Operation validateUniqueOp(
235238
@Nullable Operation val,
236239
@Nullable Operation... others

common/src/main/java/dev/terminalmc/clientsort/client/gui/TriggerButtonManager.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import dev.terminalmc.clientsort.client.inventory.helper.ContainerScreenHelper;
3030
import dev.terminalmc.clientsort.client.util.KeybindManager;
3131
import dev.terminalmc.clientsort.client.util.PolicyManager;
32+
import dev.terminalmc.clientsort.mixin.client.accessor.AbstractContainerScreenAccessor;
3233
import dev.terminalmc.clientsort.mixin.client.accessor.ScreenAccessor;
3334
import net.minecraft.client.Minecraft;
3435
import net.minecraft.client.gui.screens.Screen;
@@ -136,22 +137,24 @@ public static void afterScreenInit(Screen initScreen) {
136137
isEditorP = true;
137138
}
138139

140+
boolean left = options().anchorButtonsLeft;
141+
139142
// Generate container-side buttons
140-
Slot refSlotC = getReferenceSlot(acs, false);
143+
Slot refSlotC = getReferenceSlot(acs, false, left);
141144
if (refSlotC != null) {
142-
generate(acs, refSlotC, false, isEditorC, enabled, options().firstButtonOp);
143-
generate(acs, refSlotC, false, isEditorC, enabled, options().secondButtonOp);
144-
generate(acs, refSlotC, false, isEditorC, enabled, options().thirdButtonOp);
145-
generate(acs, refSlotC, false, isEditorC, enabled, options().fourthButtonOp);
145+
generate(acs, refSlotC, left, false, isEditorC, enabled, options().firstButtonOp);
146+
generate(acs, refSlotC, left, false, isEditorC, enabled, options().secondButtonOp);
147+
generate(acs, refSlotC, left, false, isEditorC, enabled, options().thirdButtonOp);
148+
generate(acs, refSlotC, left, false, isEditorC, enabled, options().fourthButtonOp);
146149
}
147150

148151
// Generate player-side buttons
149-
Slot refSlotP = getReferenceSlot(acs, true);
152+
Slot refSlotP = getReferenceSlot(acs, true, left);
150153
if (refSlotP != null) {
151-
generate(acs, refSlotP, true, isEditorP, enabled, options().firstButtonOp);
152-
generate(acs, refSlotP, true, isEditorP, enabled, options().secondButtonOp);
153-
generate(acs, refSlotP, true, isEditorP, enabled, options().thirdButtonOp);
154-
generate(acs, refSlotP, true, isEditorP, enabled, options().fourthButtonOp);
154+
generate(acs, refSlotP, left, true, isEditorP, enabled, options().firstButtonOp);
155+
generate(acs, refSlotP, left, true, isEditorP, enabled, options().secondButtonOp);
156+
generate(acs, refSlotP, left, true, isEditorP, enabled, options().thirdButtonOp);
157+
generate(acs, refSlotP, left, true, isEditorP, enabled, options().fourthButtonOp);
155158
}
156159
}
157160

@@ -161,7 +164,8 @@ public static void afterScreenInit(Screen initScreen) {
161164
*/
162165
private static void generate(
163166
AbstractContainerScreen<?> screen,
164-
Slot refSlot,
167+
Slot referenceSlot,
168+
boolean referenceLeft,
165169
boolean isPlayerInv,
166170
boolean isEditor,
167171
boolean enabled,
@@ -170,7 +174,8 @@ private static void generate(
170174
switch (op) {
171175
case SORT -> generateSimpleButton(
172176
screen,
173-
refSlot,
177+
referenceSlot,
178+
referenceLeft,
174179
isPlayerInv,
175180
isEditor,
176181
enabled,
@@ -182,7 +187,8 @@ private static void generate(
182187
);
183188
case STACK_FILL -> generateDirectionalButton(
184189
screen,
185-
refSlot,
190+
referenceSlot,
191+
referenceLeft,
186192
isPlayerInv,
187193
isEditor,
188194
enabled,
@@ -194,7 +200,8 @@ private static void generate(
194200
);
195201
case MATCH_TRANSFER -> generateDirectionalButton(
196202
screen,
197-
refSlot,
203+
referenceSlot,
204+
referenceLeft,
198205
isPlayerInv,
199206
isEditor,
200207
enabled,
@@ -206,7 +213,8 @@ private static void generate(
206213
);
207214
case TRANSFER -> generateDirectionalButton(
208215
screen,
209-
refSlot,
216+
referenceSlot,
217+
referenceLeft,
210218
isPlayerInv,
211219
isEditor,
212220
enabled,
@@ -222,6 +230,7 @@ private static void generate(
222230
private static void generateSimpleButton(
223231
AbstractContainerScreen<?> screen,
224232
Slot referenceSlot,
233+
boolean referenceLeft,
225234
boolean isPlayerInv,
226235
boolean isEditor,
227236
boolean enabled,
@@ -275,6 +284,7 @@ private static void generateSimpleButton(
275284
screen,
276285
container,
277286
referenceSlot,
287+
referenceLeft,
278288
isPlayerInv,
279289
policy,
280290
object.getClass().getName(),
@@ -304,6 +314,7 @@ private static void generateSimpleButton(
304314
private static void generateDirectionalButton(
305315
AbstractContainerScreen<?> screen,
306316
Slot referenceSlot,
317+
boolean referenceLeft,
307318
boolean isPlayerInv,
308319
boolean isEditor,
309320
boolean enabled,
@@ -381,6 +392,7 @@ private static void generateDirectionalButton(
381392
screen,
382393
container,
383394
referenceSlot,
395+
referenceLeft,
384396
isPlayerInv,
385397
policy,
386398
object.getClass().getName(),
@@ -452,7 +464,8 @@ public ScoredContainer(Container container, int score) {
452464
*/
453465
private static @Nullable Slot getReferenceSlot(
454466
AbstractContainerScreen<?> screen,
455-
boolean isPlayerInv
467+
boolean isPlayerInv,
468+
boolean anchorButtonsLeft
456469
) {
457470
ContainerScreenHelper<?> helper = ContainerScreenHelper.of(screen);
458471
Slot bestSlot = null;
@@ -461,8 +474,13 @@ public ScoredContainer(Container container, int score) {
461474
Scope scope = isPlayerInv ? Scope.PLAYER_INV : Scope.CONTAINER_INV;
462475
for (Slot slot : helper.getLargestSlotGroup(scope)) {
463476
// Calculate the weighted positional score
464-
double x = Math.clamp(slot.x, 0, screen.width)
465-
/ (double) screen.width;
477+
double x;
478+
if (anchorButtonsLeft) {
479+
x = Math.clamp(slot.x, 0, screen.width) / (double) screen.width;
480+
} else {
481+
x = ((AbstractContainerScreenAccessor) screen).clientsort$getImageWidth()
482+
- Math.clamp(slot.x, 0, screen.width) / (double) screen.width;
483+
}
466484
double y = (screen.height - Math.clamp(slot.y, 0, screen.height))
467485
/ (double) screen.height;
468486
double score = x * 0.8D + y * 0.2D;
@@ -497,6 +515,7 @@ TriggerButton create(
497515
AbstractContainerScreen<?> screen,
498516
Container container,
499517
Slot referenceSlot,
518+
boolean referenceLeft,
500519
boolean isPlayerInv,
501520
@Nullable ClassPolicy policy,
502521
String lowestPolicyKey,

common/src/main/java/dev/terminalmc/clientsort/client/gui/screen/config/ClothScreenProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,15 @@ else if (val > Config.Options.SOUND_VOLUME_MAX)
512512
.setSaveConsumer(val -> options.showButtons = val)
513513
.build());
514514

515+
buttons.addEntry(eb.startBooleanToggle(
516+
localized("option", "anchorButtonsLeft"),
517+
options.anchorButtonsLeft
518+
)
519+
.setTooltip(localized("option", "anchorButtonsLeft.tooltip"))
520+
.setDefaultValue(Config.Options.anchorButtonsLeftDefault)
521+
.setSaveConsumer(val -> options.anchorButtonsLeft = val)
522+
.build());
523+
515524
firstSelector = eb.startEnumSelector(
516525
localized("option", "firstButtonOp"),
517526
Operation.class,

common/src/main/java/dev/terminalmc/clientsort/client/gui/widget/MatchTransferButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public MatchTransferButton(
6262
AbstractContainerScreen<?> screen,
6363
Container container,
6464
Slot referenceSlot,
65+
boolean referenceLeft,
6566
boolean isPlayerInv,
6667
@Nullable ClassPolicy policy,
6768
String lowestPolicyKey,
@@ -72,6 +73,7 @@ public MatchTransferButton(
7273
screen,
7374
container,
7475
referenceSlot,
76+
referenceLeft,
7577
isPlayerInv,
7678
isPlayerInv ? SPRITES_UP : SPRITES_DOWN,
7779
name,

common/src/main/java/dev/terminalmc/clientsort/client/gui/widget/SortButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public SortButton(
4747
AbstractContainerScreen<?> screen,
4848
Container container,
4949
Slot referenceSlot,
50+
boolean referenceLeft,
5051
boolean isPlayerInv,
5152
@Nullable ClassPolicy policy,
5253
String lowestPolicyKey,
@@ -57,6 +58,7 @@ public SortButton(
5758
screen,
5859
container,
5960
referenceSlot,
61+
referenceLeft,
6062
isPlayerInv,
6163
SPRITES,
6264
name,

common/src/main/java/dev/terminalmc/clientsort/client/gui/widget/StackFillButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public StackFillButton(
6262
AbstractContainerScreen<?> screen,
6363
Container container,
6464
Slot referenceSlot,
65+
boolean referenceLeft,
6566
boolean isPlayerInv,
6667
@Nullable ClassPolicy policy,
6768
String lowestPolicyKey,
@@ -72,6 +73,7 @@ public StackFillButton(
7273
screen,
7374
container,
7475
referenceSlot,
76+
referenceLeft,
7577
isPlayerInv,
7678
isPlayerInv ? SPRITES_UP : SPRITES_DOWN,
7779
name,

common/src/main/java/dev/terminalmc/clientsort/client/gui/widget/TransferButton.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public TransferButton(
5959
AbstractContainerScreen<?> screen,
6060
Container container,
6161
Slot referenceSlot,
62+
boolean referenceLeft,
6263
boolean isPlayerInv,
6364
@Nullable ClassPolicy policy,
6465
String lowestPolicyKey,
@@ -69,6 +70,7 @@ public TransferButton(
6970
screen,
7071
container,
7172
referenceSlot,
73+
referenceLeft,
7274
isPlayerInv,
7375
isPlayerInv ? SPRITES_UP : SPRITES_DOWN,
7476
name,

common/src/main/java/dev/terminalmc/clientsort/client/gui/widget/TriggerButton.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public abstract class TriggerButton extends Button {
5757
private final AbstractContainerScreen<?> screen;
5858
public final Container container;
5959
public final Slot referenceSlot;
60+
public final boolean referenceLeft;
6061
public final boolean isPlayerInv;
6162

6263
private final WidgetSprites sprites;
@@ -72,6 +73,7 @@ protected TriggerButton(
7273
AbstractContainerScreen<?> screen,
7374
Container container,
7475
Slot referenceSlot,
76+
boolean referenceLeft,
7577
boolean isPlayerInv,
7678
WidgetSprites sprites,
7779
Component name,
@@ -98,6 +100,7 @@ protected TriggerButton(
98100
this.screen = screen;
99101
this.container = container;
100102
this.referenceSlot = referenceSlot;
103+
this.referenceLeft = referenceLeft;
101104
this.isPlayerInv = isPlayerInv;
102105
this.sprites = sprites;
103106
this.offset = offset;
@@ -158,11 +161,7 @@ public void renderWidget(
158161
AbstractContainerScreenAccessor acs = (AbstractContainerScreenAccessor) screen;
159162

160163
// Keep visible
161-
int newX = Math.clamp(
162-
acs.clientsort$getLeftPos() + acs.clientsort$getImageWidth() + offset.x(),
163-
0,
164-
screen.width - WIDTH
165-
);
164+
int newX = Math.clamp(getAnchorSideX(acs) + offset.x(), 0, screen.width - WIDTH);
166165
int newY = Math.clamp(
167166
acs.clientsort$getTopPos() + Math.max(0, referenceSlot.y) + offset.y(),
168167
0,
@@ -212,7 +211,7 @@ protected void onDrag(double mouseX, double mouseY, double dragX, double dragY)
212211
int newY = Math.clamp((int) mouseY - HALF_HEIGHT, 0, screen.height - HEIGHT);
213212

214213
offset = new Vec2i(
215-
newX - (acs.clientsort$getLeftPos() + acs.clientsort$getImageWidth()),
214+
newX - getAnchorSideX(acs),
216215
newY - (acs.clientsort$getTopPos()
217216
+ Math.clamp(referenceSlot.y, 0, screen.height))
218217
);
@@ -246,4 +245,11 @@ public abstract void savePolicy(
246245
boolean autoOpOther,
247246
Collection<Integer> slots
248247
);
248+
249+
private int getAnchorSideX(AbstractContainerScreenAccessor acs) {
250+
int anchorSideX = acs.clientsort$getLeftPos();
251+
if (!referenceLeft)
252+
anchorSideX += acs.clientsort$getImageWidth();
253+
return anchorSideX;
254+
}
249255
}

common/src/main/resources/assets/clientsort/lang/en_us.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@
133133
"option.clientsort.buttons": "Buttons",
134134
"option.clientsort.showButtons": "Show Buttons",
135135
"option.clientsort.showButtons.tooltip": "Whether to show extra buttons on the GUI for inventory operations.",
136+
"option.clientsort.anchorButtonsLeft": "Anchor Left",
137+
"option.clientsort.anchorButtonsLeft.tooltip": "Whether to anchor the buttons to the left side of the inventory.",
136138
"option.clientsort.firstButtonOp": "First Button Operation",
137139
"option.clientsort.secondButtonOp": "Second Button Operation",
138140
"option.clientsort.thirdButtonOp": "Third Button Operation",

0 commit comments

Comments
 (0)