mirror of
https://github.com/scorpion-26/gBar.git
synced 2024-11-22 03:02:49 +00:00
Add options for reordering widget layout.
Partially implements https://github.com/scorpion-26/gBar/issues/48 and https://github.com/scorpion-26/gBar/issues/20
This commit is contained in:
parent
b19b091c92
commit
996a6611ad
6 changed files with 303 additions and 72 deletions
12
data/config
12
data/config
|
@ -7,6 +7,18 @@
|
||||||
# - After the ':'
|
# - After the ':'
|
||||||
# - After the value
|
# - After the value
|
||||||
|
|
||||||
|
# The following three options control the ordering of the widgets.
|
||||||
|
# Reordering can cause slight margin inconsistencies,
|
||||||
|
# so it is recommend to only make minor adjustments to the default layout.
|
||||||
|
# Adding the same widget multiple times to the layout is *not* supported and will cause issues.
|
||||||
|
|
||||||
|
# Widgets to show on the left side
|
||||||
|
WidgetsLeft: [Workspaces]
|
||||||
|
# Widgets to center
|
||||||
|
WidgetsCenter: [Time]
|
||||||
|
# Widgets to display on the right side
|
||||||
|
WidgetsRight: [Tray, Packages, Audio, Bluetooth, Network, Disk, VRAM, GPU, RAM, CPU, Battery, Power]
|
||||||
|
|
||||||
# The CPU sensor to use
|
# The CPU sensor to use
|
||||||
CPUThermalZone: /sys/devices/pci0000:00/0000:00:18.3/hwmon/hwmon2/temp1_input
|
CPUThermalZone: /sys/devices/pci0000:00/0000:00:18.3/hwmon/hwmon2/temp1_input
|
||||||
|
|
||||||
|
|
331
src/Bar.cpp
331
src/Bar.cpp
|
@ -358,19 +358,47 @@ namespace Bar
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetSensor(Widget& parent, TimerCallback<Sensor>&& callback, const std::string& sensorClass, const std::string& textClass, Text*& textPtr)
|
enum Side
|
||||||
|
{
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
Center
|
||||||
|
};
|
||||||
|
|
||||||
|
Alignment SideToAlignment(Side side)
|
||||||
|
{
|
||||||
|
switch (side)
|
||||||
|
{
|
||||||
|
case Left: return Alignment::Left;
|
||||||
|
case Right: return Alignment::Right;
|
||||||
|
case Center: return Alignment::Fill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TransitionType SideToDefaultTransition(Side side)
|
||||||
|
{
|
||||||
|
switch (side)
|
||||||
|
{
|
||||||
|
case Right:
|
||||||
|
case Center: return TransitionType::SlideLeft;
|
||||||
|
case Left: return TransitionType::SlideRight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WidgetSensor(Widget& parent, TimerCallback<Sensor>&& callback, const std::string& sensorClass, const std::string& textClass, Text*& textPtr,
|
||||||
|
Side side)
|
||||||
{
|
{
|
||||||
auto eventBox = Widget::Create<EventBox>();
|
auto eventBox = Widget::Create<EventBox>();
|
||||||
|
Utils::SetTransform(*eventBox, {-1, false, SideToAlignment(side)});
|
||||||
{
|
{
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
box->SetSpacing({0, false});
|
box->SetSpacing({0, false});
|
||||||
Utils::SetTransform(*box, {-1, true, Alignment::Right});
|
|
||||||
box->SetOrientation(Utils::GetOrientation());
|
box->SetOrientation(Utils::GetOrientation());
|
||||||
{
|
{
|
||||||
|
auto revealer = Widget::Create<Revealer>();
|
||||||
if (!Config::Get().sensorTooltips)
|
if (!Config::Get().sensorTooltips)
|
||||||
{
|
{
|
||||||
auto revealer = Widget::Create<Revealer>();
|
revealer->SetTransition({Utils::GetTransitionType(SideToDefaultTransition(side)), 500});
|
||||||
revealer->SetTransition({Utils::GetTransitionType(), 500});
|
|
||||||
// Add event to eventbox for the revealer to open
|
// Add event to eventbox for the revealer to open
|
||||||
eventBox->SetHoverFn(
|
eventBox->SetHoverFn(
|
||||||
[textRevealer = revealer.get()](EventBox&, bool hovered)
|
[textRevealer = revealer.get()](EventBox&, bool hovered)
|
||||||
|
@ -381,11 +409,13 @@ namespace Bar
|
||||||
auto text = Widget::Create<Text>();
|
auto text = Widget::Create<Text>();
|
||||||
text->SetClass(textClass);
|
text->SetClass(textClass);
|
||||||
text->SetAngle(Utils::GetAngle());
|
text->SetAngle(Utils::GetAngle());
|
||||||
Utils::SetTransform(*text, {-1, true, Alignment::Fill, 0, 6});
|
// Since we don't know, on which side the text is, add padding to both sides.
|
||||||
|
// This creates double padding on the side opposite to the sensor.
|
||||||
|
// TODO: Remove that padding.
|
||||||
|
Utils::SetTransform(*text, {-1, true, Alignment::Fill, 6, 6});
|
||||||
textPtr = text.get();
|
textPtr = text.get();
|
||||||
revealer->AddChild(std::move(text));
|
revealer->AddChild(std::move(text));
|
||||||
}
|
}
|
||||||
box->AddChild(std::move(revealer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sensor = Widget::Create<Sensor>();
|
auto sensor = Widget::Create<Sensor>();
|
||||||
|
@ -402,7 +432,25 @@ namespace Bar
|
||||||
sensor->AddTimer<Sensor>(std::move(callback), DynCtx::updateTime);
|
sensor->AddTimer<Sensor>(std::move(callback), DynCtx::updateTime);
|
||||||
Utils::SetTransform(*sensor, {24, true, Alignment::Fill});
|
Utils::SetTransform(*sensor, {24, true, Alignment::Fill});
|
||||||
|
|
||||||
box->AddChild(std::move(sensor));
|
switch (side)
|
||||||
|
{
|
||||||
|
case Side::Right:
|
||||||
|
case Side::Center:
|
||||||
|
{
|
||||||
|
if (!Config::Get().sensorTooltips)
|
||||||
|
box->AddChild(std::move(revealer));
|
||||||
|
box->AddChild(std::move(sensor));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Side::Left:
|
||||||
|
{
|
||||||
|
// Invert
|
||||||
|
box->AddChild(std::move(sensor));
|
||||||
|
if (!Config::Get().sensorTooltips)
|
||||||
|
box->AddChild(std::move(revealer));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eventBox->AddChild(std::move(box));
|
eventBox->AddChild(std::move(box));
|
||||||
}
|
}
|
||||||
|
@ -411,7 +459,7 @@ namespace Bar
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handles in and out
|
// Handles in and out
|
||||||
void WidgetAudio(Widget& parent)
|
void WidgetAudio(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
enum class AudioType
|
enum class AudioType
|
||||||
{
|
{
|
||||||
|
@ -477,11 +525,11 @@ namespace Bar
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto widgetAudioBody = [&widgetAudioVolume](Widget& parent, AudioType type)
|
auto widgetAudioBody = [&widgetAudioVolume, side](Widget& parent, AudioType type)
|
||||||
{
|
{
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
box->SetSpacing({8, false});
|
box->SetSpacing({8, false});
|
||||||
Utils::SetTransform(*box, {-1, true, Alignment::Right});
|
Utils::SetTransform(*box, {-1, false, SideToAlignment(side)});
|
||||||
box->SetOrientation(Utils::GetOrientation());
|
box->SetOrientation(Utils::GetOrientation());
|
||||||
{
|
{
|
||||||
auto icon = Widget::Create<Text>();
|
auto icon = Widget::Create<Text>();
|
||||||
|
@ -505,7 +553,7 @@ namespace Bar
|
||||||
{
|
{
|
||||||
EventBox& eventBox = (EventBox&)parent;
|
EventBox& eventBox = (EventBox&)parent;
|
||||||
auto revealer = Widget::Create<Revealer>();
|
auto revealer = Widget::Create<Revealer>();
|
||||||
revealer->SetTransition({Utils::GetTransitionType(), 500});
|
revealer->SetTransition({Utils::GetTransitionType(SideToDefaultTransition(side)), 500});
|
||||||
// Add event to eventbox for the revealer to open
|
// Add event to eventbox for the revealer to open
|
||||||
eventBox.SetHoverFn(
|
eventBox.SetHoverFn(
|
||||||
[slideRevealer = revealer.get()](EventBox&, bool hovered)
|
[slideRevealer = revealer.get()](EventBox&, bool hovered)
|
||||||
|
@ -555,7 +603,7 @@ namespace Bar
|
||||||
parent.AddTimer<Widget>(DynCtx::UpdateAudio, DynCtx::updateTimeFast);
|
parent.AddTimer<Widget>(DynCtx::UpdateAudio, DynCtx::updateTimeFast);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetPackages(Widget& parent)
|
void WidgetPackages(Widget& parent, Side)
|
||||||
{
|
{
|
||||||
auto text = Widget::Create<Text>();
|
auto text = Widget::Create<Text>();
|
||||||
text->SetText("");
|
text->SetText("");
|
||||||
|
@ -567,16 +615,19 @@ namespace Bar
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_BLUEZ
|
#ifdef WITH_BLUEZ
|
||||||
void WidgetBluetooth(Widget& parent)
|
void WidgetBluetooth(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
box->SetSpacing({0, false});
|
box->SetSpacing({0, false});
|
||||||
box->SetOrientation(Utils::GetOrientation());
|
box->SetOrientation(Utils::GetOrientation());
|
||||||
|
Utils::SetTransform(*box, {-1, false, SideToAlignment(side)});
|
||||||
{
|
{
|
||||||
auto devText = Widget::Create<Text>();
|
auto devText = Widget::Create<Text>();
|
||||||
devText->SetAngle(Utils::GetAngle());
|
devText->SetAngle(Utils::GetAngle());
|
||||||
DynCtx::btDevText = devText.get();
|
DynCtx::btDevText = devText.get();
|
||||||
devText->SetClass("bt-num");
|
devText->SetClass("bt-num");
|
||||||
|
if (side == Side::Left)
|
||||||
|
Utils::SetTransform(*devText, {-1, true, Alignment::Fill, 6, 0});
|
||||||
|
|
||||||
auto iconText = Widget::Create<Button>();
|
auto iconText = Widget::Create<Button>();
|
||||||
iconText->OnClick(DynCtx::OnBTClick);
|
iconText->OnClick(DynCtx::OnBTClick);
|
||||||
|
@ -584,8 +635,23 @@ namespace Bar
|
||||||
Utils::SetTransform(*iconText, {-1, true, Alignment::Fill, 0, 6});
|
Utils::SetTransform(*iconText, {-1, true, Alignment::Fill, 0, 6});
|
||||||
DynCtx::btIconText = iconText.get();
|
DynCtx::btIconText = iconText.get();
|
||||||
|
|
||||||
box->AddChild(std::move(devText));
|
switch (side)
|
||||||
box->AddChild(std::move(iconText));
|
{
|
||||||
|
case Side::Right:
|
||||||
|
case Side::Center:
|
||||||
|
{
|
||||||
|
box->AddChild(std::move(devText));
|
||||||
|
box->AddChild(std::move(iconText));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Side::Left:
|
||||||
|
{
|
||||||
|
// Invert
|
||||||
|
box->AddChild(std::move(iconText));
|
||||||
|
box->AddChild(std::move(devText));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
box->AddTimer<Box>(DynCtx::UpdateBluetooth, DynCtx::updateTime);
|
box->AddTimer<Box>(DynCtx::UpdateBluetooth, DynCtx::updateTime);
|
||||||
|
|
||||||
|
@ -593,19 +659,19 @@ namespace Bar
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void WidgetNetwork(Widget& parent)
|
void WidgetNetwork(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
auto eventBox = Widget::Create<EventBox>();
|
auto eventBox = Widget::Create<EventBox>();
|
||||||
|
Utils::SetTransform(*eventBox, {-1, false, SideToAlignment(side)});
|
||||||
{
|
{
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
box->SetSpacing({0, false});
|
box->SetSpacing({0, false});
|
||||||
Utils::SetTransform(*box, {-1, true, Alignment::Right});
|
|
||||||
box->SetOrientation(Utils::GetOrientation());
|
box->SetOrientation(Utils::GetOrientation());
|
||||||
{
|
{
|
||||||
|
auto revealer = Widget::Create<Revealer>();
|
||||||
if (!Config::Get().sensorTooltips)
|
if (!Config::Get().sensorTooltips)
|
||||||
{
|
{
|
||||||
auto revealer = Widget::Create<Revealer>();
|
revealer->SetTransition({Utils::GetTransitionType(SideToDefaultTransition(side)), 500});
|
||||||
revealer->SetTransition({Utils::GetTransitionType(), 500});
|
|
||||||
// Add event to eventbox for the revealer to open
|
// Add event to eventbox for the revealer to open
|
||||||
eventBox->SetHoverFn(
|
eventBox->SetHoverFn(
|
||||||
[textRevealer = revealer.get()](EventBox&, bool hovered)
|
[textRevealer = revealer.get()](EventBox&, bool hovered)
|
||||||
|
@ -616,11 +682,11 @@ namespace Bar
|
||||||
auto text = Widget::Create<Text>();
|
auto text = Widget::Create<Text>();
|
||||||
text->SetClass("network-data-text");
|
text->SetClass("network-data-text");
|
||||||
text->SetAngle(Utils::GetAngle());
|
text->SetAngle(Utils::GetAngle());
|
||||||
Utils::SetTransform(*text, {-1, true, Alignment::Fill, 0, 6});
|
// Margins have the same problem as the WidgetSensor ones...
|
||||||
|
Utils::SetTransform(*text, {-1, true, Alignment::Fill, 6, 6});
|
||||||
DynCtx::networkText = text.get();
|
DynCtx::networkText = text.get();
|
||||||
revealer->AddChild(std::move(text));
|
revealer->AddChild(std::move(text));
|
||||||
}
|
}
|
||||||
box->AddChild(std::move(revealer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sensor = Widget::Create<NetworkSensor>();
|
auto sensor = Widget::Create<NetworkSensor>();
|
||||||
|
@ -630,7 +696,25 @@ namespace Bar
|
||||||
sensor->AddTimer<NetworkSensor>(DynCtx::UpdateNetwork, DynCtx::updateTime);
|
sensor->AddTimer<NetworkSensor>(DynCtx::UpdateNetwork, DynCtx::updateTime);
|
||||||
Utils::SetTransform(*sensor, {24, true, Alignment::Fill});
|
Utils::SetTransform(*sensor, {24, true, Alignment::Fill});
|
||||||
|
|
||||||
box->AddChild(std::move(sensor));
|
switch (side)
|
||||||
|
{
|
||||||
|
case Side::Right:
|
||||||
|
case Side::Center:
|
||||||
|
{
|
||||||
|
if (!Config::Get().sensorTooltips)
|
||||||
|
box->AddChild(std::move(revealer));
|
||||||
|
box->AddChild(std::move(sensor));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Side::Left:
|
||||||
|
{
|
||||||
|
// Invert
|
||||||
|
box->AddChild(std::move(sensor));
|
||||||
|
if (!Config::Get().sensorTooltips)
|
||||||
|
box->AddChild(std::move(revealer));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eventBox->AddChild(std::move(box));
|
eventBox->AddChild(std::move(box));
|
||||||
}
|
}
|
||||||
|
@ -638,26 +722,26 @@ namespace Bar
|
||||||
parent.AddChild(std::move(eventBox));
|
parent.AddChild(std::move(eventBox));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetSensors(Widget& parent)
|
void WidgetSensors(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
WidgetSensor(parent, DynCtx::UpdateDisk, "disk-util-progress", "disk-data-text", DynCtx::diskText);
|
WidgetSensor(parent, DynCtx::UpdateDisk, "disk-util-progress", "disk-data-text", DynCtx::diskText, side);
|
||||||
#if defined WITH_NVIDIA || defined WITH_AMD
|
#if defined WITH_NVIDIA || defined WITH_AMD
|
||||||
if (RuntimeConfig::Get().hasNvidia || RuntimeConfig::Get().hasAMD)
|
if (RuntimeConfig::Get().hasNvidia || RuntimeConfig::Get().hasAMD)
|
||||||
{
|
{
|
||||||
WidgetSensor(parent, DynCtx::UpdateVRAM, "vram-util-progress", "vram-data-text", DynCtx::vramText);
|
WidgetSensor(parent, DynCtx::UpdateVRAM, "vram-util-progress", "vram-data-text", DynCtx::vramText, side);
|
||||||
WidgetSensor(parent, DynCtx::UpdateGPU, "gpu-util-progress", "gpu-data-text", DynCtx::gpuText);
|
WidgetSensor(parent, DynCtx::UpdateGPU, "gpu-util-progress", "gpu-data-text", DynCtx::gpuText, side);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
WidgetSensor(parent, DynCtx::UpdateRAM, "ram-util-progress", "ram-data-text", DynCtx::ramText);
|
WidgetSensor(parent, DynCtx::UpdateRAM, "ram-util-progress", "ram-data-text", DynCtx::ramText, side);
|
||||||
WidgetSensor(parent, DynCtx::UpdateCPU, "cpu-util-progress", "cpu-data-text", DynCtx::cpuText);
|
WidgetSensor(parent, DynCtx::UpdateCPU, "cpu-util-progress", "cpu-data-text", DynCtx::cpuText, side);
|
||||||
// Only show battery percentage if battery folder is set and exists
|
// Only show battery percentage if battery folder is set and exists
|
||||||
if (System::GetBatteryPercentage() >= 0)
|
if (System::GetBatteryPercentage() >= 0)
|
||||||
{
|
{
|
||||||
WidgetSensor(parent, DynCtx::UpdateBattery, "battery-util-progress", "battery-data-text", DynCtx::batteryText);
|
WidgetSensor(parent, DynCtx::UpdateBattery, "battery-util-progress", "battery-data-text", DynCtx::batteryText, side);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetPower(Widget& parent)
|
void WidgetPower(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
// TODO: Abstract this (Currently not DRY)
|
// TODO: Abstract this (Currently not DRY)
|
||||||
static bool activatedExit = false;
|
static bool activatedExit = false;
|
||||||
|
@ -689,16 +773,16 @@ namespace Bar
|
||||||
|
|
||||||
auto eventBox = Widget::Create<EventBox>();
|
auto eventBox = Widget::Create<EventBox>();
|
||||||
eventBox->SetHoverFn(DynCtx::PowerBoxEvent);
|
eventBox->SetHoverFn(DynCtx::PowerBoxEvent);
|
||||||
|
Utils::SetTransform(*eventBox, {-1, false, SideToAlignment(side)});
|
||||||
{
|
{
|
||||||
auto powerBox = Widget::Create<Box>();
|
auto powerBox = Widget::Create<Box>();
|
||||||
powerBox->SetClass("power-box");
|
powerBox->SetClass("power-box");
|
||||||
Utils::SetTransform(*powerBox, {-1, false, Alignment::Right});
|
|
||||||
powerBox->SetSpacing({0, false});
|
powerBox->SetSpacing({0, false});
|
||||||
powerBox->SetOrientation(Utils::GetOrientation());
|
powerBox->SetOrientation(Utils::GetOrientation());
|
||||||
{
|
{
|
||||||
auto revealer = Widget::Create<Revealer>();
|
auto revealer = Widget::Create<Revealer>();
|
||||||
DynCtx::powerBoxRevealer = revealer.get();
|
DynCtx::powerBoxRevealer = revealer.get();
|
||||||
revealer->SetTransition({Utils::GetTransitionType(), 500});
|
revealer->SetTransition({Utils::GetTransitionType(SideToDefaultTransition(side)), 500});
|
||||||
{
|
{
|
||||||
auto powerBoxExpand = Widget::Create<Box>();
|
auto powerBoxExpand = Widget::Create<Box>();
|
||||||
powerBoxExpand->SetClass("power-box-expand");
|
powerBoxExpand->SetClass("power-box-expand");
|
||||||
|
@ -792,7 +876,7 @@ namespace Bar
|
||||||
powerButton->SetClass("power-button");
|
powerButton->SetClass("power-button");
|
||||||
powerButton->SetText(" ");
|
powerButton->SetText(" ");
|
||||||
powerButton->SetAngle(Utils::GetAngle());
|
powerButton->SetAngle(Utils::GetAngle());
|
||||||
Utils::SetTransform(*powerButton, {24, true, Alignment::Fill});
|
Utils::SetTransform(*powerButton, {24, false, Alignment::Fill});
|
||||||
powerButton->OnClick(
|
powerButton->OnClick(
|
||||||
[setActivate](Button& but)
|
[setActivate](Button& but)
|
||||||
{
|
{
|
||||||
|
@ -807,8 +891,23 @@ namespace Bar
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
powerBox->AddChild(std::move(revealer));
|
switch (side)
|
||||||
powerBox->AddChild(std::move(powerButton));
|
{
|
||||||
|
case Side::Right:
|
||||||
|
case Side::Center:
|
||||||
|
{
|
||||||
|
powerBox->AddChild(std::move(revealer));
|
||||||
|
powerBox->AddChild(std::move(powerButton));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Side::Left:
|
||||||
|
{
|
||||||
|
// Invert
|
||||||
|
powerBox->AddChild(std::move(powerButton));
|
||||||
|
powerBox->AddChild(std::move(revealer));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
eventBox->AddChild(std::move(powerBox));
|
eventBox->AddChild(std::move(powerBox));
|
||||||
}
|
}
|
||||||
|
@ -817,15 +916,15 @@ namespace Bar
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_WORKSPACES
|
#ifdef WITH_WORKSPACES
|
||||||
void WidgetWorkspaces(Widget& parent)
|
void WidgetWorkspaces(Widget& parent, Side side)
|
||||||
{
|
{
|
||||||
auto eventBox = Widget::Create<EventBox>();
|
auto eventBox = Widget::Create<EventBox>();
|
||||||
eventBox->SetScrollFn(DynCtx::ScrollWorkspaces);
|
eventBox->SetScrollFn(DynCtx::ScrollWorkspaces);
|
||||||
|
Utils::SetTransform(*eventBox, {-1, false, SideToAlignment(side)});
|
||||||
{
|
{
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
box->SetSpacing({8, true});
|
box->SetSpacing({8, true});
|
||||||
box->SetOrientation(Utils::GetOrientation());
|
box->SetOrientation(Utils::GetOrientation());
|
||||||
Utils::SetTransform(*box, {-1, true, Alignment::Left, 12, 0});
|
|
||||||
{
|
{
|
||||||
DynCtx::workspaces.resize(Config::Get().numWorkspaces);
|
DynCtx::workspaces.resize(Config::Get().numWorkspaces);
|
||||||
for (size_t i = 0; i < DynCtx::workspaces.size(); i++)
|
for (size_t i = 0; i < DynCtx::workspaces.size(); i++)
|
||||||
|
@ -848,6 +947,119 @@ namespace Bar
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void WidgetTime(Widget& parent, Side side)
|
||||||
|
{
|
||||||
|
auto time = Widget::Create<Text>();
|
||||||
|
Utils::SetTransform(*time, {-1, false, SideToAlignment(side)});
|
||||||
|
time->SetAngle(Utils::GetAngle());
|
||||||
|
time->SetClass("time-text");
|
||||||
|
time->SetText("Uninitialized");
|
||||||
|
time->AddTimer<Text>(DynCtx::UpdateTime, 1000);
|
||||||
|
parent.AddChild(std::move(time));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChooseWidgetToDraw(const std::string& widgetName, Widget& parent, Side side)
|
||||||
|
{
|
||||||
|
if (widgetName == "Workspaces")
|
||||||
|
{
|
||||||
|
#ifdef WITH_WORKSPACES
|
||||||
|
if (RuntimeConfig::Get().hasWorkspaces)
|
||||||
|
{
|
||||||
|
WidgetWorkspaces(parent, side);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Time")
|
||||||
|
{
|
||||||
|
WidgetTime(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Tray")
|
||||||
|
{
|
||||||
|
#ifdef WITH_SNI
|
||||||
|
SNI::WidgetSNI(parent);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Packages")
|
||||||
|
{
|
||||||
|
WidgetPackages(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Audio")
|
||||||
|
{
|
||||||
|
WidgetAudio(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Bluetooth")
|
||||||
|
{
|
||||||
|
#ifdef WITH_BLUEZ
|
||||||
|
if (RuntimeConfig::Get().hasBlueZ)
|
||||||
|
WidgetBluetooth(parent, side);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Network")
|
||||||
|
{
|
||||||
|
if (Config::Get().networkWidget && RuntimeConfig::Get().hasNet)
|
||||||
|
WidgetNetwork(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Cheeky shorthand for all sensors
|
||||||
|
if (widgetName == "Sensors")
|
||||||
|
{
|
||||||
|
WidgetSensors(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Disk")
|
||||||
|
{
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateDisk, "disk-util-progress", "disk-data-text", DynCtx::diskText, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "VRAM")
|
||||||
|
{
|
||||||
|
#if defined WITH_NVIDIA || defined WITH_AMD
|
||||||
|
if (RuntimeConfig::Get().hasNvidia || RuntimeConfig::Get().hasAMD)
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateVRAM, "vram-util-progress", "vram-data-text", DynCtx::vramText, side);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (widgetName == "GPU")
|
||||||
|
{
|
||||||
|
#if defined WITH_NVIDIA || defined WITH_AMD
|
||||||
|
if (RuntimeConfig::Get().hasNvidia || RuntimeConfig::Get().hasAMD)
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateGPU, "gpu-util-progress", "gpu-data-text", DynCtx::gpuText, side);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (widgetName == "RAM")
|
||||||
|
{
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateRAM, "ram-util-progress", "ram-data-text", DynCtx::ramText, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "CPU")
|
||||||
|
{
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateCPU, "cpu-util-progress", "cpu-data-text", DynCtx::cpuText, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Battery")
|
||||||
|
{
|
||||||
|
// Only show battery percentage if battery folder is set and exists
|
||||||
|
if (System::GetBatteryPercentage() >= 0)
|
||||||
|
WidgetSensor(parent, DynCtx::UpdateBattery, "battery-util-progress", "battery-data-text", DynCtx::batteryText, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (widgetName == "Power")
|
||||||
|
{
|
||||||
|
WidgetPower(parent, side);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LOG("Warning: Unkwown widget name " << widgetName << "!"
|
||||||
|
<< "\n\tKnown names are: Workspaces, Time, Tray, Packages, Sound, Bluetooth, Network, Sensors, Disk, "
|
||||||
|
"VRAM, GPU, RAM, CPU, Battery, Power");
|
||||||
|
}
|
||||||
|
|
||||||
void Create(Window& window, int32_t monitor)
|
void Create(Window& window, int32_t monitor)
|
||||||
{
|
{
|
||||||
monitorID = monitor;
|
monitorID = monitor;
|
||||||
|
@ -871,55 +1083,36 @@ namespace Bar
|
||||||
}
|
}
|
||||||
|
|
||||||
auto left = Widget::Create<Box>();
|
auto left = Widget::Create<Box>();
|
||||||
left->SetSpacing({0, false});
|
left->SetSpacing({6, false});
|
||||||
left->SetOrientation(Utils::GetOrientation());
|
left->SetOrientation(Utils::GetOrientation());
|
||||||
// For centerTime the width of the left widget handles the centering.
|
// For centerTime the width of the left widget handles the centering.
|
||||||
// For not centerTime we want to set it as much right as possible. So let this expand as much as possible.
|
// For not centerTime we want to set it as much right as possible. So let this expand as much as possible.
|
||||||
Utils::SetTransform(*left, {endLeftWidgets, !Config::Get().centerTime, Alignment::Left});
|
Utils::SetTransform(*left, {endLeftWidgets, !Config::Get().centerTime, Alignment::Left, 12, 0});
|
||||||
#ifdef WITH_WORKSPACES
|
|
||||||
if (RuntimeConfig::Get().hasWorkspaces)
|
for (auto& widget : Config::Get().widgetsLeft)
|
||||||
{
|
{
|
||||||
WidgetWorkspaces(*left);
|
ChooseWidgetToDraw(widget, *left, Side::Left);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
auto center = Widget::Create<Box>();
|
auto center = Widget::Create<Box>();
|
||||||
center->SetOrientation(Utils::GetOrientation());
|
center->SetOrientation(Utils::GetOrientation());
|
||||||
Utils::SetTransform(*center, {(int)Config::Get().timeSpace, false, Alignment::Left});
|
Utils::SetTransform(*center, {(int)Config::Get().timeSpace, false, Alignment::Left});
|
||||||
|
center->SetSpacing({6, false});
|
||||||
|
|
||||||
|
for (auto& widget : Config::Get().widgetsCenter)
|
||||||
{
|
{
|
||||||
auto time = Widget::Create<Text>();
|
ChooseWidgetToDraw(widget, *center, Side::Center);
|
||||||
Utils::SetTransform(*time, {-1, true, Alignment::Center});
|
|
||||||
time->SetAngle(Utils::GetAngle());
|
|
||||||
time->SetClass("time-text");
|
|
||||||
time->SetText("Uninitialized");
|
|
||||||
time->AddTimer<Text>(DynCtx::UpdateTime, 1000);
|
|
||||||
center->AddChild(std::move(time));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto right = Widget::Create<Box>();
|
auto right = Widget::Create<Box>();
|
||||||
right->SetClass("right");
|
right->SetClass("right");
|
||||||
right->SetSpacing({8, false});
|
right->SetSpacing({6, false});
|
||||||
right->SetOrientation(Utils::GetOrientation());
|
right->SetOrientation(Utils::GetOrientation());
|
||||||
Utils::SetTransform(*right, {-1, true, Alignment::Right, 0, 10});
|
Utils::SetTransform(*right, {-1, true, Alignment::Right, 0, 10});
|
||||||
|
|
||||||
|
for (auto& widget : Config::Get().widgetsRight)
|
||||||
{
|
{
|
||||||
#ifdef WITH_SNI
|
ChooseWidgetToDraw(widget, *right, Side::Right);
|
||||||
SNI::WidgetSNI(*right);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WidgetPackages(*right);
|
|
||||||
|
|
||||||
WidgetAudio(*right);
|
|
||||||
|
|
||||||
#ifdef WITH_BLUEZ
|
|
||||||
if (RuntimeConfig::Get().hasBlueZ)
|
|
||||||
WidgetBluetooth(*right);
|
|
||||||
#endif
|
|
||||||
if (Config::Get().networkWidget && RuntimeConfig::Get().hasNet)
|
|
||||||
WidgetNetwork(*right);
|
|
||||||
|
|
||||||
WidgetSensors(*right);
|
|
||||||
|
|
||||||
WidgetPower(*right);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mainWidget->AddChild(std::move(left));
|
mainWidget->AddChild(std::move(left));
|
||||||
|
|
|
@ -220,6 +220,10 @@ void Config::Load()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool foundProperty = false;
|
bool foundProperty = false;
|
||||||
|
AddConfigVar("WidgetsLeft", config.widgetsLeft, lineView, foundProperty);
|
||||||
|
AddConfigVar("WidgetsCenter", config.widgetsCenter, lineView, foundProperty);
|
||||||
|
AddConfigVar("WidgetsRight", config.widgetsRight, lineView, foundProperty);
|
||||||
|
|
||||||
AddConfigVar("CPUThermalZone", config.cpuThermalZone, lineView, foundProperty);
|
AddConfigVar("CPUThermalZone", config.cpuThermalZone, lineView, foundProperty);
|
||||||
AddConfigVar("NetworkAdapter", config.networkAdapter, lineView, foundProperty);
|
AddConfigVar("NetworkAdapter", config.networkAdapter, lineView, foundProperty);
|
||||||
AddConfigVar("SuspendCommand", config.suspendCommand, lineView, foundProperty);
|
AddConfigVar("SuspendCommand", config.suspendCommand, lineView, foundProperty);
|
||||||
|
|
|
@ -8,6 +8,10 @@
|
||||||
class Config
|
class Config
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
std::vector<std::string> widgetsLeft = {"Workspaces"};
|
||||||
|
std::vector<std::string> widgetsCenter = {"Time"};
|
||||||
|
std::vector<std::string> widgetsRight = {"Tray", "Sound", "Bluetooth", "Network", "Disk", "VRAM", "GPU", "CPU", "Battery", "Power"};
|
||||||
|
|
||||||
std::string cpuThermalZone = ""; // idk, no standard way of doing this.
|
std::string cpuThermalZone = ""; // idk, no standard way of doing this.
|
||||||
std::string networkAdapter = "eno1"; // Is this standard?
|
std::string networkAdapter = "eno1"; // Is this standard?
|
||||||
std::string suspendCommand = "systemctl suspend";
|
std::string suspendCommand = "systemctl suspend";
|
||||||
|
|
|
@ -514,6 +514,7 @@ namespace SNI
|
||||||
}
|
}
|
||||||
// Add parent box
|
// Add parent box
|
||||||
auto box = Widget::Create<Box>();
|
auto box = Widget::Create<Box>();
|
||||||
|
Utils::SetTransform(*box, {-1, false, Alignment::Fill});
|
||||||
auto container = Widget::Create<Box>();
|
auto container = Widget::Create<Box>();
|
||||||
container->AddTimer<Box>(UpdateWidgets, 1000, TimerDispatchBehaviour::LateDispatch);
|
container->AddTimer<Box>(UpdateWidgets, 1000, TimerDispatchBehaviour::LateDispatch);
|
||||||
iconBox = container.get();
|
iconBox = container.get();
|
||||||
|
|
23
src/Widget.h
23
src/Widget.h
|
@ -423,14 +423,31 @@ namespace Utils
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline TransitionType GetTransitionType()
|
// defaultTransition is the transition in top position
|
||||||
|
inline TransitionType GetTransitionType(TransitionType defaultTransition)
|
||||||
{
|
{
|
||||||
switch (Config::Get().location)
|
switch (Config::Get().location)
|
||||||
{
|
{
|
||||||
case 'T':
|
case 'T':
|
||||||
case 'B': return TransitionType::SlideLeft;
|
case 'B':
|
||||||
|
{
|
||||||
|
switch (defaultTransition)
|
||||||
|
{
|
||||||
|
case TransitionType::SlideLeft: return TransitionType::SlideLeft;
|
||||||
|
case TransitionType::SlideRight: return TransitionType::SlideRight;
|
||||||
|
default: ASSERT(false, "Utils::GetTransitionType(): Invalid defaultTransition!");
|
||||||
|
}
|
||||||
|
}
|
||||||
case 'L':
|
case 'L':
|
||||||
case 'R': return TransitionType::SlideUp;
|
case 'R':
|
||||||
|
{
|
||||||
|
switch (defaultTransition)
|
||||||
|
{
|
||||||
|
case TransitionType::SlideLeft: return TransitionType::SlideUp;
|
||||||
|
case TransitionType::SlideRight: return TransitionType::SlideDown;
|
||||||
|
default: ASSERT(false, "Utils::GetTransitionType(): Invalid defaultTransition!");
|
||||||
|
}
|
||||||
|
}
|
||||||
default: LOG("Invalid location char \"" << Config::Get().location << "\"!"); return TransitionType::SlideLeft;
|
default: LOG("Invalid location char \"" << Config::Get().location << "\"!"); return TransitionType::SlideLeft;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue