Add audio revealer

This adds an option to hide the audio slider behind a revealer, which
works similar to the sensors.
For the ping: https://github.com/scorpion-26/gBar/issues/5
This commit is contained in:
scorpion-26 2023-02-04 15:48:06 +01:00
commit c0038d83b8
6 changed files with 83 additions and 14 deletions

View file

@ -31,3 +31,6 @@ DefaultWorkspaceSymbol: 
# Forces the time to be centered. # Forces the time to be centered.
# This can cause issues, if there is not enough space on screen (e.g. when opening the text) # This can cause issues, if there is not enough space on screen (e.g. when opening the text)
CenterTime: true CenterTime: true
# Sets the audio slider to be on reveal (Just like the sensors) when true. Only affects the bar.
AudioRevealer: false

View file

@ -221,15 +221,8 @@ namespace Bar
void WidgetAudio(Widget& parent) void WidgetAudio(Widget& parent)
{ {
auto box = Widget::Create<Box>(); auto widgetAudioSlider = [](Widget& parent)
box->SetSpacing({8, false});
box->SetHorizontalTransform({-1, false, Alignment::Right});
{ {
auto icon = Widget::Create<Text>();
icon->SetClass("audio-icon");
icon->SetText("");
DynCtx::audioIcon = icon.get();
auto slider = Widget::Create<Slider>(); auto slider = Widget::Create<Slider>();
slider->SetOrientation(Orientation::Horizontal); slider->SetOrientation(Orientation::Horizontal);
slider->SetHorizontalTransform({100, true, Alignment::Fill}); slider->SetHorizontalTransform({100, true, Alignment::Fill});
@ -239,11 +232,60 @@ namespace Bar
slider->OnValueChange(DynCtx::OnChangeVolume); slider->OnValueChange(DynCtx::OnChangeVolume);
slider->SetRange({0, 1, 0.01}); slider->SetRange({0, 1, 0.01});
box->AddChild(std::move(slider)); parent.AddChild(std::move(slider));
box->AddChild(std::move(icon)); };
}
parent.AddChild(std::move(box)); auto widgetAudioBody = [&widgetAudioSlider](Widget& parent)
{
auto box = Widget::Create<Box>();
box->SetSpacing({8, false});
box->SetHorizontalTransform({-1, true, Alignment::Right});
{
auto icon = Widget::Create<Text>();
icon->SetClass("audio-icon");
icon->SetText("");
DynCtx::audioIcon = icon.get();
if (Config::Get().audioRevealer)
{
EventBox& eventBox = (EventBox&)parent;
auto revealer = Widget::Create<Revealer>();
revealer->SetTransition({TransitionType::SlideLeft, 500});
// Add event to eventbox for the revealer to open
eventBox.SetEventFn(
[slideRevealer = revealer.get()](EventBox&, bool hovered)
{
slideRevealer->SetRevealed(hovered);
});
{
widgetAudioSlider(*revealer);
}
box->AddChild(std::move(revealer));
}
else
{
// Straight forward
widgetAudioSlider(*box);
}
box->AddChild(std::move(icon));
}
parent.AddChild(std::move(box));
};
if (Config::Get().audioRevealer)
{
// Need an EventBox
auto eventBox = Widget::Create<EventBox>();
widgetAudioBody(*eventBox);
parent.AddChild(std::move(eventBox));
}
else
{
// Just invoke it.
widgetAudioBody(parent);
}
} }
#ifdef WITH_BLUEZ #ifdef WITH_BLUEZ

View file

@ -123,7 +123,6 @@ void Config::Load()
AddConfigVar("LockCommand", config.lockCommand, lineView, foundProperty); AddConfigVar("LockCommand", config.lockCommand, lineView, foundProperty);
AddConfigVar("ExitCommand", config.exitCommand, lineView, foundProperty); AddConfigVar("ExitCommand", config.exitCommand, lineView, foundProperty);
AddConfigVar("BatteryFolder", config.batteryFolder, lineView, foundProperty); AddConfigVar("BatteryFolder", config.batteryFolder, lineView, foundProperty);
AddConfigVar("CenterTime", config.centerTime, lineView, foundProperty);
AddConfigVar("DefaultWorkspaceSymbol", config.defaultWorkspaceSymbol, lineView, foundProperty); AddConfigVar("DefaultWorkspaceSymbol", config.defaultWorkspaceSymbol, lineView, foundProperty);
for (int i = 1; i < 10; i++) for (int i = 1; i < 10; i++)
{ {
@ -131,6 +130,9 @@ void Config::Load()
AddConfigVar("WorkspaceSymbol-" + std::to_string(i), config.workspaceSymbols[i - 1], lineView, foundProperty); AddConfigVar("WorkspaceSymbol-" + std::to_string(i), config.workspaceSymbols[i - 1], lineView, foundProperty);
} }
AddConfigVar("CenterTime", config.centerTime, lineView, foundProperty);
AddConfigVar("AudioRevealer", config.audioRevealer, lineView, foundProperty);
if (foundProperty == false) if (foundProperty == false)
{ {
LOG("Warning: unknown config var: " << line); LOG("Warning: unknown config var: " << line);

View file

@ -14,6 +14,7 @@ public:
std::string defaultWorkspaceSymbol = ""; std::string defaultWorkspaceSymbol = "";
bool centerTime = true; bool centerTime = true;
bool audioRevealer = false;
static void Load(); static void Load();
static const Config& Get(); static const Config& Get();

View file

@ -131,6 +131,11 @@ void Widget::SetVisible(bool visible)
gtk_widget_set_visible(m_Widget, visible); gtk_widget_set_visible(m_Widget, visible);
} }
void Widget::PropagateToParent(GdkEvent* event)
{
gtk_propagate_event(gtk_widget_get_parent(m_Widget), event);
}
void Widget::ApplyPropertiesToWidget() void Widget::ApplyPropertiesToWidget()
{ {
// Apply style // Apply style
@ -189,6 +194,7 @@ void EventBox::SetEventFn(std::function<void(EventBox&, bool)>&& fn)
void EventBox::Create() void EventBox::Create()
{ {
m_Widget = gtk_event_box_new(); m_Widget = gtk_event_box_new();
gtk_event_box_set_above_child((GtkEventBox*)m_Widget, false);
auto enter = [](GtkWidget*, GdkEventCrossing*, gpointer data) -> gboolean auto enter = [](GtkWidget*, GdkEventCrossing*, gpointer data) -> gboolean
{ {
EventBox* box = (EventBox*)data; EventBox* box = (EventBox*)data;
@ -324,11 +330,12 @@ void Text::Create()
void Button::Create() void Button::Create()
{ {
m_Widget = gtk_button_new_with_label(m_Text.c_str()); m_Widget = gtk_button_new_with_label(m_Text.c_str());
auto clickFn = [](UNUSED GtkButton* gtkButton, void* data) auto clickFn = [](UNUSED GtkButton* gtkButton, void* data) -> gboolean
{ {
Button* button = (Button*)data; Button* button = (Button*)data;
if (button->m_OnClick) if (button->m_OnClick)
button->m_OnClick(*button); button->m_OnClick(*button);
return GDK_EVENT_STOP;
}; };
g_signal_connect(m_Widget, "clicked", G_CALLBACK(+clickFn), this); g_signal_connect(m_Widget, "clicked", G_CALLBACK(+clickFn), this);
ApplyPropertiesToWidget(); ApplyPropertiesToWidget();
@ -386,5 +393,18 @@ void Slider::Create()
return false; return false;
}; };
g_signal_connect(m_Widget, "change-value", G_CALLBACK(+changedFn), this); g_signal_connect(m_Widget, "change-value", G_CALLBACK(+changedFn), this);
// Propagate events to any parent eventboxes
auto propagate = [](GtkWidget*, GdkEventCrossing* data, gpointer widget) -> gboolean
{
Slider* slider = (Slider*)widget;
// Seems to be necessary. For revealers to work properly, we need to notify it of the event through propagation.
// Automatic propagation with GDK_EVENT_PROPAGATE doesn't work for some reason
slider->PropagateToParent((GdkEvent*)data);
return GDK_EVENT_PROPAGATE;
};
gtk_widget_set_events(m_Widget, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_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(); ApplyPropertiesToWidget();
} }

View file

@ -141,6 +141,7 @@ public:
void SetVisible(bool visible); void SetVisible(bool visible);
protected: protected:
void PropagateToParent(GdkEvent* event);
void ApplyPropertiesToWidget(); void ApplyPropertiesToWidget();
GtkWidget* m_Widget = nullptr; GtkWidget* m_Widget = nullptr;