Skip to content

Commit

Permalink
Merge pull request #449 from calops/vertical-tray
Browse files Browse the repository at this point in the history
Add `direction` option for tray module
  • Loading branch information
JakeStanger authored Feb 17, 2024
2 parents 7f3663a + b037a55 commit 31505c7
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 5 deletions.
17 changes: 13 additions & 4 deletions docs/modules/Tray.md
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -15,7 +18,8 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
{
"end": [
{
"type": "tray"
"type": "tray",
"direction": "top_to_bottom"
}
]
}
Expand All @@ -29,6 +33,7 @@ Displays a fully interactive icon tray using the KDE `libappindicator` protocol.
```toml
[[end]]
type = "tray"
direction = "top_to_bottom"
```

</details>
Expand All @@ -39,6 +44,7 @@ type = "tray"
```yaml
end:
- type: "tray"
direction: "top_to_bottom"
```
</details>
Expand All @@ -49,7 +55,10 @@ end:
```corn
{
end = [
{ type = "tray" }
{
type = "tray"
direction = "top_to_bottom"
}
]
}
```
Expand All @@ -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).
31 changes: 30 additions & 1 deletion src/modules/tray/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 31505c7

Please sign in to comment.