mirror of
https://github.com/scorpion-26/gBar.git
synced 2024-11-24 12:12:09 +00:00
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:
parent
906a1259c3
commit
a12cb9af5d
6 changed files with 39 additions and 1 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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));
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue