Skip to content

Commit 4f3debe

Browse files
authored
Rich text (#76)
* rich text & a bunch of tweaks * find hovering element in rich text * rich tooltip * split GuiContext * fix overlay context * fix & break mouse pos, i havent decided yet * rich text widget with hoverable & interactable * minor changes & fixes, i dont event know anymore * fix space at start of line * improvements, fixes, comments, javadoc
1 parent a670dd3 commit 4f3debe

File tree

89 files changed

+2863
-808
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+2863
-808
lines changed

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ ij_visual_guides =
1515
ij_wrap_on_typing = false
1616

1717
[*.java]
18-
max_line_length = 150
18+
max_line_length = 140
1919
ij_java_align_consecutive_assignments = false
2020
ij_java_align_consecutive_variable_declarations = false
2121
ij_java_align_group_field_declarations = false

src/main/java/com/cleanroommc/modularui/ModularUIConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.cleanroommc.modularui;
22

3-
import com.cleanroommc.modularui.screen.Tooltip;
3+
import com.cleanroommc.modularui.screen.RichTooltip;
44

55
import net.minecraftforge.common.config.Config;
66
import net.minecraftforge.fml.relauncher.FMLLaunchHandler;
@@ -20,7 +20,7 @@ public class ModularUIConfig {
2020

2121
// Default direction
2222
@Config.Comment("Default tooltip position around the widget or its panel.")
23-
public static Tooltip.Pos tooltipPos = Tooltip.Pos.VERTICAL;
23+
public static RichTooltip.Pos tooltipPos = RichTooltip.Pos.VERTICAL;
2424

2525
@Config.Comment("If true, widget outlines and widget information will be drawn.")
2626
public static boolean guiDebugMode = FMLLaunchHandler.isDeobfuscatedEnvironment();

src/main/java/com/cleanroommc/modularui/api/IMuiScreen.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.cleanroommc.modularui.screen.ClientScreenHandler;
55
import com.cleanroommc.modularui.screen.ModularScreen;
66

7+
import com.cleanroommc.modularui.screen.viewport.ModularGuiContext;
78
import net.minecraft.client.gui.GuiScreen;
89
import net.minecraft.client.gui.inventory.GuiContainer;
910
import net.minecraft.inventory.Slot;
@@ -82,7 +83,7 @@ default boolean isGuiContainer() {
8283
}
8384

8485
/**
85-
* Hovering widget is handled by {@link com.cleanroommc.modularui.screen.viewport.GuiContext}.
86+
* Hovering widget is handled by {@link ModularGuiContext}.
8687
* If it detects a slot, this method is called. Only affects {@link GuiContainer GuiContainers}.
8788
*
8889
* @param slot hovered slot

src/main/java/com/cleanroommc/modularui/api/ITheme.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.cleanroommc.modularui.api;
22

3-
import com.cleanroommc.modularui.screen.Tooltip;
3+
import com.cleanroommc.modularui.screen.RichTooltip;
44
import com.cleanroommc.modularui.theme.WidgetSlotTheme;
55
import com.cleanroommc.modularui.theme.WidgetTextFieldTheme;
66
import com.cleanroommc.modularui.theme.WidgetTheme;
@@ -64,5 +64,5 @@ default <T extends WidgetTheme> T getWidgetTheme(Class<T> clazz, String id) {
6464

6565
boolean getSmoothProgressBarOverride();
6666

67-
Tooltip.Pos getTooltipPosOverride();
67+
RichTooltip.Pos getTooltipPosOverride();
6868
}

src/main/java/com/cleanroommc/modularui/api/MCHelper.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22

33
import net.minecraft.client.Minecraft;
44
import net.minecraft.client.entity.EntityPlayerSP;
5+
import net.minecraft.client.gui.FontRenderer;
56
import net.minecraft.client.gui.GuiScreen;
7+
import net.minecraft.client.util.ITooltipFlag;
8+
import net.minecraft.item.ItemStack;
9+
import net.minecraft.util.text.TextFormatting;
10+
11+
import java.util.Collections;
12+
import java.util.List;
613

714
public class MCHelper {
815

@@ -45,4 +52,23 @@ public static GuiScreen getCurrentScreen() {
4552
Minecraft mc = getMc();
4653
return mc != null ? mc.currentScreen : null;
4754
}
55+
56+
public static FontRenderer getFontRenderer() {
57+
if (hasMc()) return getMc().fontRenderer;
58+
return null;
59+
}
60+
61+
public static List<String> getItemToolTip(ItemStack item) {
62+
if (!hasMc()) return Collections.emptyList();
63+
if (getMc().currentScreen != null) return getMc().currentScreen.getItemToolTip(item);
64+
List<String> list = item.getTooltip(getPlayer(), getMc().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL);
65+
for (int i = 0; i < list.size(); ++i) {
66+
if (i == 0) {
67+
list.set(i, item.getItem().getForgeRarity(item).getColor() + list.get(i));
68+
} else {
69+
list.set(i, TextFormatting.GRAY + list.get(i));
70+
}
71+
}
72+
return list;
73+
}
4874
}

src/main/java/com/cleanroommc/modularui/api/drawable/IDrawable.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.cleanroommc.modularui.drawable.DrawableArray;
44
import com.cleanroommc.modularui.drawable.Icon;
55
import com.cleanroommc.modularui.screen.viewport.GuiContext;
6+
import com.cleanroommc.modularui.screen.viewport.ModularGuiContext;
67
import com.cleanroommc.modularui.theme.WidgetTheme;
78
import com.cleanroommc.modularui.widget.Widget;
89
import com.cleanroommc.modularui.widget.sizer.Area;
@@ -171,7 +172,7 @@ public DrawableWidget(IDrawable drawable) {
171172

172173
@SideOnly(Side.CLIENT)
173174
@Override
174-
public void draw(GuiContext context, WidgetTheme widgetTheme) {
175+
public void draw(ModularGuiContext context, WidgetTheme widgetTheme) {
175176
this.drawable.drawAtZero(context, getArea(), widgetTheme);
176177
}
177178
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.cleanroommc.modularui.api.drawable;
2+
3+
import com.cleanroommc.modularui.screen.RichTooltip;
4+
5+
import com.cleanroommc.modularui.widget.sizer.Area;
6+
7+
import org.jetbrains.annotations.ApiStatus;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
public interface IHoverable extends IIcon {
11+
12+
/**
13+
* Called every frame this hoverable is hovered inside a {@link com.cleanroommc.modularui.drawable.text.RichText}.
14+
*/
15+
default void onHover() {}
16+
17+
@Nullable
18+
default RichTooltip getTooltip() {
19+
return null;
20+
}
21+
22+
void setRenderedAt(int x, int y);
23+
24+
Area getRenderedArea();
25+
}

src/main/java/com/cleanroommc/modularui/api/drawable/IIcon.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.cleanroommc.modularui.api.drawable;
22

3+
import com.cleanroommc.modularui.drawable.HoverableIcon;
4+
import com.cleanroommc.modularui.drawable.InteractableIcon;
35
import com.cleanroommc.modularui.widget.sizer.Box;
46

57
/**
@@ -22,5 +24,13 @@ public interface IIcon extends IDrawable {
2224
*/
2325
Box getMargin();
2426

27+
default HoverableIcon asHoverable() {
28+
return new HoverableIcon(this);
29+
}
30+
31+
default InteractableIcon asInteractable() {
32+
return new InteractableIcon(this);
33+
}
34+
2535
IIcon EMPTY_2PX = EMPTY.asIcon().height(2);
2636
}

src/main/java/com/cleanroommc/modularui/api/drawable/IKey.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package com.cleanroommc.modularui.api.drawable;
22

3-
import com.cleanroommc.modularui.drawable.AnimatedText;
4-
import com.cleanroommc.modularui.drawable.StyledText;
5-
import com.cleanroommc.modularui.drawable.TextRenderer;
6-
import com.cleanroommc.modularui.drawable.keys.CompoundKey;
7-
import com.cleanroommc.modularui.drawable.keys.DynamicKey;
8-
import com.cleanroommc.modularui.drawable.keys.LangKey;
9-
import com.cleanroommc.modularui.drawable.keys.StringKey;
3+
import com.cleanroommc.modularui.drawable.Icon;
4+
import com.cleanroommc.modularui.drawable.text.*;
105
import com.cleanroommc.modularui.screen.viewport.GuiContext;
116
import com.cleanroommc.modularui.theme.WidgetTheme;
127
import com.cleanroommc.modularui.utils.Alignment;
138
import com.cleanroommc.modularui.utils.JsonHelper;
149
import com.cleanroommc.modularui.widgets.TextWidget;
1510

11+
import net.minecraft.util.text.TextFormatting;
1612
import net.minecraftforge.fml.relauncher.Side;
1713
import net.minecraftforge.fml.relauncher.SideOnly;
1814

@@ -31,7 +27,9 @@ public interface IKey extends IDrawable {
3127

3228
TextRenderer renderer = new TextRenderer();
3329

34-
IKey EMPTY = new StringKey("");
30+
IKey EMPTY = str("");
31+
IKey LINE_FEED = str("\n");
32+
IKey SPACE = str(" ");
3533

3634
/**
3735
* Creates a translated text.
@@ -104,10 +102,18 @@ static IKey str(@NotNull String key) {
104102
* @param args arguments
105103
* @return text key
106104
*/
107-
static IKey format(@NotNull String key, @Nullable Object... args) {
105+
static IKey str(@NotNull String key, @Nullable Object... args) {
108106
return new StringKey(key, args);
109107
}
110108

109+
/**
110+
* @deprecated renamed to str()
111+
*/
112+
@Deprecated
113+
static IKey format(@NotNull String key, @Nullable Object... args) {
114+
return str(key, args);
115+
}
116+
111117
/**
112118
* Creates a composed text key.
113119
*
@@ -129,10 +135,17 @@ static IKey dynamic(@NotNull Supplier<String> getter) {
129135
}
130136

131137
/**
132-
* @return the current formatted string
138+
* @return the current unformatted string
133139
*/
134140
String get();
135141

142+
/**
143+
* @return the current formatted string
144+
*/
145+
default String getFormatted() {
146+
return get();
147+
}
148+
136149
@SideOnly(Side.CLIENT)
137150
@Override
138151
default void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) {
@@ -141,7 +154,7 @@ default void draw(GuiContext context, int x, int y, int width, int height, Widge
141154
renderer.setAlignment(Alignment.Center, width, height);
142155
renderer.setScale(1f);
143156
renderer.setPos(x, y);
144-
renderer.draw(get());
157+
renderer.draw(getFormatted());
145158
}
146159

147160
@Override
@@ -157,6 +170,13 @@ default AnimatedText withAnimation() {
157170
return new AnimatedText(this);
158171
}
159172

173+
IKey format(TextFormatting formatting);
174+
175+
default IKey format(TextFormatting... formatting) {
176+
for (TextFormatting tf : formatting) format(tf);
177+
return this;
178+
}
179+
160180
default StyledText alignment(Alignment alignment) {
161181
return withStyle().alignment(alignment);
162182
}
@@ -173,6 +193,15 @@ default StyledText shadow(boolean shadow) {
173193
return withStyle().shadow(shadow);
174194
}
175195

196+
@Override
197+
default Icon asIcon() {
198+
return new Icon(this);
199+
}
200+
201+
default KeyIcon asTextIcon() {
202+
return new KeyIcon(this);
203+
}
204+
176205
@Override
177206
default void loadFromJson(JsonObject json) {
178207
if (json.has("color") || json.has("shadow") || json.has("align") || json.has("alignment") || json.has("scale")) {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.cleanroommc.modularui.api.drawable;
2+
3+
import com.cleanroommc.modularui.drawable.text.Spacer;
4+
import com.cleanroommc.modularui.utils.Alignment;
5+
6+
public interface IRichTextBuilder<T extends IRichTextBuilder<T>> {
7+
8+
T getThis();
9+
10+
IRichTextBuilder<?> getRichText();
11+
12+
default T add(String s) {
13+
getRichText().add(s);
14+
return getThis();
15+
}
16+
17+
default T add(IDrawable drawable) {
18+
getRichText().add(drawable);
19+
return getThis();
20+
}
21+
22+
default T addLine(ITextLine line) {
23+
getRichText().addLine(line);
24+
return getThis();
25+
}
26+
27+
default T addLine(IDrawable line) {
28+
getRichText().add(line).newLine();
29+
return getThis();
30+
}
31+
32+
default T newLine() {
33+
return add(IKey.LINE_FEED);
34+
}
35+
36+
default T space() {
37+
return add(IKey.SPACE);
38+
}
39+
40+
default T spaceLine(int pixelSpace) {
41+
return addLine(Spacer.of(pixelSpace));
42+
}
43+
44+
default T addElements(Iterable<IDrawable> drawables) {
45+
for (IDrawable drawable : drawables) {
46+
getRichText().add(drawable);
47+
}
48+
return getThis();
49+
}
50+
51+
default T addDrawableLines(Iterable<IDrawable> drawables) {
52+
for (IDrawable drawable : drawables) {
53+
getRichText().add(drawable).newLine();
54+
}
55+
return getThis();
56+
}
57+
58+
default T addStringLines(Iterable<String> drawables) {
59+
for (String drawable : drawables) {
60+
getRichText().add(drawable).newLine();
61+
}
62+
return getThis();
63+
}
64+
65+
default T clearText() {
66+
getRichText().clearText();
67+
return getThis();
68+
}
69+
70+
default T alignment(Alignment alignment) {
71+
getRichText().alignment(alignment);
72+
return getThis();
73+
}
74+
75+
default T textColor(int color) {
76+
getRichText().textColor(color);
77+
return getThis();
78+
}
79+
80+
default T scale(float scale) {
81+
getRichText().scale(scale);
82+
return getThis();
83+
}
84+
85+
default T textShadow(boolean shadow) {
86+
getRichText().textShadow(shadow);
87+
return getThis();
88+
}
89+
}

0 commit comments

Comments
 (0)