feat(tray): add direction option

This commit is contained in:
Rémi Labeyrie 2024-02-12 23:57:27 +01:00
parent d2adecb935
commit b037a55fb7
No known key found for this signature in database
GPG Key ID: 5357919C06FD9147
2 changed files with 43 additions and 5 deletions

View File

@ -6,7 +6,10 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
> Type: `tray`
***This module provides no configuration options.***
| Name | Type | Default | Description |
|-------------|----------|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
| `direction` | `string` | `left_to_right` if bar is horizontal, `top_to_bottom` otherwise | Direction to display the tray items. Possible values: `top_to_bottom`, `bottom_to_top`, `left_to_right`, `right_to_left` |
<details>
<summary>JSON</summary>
@ -15,7 +18,8 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
{
"end": [
{
"type": "tray"
"type": "tray",
"direction": "top_to_bottom"
}
]
}
@ -29,6 +33,7 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
```toml
[[end]]
type = "tray"
direction = "top_to_bottom"
```
</details>
@ -39,6 +44,7 @@ type = "tray"
```yaml
end:
- type: "tray"
direction: "top_to_bottom"
```
</details>
@ -49,7 +55,10 @@ end:
```corn
{
end = [
{ type = "tray" }
{
type = "tray"
direction = "top_to_bottom"
}
]
}
```
@ -63,4 +72,4 @@ end:
| `.tray` | Tray widget box |
| `.tray .item` | Tray icon button |
For more information on styling, please see the [styling guide](styling-guide).
For more information on styling, please see the [styling guide](styling-guide).

View File

@ -8,7 +8,7 @@ use crate::modules::tray::diff::get_diffs;
use crate::modules::{Module, ModuleInfo, ModuleParts, ModuleUpdateEvent, WidgetContext};
use crate::{glib_recv, spawn};
use color_eyre::Result;
use gtk::prelude::*;
use gtk::{prelude::*, PackDirection};
use gtk::{IconTheme, MenuBar};
use interface::TrayMenu;
use serde::Deserialize;
@ -18,10 +18,28 @@ use tokio::sync::mpsc;
#[derive(Debug, Deserialize, Clone)]
pub struct TrayModule {
#[serde(default, deserialize_with = "deserialize_orientation")]
pub direction: Option<PackDirection>,
#[serde(flatten)]
pub common: Option<CommonConfig>,
}
fn deserialize_orientation<'de, D>(deserializer: D) -> Result<Option<PackDirection>, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = Option::<String>::deserialize(deserializer)?;
value
.map(|v| match v.as_str() {
"left_to_right" => Ok(PackDirection::Ltr),
"right_to_left" => Ok(PackDirection::Rtl),
"top_to_bottom" => Ok(PackDirection::Ttb),
"bottom_to_top" => Ok(PackDirection::Btt),
_ => Err(serde::de::Error::custom("invalid value for orientation")),
})
.transpose()
}
impl Module<MenuBar> for TrayModule {
type SendMessage = NotifierItemMessage;
type ReceiveMessage = NotifierItemCommand;
@ -70,6 +88,17 @@ impl Module<MenuBar> for TrayModule {
) -> Result<ModuleParts<MenuBar>> {
let container = MenuBar::new();
let direction = self.direction.unwrap_or(
if info.bar_position.get_orientation() == gtk::Orientation::Vertical {
PackDirection::Ttb
} else {
PackDirection::Ltr
},
);
container.set_pack_direction(direction);
container.set_child_pack_direction(direction);
{
let container = container.clone();
let mut menus = HashMap::new();