diff --git a/plugin-playground/src/main/kotlin/KondoKit/Helpers.kt b/plugin-playground/src/main/kotlin/KondoKit/Helpers.kt index faec99f..bfcac22 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/Helpers.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/Helpers.kt @@ -190,6 +190,10 @@ object Helpers { } } + fun showAlert(message: String, title: String, type: Int){ + JOptionPane.showMessageDialog(null, message, title, type) + } + fun formatHtmlLabelText(text1: String, color1: Color, text2: String, color2: Color): String { return "
" + "$text1" + diff --git a/plugin-playground/src/main/kotlin/KondoKit/HiscoresView.kt b/plugin-playground/src/main/kotlin/KondoKit/HiscoresView.kt index 3ceb86d..ecdeed0 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/HiscoresView.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/HiscoresView.kt @@ -7,10 +7,15 @@ import KondoKit.Helpers.formatHtmlLabelText import KondoKit.Helpers.getSpriteId import KondoKit.Helpers.showToast import KondoKit.SpriteToBufferedImage.getBufferedImageFromSprite +import KondoKit.plugin.Companion.POPUP_BACKGROUND +import KondoKit.plugin.Companion.POPUP_FOREGROUND +import KondoKit.plugin.Companion.TITLE_BAR_COLOR +import KondoKit.plugin.Companion.TOOLTIP_BACKGROUND import KondoKit.plugin.Companion.VIEW_BACKGROUND_COLOR import KondoKit.plugin.Companion.WIDGET_COLOR import KondoKit.plugin.Companion.primaryColor import KondoKit.plugin.Companion.secondaryColor +import KondoKit.plugin.StateManager.focusedView import com.google.gson.Gson import plugin.api.API import rt4.Sprites @@ -27,6 +32,7 @@ import java.net.SocketTimeoutException import java.net.URL import javax.swing.* import javax.swing.border.MatteBorder +import kotlin.math.floor object Constants { // Sprite IDs @@ -38,7 +44,6 @@ object Constants { // Dimensions val SEARCH_FIELD_DIMENSION = Dimension(230, 30) val ICON_DIMENSION_SMALL = Dimension(12, 12) - val ICON_DIMENSION_MEDIUM = Dimension(18, 20) val ICON_DIMENSION_LARGE = Dimension(30, 30) val HISCORE_PANEL_DIMENSION = Dimension(230, 500) val FILTER_PANEL_DIMENSION = Dimension(230, 30) @@ -50,11 +55,9 @@ object Constants { val NUMBER_LABEL_DIMENSION = Dimension(20, 20) // Colors - val COLOR_BACKGROUND_DARK = Color(27, 27, 27) + val COLOR_BACKGROUND_DARK = WIDGET_COLOR val COLOR_BACKGROUND_MEDIUM = VIEW_BACKGROUND_COLOR - val COLOR_FOREGROUND_LIGHT = Color(200, 200, 200) - val COLOR_RED = Color.RED - val COLOR_SKILL_PANEL = Color(60, 60, 60) + val COLOR_FOREGROUND_LIGHT = POPUP_FOREGROUND // Fonts val FONT_ARIAL_PLAIN_14 = Font("Arial", Font.PLAIN, 14) @@ -67,6 +70,7 @@ var text: String = "" object HiscoresView { + const val VIEW_NAME = "HISCORE_SEARCH_VIEW" var hiScoreView: JPanel? = null class CustomSearchField(private val hiscoresPanel: JPanel) : Canvas() { @@ -137,9 +141,9 @@ object HiscoresView { } }) - Timer(1000) { + Timer(500) { cursorVisible = !cursorVisible - if(plugin.StateManager.focusedView == "HISCORE_SEARCH_VIEW") + if(focusedView == VIEW_NAME) repaint() }.start() } @@ -165,7 +169,7 @@ object HiscoresView { } if (text.isNotEmpty()) { - g.color = Constants.COLOR_RED + g.color = Color.RED g.drawString("x", width - 20, 20) } } @@ -305,13 +309,13 @@ object HiscoresView { summoning: Int, isMemberWorld: Boolean ): Double { - val base = (defence + hitpoints + Math.floor(prayer.toDouble() / 2)) * 0.25 + val base = (defence + hitpoints + floor(prayer.toDouble() / 2)) * 0.25 val melee = (attack + strength) * 0.325 - val range = Math.floor(ranged * 1.5) * 0.325 - val mage = Math.floor(magic * 1.5) * 0.325 + val range = floor(ranged * 1.5) * 0.325 + val mage = floor(magic * 1.5) * 0.325 val maxCombatType = maxOf(melee, range, mage) - val summoningFactor = if (isMemberWorld) Math.floor(summoning.toDouble() / 8) else 0.0 + val summoningFactor = if (isMemberWorld) floor(summoning.toDouble() / 8) else 0.0 return Math.round((base + maxCombatType + summoningFactor) * 1000.0) / 1000.0 } @@ -338,7 +342,7 @@ object HiscoresView { fun createHiscoreSearchView() { val hiscorePanel = JPanel().apply { layout = BoxLayout(this, BoxLayout.Y_AXIS) - name = "HISCORE_SEARCH_VIEW" + name = VIEW_NAME background = Constants.COLOR_BACKGROUND_MEDIUM preferredSize = Constants.HISCORE_PANEL_DIMENSION maximumSize = preferredSize @@ -369,7 +373,7 @@ object HiscoresView { val playerNamePanel = JPanel().apply { layout = GridBagLayout() // This will center the JLabel both vertically and horizontally - background = WIDGET_COLOR + background = TOOLTIP_BACKGROUND.darker() preferredSize = Constants.FILTER_PANEL_DIMENSION maximumSize = preferredSize minimumSize = preferredSize @@ -436,6 +440,7 @@ object HiscoresView { val bufferedImageSprite = getBufferedImageFromSprite(API.GetSprite(Constants.LVL_BAR_SPRITE)); val totalLevelIcon = ImageCanvas(bufferedImageSprite).apply { + fillColor = COLOR_BACKGROUND_DARK preferredSize = Constants.ICON_DIMENSION_LARGE size = Constants.ICON_DIMENSION_LARGE } @@ -457,6 +462,7 @@ object HiscoresView { val bufferedImageSprite2 = getBufferedImageFromSprite(API.GetSprite(Constants.COMBAT_LVL_SPRITE)) val combatLevelIcon = ImageCanvas(bufferedImageSprite2).apply { + fillColor = COLOR_BACKGROUND_DARK preferredSize = Constants.ICON_DIMENSION_LARGE size = Constants.ICON_DIMENSION_LARGE } diff --git a/plugin-playground/src/main/kotlin/KondoKit/LootTrackerView.kt b/plugin-playground/src/main/kotlin/KondoKit/LootTrackerView.kt index 1702b04..3a0fc14 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/LootTrackerView.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/LootTrackerView.kt @@ -4,11 +4,17 @@ import KondoKit.Helpers.addMouseListenerToAll import KondoKit.Helpers.formatHtmlLabelText import KondoKit.SpriteToBufferedImage.getBufferedImageFromSprite import KondoKit.XPTrackerView.wrappedWidget +import KondoKit.plugin.Companion.IMAGE_SIZE +import KondoKit.plugin.Companion.POPUP_BACKGROUND +import KondoKit.plugin.Companion.POPUP_FOREGROUND +import KondoKit.plugin.Companion.TITLE_BAR_COLOR +import KondoKit.plugin.Companion.TOOLTIP_BACKGROUND import KondoKit.plugin.Companion.TOTAL_XP_WIDGET_SIZE import KondoKit.plugin.Companion.VIEW_BACKGROUND_COLOR import KondoKit.plugin.Companion.WIDGET_COLOR import KondoKit.plugin.Companion.primaryColor import KondoKit.plugin.Companion.secondaryColor +import KondoKit.plugin.StateManager.focusedView import plugin.api.API import rt4.* import java.awt.* @@ -30,6 +36,7 @@ object LootTrackerView { const val BAG_ICON = 900; val npcDeathSnapshots = mutableMapOf() var gePriceMap = loadGEPrices() + const val VIEW_NAME = "LOOT_TRACKER_VIEW"; private val lootItemPanels = mutableMapOf>() private val npcKillCounts = mutableMapOf() private var totalTrackerWidget: XPWidget? = null @@ -125,9 +132,10 @@ object LootTrackerView { addMouseListenerToAll(wrapped,rightClickListener) wrapped.addMouseListener(rightClickListener) add(wrapped) - add(Box.createVerticalStrut(10)) + add(Box.createVerticalStrut(8)) revalidate() - repaint() + if(focusedView == VIEW_NAME) + repaint() } } @@ -158,7 +166,7 @@ object LootTrackerView { xpLeftLabel = JLabel(), actionsRemainingLabel = JLabel(), xpPerHourLabel = l1, - progressBar = ProgressBar(0.0, Color(150, 50, 50)), + progressBar = ProgressBar(0.0, Color(0,0,0)), // unused. totalXpGained = 0, startTime = System.currentTimeMillis(), previousXp = 0 @@ -167,16 +175,19 @@ object LootTrackerView { private fun createWidgetPanel(bufferedImageSprite: BufferedImage, l1 : JLabel, l2 : JLabel): Panel { val imageCanvas = ImageCanvas(bufferedImageSprite).apply { - size = Dimension(width, height) + preferredSize = Dimension(bufferedImageSprite.width, bufferedImageSprite.height) + minimumSize = preferredSize + maximumSize = preferredSize + size = preferredSize background = WIDGET_COLOR } - val imageContainer = Panel(FlowLayout()).apply { + val imageContainer = Panel(BorderLayout()).apply { background = WIDGET_COLOR - add(imageCanvas) + add(imageCanvas, BorderLayout.NORTH) } - return Panel(BorderLayout(5, 5)).apply { + return Panel(BorderLayout(5, 0)).apply { background = WIDGET_COLOR preferredSize = TOTAL_XP_WIDGET_SIZE add(imageContainer, BorderLayout.WEST) @@ -185,7 +196,7 @@ object LootTrackerView { } private fun createTextPanel(l1 : JLabel, l2: JLabel): Panel { - return Panel(GridLayout(2, 1, 5, 5)).apply { + return Panel(GridLayout(2, 1, 5, 0)).apply { background = WIDGET_COLOR add(l1) add(l2) @@ -219,9 +230,10 @@ object LootTrackerView { lootPanel.parent.maximumSize = size lootPanel.parent.revalidate() lootPanel.parent.repaint() - lootPanel.revalidate() - lootPanel.repaint() + + if(focusedView == VIEW_NAME) + lootPanel.repaint() } } @@ -231,7 +243,7 @@ object LootTrackerView { } private fun createItemPanel(itemId: Int, quantity: Int): JPanel { - val bufferedImageSprite = getBufferedImageFromSprite(API.GetObjSprite(itemId, quantity, true, 0, 0)) + val bufferedImageSprite = getBufferedImageFromSprite(API.GetObjSprite(itemId, quantity, true, 1, 3153952)) // Create the panel for the item val itemPanel = FixedSizePanel(Dimension(36, 32)).apply { @@ -276,22 +288,22 @@ object LootTrackerView { val gePricePerItem = gePriceMap[itemDef.id.toString()]?.toInt() ?: 0 val totalGePrice = gePricePerItem * quantity val totalHaPrice = itemDef.cost * quantity - val geText = if (quantity > 1) " (${gePricePerItem} ea)" else "" - val haText = if (quantity > 1) " (${itemDef.cost} ea)" else "" - - val text = "
" + + val geText = if (quantity > 1) " (${formatValue(gePricePerItem)} ea)" else "" + val haText = if (quantity > 1) " (${formatValue(itemDef.cost)} ea)" else "" + val bgColor = Helpers.colorToHex(TOOLTIP_BACKGROUND) + val textColor = Helpers.colorToHex(secondaryColor) + val text = "
" + "${itemDef.name} x $quantity
" + - "GE: $totalGePrice ${geText}
" + - "HA: $totalHaPrice ${haText}
" + "GE: ${formatValue(totalGePrice)} ${geText}
" + + "HA: ${formatValue(totalHaPrice)} ${haText}
" val _font = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) - val c = Color(50,50,50) if (customToolTipWindow == null) { customToolTipWindow = JWindow().apply { contentPane = JLabel(text).apply { border = BorderFactory.createLineBorder(Color.BLACK) isOpaque = true - background = c + background = TOOLTIP_BACKGROUND foreground = Color.WHITE font = _font } @@ -316,7 +328,8 @@ object LootTrackerView { panel.removeAll() panel.add(createItemPanel(itemId, quantity).components[0], BorderLayout.CENTER) panel.revalidate() - panel.repaint() + if(focusedView == VIEW_NAME) + panel.repaint() } private fun updateKillCountLabel(lootTrackerPanel: JPanel, npcName: String) { @@ -340,7 +353,8 @@ object LootTrackerView { text = "${formatValue(newValue)} gp" putClientProperty("val", newValue) revalidate() - repaint() + if(focusedView == VIEW_NAME) + repaint() } } } @@ -401,9 +415,10 @@ object LootTrackerView { findLootItemsPanel(lootTrackerView, npcName)?.let { } ?: run { lootTrackerView.add(createLootFrame(npcName)) - lootTrackerView.add(Box.createVerticalStrut(10)) + lootTrackerView.add(Box.createVerticalStrut(8)) lootTrackerView.revalidate() - lootTrackerView.repaint() + if(focusedView == VIEW_NAME) + lootTrackerView.repaint() } npcKillCounts[npcName] = npcKillCounts.getOrDefault(npcName, 0) + 1 @@ -427,7 +442,7 @@ object LootTrackerView { } val labelPanel = JPanel(BorderLayout()).apply { - background = Color(21, 21, 21) + background = TITLE_BAR_COLOR border = BorderFactory.createEmptyBorder(5, 5, 5, 5) maximumSize = Dimension(230, 24) minimumSize = maximumSize @@ -436,14 +451,14 @@ object LootTrackerView { val killCount = npcKillCounts.getOrPut(npcName) { 0 } val countLabel = JLabel(formatHtmlLabelText(npcName, secondaryColor, " x $killCount", primaryColor)).apply { - foreground = Color(200, 200, 200) + foreground = secondaryColor font = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) horizontalAlignment = JLabel.LEFT name = "killCountLabel_$npcName" } val valueLabel = JLabel("0 gp").apply { - foreground = Color(200, 200, 200) + foreground = secondaryColor font = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) horizontalAlignment = JLabel.RIGHT name = "valueLabel_$npcName" @@ -491,13 +506,13 @@ object LootTrackerView { val popupMenu = JPopupMenu() val rFont = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) - popupMenu.background = Color(45, 45, 45) + popupMenu.background = POPUP_BACKGROUND // Create menu items with custom font and colors val menuItem1 = JMenuItem("Remove").apply { font = rFont // Set custom font - background = Color(45, 45, 45) // Dark background for item - foreground = Color(220, 220, 220) // Light text color for item + background = POPUP_BACKGROUND // Dark background for item + foreground = POPUP_FOREGROUND // Light text color for item } popupMenu.add(menuItem1) menuItem1.addActionListener { @@ -509,7 +524,7 @@ object LootTrackerView { if (toRemoveIndex >= 0 && toRemoveIndex < components.size - 1) { val nextComponent = components[toRemoveIndex + 1] if (nextComponent is Box.Filler) { - // Nasty way to remove the Box.createVerticalStrut(10) after + // Nasty way to remove the Box.createVerticalStrut(8) after // the lootpanel. parent.remove(nextComponent) } @@ -528,13 +543,13 @@ object LootTrackerView { val popupMenu = JPopupMenu() val rFont = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) - popupMenu.background = Color(45, 45, 45) + popupMenu.background = POPUP_BACKGROUND // Create menu items with custom font and colors val menuItem1 = JMenuItem("Reset Loot Tracker").apply { font = rFont // Set custom font - background = Color(45, 45, 45) // Dark background for item - foreground = Color(220, 220, 220) // Light text color for item + background = POPUP_BACKGROUND // Dark background for item + foreground = POPUP_FOREGROUND // Light text color for item } popupMenu.add(menuItem1) menuItem1.addActionListener { @@ -572,7 +587,7 @@ object LootTrackerView { wrapped.addMouseListener(rightClickListener) lootTrackerView?.add(Box.createVerticalStrut(5)) lootTrackerView?.add(wrapped) - lootTrackerView?.add(Box.createVerticalStrut(10)) + lootTrackerView?.add(Box.createVerticalStrut(8)) lootTrackerView?.revalidate() lootTrackerView?.repaint() } diff --git a/plugin-playground/src/main/kotlin/KondoKit/ProgressBar.kt b/plugin-playground/src/main/kotlin/KondoKit/ProgressBar.kt index f5df980..2c5546f 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/ProgressBar.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/ProgressBar.kt @@ -1,5 +1,7 @@ package KondoKit +import KondoKit.plugin.Companion.PROGRESS_BAR_FILL +import KondoKit.plugin.Companion.secondaryColor import java.awt.Canvas import java.awt.Color import java.awt.Dimension @@ -26,24 +28,24 @@ class ProgressBar( g.fillRect(0, 0, width, this.height) // Draw the unfilled part of the progress bar - g.color = Color(61, 56, 49) // from Runelite + g.color = PROGRESS_BAR_FILL g.fillRect(width, 0, this.width - width, this.height) // Variables for text position val textY = this.height / 2 + 6 // Draw the current level on the far left - drawTextWithShadow(g, "Lvl. $currentLevel", 5, textY, Color(255, 255, 255)) + drawTextWithShadow(g, "Lvl. $currentLevel", 5, textY, secondaryColor) // Draw the percentage in the middle val percentageText = String.format("%.2f%%", progress) val percentageWidth = g.fontMetrics.stringWidth(percentageText) - drawTextWithShadow(g, percentageText, (this.width - percentageWidth) / 2, textY, Color(255, 255, 255)) + drawTextWithShadow(g, percentageText, (this.width - percentageWidth) / 2, textY, secondaryColor) // Draw the next level on the far right val nextLevelText = "Lvl. $nextLevel" val nextLevelWidth = g.fontMetrics.stringWidth(nextLevelText) - drawTextWithShadow(g, nextLevelText, this.width - nextLevelWidth - 5, textY, Color(255, 255, 255)) + drawTextWithShadow(g, nextLevelText, this.width - nextLevelWidth - 5, textY, secondaryColor) } override fun getPreferredSize(): Dimension { diff --git a/plugin-playground/src/main/kotlin/KondoKit/ReflectiveEditorView.kt b/plugin-playground/src/main/kotlin/KondoKit/ReflectiveEditorView.kt index 270c41b..cd167c9 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/ReflectiveEditorView.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/ReflectiveEditorView.kt @@ -2,10 +2,13 @@ package KondoKit import KondoKit.Helpers.convertValue import KondoKit.Helpers.showToast +import KondoKit.plugin.Companion.TITLE_BAR_COLOR +import KondoKit.plugin.Companion.TOOLTIP_BACKGROUND import KondoKit.plugin.Companion.VIEW_BACKGROUND_COLOR import KondoKit.plugin.Companion.WIDGET_COLOR import KondoKit.plugin.Companion.primaryColor import KondoKit.plugin.Companion.secondaryColor +import KondoKit.plugin.StateManager.focusedView import plugin.Plugin import plugin.PluginInfo import plugin.PluginRepository @@ -28,6 +31,7 @@ import kotlin.math.ceil object ReflectiveEditorView { var reflectiveEditorView: JPanel? = null val loadedPlugins: MutableList = mutableListOf() + const val VIEW_NAME = "REFLECTIVE_EDITOR_VIEW" fun createReflectiveEditorView() { val reflectiveEditorPanel = JPanel(BorderLayout()) reflectiveEditorPanel.background = VIEW_BACKGROUND_COLOR @@ -100,7 +104,7 @@ object ReflectiveEditorView { reflectiveEditorView.revalidate() - if(plugin.StateManager.focusedView == "REFLECTIVE_EDITOR_VIEW") + if(focusedView == VIEW_NAME) reflectiveEditorView.repaint() } @@ -128,7 +132,7 @@ object ReflectiveEditorView { label.font = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) labelPanel.add(label, BorderLayout.CENTER) label.isOpaque = true - label.background = Color(21, 21, 21) + label.background = TITLE_BAR_COLOR reflectiveEditorView.add(labelPanel) for (field in exposedFields) { @@ -270,7 +274,6 @@ object ReflectiveEditorView { fun showCustomToolTip(text: String, component: JComponent) { val _font = Font("RuneScape Small", Font.PLAIN, 16) - val backgroundColor = Color(50, 50, 50) val maxWidth = 150 val lineHeight = 16 @@ -290,10 +293,12 @@ object ReflectiveEditorView { if (customToolTipWindow == null) { customToolTipWindow = JWindow().apply { - contentPane = JLabel("
$text
").apply { + val bgColor = Helpers.colorToHex(TOOLTIP_BACKGROUND) + val textColor = Helpers.colorToHex(secondaryColor) + contentPane = JLabel("
$text
").apply { border = BorderFactory.createLineBorder(Color.BLACK) isOpaque = true - background = backgroundColor + background = TOOLTIP_BACKGROUND foreground = Color.WHITE font = _font maximumSize = Dimension(maxWidth, Int.MAX_VALUE) @@ -304,7 +309,9 @@ object ReflectiveEditorView { } else { // Update the tooltip text val label = customToolTipWindow!!.contentPane as JLabel - label.text = "
$text
" + val bgColor = Helpers.colorToHex(TOOLTIP_BACKGROUND) + val textColor = Helpers.colorToHex(secondaryColor) + label.text = "
$text
" label.preferredSize = Dimension(maxWidth, requiredHeight) customToolTipWindow!!.pack() } diff --git a/plugin-playground/src/main/kotlin/KondoKit/ScrollablePanel.kt b/plugin-playground/src/main/kotlin/KondoKit/ScrollablePanel.kt index 44467a7..46f2b5a 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/ScrollablePanel.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/ScrollablePanel.kt @@ -1,8 +1,8 @@ package KondoKit +import KondoKit.plugin.Companion.SCROLL_BAR_COLOR import KondoKit.plugin.Companion.VIEW_BACKGROUND_COLOR import rt4.GameShell.frame -import java.awt.Color import java.awt.Graphics import java.awt.Graphics2D import java.awt.Rectangle @@ -147,7 +147,7 @@ class ScrollablePanel(private val content: JPanel) : JPanel() { if (showScrollbar) { val g2 = g as Graphics2D val scrollbarX = 238 - g2.color = Color(64, 64, 64) + g2.color = SCROLL_BAR_COLOR g2.fillRect(scrollbarX, scrollbarY, 2, scrollbarHeight) } } diff --git a/plugin-playground/src/main/kotlin/KondoKit/SpriteToBufferedImage.kt b/plugin-playground/src/main/kotlin/KondoKit/SpriteToBufferedImage.kt index e273c98..ef7b298 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/SpriteToBufferedImage.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/SpriteToBufferedImage.kt @@ -4,109 +4,172 @@ import rt4.GlIndexedSprite import rt4.GlSprite import rt4.SoftwareIndexedSprite import rt4.SoftwareSprite +import java.awt.Color import java.awt.image.BufferedImage +// Define interfaces for common sprite types +interface BaseSprite { + val width: Int + val height: Int +} + +interface IndexedSprite : BaseSprite { + val pixels: ByteArray + val palette: IntArray +} + +interface NonIndexedSprite : BaseSprite { + val pixels: IntArray? +} + +// Adapter functions for existing sprite types +fun adaptSoftwareSprite(sprite: SoftwareSprite): NonIndexedSprite { + return object : NonIndexedSprite { + override val width: Int = sprite.width + override val height: Int = sprite.height + override val pixels: IntArray? = sprite.pixels + } +} + +fun adaptSoftwareIndexedSprite(sprite: SoftwareIndexedSprite): IndexedSprite { + return object : IndexedSprite { + override val width: Int = sprite.width + override val height: Int = sprite.height + override val pixels: ByteArray = sprite.pixels + override val palette: IntArray = sprite.pallet + } +} + +fun adaptGlSprite(sprite: GlSprite): NonIndexedSprite { + return object : NonIndexedSprite { + override val width: Int = sprite.width + override val height: Int = sprite.height + override val pixels: IntArray? = sprite.pixels + } +} + +fun adaptGlIndexedSprite(sprite: GlIndexedSprite): IndexedSprite { + return object : IndexedSprite { + override val width: Int = sprite.width + override val height: Int = sprite.height + override val pixels: ByteArray = sprite.pixels + override val palette: IntArray = sprite.pallet + } +} + object SpriteToBufferedImage { /** - * Converts a SoftwareSprite back into a BufferedImage. + * Converts a BaseSprite into a BufferedImage. + * + * Handles both indexed and non-indexed sprites, with optional tinting and grayscale. * * @param sprite The sprite to be converted. + * @param tint An optional Color to tint the image. + * @param grayscale If true, converts the image to grayscale. * @return The BufferedImage created from the sprite. */ - fun convertToBufferedImage(sprite: SoftwareSprite): BufferedImage { + fun convertToBufferedImage(sprite: BaseSprite, tint: Color? = null, grayscale: Boolean = false): BufferedImage { val width = sprite.width val height = sprite.height - val pixels = sprite.pixels - - // Create a BufferedImage with ARGB color model val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) - // Manually set pixels and print the pixel data - for (y in 0 until height) { - for (x in 0 until width) { - val pixel = pixels[y * width + x] - image.setRGB(x, y, pixel) + when (sprite) { + is IndexedSprite -> { + val pixels = sprite.pixels + val palette = sprite.palette + + // Manually set pixels using the palette + for (y in 0 until height) { + for (x in 0 until width) { + val index = pixels[y * width + x].toInt() and 0xFF + var color = palette[index] + + // Apply grayscale or tint if provided + val finalColor = if (grayscale) { + applyGrayscale(Color(color, true)) + } else if (tint != null) { + applyTint(Color(color, true), tint) + } else { + Color(color, true) + } + + image.setRGB(x, y, finalColor.rgb) + } + } + } + is NonIndexedSprite -> { + val pixels = sprite.pixels ?: return image // Handle null case for GlSprite + + // Manually set pixels directly + for (y in 0 until height) { + for (x in 0 until width) { + var color = pixels[y * width + x] + + // Apply grayscale or tint if provided + val finalColor = if (grayscale) { + applyGrayscale(Color(color, true)) + } else if (tint != null) { + applyTint(Color(color, true), tint) + } else { + Color(color, true) + } + + image.setRGB(x, y, finalColor.rgb) + } + } } } + return image } - fun convertToBufferedImage(sprite: SoftwareIndexedSprite): BufferedImage { - val width = sprite.width - val height = sprite.height - val pixels = sprite.pixels // byte[] - val palette = sprite.pallet + /** + * Applies a tint to a given color using the tint's alpha value to control the intensity. + * + * @param original The original color. + * @param tint The tint color to be applied, with alpha controlling the intensity. + * @return The tinted color. + */ + fun applyTint(original: Color, tint: Color): Color { + val alpha = tint.alpha / 255.0 // Normalize alpha to range [0, 1] + val invAlpha = 1.0 - alpha - // Create a BufferedImage with ARGB color model - val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) + // Blend the tint with the original color based on the alpha + val r = (original.red * invAlpha + tint.red * alpha).toInt().coerceIn(0, 255) + val g = (original.green * invAlpha + tint.green * alpha).toInt().coerceIn(0, 255) + val b = (original.blue * invAlpha + tint.blue * alpha).toInt().coerceIn(0, 255) - // Manually set pixels using the palette - for (y in 0 until height) { - for (x in 0 until width) { - // Get the index from the sprite's pixel array - val index = pixels[y * width + x].toInt() and 0xFF - // Map the index to a color in the palette - val color = palette[index] - // Set the ARGB color in the BufferedImage - image.setRGB(x, y, color) - } - } - return image - } - - fun convertToBufferedImage(sprite: GlIndexedSprite): BufferedImage { - val width = sprite.width - val height = sprite.height - val pixels = sprite.pixels // byte[] - val palette = sprite.pallet - - // Create a BufferedImage with ARGB color model - val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) - - // Manually set pixels using the palette - for (y in 0 until height) { - for (x in 0 until width) { - // Get the index from the sprite's pixel array - val index = pixels[y * width + x].toInt() and 0xFF - // Map the index to a color in the palette - val color = palette[index] - // Set the ARGB color in the BufferedImage - image.setRGB(x, y, color) - } - } - return image + return Color(r, g, b, original.alpha) } - fun convertToBufferedImage(sprite: GlSprite): BufferedImage { - val width = sprite.width - val height = sprite.height - val pixels = sprite.pixels - - // Create a BufferedImage with ARGB color model - val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) - - if(pixels == null) { - return image - } - - // Manually set pixels and print the pixel data - for (y in 0 until height) { - for (x in 0 until width) { - val pixel = pixels[y * width + x] - image.setRGB(x, y, pixel) - } - } - return image + /** + * Converts a color to grayscale. + * + * @param original The original color. + * @return The grayscale version of the color. + */ + fun applyGrayscale(original: Color): Color { + // Calculate the grayscale value using the luminosity method + val grayValue = (0.3 * original.red + 0.59 * original.green + 0.11 * original.blue).toInt() + return Color(grayValue, grayValue, grayValue, original.alpha) } - fun getBufferedImageFromSprite(sprite: Any?) : BufferedImage { - return when(sprite){ - is GlSprite -> convertToBufferedImage(sprite) - is SoftwareSprite -> convertToBufferedImage(sprite) - is SoftwareIndexedSprite -> convertToBufferedImage(sprite) - is GlIndexedSprite -> convertToBufferedImage(sprite) - else -> BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) + /** + * Converts an unknown sprite object into a BufferedImage if it matches a known sprite type. + * + * @param sprite The sprite object to be converted. + * @param tint An optional Color to tint the image. + * @param grayscale If true, converts the image to grayscale. + * @return The BufferedImage created from the sprite or a default image if unsupported. + */ + fun getBufferedImageFromSprite(sprite: Any?, tint: Color? = null, grayscale: Boolean = false): BufferedImage { + return when (sprite) { + is SoftwareSprite -> convertToBufferedImage(adaptSoftwareSprite(sprite), tint, grayscale) + is SoftwareIndexedSprite -> convertToBufferedImage(adaptSoftwareIndexedSprite(sprite), tint, grayscale) + is GlSprite -> convertToBufferedImage(adaptGlSprite(sprite), tint, grayscale) + is GlIndexedSprite -> convertToBufferedImage(adaptGlIndexedSprite(sprite), tint, grayscale) + else -> BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) // Default empty image for unsupported types } } } \ No newline at end of file diff --git a/plugin-playground/src/main/kotlin/KondoKit/XPTrackerView.kt b/plugin-playground/src/main/kotlin/KondoKit/XPTrackerView.kt index a30030c..b975194 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/XPTrackerView.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/XPTrackerView.kt @@ -8,6 +8,8 @@ import KondoKit.Helpers.getSpriteId import KondoKit.SpriteToBufferedImage.getBufferedImageFromSprite import KondoKit.plugin.Companion.IMAGE_SIZE import KondoKit.plugin.Companion.LVL_ICON +import KondoKit.plugin.Companion.POPUP_BACKGROUND +import KondoKit.plugin.Companion.POPUP_FOREGROUND import KondoKit.plugin.Companion.TOTAL_XP_WIDGET_SIZE import KondoKit.plugin.Companion.VIEW_BACKGROUND_COLOR import KondoKit.plugin.Companion.WIDGET_COLOR @@ -15,6 +17,7 @@ import KondoKit.plugin.Companion.WIDGET_SIZE import KondoKit.plugin.Companion.playerXPMultiplier import KondoKit.plugin.Companion.primaryColor import KondoKit.plugin.Companion.secondaryColor +import KondoKit.plugin.StateManager.focusedView import plugin.api.API import java.awt.* import java.awt.event.MouseAdapter @@ -30,6 +33,7 @@ object XPTrackerView { var totalXPWidget: XPWidget? = null val initialXP: MutableMap = HashMap() var xpTrackerView: JPanel? = null + const val VIEW_NAME = "XP_TRACKER_VIEW" val npcHitpointsMap: Map = try { @@ -96,10 +100,10 @@ object XPTrackerView { xpWidget.xpGainedLabel.text = formatHtmlLabelText("XP Gained: ", primaryColor, formattedXp, secondaryColor) // Update the progress bar with current level, progress, and next level - xpWidget.progressBar.updateProgress(progress, currentLevel, if (currentLevel < 99) currentLevel + 1 else 99, plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + xpWidget.progressBar.updateProgress(progress, currentLevel, if (currentLevel < 99) currentLevel + 1 else 99, focusedView == VIEW_NAME) xpWidget.previousXp = xp - if (plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if (focusedView == VIEW_NAME) xpWidget.container.repaint() } @@ -109,7 +113,7 @@ object XPTrackerView { totalXPWidget.totalXpGained += xpGainedSinceLastUpdate val formattedXp = formatNumber(totalXPWidget.totalXpGained) totalXPWidget.xpGainedLabel.text = formatHtmlLabelText("Gained: ", primaryColor, formattedXp, secondaryColor) - if (plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if (focusedView == VIEW_NAME) totalXPWidget.container.repaint() } @@ -148,7 +152,7 @@ object XPTrackerView { xpWidgets.clear() xpTrackerView.revalidate() - if (plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if (focusedView == VIEW_NAME) xpTrackerView.repaint() } @@ -164,10 +168,10 @@ object XPTrackerView { val bufferedImageSprite = getBufferedImageFromSprite(API.GetSprite(LVL_ICON)) val imageContainer = Panel(FlowLayout()).apply { - preferredSize = IMAGE_SIZE - maximumSize = IMAGE_SIZE - minimumSize = IMAGE_SIZE - size = IMAGE_SIZE + preferredSize = Dimension(bufferedImageSprite.width, bufferedImageSprite.height) + maximumSize = preferredSize + minimumSize = preferredSize + size = preferredSize } bufferedImageSprite.let { image -> @@ -182,7 +186,7 @@ object XPTrackerView { imageContainer.size = Dimension(bufferedImageSprite.width, bufferedImageSprite.height) imageContainer.revalidate() - if(plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if(focusedView == VIEW_NAME) imageContainer.repaint() } @@ -221,7 +225,7 @@ object XPTrackerView { this.font = font }, xpPerHourLabel = xpPerHourLabel, - progressBar = ProgressBar(0.0, Color(150, 50, 50)), + progressBar = ProgressBar(0.0, Color.BLACK), // Unused totalXpGained = 0, startTime = System.currentTimeMillis(), previousXp = 0, @@ -272,25 +276,13 @@ object XPTrackerView { val rFont = Font("RuneScape Small", Font.TRUETYPE_FONT, 16) - popupMenu.background = Color(45, 45, 45) + popupMenu.background = POPUP_BACKGROUND // Create menu items with custom font and colors val menuItem1 = JMenuItem("Reset Tracker").apply { font = rFont // Set custom font - background = Color(45, 45, 45) // Dark background for item - foreground = Color(220, 220, 220) // Light text color for item - } - - val menuItem2 = JMenuItem("Option 2").apply { - font = rFont - background = Color(45, 45, 45) - foreground = Color(220, 220, 220) - } - - val menuItem3 = JMenuItem("Option 3").apply { - font = rFont - background = Color(45, 45, 45) - foreground = Color(220, 220, 220) + background = POPUP_BACKGROUND // Dark background for item + foreground = POPUP_FOREGROUND // Light text color for item } // Add menu items to the popup menu @@ -333,7 +325,7 @@ object XPTrackerView { imageContainer.size = Dimension(image.width, image.height) // Ensure container respects the image size imageContainer.revalidate() - if(plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if(focusedView == VIEW_NAME) imageContainer.repaint() } @@ -374,7 +366,7 @@ object XPTrackerView { val levelPanel = Panel().apply { layout = BorderLayout(5, 0) - background = Color(43, 43, 43) + background = WIDGET_COLOR } val progressBarPanel = ProgressBar(0.0, getProgressBarColor(skillId)).apply { @@ -393,7 +385,7 @@ object XPTrackerView { widgetPanel.add(levelPanel, BorderLayout.SOUTH) widgetPanel.revalidate() - if(plugin.StateManager.focusedView == "XP_TRACKER_VIEW") + if(focusedView == VIEW_NAME) widgetPanel.repaint() return XPWidget( diff --git a/plugin-playground/src/main/kotlin/KondoKit/plugin.kt b/plugin-playground/src/main/kotlin/KondoKit/plugin.kt index 046c0fe..daf92c1 100644 --- a/plugin-playground/src/main/kotlin/KondoKit/plugin.kt +++ b/plugin-playground/src/main/kotlin/KondoKit/plugin.kt @@ -4,6 +4,8 @@ import KondoKit.Constants.COMBAT_LVL_SPRITE import KondoKit.Helpers.formatHtmlLabelText import KondoKit.Helpers.formatNumber import KondoKit.Helpers.getSpriteId +import KondoKit.Helpers.showAlert +import KondoKit.Helpers.showToast import KondoKit.HiscoresView.createHiscoreSearchView import KondoKit.HiscoresView.hiScoreView import KondoKit.LootTrackerView.BAG_ICON @@ -26,6 +28,7 @@ import KondoKit.XPTrackerView.wrappedWidget import KondoKit.XPTrackerView.xpTrackerView import KondoKit.XPTrackerView.xpWidgets import KondoKit.plugin.StateManager.focusedView +import com.sun.org.apache.xpath.internal.operations.Bool import plugin.Plugin import plugin.api.* import plugin.api.API.* @@ -52,11 +55,26 @@ class plugin : Plugin() { companion object { val WIDGET_SIZE = Dimension(220, 50) val TOTAL_XP_WIDGET_SIZE = Dimension(220, 30) - val IMAGE_SIZE = Dimension(20, 20) - val WIDGET_COLOR = Color(30, 30, 30) - val VIEW_BACKGROUND_COLOR = Color(40, 40, 40) - val primaryColor = Color(165, 165, 165) // Color for "XP Gained:" - val secondaryColor = Color(255, 255, 255) // Color for "0" + val IMAGE_SIZE = Dimension(25, 23) + + // Default Theme Colors + var WIDGET_COLOR = Color(30, 30, 30) + var TITLE_BAR_COLOR = Color(21, 21, 21) + var VIEW_BACKGROUND_COLOR = Color(40, 40, 40) + var primaryColor = Color(165, 165, 165) // Color for "XP Gained:" + var secondaryColor = Color(255, 255, 255) // Color for "0" + var POPUP_BACKGROUND = Color(45, 45, 45) + var POPUP_FOREGROUND = Color(220, 220, 220) + var TOOLTIP_BACKGROUND = Color(50,50,50) + var SCROLL_BAR_COLOR = Color(64, 64, 64) + var PROGRESS_BAR_FILL = Color(61, 56, 49) + var NAV_TINT: Color? = null + var NAV_GREYSCALE = false + + var appliedTheme = ThemeType.RUNELITE + + @Exposed("Theme colors for KondoKit, requires a relaunch to apply.") + var theme = ThemeType.RUNELITE @Exposed("Default: true, Use Local JSON or the prices from the Live/Stable server API") var useLiveGEPrices = true @@ -90,6 +108,7 @@ class plugin : Plugin() { private var initialized = false; private var lastClickTime = 0L private var lastUIOffset = 0 + private const val HIDDEN_VIEW = "HIDDEN"; private val drawActions = mutableListOf<() -> Unit>() fun registerDrawAction(action: () -> Unit) { @@ -159,6 +178,14 @@ class plugin : Plugin() { fun OnKondoValueUpdated(){ StoreData("kondoUseRemoteGE", useLiveGEPrices) + StoreData("kondoTheme", theme.toString()) + if(appliedTheme != theme) { + showAlert( + "KondoKit Theme changes require a relaunch.", + "KondoKit", + JOptionPane.INFORMATION_MESSAGE + ) + } StoreData("kondoPlayerXPMultiplier", playerXPMultiplier) LootTrackerView.gePriceMap = LootTrackerView.loadGEPrices() StoreData("kondoLaunchMinimized", launchMinimized) @@ -191,7 +218,7 @@ class plugin : Plugin() { private fun searchHiscore(username: String): Runnable { return Runnable { - setActiveView("HISCORE_SEARCH_VIEW") + setActiveView(HiscoresView.VIEW_NAME) val customSearchField = hiScoreView?.let { HiscoresView.CustomSearchField(it) } customSearchField?.searchPlayer(username) ?: run { @@ -237,7 +264,7 @@ class plugin : Plugin() { xpTrackerView?.add(Box.createVerticalStrut(5)) xpTrackerView?.revalidate() - if(focusedView == "XP_TRACKER_VIEW") + if(focusedView == XPTrackerView.VIEW_NAME) xpTrackerView?.repaint() updateWidget(xpWidget, xp) @@ -290,6 +317,10 @@ class plugin : Plugin() { if (frame != null) { loadFont() + val themeIndex = (GetData("kondoTheme") as? String) ?: "RUNELITE" + theme = ThemeType.valueOf(themeIndex) + applyTheme(getTheme(theme)) + appliedTheme = theme try { UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel") @@ -337,10 +368,10 @@ class plugin : Plugin() { createLootTrackerView() createReflectiveEditorView() - mainContentPanel.add(ScrollablePanel(xpTrackerView!!), "XP_TRACKER_VIEW") - mainContentPanel.add(ScrollablePanel(hiScoreView!!), "HISCORE_SEARCH_VIEW") - mainContentPanel.add(ScrollablePanel(lootTrackerView!!), "LOOT_TRACKER_VIEW") - mainContentPanel.add(ScrollablePanel(reflectiveEditorView!!), "REFLECTIVE_EDITOR_VIEW") + mainContentPanel.add(ScrollablePanel(xpTrackerView!!), XPTrackerView.VIEW_NAME) + mainContentPanel.add(ScrollablePanel(hiScoreView!!), HiscoresView.VIEW_NAME) + mainContentPanel.add(ScrollablePanel(lootTrackerView!!), LootTrackerView.VIEW_NAME) + mainContentPanel.add(ScrollablePanel(reflectiveEditorView!!), ReflectiveEditorView.VIEW_NAME) val navPanel = Panel().apply { layout = BoxLayout(this, BoxLayout.Y_AXIS) @@ -348,10 +379,10 @@ class plugin : Plugin() { preferredSize = Dimension(NAVBAR_WIDTH, frame.height) } - navPanel.add(createNavButton(LVL_ICON, "XP_TRACKER_VIEW")) - navPanel.add(createNavButton(MAG_SPRITE, "HISCORE_SEARCH_VIEW")) - navPanel.add(createNavButton(LOOT_ICON, "LOOT_TRACKER_VIEW")) - navPanel.add(createNavButton(WRENCH_ICON, "REFLECTIVE_EDITOR_VIEW")) + navPanel.add(createNavButton(LVL_ICON, XPTrackerView.VIEW_NAME)) + navPanel.add(createNavButton(MAG_SPRITE, HiscoresView.VIEW_NAME)) + navPanel.add(createNavButton(LOOT_ICON, LootTrackerView.VIEW_NAME)) + navPanel.add(createNavButton(WRENCH_ICON, ReflectiveEditorView.VIEW_NAME)) var rightPanel = Panel(BorderLayout()).apply { add(mainContentPanel, BorderLayout.CENTER) @@ -370,9 +401,9 @@ class plugin : Plugin() { rightPanelWrapper?.let { frame.add(it, BorderLayout.EAST) } if(!launchMinimized){ - setActiveView("XP_TRACKER_VIEW") + setActiveView(XPTrackerView.VIEW_NAME) } else { - setActiveView("HIDDEN") + setActiveView(HIDDEN_VIEW) } initialized = true pluginsReloaded = true @@ -410,7 +441,7 @@ class plugin : Plugin() { private fun setActiveView(viewName: String) { // Handle the visibility of the main content panel - if (viewName == "HIDDEN") { + if (viewName == HIDDEN_VIEW) { mainContentPanel.isVisible = false } else { if (!mainContentPanel.isVisible) { @@ -434,7 +465,7 @@ class plugin : Plugin() { } private fun createNavButton(spriteId: Int, viewName: String): JPanel { - val bufferedImageSprite = getBufferedImageFromSprite(GetSprite(spriteId)) + val bufferedImageSprite = getBufferedImageFromSprite(GetSprite(spriteId), NAV_TINT, NAV_GREYSCALE) val buttonSize = Dimension(NAVBAR_WIDTH, 32) val imageSize = Dimension((bufferedImageSprite.width / 1.2f).toInt(), (bufferedImageSprite.height / 1.2f).toInt()) val cooldownDuration = 100L @@ -536,4 +567,103 @@ class plugin : Plugin() { object StateManager { var focusedView: String = "" } + + fun applyTheme(theme: Theme) { + WIDGET_COLOR = theme.widgetColor + TITLE_BAR_COLOR = theme.titleBarColor + VIEW_BACKGROUND_COLOR = theme.viewBackgroundColor + primaryColor = theme.primaryColor + secondaryColor = theme.secondaryColor + POPUP_BACKGROUND = theme.popupBackground + POPUP_FOREGROUND = theme.popupForeground + TOOLTIP_BACKGROUND = theme.tooltipBackground + SCROLL_BAR_COLOR = theme.scrollBarColor + PROGRESS_BAR_FILL = theme.progressBarFill + NAV_TINT = theme.navTint + NAV_GREYSCALE = theme.navGreyScale + } + + enum class ThemeType { + RUNELITE, + DARKER_RUNELITE, + SARADOMIN, + ORION, + } + + fun getTheme(themeType: ThemeType): Theme { + return when (themeType) { + ThemeType.RUNELITE -> Theme( + widgetColor = Color(30, 30, 30), + titleBarColor = Color(21, 21, 21), + viewBackgroundColor = Color(40, 40, 40), + primaryColor = Color(165, 165, 165), + secondaryColor = Color(255, 255, 255), + popupBackground = Color(45, 45, 45), + popupForeground = Color(220, 220, 220), + tooltipBackground = Color(50, 50, 50), + scrollBarColor = Color(64, 64, 64), + progressBarFill = Color(61, 56, 49), + navTint = null, + navGreyScale = false + ) + ThemeType.DARKER_RUNELITE -> Theme( + widgetColor = Color(15, 15, 15), // Darker widget backgrounds + titleBarColor = Color(10, 10, 10), // Even darker title bar + viewBackgroundColor = Color(20, 20, 20), // Very dark background for the view + primaryColor = Color(140, 140, 140), // Darker shade for primary text + secondaryColor = Color(210, 210, 210), // Slightly muted white for secondary text + popupBackground = Color(25, 25, 25), // Very dark popup backgrounds + popupForeground = Color(200, 200, 200), // Slightly muted light gray for popup text + tooltipBackground = Color(30, 30, 30), // Darker tooltips background + scrollBarColor = Color(40, 40, 40), // Darker scroll bar + progressBarFill = Color(45, 40, 35), // Darker progress bar fill + navTint = null, //Color(20, 20, 20, 60), // No specific tint applied + navGreyScale = false // Navigation retains color (if applicable) + ) + ThemeType.ORION -> Theme( + widgetColor = Color(50, 50, 50), // Darker gray for widget backgrounds + titleBarColor = Color(35, 35, 35), // Very dark gray for the title bar + viewBackgroundColor = Color(60, 60, 60), // Medium-dark gray for view background + primaryColor = Color(180, 180, 180), // Lighter gray for primary text or highlights + secondaryColor = Color(210, 210, 210), // Light gray for secondary text + popupBackground = Color(45, 45, 45), // Dark gray for popup backgrounds + popupForeground = Color(230, 230, 230), // Light gray for popup text + tooltipBackground = Color(55, 55, 55), // Slightly darker gray for tooltips + scrollBarColor = Color(75, 75, 75), // Dark gray for scroll bars + progressBarFill = Color(100, 100, 100), // Medium gray for progress bar fill + navTint = null, + navGreyScale = true + ) + ThemeType.SARADOMIN -> Theme( + widgetColor = Color(75, 60, 45), + titleBarColor = Color(60, 48, 36), + viewBackgroundColor = Color(95, 76, 58), + primaryColor = Color(180, 150, 120), + secondaryColor = Color(230, 210, 190), + popupBackground = Color(70, 56, 42), + popupForeground = Color(220, 200, 180), + tooltipBackground = Color(80, 65, 50), + scrollBarColor = Color(100, 85, 70), + progressBarFill = Color(130, 110, 90), + navTint = null, + navGreyScale = false + ) + } + } + + + data class Theme( + val widgetColor: Color, + val titleBarColor: Color, + val viewBackgroundColor: Color, + val primaryColor: Color, + val secondaryColor: Color, + val popupBackground: Color, + val popupForeground: Color, + val tooltipBackground: Color, + val scrollBarColor: Color, + val progressBarFill: Color, + val navTint: Color?, + val navGreyScale: Boolean + ) }