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
This commit is contained in:
scorpion-26 2023-02-20 23:04:37 +01:00
parent 906a1259c3
commit a12cb9af5d
6 changed files with 39 additions and 1 deletions

View file

@ -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

View file

@ -268,6 +268,7 @@ namespace Bar
slider->AddTimer<Slider>(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));
};

View file

@ -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);

View file

@ -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();
};

View file

@ -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();

View file

@ -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<void(Slider&, double)>&& 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<void(Slider&, double)> m_OnValueChange;
};