mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-08-16 22:31:03 +02:00
feat(workspaces): new sorting options
Renames existing `alphanumeric` sorting method to `label` and adds a new method called `name` which uses the real workspace name, akin to behaviour before #799. BREAKING CHANGE: The workspace `sort` config option valid values have changed. Where `alphanumeric` is explicitly set, this will need changing to one of `label` or `name`.
This commit is contained in:
parent
fa6f27d4b9
commit
03136e7c70
2 changed files with 47 additions and 24 deletions
|
@ -8,14 +8,14 @@ Shows all current workspaces. Clicking a workspace changes focus to it.
|
||||||
|
|
||||||
> Type: `workspaces`
|
> Type: `workspaces`
|
||||||
|
|
||||||
| Name | Type | Default | Description |
|
| Name | Type | Default | Description |
|
||||||
|----------------|---------------------------------------|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|----------------|---------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| `name_map` | `Map<string, string or image>` | `{}` | A map of actual workspace names to their display labels/images. Workspaces use their actual name if not present in the map. See [here](images) for information on images. |
|
| `name_map` | `Map<string, string or image>` | `{}` | A map of actual workspace names to their display labels/images. Workspaces use their actual name if not present in the map. See [here](images) for information on images. |
|
||||||
| `favorites` | `Map<string, string[]>` or `string[]` | `[]` | Workspaces to always show. This can be for all monitors, or a map to set per monitor. |
|
| `favorites` | `Map<string, string[]>` or `string[]` | `[]` | Workspaces to always show. This can be for all monitors, or a map to set per monitor. |
|
||||||
| `hidden` | `string[]` | `[]` | A list of workspace names to never show |
|
| `hidden` | `string[]` | `[]` | A list of workspace names to never show |
|
||||||
| `icon_size` | `integer` | `32` | Size to render icon at (image icons only). |
|
| `icon_size` | `integer` | `32` | Size to render icon at (image icons only). |
|
||||||
| `all_monitors` | `boolean` | `false` | Whether to display workspaces from all monitors. When `false`, only shows workspaces on the current monitor. |
|
| `all_monitors` | `boolean` | `false` | Whether to display workspaces from all monitors. When `false`, only shows workspaces on the current monitor. |
|
||||||
| `sort` | `'added'` or `'alphanumeric'` | `alphanumeric` | The method used for sorting workspaces. `added` always appends to the end, `alphanumeric` sorts by number/name. |
|
| `sort` | `'added'` or `'label'` or `'name'` | `label` | The method used for sorting workspaces. `added` always appends to the end, `label` sorts by displayed value, and `name` sorts by workspace name. |
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>JSON</summary>
|
<summary>JSON</summary>
|
||||||
|
|
|
@ -18,21 +18,29 @@ use std::collections::HashMap;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tracing::{debug, trace, warn};
|
use tracing::{debug, trace, warn};
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Clone, Copy, Eq, PartialEq)]
|
#[derive(Debug, Deserialize, Default, Clone, Copy, Eq, PartialEq)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
|
||||||
pub enum SortOrder {
|
pub enum SortOrder {
|
||||||
/// Shows workspaces in the order they're added
|
/// Shows workspaces in the order they're added
|
||||||
Added,
|
Added,
|
||||||
/// Shows workspaces in numeric order.
|
|
||||||
/// Named workspaces are added to the end in alphabetical order.
|
|
||||||
Alphanumeric,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for SortOrder {
|
/// Shows workspaces in the order of their displayed labels,
|
||||||
fn default() -> Self {
|
/// accounting for any mappings supplied in `name_map`.
|
||||||
Self::Alphanumeric
|
/// In most cases, this is likely their number.
|
||||||
}
|
///
|
||||||
|
/// Workspaces are sorted numerically first,
|
||||||
|
/// and named workspaces are added to the end in alphabetical order.
|
||||||
|
#[default]
|
||||||
|
Label,
|
||||||
|
|
||||||
|
/// Shows workspaces in the order of their real names,
|
||||||
|
/// as supplied by the compositor.
|
||||||
|
/// In most cases, this is likely their number.
|
||||||
|
///
|
||||||
|
/// Workspaces are sorted numerically first,
|
||||||
|
/// and named workspaces are added to the end in alphabetical order.
|
||||||
|
Name,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Clone)]
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
|
@ -101,11 +109,14 @@ pub struct WorkspacesModule {
|
||||||
all_monitors: bool,
|
all_monitors: bool,
|
||||||
|
|
||||||
/// The method used for sorting workspaces.
|
/// The method used for sorting workspaces.
|
||||||
/// `added` always appends to the end, `alphanumeric` sorts by number/name.
|
|
||||||
///
|
///
|
||||||
/// **Valid options**: `added`, `alphanumeric`
|
/// - `added` always appends to the end.
|
||||||
|
/// - `label` sorts by displayed value.
|
||||||
|
/// - `name` sorts by workspace name.
|
||||||
|
///
|
||||||
|
/// **Valid options**: `added`, `label`, `name`.
|
||||||
/// <br>
|
/// <br>
|
||||||
/// **Default**: `alphanumeric`
|
/// **Default**: `label`
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
sort: SortOrder,
|
sort: SortOrder,
|
||||||
|
|
||||||
|
@ -136,11 +147,23 @@ pub struct WorkspaceItemContext {
|
||||||
/// using their widget names.
|
/// using their widget names.
|
||||||
///
|
///
|
||||||
/// Named workspaces are always sorted before numbered ones.
|
/// Named workspaces are always sorted before numbered ones.
|
||||||
fn reorder_workspaces(container: >k::Box) {
|
fn reorder_workspaces(container: >k::Box, sort_order: SortOrder) {
|
||||||
let mut buttons = container
|
let mut buttons = container
|
||||||
.children()
|
.children()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|child| (child.widget_name().to_string(), child))
|
.map(|child| {
|
||||||
|
let label = if sort_order == SortOrder::Label {
|
||||||
|
child
|
||||||
|
.downcast_ref::<gtk::Button>()
|
||||||
|
.and_then(|button| button.label())
|
||||||
|
.unwrap_or_else(|| child.widget_name())
|
||||||
|
} else {
|
||||||
|
child.widget_name()
|
||||||
|
}
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
(label, child)
|
||||||
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
buttons.sort_by(|(label_a, _), (label_b, _a)| {
|
buttons.sort_by(|(label_a, _), (label_b, _a)| {
|
||||||
|
@ -285,8 +308,8 @@ impl Module<gtk::Box> for WorkspacesModule {
|
||||||
|
|
||||||
macro_rules! reorder {
|
macro_rules! reorder {
|
||||||
() => {
|
() => {
|
||||||
if self.sort == SortOrder::Alphanumeric {
|
if self.sort != SortOrder::Added {
|
||||||
reorder_workspaces(&container);
|
reorder_workspaces(&container, self.sort);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue