Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Added option to show some features outside SB. #603

Merged
merged 39 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ccd91ec
Added option to show some features outside sb. (Attempt 2)
Obsidianninja11 Oct 19, 2023
4c0b2aa
Added ConfigFixEvent and fixed imports
Obsidianninja11 Oct 21, 2023
794ba1a
Oops forgot realTime.formatToggle
Obsidianninja11 Oct 21, 2023
3760199
Merge branch 'beta' into show-outside-2
hannibal002 Oct 28, 2023
874d487
code cleanup
hannibal002 Oct 28, 2023
d84e277
Merge branch 'hannibal002:beta' into show-outside-2
Obsidianninja11 Oct 31, 2023
41f1cbe
Fixes and composter display outside sb
Obsidianninja11 Oct 31, 2023
af63ba3
Added show outside for arrow trail and put all non dev show outsides …
Obsidianninja11 Nov 1, 2023
4e66940
Fixed tps display config
Obsidianninja11 Nov 5, 2023
9746ed3
Merge branch 'beta' into show-outside-2
Obsidianninja11 Nov 5, 2023
be075d3
reverted unnecessary changes.
hannibal002 Nov 5, 2023
c5da3bb
reverted unnecessary changes again.
hannibal002 Nov 5, 2023
c0827a8
reverted unnecessary changes again part 3
hannibal002 Nov 5, 2023
17d1402
better warn message
hannibal002 Nov 5, 2023
89c465d
use neu internal name object
hannibal002 Nov 5, 2023
13a49c0
making it a bit more readable
hannibal002 Nov 5, 2023
d9afa39
one line change
hannibal002 Nov 5, 2023
93ef2df
added enum
hannibal002 Nov 5, 2023
9b1f3f9
Using OutsideSbFeature.isSelected()
hannibal002 Nov 5, 2023
ac9f0ef
code cleanup
hannibal002 Nov 5, 2023
60260dd
Merge branch 'beta' into show-outside-2
Obsidianninja11 Nov 30, 2023
f1352dc
Fixed merge conflicts
Obsidianninja11 Dec 1, 2023
fbc9dd0
Merge branch 'beta' into show-outside-2
hannibal002 Dec 8, 2023
ed68534
fixed config migration version
hannibal002 Dec 8, 2023
30da809
Merge branch 'beta' into show-outside-2
Obsidianninja11 Dec 25, 2023
33f7063
Fixed merge conflicts
Obsidianninja11 Dec 25, 2023
5011fbb
Merge remote-tracking branch 'origin/show-outside-2' into show-outside-2
Obsidianninja11 Dec 25, 2023
579812b
Fixed merge conflicts + config migrator version
Obsidianninja11 Dec 25, 2023
572c510
Merge branch 'beta' into show-outside-2
hannibal002 Jan 11, 2024
8481d65
Merge branch 'beta' into fork/show-outside-2
hannibal002 Feb 9, 2024
4400741
fixing merge conflicts
hannibal002 Feb 10, 2024
3300de6
Merge branch 'beta' into show-outside-2
Obsidianninja11 Feb 21, 2024
7922afd
Better formatting
Obsidianninja11 Feb 21, 2024
02605de
Merge branch 'beta' into fork/show-outside-2
hannibal002 Mar 1, 2024
701d2ab
Fixes and code cleanup
Obsidianninja11 Mar 2, 2024
7437f4a
Merge branch 'beta' into show-outside-2
Obsidianninja11 Mar 4, 2024
6e8708e
fixed errors on startup
hannibal002 Mar 4, 2024
afad9a2
show information that composter timer needs a SkyBlock join to load p…
hannibal002 Mar 4, 2024
eebe4b4
Merge branch 'beta' into fork/show-outside-2
hannibal002 Mar 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package at.hannibal2.skyhanni.config.enums

import at.hannibal2.skyhanni.SkyHanniMod

enum class OutsideSbFeature(private val displayName: String) {
MODIFY_VISUAL_WORDS("Modify Visual Words"),
CUSTOM_TEXT_BOX("Custom Text Box"),
REAL_TIME("Real Time"),
TPS_DISPLAY("TPS Display"),
MARKED_PLAYERS("Marked Players"),
FARMING_WEIGHT("Farming Weight"),
NEXT_JACOB_CONTEXT("Next Jacobs's Context"),
COMPOSTER_TIME("Composter Time"),
YAW_AND_PITCH("Yaw and Pitch"),
QUICK_MOD_MENU_SWITCH("Quick Mod Menu Switch"),
FOLLOWING_LINE("Following Line"),
ARROW_TRAIL("Arrow Trail"),
HIGHLIGHT_PARTY_MEMBERS("Highlight Party Members"),
MOVEMENT_SPEED("Movement Speed");

override fun toString() = displayName

fun isSelected() = SkyHanniMod.feature.misc.showOutsideSB.contains(this)
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ public class WaypointsConfig {
@ConfigEditorBoolean
public boolean showPlatformNumber = false;

@Expose
@ConfigOption(name = "Show Outside SB", desc = "Make parkour waypoints outside of SkyBlock too.")
@ConfigEditorBoolean
public boolean parkourOutsideSB = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,9 @@ public class EliteFarmingWeightConfig {
@ConfigOption(name = "Show below 200", desc = "Show the farming weight data even if you are below 200 weight.")
@ConfigEditorBoolean
public boolean ignoreLow = false;

@Expose
@ConfigOption(name = "Show Outside Garden", desc = "Show the farming weight outside of the garden.")
@ConfigEditorBoolean
public boolean showOutsideGarden = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class NextJacobContestConfig {
@Expose
@ConfigOption(name = "Outside Garden", desc = "Show the timer not only in the Garden but everywhere in SkyBlock.")
@ConfigEditorBoolean
public boolean everywhere = false;
public boolean showOutsideGarden = false;

@Expose
@ConfigOption(name = "In Other Guis", desc = "Mark the current or next Farming Contest crops in other farming GUIs as underlined.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public class YawPitchDisplayConfig {
@Expose
@ConfigOption(name = "Show Outside Garden", desc = "The overlay will work outside of the Garden.")
@ConfigEditorBoolean
public boolean showEverywhere = false;
public boolean showOutsideGarden = false;

@Expose
@ConfigOption(name = "Ignore Timeout", desc = "Ignore the timeout after not moving mouse.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@

import at.hannibal2.skyhanni.config.FeatureToggle;
import at.hannibal2.skyhanni.config.core.config.Position;
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature;
import at.hannibal2.skyhanni.config.features.misc.compacttablist.CompactTabListConfig;
import at.hannibal2.skyhanni.config.features.misc.cosmetic.CosmeticConfig;
import at.hannibal2.skyhanni.config.features.misc.pets.PetConfig;
import com.google.gson.annotations.Expose;
import io.github.moulberry.moulconfig.annotations.Accordion;
import io.github.moulberry.moulconfig.annotations.Category;
import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean;
import io.github.moulberry.moulconfig.annotations.ConfigEditorDraggableList;
import io.github.moulberry.moulconfig.annotations.ConfigOption;

import java.util.ArrayList;
import java.util.List;

public class MiscConfig {

@Expose
Expand Down Expand Up @@ -98,6 +103,11 @@ public class MiscConfig {
@Accordion
public PetCandyDisplayConfig petCandy = new PetCandyDisplayConfig();

@Expose
@ConfigOption(name = "Show Outside SB", desc = "Show these features outside of SkyBlock.")
@ConfigEditorDraggableList
public List<OutsideSbFeature> showOutsideSB = new ArrayList<>();

@Expose
@ConfigOption(name = "Exp Bottles", desc = "Hides all the experience orbs lying on the ground.")
@ConfigEditorBoolean
Expand Down Expand Up @@ -165,6 +175,12 @@ public class MiscConfig {
@Expose
public Position playerMovementSpeedPos = new Position(394, 124, false, true);

@Expose
@ConfigOption(name = "Pet Candy Used", desc = "Show the number of Pet Candy used on a pet.")
@ConfigEditorBoolean
@FeatureToggle
public boolean petCandyUsed = true;

Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
@Expose
@ConfigOption(name = "Server Restart Title", desc = "Show a title with seconds remaining until the server restarts after a Game Update or Scheduled Restart.")
@ConfigEditorBoolean
Expand Down
1 change: 0 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/data/GuiEditManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class GuiEditManager {

@SubscribeEvent
fun onKeyClick(event: LorenzKeyPressEvent) {
if (!LorenzUtils.onHypixel) return
if (event.keyCode != SkyHanniMod.feature.gui.keyBindOpen) return
if (isInGui()) return

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package at.hannibal2.skyhanni.features.cosmetics

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.events.IslandChangeEvent
import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
import at.hannibal2.skyhanni.events.LorenzTickEvent
Expand Down Expand Up @@ -30,8 +31,7 @@ class ArrowTrail {

@SubscribeEvent
fun onTick(event: LorenzTickEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (!isEnabled()) return
val secondsAlive = config.secondsAlive.toDouble().toDuration(DurationUnit.SECONDS)
val time = SimpleTimeMark.now()
val deathTime = time.plus(secondsAlive)
Expand All @@ -51,8 +51,7 @@ class ArrowTrail {

@SubscribeEvent
fun onWorldRender(event: LorenzRenderWorldEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (!isEnabled()) return
val color = if (config.handlePlayerArrowsDifferently) config.playerArrowColor else config.arrowColor
val playerArrowColor = color.toChromaColor()
listYourArrow.forEach {
Expand All @@ -66,6 +65,8 @@ class ArrowTrail {
}
}

private fun isEnabled() = config.enabled && (LorenzUtils.inSkyBlock || OutsideSbFeature.ARROW_TRAIL.isSelected())

@SubscribeEvent
fun onIslandChange(event: IslandChangeEvent) {
listAllArrow.clear()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package at.hannibal2.skyhanni.features.cosmetics

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
import at.hannibal2.skyhanni.events.LorenzTickEvent
Expand Down Expand Up @@ -35,8 +36,7 @@ class CosmeticFollowingLine {

@SubscribeEvent
fun onRenderWorld(event: LorenzRenderWorldEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (!isEnabled()) return

updateClose(event)

Expand Down Expand Up @@ -99,8 +99,7 @@ class CosmeticFollowingLine {

@SubscribeEvent
fun onTick(event: LorenzTickEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
if (!isEnabled()) return

if (event.isMod(5)) {
locations = locations.editCopy { values.removeIf { it.time.passedSince() > config.secondsAlive.seconds } }
Expand All @@ -124,6 +123,8 @@ class CosmeticFollowingLine {
}
}

private fun isEnabled() = (LorenzUtils.inSkyBlock || OutsideSbFeature.FOLLOWING_LINE.isSelected()) && config.enabled

@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(9, "misc.cosmeticConfig", "misc.cosmetic")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.features.garden
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigFileType
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.config.features.garden.NextJacobContestConfig.ShareContestsEntry
import at.hannibal2.skyhanni.events.ConfigLoadEvent
import at.hannibal2.skyhanni.events.DebugDataCollectEvent
Expand Down Expand Up @@ -508,8 +509,9 @@ object GardenNextJacobContest {
}
}

private fun isEnabled() = LorenzUtils.inSkyBlock && config.display
&& (GardenAPI.inGarden() || config.everywhere)
private fun isEnabled() = ((OutsideSbFeature.NEXT_JACOB_CONTEXT.isSelected() && !LorenzUtils.inSkyBlock) ||
(LorenzUtils.inSkyBlock && (GardenAPI.inGarden() || config.showOutsideGarden)))
&& config.display
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved

private fun isFetchEnabled() = isEnabled() && config.fetchAutomatically
private fun isSendEnabled() =
Expand Down Expand Up @@ -632,6 +634,7 @@ object GardenNextJacobContest {
event.transform(15, "garden.nextJacobContests.shareAutomatically") { element ->
ConfigUtils.migrateIntToEnum(element, ShareContestsEntry::class.java)
}
event.move(18, "garden.nextJacobContests.everywhere", "garden.nextJacobContests.showOutsideGarden")
}
}

Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package at.hannibal2.skyhanni.features.garden

import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.events.GardenToolChangeEvent
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.utils.LorenzUtils
Expand All @@ -19,10 +21,9 @@ class GardenYawAndPitch {

@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!config.enabled) return
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
if (!LorenzUtils.onHypixel) return
if (!isEnabled()) return
if (GardenAPI.hideExtraGuis()) return
if (!GardenAPI.inGarden() && !config.showEverywhere) return
if (GardenAPI.toolInHand == null && !config.showWithoutTool) return

val player = Minecraft.getMinecraft().thePlayer
Expand Down Expand Up @@ -57,4 +58,14 @@ class GardenYawAndPitch {
fun onGardenToolChange(event: GardenToolChangeEvent) {
lastChange = SimpleTimeMark.farPast()
}

@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(18, "garden.yawPitchDisplay.everywhere", "garden.yawPitchDisplay.showOutsideGarden")
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
}

private fun isEnabled() = (
(OutsideSbFeature.YAW_AND_PITCH.isSelected() && !LorenzUtils.inSkyBlock) ||
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
(LorenzUtils.inSkyBlock && (GardenAPI.inGarden() || config.showOutsideGarden))
)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package at.hannibal2.skyhanni.features.garden.composter

import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.TabListUpdateEvent
import at.hannibal2.skyhanni.features.fame.ReminderUtils
import at.hannibal2.skyhanni.features.garden.GardenAPI
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUItems
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NEUItems.getItemStack
import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import at.hannibal2.skyhanni.utils.TimeUtils
Expand All @@ -25,6 +27,7 @@ class ComposterDisplay {
private var display = emptyList<List<Any>>()
private var composterEmptyTime: Duration? = null

private val bucket by lazy { "BUCKET".asInternalName().getItemStack() }
private var tabListData by ComposterAPI::tabListData

enum class DataType(rawPattern: String, val icon: String) {
Expand All @@ -33,9 +36,7 @@ class ComposterDisplay {
TIME_LEFT(" Time Left: §r(.*)", "WATCH"),
STORED_COMPOST(" Stored Compost: §r(.*)", "COMPOST");

val displayItem by lazy {
NEUItems.getItemStack(icon)
}
val displayItem by lazy { icon.asInternalName().getItemStack() }

val pattern by lazy { rawPattern.toPattern() }

Expand Down Expand Up @@ -80,7 +81,7 @@ class ComposterDisplay {
return if (emptyTime != null) {
GardenAPI.storage?.composterEmptyTime = System.currentTimeMillis() + emptyTime.inWholeMilliseconds
val format = emptyTime.format()
listOf(NEUItems.getItemStack("BUCKET"), "§b$format")
listOf(bucket, "§b$format")
} else {
listOf("§cOpen Composter Upgrades!")
}
Expand Down Expand Up @@ -142,7 +143,7 @@ class ComposterDisplay {

@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!LorenzUtils.inSkyBlock && !OutsideSbFeature.COMPOSTER_TIME.isSelected()) return

if (GardenAPI.inGarden() && config.displayEnabled) {
config.displayPos.renderStringsAndItems(display, posLabel = "Composter Display")
Expand All @@ -158,7 +159,7 @@ class ComposterDisplay {
val duration = storage.composterEmptyTime - System.currentTimeMillis()
if (duration > 0) {
if (duration < 1000 * 60 * 20) {
warn("Your composter in the garden is soon empty!")
warn("Your composter in the garden is almost empty!")
}
TimeUtils.formatDuration(duration, maxUnits = 3)
} else {
Expand All @@ -167,8 +168,10 @@ class ComposterDisplay {
}
} else "?"

if (!GardenAPI.inGarden() && config.displayOutsideGarden) {
val list = Collections.singletonList(listOf(NEUItems.getItemStack("BUCKET"), "§b$format"))
val inSb = LorenzUtils.inSkyBlock && config.displayOutsideGarden
val outsideSb = !LorenzUtils.inSkyBlock && OutsideSbFeature.COMPOSTER_TIME.isSelected()
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
if (!GardenAPI.inGarden() && (inSb || outsideSb)) {
val list = Collections.singletonList(listOf(bucket, "§b$format"))
config.outsideGardenPos.renderStringsAndItems(list, posLabel = "Composter Outside Garden Display")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.features.garden.farming

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.data.HypixelData
import at.hannibal2.skyhanni.data.ProfileStorageData
import at.hannibal2.skyhanni.events.GardenToolChangeEvent
Expand Down Expand Up @@ -144,7 +145,7 @@ class FarmingWeightDisplay {
private var lastOpenWebsite = SimpleTimeMark.farPast()

private fun update() {
if (!GardenAPI.inGarden()) return
if (!isEnabled()) return
hannibal002 marked this conversation as resolved.
Show resolved Hide resolved
if (apiError) {
display = errorMessage
return
Expand All @@ -157,10 +158,6 @@ class FarmingWeightDisplay {
if (weight == -1.0) {
if (!isLoadingWeight) {
val localProfile = HypixelData.profileName
if (localProfile == "") {
Obsidianninja11 marked this conversation as resolved.
Show resolved Hide resolved
display = Renderable.singeltonString("§cError: profileName is empty!")
return
}

isLoadingWeight = true
if (display.isEmpty()) {
Expand Down Expand Up @@ -342,7 +339,9 @@ class FarmingWeightDisplay {
)
}

private fun isEnabled() = GardenAPI.inGarden() && config.display
private fun isEnabled() = ((OutsideSbFeature.FARMING_WEIGHT.isSelected() && !LorenzUtils.inSkyBlock) ||
(LorenzUtils.inSkyBlock && (GardenAPI.inGarden() || config.showOutsideGarden))) && config.display

private fun isEtaEnabled() = config.overtakeETA

fun addCrop(crop: CropType, addedCounter: Int) {
Expand Down Expand Up @@ -453,7 +452,7 @@ class FarmingWeightDisplay {

// If the selected profile is not found or if the cute name doesn't match look for a different profile
// While it's not optimal to loop twice, this shouldn't happen often
if (selectedProfileEntry == null || selectedProfileEntry["profileName"].asString.lowercase() != localProfile) {
if (selectedProfileEntry == null || (selectedProfileEntry["profileName"].asString.lowercase() != localProfile && localProfile != "")) {
selectedProfileEntry = profileEntries.find {
it.asJsonObject["profileName"].asString.lowercase() == localProfile
}?.asJsonObject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.features.misc

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.config.enums.OutsideSbFeature
import at.hannibal2.skyhanni.events.ConfigLoadEvent
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.utils.ConditionalUtils.afterChange
Expand All @@ -28,7 +29,7 @@ class CustomTextBox {
@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!config.enabled) return
if (!LorenzUtils.inSkyBlock) return
if (!LorenzUtils.inSkyBlock && !OutsideSbFeature.CUSTOM_TEXT_BOX.isSelected()) return

config.position.renderStrings(display, posLabel = "Custom Text Box")
}
Expand Down
Loading
Loading