diff --git a/src/main/resources/ocelot/desktop/ocelot.conf b/src/main/resources/ocelot/desktop/ocelot.conf index ec95bd8..a42b2ff 100644 --- a/src/main/resources/ocelot/desktop/ocelot.conf +++ b/src/main/resources/ocelot/desktop/ocelot.conf @@ -52,6 +52,11 @@ ocelot { # If true, screen nodes will render mini-previews of their content in realtime # Otherwise, content will be shown only in windows renderScreenDataOnNodes: true + + # Delay before a tooltip appears when hovering over items (in seconds) + tooltipDelayItem: 0.001 + # Delay before a tooltip appears when hovering over UI elements (in seconds) + tooltipDelayUI: 0.3 } render { diff --git a/src/main/scala/ocelot/desktop/Settings.scala b/src/main/scala/ocelot/desktop/Settings.scala index 5089a4c..57bb15c 100644 --- a/src/main/scala/ocelot/desktop/Settings.scala +++ b/src/main/scala/ocelot/desktop/Settings.scala @@ -50,6 +50,8 @@ class Settings(val config: Config) extends SettingsData { saveOnExit = config.getBooleanOrElse("ocelot.workspace.saveOnExit", default = true) openLastWorkspace = config.getBooleanOrElse("ocelot.workspace.openLastWorkspace", default = true) renderScreenDataOnNodes = config.getBooleanOrElse("ocelot.workspace.renderScreenDataOnNodes", default = true) + tooltipDelayItem = (config.getDoubleOrElse("ocelot.workspace.tooltipDelayItem", 0.001) max 0.001 min 2.0).toFloat + tooltipDelayUI = (config.getDoubleOrElse("ocelot.workspace.tooltipDelayUI", 0.3) max 0.001 min 2.0).toFloat screenWindowMipmap = config.getBooleanOrElse("ocelot.render.screenWindowMipmap", default = true) } @@ -180,6 +182,8 @@ object Settings extends Logging { .withValuePreserveOrigin("ocelot.workspace.saveOnExit", settings.saveOnExit) .withValuePreserveOrigin("ocelot.workspace.openLastWorkspace", settings.openLastWorkspace) .withValuePreserveOrigin("ocelot.workspace.renderScreenDataOnNodes", settings.renderScreenDataOnNodes) + .withValuePreserveOrigin("ocelot.workspace.tooltipDelayItem", settings.tooltipDelayItem) + .withValuePreserveOrigin("ocelot.workspace.tooltipDelayUI", settings.tooltipDelayUI) if (!Files.exists(path.getParent)) Files.createDirectory(path.getParent) diff --git a/src/main/scala/ocelot/desktop/ui/widget/settings/UISettingsTab.scala b/src/main/scala/ocelot/desktop/ui/widget/settings/UISettingsTab.scala index 6fba99c..c62e230 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/settings/UISettingsTab.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/settings/UISettingsTab.scala @@ -4,7 +4,8 @@ import ocelot.desktop.Settings import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.IconSource import ocelot.desktop.ui.UiHandler -import ocelot.desktop.ui.widget.{Checkbox, PaddingBox, Slider} +import ocelot.desktop.ui.widget.{Checkbox, Label, PaddingBox, Slider} +import ocelot.desktop.util.MathUtils.roundAt class UISettingsTab extends SettingsTab { override val icon: IconSource = IconSource.SettingsUI @@ -90,4 +91,30 @@ class UISettingsTab extends SettingsTab { applySettings() } }, Padding2D(bottom = 8)) + + children :+= new PaddingBox(new Label("Tooltip delays:"), Padding2D(bottom = 8)) + + children :+= new PaddingBox(new Slider(Settings.get.tooltipDelayItem / 2.0f, "Items") { + override def minimumSize: Size2D = Size2D(512, 24) + + private def convert(value: Float): Float = roundAt(2)(value * 2.0f).toFloat + override def formatText: String = f"$text: ${convert(value)}%.2f s" + + override def onValueFinal(value: Float): Unit = { + // we are treating 0 as 0.001 to keep the legacy behaviour + Settings.get.tooltipDelayItem = convert(value) max 0.001f min 2.0f + } + }, Padding2D(bottom = 8)) + + children :+= new PaddingBox(new Slider(Settings.get.tooltipDelayUI / 2.0f, "UI Elements") { + override def minimumSize: Size2D = Size2D(512, 24) + + private def convert(value: Float): Float = roundAt(2)(value * 2.0f).toFloat + override def formatText: String = f"$text: ${convert(value)}%.2f s" + + override def onValueFinal(value: Float): Unit = { + // we are treating 0 as 0.001 to keep the legacy behaviour + Settings.get.tooltipDelayUI = convert(value) max 0.001f min 2.0f + } + }, Padding2D(bottom = 16)) } diff --git a/src/main/scala/ocelot/desktop/ui/widget/tooltip/ItemTooltip.scala b/src/main/scala/ocelot/desktop/ui/widget/tooltip/ItemTooltip.scala index 0f8760a..5018475 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/tooltip/ItemTooltip.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/tooltip/ItemTooltip.scala @@ -1,10 +1,13 @@ package ocelot.desktop.ui.widget.tooltip +import ocelot.desktop.Settings import ocelot.desktop.color.Color import ocelot.desktop.geometry.Padding2D import ocelot.desktop.ui.widget.Label class ItemTooltip extends Tooltip { + override val DelayTime: Float = Settings.get.tooltipDelayItem + override def bodyPadding: Padding2D = Padding2D.equal(5) def addLine(_text: String, _color: Color = Color.Grey): Unit = { diff --git a/src/main/scala/ocelot/desktop/ui/widget/tooltip/LabelTooltip.scala b/src/main/scala/ocelot/desktop/ui/widget/tooltip/LabelTooltip.scala index 0c69340..04e18c7 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/tooltip/LabelTooltip.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/tooltip/LabelTooltip.scala @@ -1,11 +1,12 @@ package ocelot.desktop.ui.widget.tooltip +import ocelot.desktop.Settings import ocelot.desktop.color.Color import ocelot.desktop.geometry.Padding2D import ocelot.desktop.ui.widget.Label class LabelTooltip(text: String) extends Tooltip { - override val DelayTime: Float = 1.0f + override val DelayTime: Float = Settings.get.tooltipDelayUI for (line <- text.split("\n")) { body.children :+= new Label { diff --git a/src/main/scala/ocelot/desktop/util/MathUtils.scala b/src/main/scala/ocelot/desktop/util/MathUtils.scala new file mode 100644 index 0000000..bb80cd7 --- /dev/null +++ b/src/main/scala/ocelot/desktop/util/MathUtils.scala @@ -0,0 +1,8 @@ +package ocelot.desktop.util + +object MathUtils { + def roundAt(p: Int)(n: Double): Double = { + val s = math pow (10, p) + (math round n * s) / s + } +} diff --git a/src/main/scala/ocelot/desktop/util/SettingsData.scala b/src/main/scala/ocelot/desktop/util/SettingsData.scala index d99bbe3..fe1162d 100644 --- a/src/main/scala/ocelot/desktop/util/SettingsData.scala +++ b/src/main/scala/ocelot/desktop/util/SettingsData.scala @@ -41,6 +41,8 @@ class SettingsData { var saveOnExit: Boolean = true var openLastWorkspace: Boolean = true var renderScreenDataOnNodes: Boolean = true + var tooltipDelayItem: Float = 0.001f + var tooltipDelayUI: Float = 0.3f var screenWindowMipmap: Boolean = true