From a12cb9af5d170ebc55c7b1fd5d0ea8f63abb82cc Mon Sep 17 00:00:00 2001 From: scorpion-26 <58082714+scorpion-26@users.noreply.github.com> Date: Mon, 20 Feb 2023 23:04:37 +0100 Subject: [PATCH] AudioSlider: Add option for scroll speed There seems to be a floating point error somewhere though, since sometimes it goes up by AudioScrollSpeed - 1 instead of AudioScrollSpeed... For the ping https://github.com/scorpion-26/gBar/issues/5 --- data/config | 3 +++ src/Bar.cpp | 1 + src/Config.cpp | 2 ++ src/Config.h | 2 ++ src/Widget.cpp | 30 +++++++++++++++++++++++++++++- src/Widget.h | 2 ++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/data/config b/data/config index a1422b3..273f2f3 100644 --- a/data/config +++ b/data/config @@ -41,6 +41,9 @@ CenterTime: true # Sets the audio slider to be on reveal (Just like the sensors) when true. Only affects the bar. AudioRevealer: false +# Sets the rate of change of the slider on each scroll. In Percent +AudioScrollSpeed: 5 + # The network adapter to use. You can query /sys/class/net for all possible values NetworkAdapter: eno1 diff --git a/src/Bar.cpp b/src/Bar.cpp index d4982fa..1c0914d 100644 --- a/src/Bar.cpp +++ b/src/Bar.cpp @@ -268,6 +268,7 @@ namespace Bar slider->AddTimer(DynCtx::UpdateAudio, DynCtx::updateTimeFast); slider->OnValueChange(DynCtx::OnChangeVolume); slider->SetRange({0, 1, 0.01}); + slider->SetScrollSpeed((double)Config::Get().audioScrollSpeed / 100.); parent.AddChild(std::move(slider)); }; diff --git a/src/Config.cpp b/src/Config.cpp index 754c932..6bdec86 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -142,6 +142,8 @@ void Config::Load() AddConfigVar("MinDownloadBytes", config.minDownloadBytes, lineView, foundProperty); AddConfigVar("MaxDownloadBytes", config.maxDownloadBytes, lineView, foundProperty); + AddConfigVar("AudioScrollSpeed", config.audioScrollSpeed, lineView, foundProperty); + if (foundProperty == false) { LOG("Warning: unknown config var: " << lineView); diff --git a/src/Config.h b/src/Config.h index ab11249..dfa711a 100644 --- a/src/Config.h +++ b/src/Config.h @@ -26,6 +26,8 @@ public: uint32_t minDownloadBytes = 0; // Bottom limit of the network widgets download. Everything above it is considered "under" uint32_t maxDownloadBytes = 10 * 1024 * 1024; // 10 MiB Top limit of the network widgets download. Everything above it is considered "over" + uint32_t audioScrollSpeed = 5; // 5% each scroll + static void Load(); static const Config& Get(); }; diff --git a/src/Widget.cpp b/src/Widget.cpp index 8702632..9eceb21 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -550,6 +550,11 @@ void Slider::SetInverted(bool inverted) m_Inverted = inverted; } +void Slider::SetScrollSpeed(double speed) +{ + m_ScrollSpeed = speed; +} + void Slider::Create() { m_Widget = gtk_scale_new_with_range(Utils::ToGtkOrientation(m_Orientation), m_Range.min, m_Range.max, m_Range.step); @@ -564,6 +569,29 @@ void Slider::Create() }; g_signal_connect(m_Widget, "change-value", G_CALLBACK(+changedFn), this); + auto scroll = [](GtkWidget*, GdkEventScroll* event, void* data) -> gboolean + { + Slider* slider = (Slider*)data; + double value = gtk_range_get_value((GtkRange*)slider->m_Widget); + // Range generates a 'smooth' event. + if (event->delta_y >= 0) + { + value -= slider->m_ScrollSpeed; + slider->SetValue(value); + if (slider->m_OnValueChange) + slider->m_OnValueChange(*slider, value); + } + else if (event->delta_y <= 0) + { + value += slider->m_ScrollSpeed; + slider->SetValue(value); + if (slider->m_OnValueChange) + slider->m_OnValueChange(*slider, value); + } + return GDK_EVENT_STOP; + }; + g_signal_connect(m_Widget, "scroll-event", G_CALLBACK(+scroll), this); + // Propagate events to any parent eventboxes auto propagate = [](GtkWidget*, GdkEventCrossing* data, gpointer widget) -> gboolean { @@ -573,7 +601,7 @@ void Slider::Create() slider->PropagateToParent((GdkEvent*)data); return GDK_EVENT_PROPAGATE; }; - gtk_widget_set_events(m_Widget, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + gtk_widget_set_events(m_Widget, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_SCROLL_MASK); g_signal_connect(m_Widget, "enter-notify-event", G_CALLBACK(+propagate), this); g_signal_connect(m_Widget, "leave-notify-event", G_CALLBACK(+propagate), this); ApplyPropertiesToWidget(); diff --git a/src/Widget.h b/src/Widget.h index a479f97..b09c8d4 100644 --- a/src/Widget.h +++ b/src/Widget.h @@ -314,6 +314,7 @@ public: void SetOrientation(Orientation orientation); void SetInverted(bool flipped); void SetRange(SliderRange range); + void SetScrollSpeed(double speed); void OnValueChange(std::function&& callback); @@ -323,5 +324,6 @@ private: Orientation m_Orientation = Orientation::Horizontal; SliderRange m_Range; bool m_Inverted = false; + double m_ScrollSpeed = 5. / 100.; // 5% std::function m_OnValueChange; };