]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/keyboard/Key.java
Setup for 1.16.3 Fabric
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / keyboard / Key.java
1 package com.irtimaled.bbor.client.keyboard;
2
3 import net.minecraft.client.util.InputUtil;
4
5 import java.util.HashSet;
6 import java.util.Set;
7
8 public class Key {
9     private int keyCode;
10     private KeyHandler onKeyPress;
11     private final Set<Key> subKeys = new HashSet<>();
12     private boolean triggeredSincePress;
13
14     Key(int keyCode) {
15         this.keyCode = keyCode;
16     }
17
18     public Key onKeyPressHandler(KeyHandler onKeyPress) {
19         this.onKeyPress = onKeyPress;
20         return this;
21     }
22
23     void updateKeyCode(int keyCode) {
24         this.keyCode = keyCode;
25     }
26
27     private int pressDuration = 0;
28
29     private void runHandler(KeyHandler onKeyPress) {
30         triggeredSincePress = true;
31         onKeyPress.handle();
32     }
33
34     private void press() {
35         for (Key subKey : subKeys) {
36             subKey.triggeredSincePress = false;
37         }
38         triggeredSincePress = false;
39         pressDuration++;
40     }
41
42     private void release() {
43         try {
44             for (Key subKey : subKeys) {
45                 if (subKey.pressDuration > 0) {
46                     subKey.release();
47                     return;
48                 }
49                 if (subKey.triggeredSincePress) {
50                     return;
51                 }
52             }
53             if (onKeyPress != null && pressDuration > 0) {
54                 runHandler(onKeyPress);
55             }
56         } finally {
57             pressDuration = 0;
58         }
59     }
60
61     boolean handleKeyEvent(int keyCode, boolean isPressed) {
62         if (this.keyCode == keyCode) {
63             if (isPressed) {
64                 press();
65             } else {
66                 release();
67             }
68             return true;
69         } else if (this.pressDuration > 0) {
70             for (Key subKey : subKeys) {
71                 if (subKey.handleKeyEvent(keyCode, isPressed)) {
72                     return true;
73                 }
74             }
75         }
76
77         return false;
78     }
79
80     public Key register(String keyName) {
81         InputUtil.Key input = InputUtil.fromTranslationKey(keyName);
82         Key key = new Key(input.getCode());
83         subKeys.add(key);
84         return key;
85     }
86 }