diff --git a/apps-list.md b/apps-list.md index 2690b5b..65ce33c 100644 --- a/apps-list.md +++ b/apps-list.md @@ -1,3 +1,5 @@ +adw-gtk-theme +aether an-anime-game-launcher-bin android-emulator android-sdk-platform-tools @@ -6,11 +8,12 @@ angband arc-solid-gtk-theme aurorae awesome-terminal-fonts -ayugram-desktop-bin +awww baobab base base-devel bat +bibata-cursor-theme-bin bind blackarch-mirrorlist blender @@ -34,6 +37,7 @@ clock-tui cloudflared cmatrix cmus +commet-bin cool-retro-term cowsay cull-bin @@ -57,6 +61,7 @@ emptty eog epiphany espeak-ng +evercal eww ex-vi-compat expac @@ -131,6 +136,7 @@ gtk-theme-elementary gtk-theme-material-black gtk3 gtklock +gum gvfs-afc gvfs-dnssd gvfs-goa @@ -145,6 +151,7 @@ hdparm helix helm-bin helvum +hostapd hylauncher-bin hyprland hyprlock @@ -152,6 +159,7 @@ hyprpicker hyprpwcenter hyprshot hyprwave +hyprwhspr hytale-f2p-git i2pd i3-wm @@ -161,6 +169,8 @@ i3status imv inkscape ithil-bin +iw +iwd jdk-openjdk kactivitymanagerd kalidoface-bin @@ -202,8 +212,10 @@ links linux linux-firmware linux-headers +linux-wifi-hotspot lla lmms +lolcat loupe lsd lshw @@ -297,6 +309,7 @@ plymouth-kcm polkit-gnome polkit-kde-agent pomo-bin +ponysay portproton postgresql power-profiles-daemon @@ -327,6 +340,7 @@ showmethekey showtime sillytavern-git simple-scan +simplex-chat-bin sing-box sioyek snapshot @@ -341,7 +355,6 @@ sushi swaybg swaync swayosd -swww syncthing systemctl-tui systemsettings @@ -354,6 +367,7 @@ telegram-desktop tesseract-data-eng throne-bin timr +tmux tofi tor torbrowser-launcher @@ -362,6 +376,7 @@ ttf-iosevka-nerd ttf-iosevkaterm-nerd ttf-quicksand-variable tuios-bin +tuxsay typst udiskie ufw @@ -377,7 +392,6 @@ vulkan-validation-layers wacomtablet walker waybar -waydroid wayland-utils wayvnc weechat @@ -388,7 +402,6 @@ wine-staging winetricks wireshark-cli wl-clipboard -xdg-desktop-portal-kde xdotool xf86-video-vesa xorg-bdftopcf diff --git a/config/mpDris2/mpDris2.conf b/config/mpDris2/mpDris2.conf new file mode 100644 index 0000000..bd43e87 --- /dev/null +++ b/config/mpDris2/mpDris2.conf @@ -0,0 +1,36 @@ +# Copy this to /etc/mpDris2.conf or ~/.config/mpDris2/mpDris2.conf +# Default values are shown here, commented out. + +[Connection] +# You can also export $MPD_HOST and/or $MPD_PORT to change the server. +host = /run/user/1000/mpd/socket +#port = 6600 +#password = + +[Library] +music_dir = ~/mus/ +cover_regex = ^(album|cover|\.?folder|front).*\.(gif|jpeg|jpg|png)$ + +[Bling] +#mmkeys = True +notify = False +# Send notifications while paused? +#notify_paused = True +# CD-like previous command: if playback is past 3 seconds, seek to the beginning +#cdprev = True + +#[Notify] +# Urgency of the notification: 0 for low, 1 for medium and 2 for high. +#urgency = 0 +# Timeout of the notification in milliseconds. -1 uses the notification's default +# and 0 sets the notification to never timeout. +#timeout = -1 +# Format the notification's summary and body in either playing or paused state. +# Leave blank to use mpDris2's internal defaults. +# Possible values: +# %album%, %title%, %id%, %time%, %timeposition%, %date%, %track%, +# %disc%, %artist%, %albumartist%, %composer%, %genre%, %file% +#summary = +#body = +#paused_summary = +#paused_body = diff --git a/config/mpd/mpd.conf b/config/mpd/mpd.conf new file mode 100644 index 0000000..6c3a202 --- /dev/null +++ b/config/mpd/mpd.conf @@ -0,0 +1,403 @@ +# An example configuration file for MPD. +# Read the user manual for documentation: http://www.mausicpd.org/doc/user/ + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +music_directory "/home/unconfer/mus" +#music_directory "~/music" +playlist_plugin { + name "save" + enabled "yes" +} + +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +#playlist_directory "$XDG_CONFIG_HOME/mpd/playlists" +playlist_directory "$XDG_MUSIC_DIR/playlists" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +#db_file "$XDG_CACHE_HOME/mpd/database" +db_file "~/.mpd/database" + +# These settings are the locations for the daemon log files for the daemon. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog. +# +# If you use systemd, do not configure a log_file. With systemd, MPD +# defaults to the systemd journal, which is fine. +# +#log_file "$XDG_CACHE_HOME/mpd/log" +#log_file "~/.mpd/log" + +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +# If you use systemd, do not configure a pid_file. +# +pid_file "$XDG_RUNTIME_DIR/mpd/mpd.pid" +#pid_file "~/.mpd/pid" + +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +state_file "$XDG_RUNTIME_DIR/mpd/state" +#state_file "~/.mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +#sticker_file "$XDG_CACHE_HOME/sticker.sql" +#sticker_file "~/.mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +#user "nobody" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other than the default, any. +# This setting can deny access to control of the daemon. Not effective if +# systemd socket activation is in use. +# +# For network +#bind_to_address "any" +# +# And for Unix Socket +#bind_to_address "$XDG_RUNTIME_DIR/mpd/socket" +bind_to_address "/tmp/mpd_socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +#port "6601" +# +# Suppress all messages below the given threshold. Use "verbose" for +# troubleshooting. Available setting arguments are "notice", "info", "verbose", +# "warning" and "error". +# +#log_level "notice" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +#restore_paused "no" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +#save_absolute_paths_in_playlists "no" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the user manual. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This example just enables the "comment" tag without disabling all +# the other supported tags: +#metadata_to_use "+comment" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. (Linux only) +# +auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +#zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. %h will be replaced with the hostname. +# +#zeroconf_name "Music Player @ %h" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Database ####################################################################### +# +# An example of a database section instead of the old 'db_file' setting. +# It enables mounting other storages into the music directory. +# +#database { +# plugin "simple" +# path "~/.local/share/mpd/db" +# cache_directory "~/.local/share/mpd/cache" +#} +# +# An example of database config for a satellite setup +# +#music_directory "nfs://fileserver.local/srv/mp3" +#database { +# plugin "proxy" +# host "other.mpd.host" +# port "6600" +#} + +# Input ####################################################################### +# +input { + plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# An example of an ALSA output: +# +#audio_output { +# type "alsa" +# name "My ALSA Device" +## device "hw:0,0" # optional +## mixer_type "hardware" # optional +## mixer_device "default" # optional +## mixer_control "PCM" # optional +## mixer_index "0" # optional +#} +audio_output { + type "pipewire" + name "PipeWire Sound Server" +} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +## device "/dev/dsp" # optional +## mixer_type "hardware" # optional +## mixer_device "/dev/mixer" # optional +## mixer_control "PCM" # optional +#} +# +# An example of a shout output (for streaming to Icecast): +# +#audio_output { +# type "shout" +# encoder "vorbis" # optional +# name "My Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "hackme" +# quality "5.0" +# bitrate "128" +# format "44100:16:1" +## protocol "icecast2" # optional +## user "source" # optional +## description "My Stream Description" # optional +## url "http://example.com" # optional +## genre "jazz" # optional +## public "no" # optional +## timeout "2" # optional +## mixer_type "software" # optional +#} +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} +# +# An example of a httpd output (built-in HTTP streaming server): +# +#audio_output { +# type "httpd" +# name "My HTTP Stream" +# encoder "vorbis" # optional, vorbis or lame +# port "8000" +# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +# max_clients "0" # optional 0=no limit +#} +# +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +## server "remote_server" # optional +## sink "remote_server_sink" # optional +## media_role "media_role" #optional +#} +# +# An example of a winmm output (Windows multimedia API). +# +#audio_output { +# type "winmm" +# name "My WinMM output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +## device "0" # optional +## mixer_type "hardware" # optional +#} +# +# An example of a wasapi output (Windows multimedia API). +# +#audio_output { +# type "wasapi" +# name "My WASAPI output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +## device "0" # optional +## mixer_type "hardware" # optional +## Exclusive mode blocks all other audio source, and get best audio quality without resampling. +## exclusive "no" # optional +## Enumerate all devices in log. +## enumerate "no" # optional +#} +# +# An example of an openal output. +# +#audio_output { +# type "openal" +# name "My OpenAL output" +## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +#} +# +# An example of an sndio output. +# +#audio_output { +# type "sndio" +# name "sndio output" +# mixer_type "hardware" +#} +# +# An example of an OS X output: +# +#audio_output { +# type "osx" +# name "My OS X Device" +## device "Built-in Output" # optional +## channel_map "-1,-1,0,1" # optional +#} +# +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +#audio_output { +# type "null" +# name "My Null Output" +# mixer_type "none" # optional +#} +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album", "track" or "auto". "auto" is a special mode that +# chooses between "track" and "album" depending on the current state of +# random playback. If random playback is enabled then "track" mode is used. +# See for +# more details about ReplayGain. +# This setting is off by default. +# +#replaygain "album" +# +############################################################################### + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +#filesystem_charset "UTF-8" +# +############################################################################### diff --git a/config/rmpc/config.ron b/config/rmpc/config.ron new file mode 100644 index 0000000..33a38f9 --- /dev/null +++ b/config/rmpc/config.ron @@ -0,0 +1,281 @@ +#![enable(implicit_some)] +#![enable(unwrap_newtypes)] +#![enable(unwrap_variant_newtypes)] +( + address: "/run/user/1000/mpd/socket", + password: None, + theme: None, + cache_dir: None, + on_song_change: None, + volume_step: 5, + max_fps: 165, + scrolloff: 0, + wrap_navigation: false, + enable_mouse: true, + scroll_amount: 1, + enable_config_hot_reload: true, + enable_lyrics_hot_reload: false, + status_update_interval_ms: 1000, + rewind_to_start_sec: None, + keep_state_on_song_change: true, + reflect_changes_to_playlist: false, + select_current_song_on_change: false, + ignore_leading_the: false, + browser_song_sort: [Disc, Track, Artist, Title], + directories_sort: SortFormat(group_by_type: true, reverse: false), + auto_open_downloads: true, + album_art: ( + method: Auto, + max_size_px: (width: 1200, height: 1200), + disabled_protocols: ["http://", "https://"], + vertical_align: Center, + horizontal_align: Center, + ), + keybinds: ( + global: { + "q": Quit, + "?": ShowHelp, + ":": CommandMode, + "oI": ShowCurrentSongInfo, + "oo": ShowOutputs, + "op": ShowDecoders, + "od": ShowDownloads, + "oP": Partition(), + "z": ToggleRepeat, + "x": ToggleRandom, + "c": ToggleConsume, + "v": ToggleSingle, + "p": TogglePause, + "s": Stop, + ">": NextTrack, + "<": PreviousTrack, + "f": SeekForward, + "b": SeekBack, + ".": VolumeUp, + ",": VolumeDown, + "": NextTab, + "gt": NextTab, + "": PreviousTab, + "gT": PreviousTab, + "1": SwitchToTab("Queue"), + "2": SwitchToTab("Directories"), + "3": SwitchToTab("Artists"), + "4": SwitchToTab("Album Artists"), + "5": SwitchToTab("Albums"), + "6": SwitchToTab("Playlists"), + "7": SwitchToTab("Search"), + "": Update, + "": Rescan, + "R": AddRandom, + }, + navigation: { + "": Close, + "": Close, + "": Confirm, + "k": Up, + "": Up, + "j": Down, + "": Down, + "h": Left, + "": Left, + "l": Right, + "": Right, + "k": PaneUp, + "": PaneUp, + "j": PaneDown, + "": PaneDown, + "h": PaneLeft, + "": PaneLeft, + "l": PaneRight, + "": PaneRight, + "K": MoveUp, + "J": MoveDown, + "": UpHalf, + "": DownHalf, + "": PageUp, + "": PageUp, + "": PageDown, + "": PageDown, + "gg": Top, + "G": Bottom, + "": Select, + "": InvertSelection, + "/": EnterSearch, + "n": NextResult, + "N": PreviousResult, + "a": Add, + "A": AddAll, + "D": Delete, + "": Rename, + "i": FocusInput, + "oi": ShowInfo, + "": ContextMenu(), + "s": Save(kind: Modal(all: false, duplicates_strategy: Ask)), + "a": Save(kind: Modal(all: true, duplicates_strategy: Ask)), + "r": Rate(), + }, + queue: { + "d": Delete, + "D": DeleteAll, + "": Play, + "C": JumpToCurrent, + "X": Shuffle, + }, + ), + search: ( + case_sensitive: false, + ignore_diacritics: false, + search_button: false, + mode: Contains, + tags: [ + (value: "any", label: "Any Tag"), + (value: "artist", label: "Artist"), + (value: "album", label: "Album"), + (value: "albumartist", label: "Album Artist"), + (value: "title", label: "Title"), + (value: "filename", label: "Filename"), + (value: "genre", label: "Genre"), + ], + ), + artists: ( + album_display_mode: SplitByDate, + album_sort_by: Date, + album_date_tags: [Date], + ), + tabs: [ + ( + name: "Queue", + pane: Split( + direction: Horizontal, + panes: [ + ( + size: "35%", + pane: Split( + direction: Vertical, + panes: [ + ( + size: "100%", + borders: "LEFT | RIGHT | TOP", + border_symbols: Rounded, + pane: Pane(AlbumArt) + ), + ( + size: "7", + borders: "ALL", + border_symbols: Inherited(parent: Rounded, top_left: "├", top_right: "┤",), + border_title: [(kind: Text(" Lyrics "))], + border_title_alignment: Right, + pane: Pane(Lyrics) + ), + ], + ), + ), + ( + size: "65%", + pane: Split( + direction: Vertical, + panes: [ + ( + size: "3", + borders: "ALL", + border_symbols: Inherited(parent: Rounded, bottom_left: "├", bottom_right: "┤",), + pane: Split( + direction: Horizontal, + panes: [ + ( + size: "1", + pane: Pane(Empty()) + ), + ( + size: "100%", + pane: Pane(QueueHeader()) + ), + ] + ) + ), + ( + size: "100%", + borders: "LEFT | RIGHT | BOTTOM", + border_symbols: Rounded, + pane: Split( + direction: Horizontal, + panes: [ + ( + size: "1", + pane: Pane(Empty()) + ), + ( + size: "100%", + pane: Pane(Queue) + ), + ] + ) + ), + ], + ) + ), + ], + ), + ), + ( + name: "Directories", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(Directories), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ( + name: "Artists", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(Artists), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ( + name: "Album Artists", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(AlbumArtists), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ( + name: "Albums", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(Albums), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ( + name: "Playlists", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(Playlists), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ( + name: "Search", + borders: "ALL", + border_symbols: Rounded, + pane: Split( + size: "100%", + direction: Vertical, + panes: [(pane: Pane(Search), size: "100%", borders: "ALL", border_symbols: Rounded)], + ) + ), + ], +) diff --git a/config/rmpc/themes/zzz.ron b/config/rmpc/themes/zzz.ron new file mode 100644 index 0000000..696c77e --- /dev/null +++ b/config/rmpc/themes/zzz.ron @@ -0,0 +1,307 @@ +#![enable(implicit_some)] +#![enable(unwrap_newtypes)] +#![enable(unwrap_variant_newtypes)] +( + default_album_art_path: None, + format_tag_separator: " | ", + browser_column_widths: [20, 38, 42], + background_color: None, + text_color: None, + header_background_color: None, + modal_background_color: None, + modal_backdrop: false, + preview_label_style: (fg: "yellow"), + preview_metadata_group_style: (fg: "yellow", modifiers: "Bold"), + highlighted_item_style: (fg: "blue", modifiers: "Bold"), + current_item_style: (fg: "black", bg: "blue", modifiers: "Bold"), + borders_style: (fg: "blue"), + highlight_border_style: (fg: "blue"), + symbols: ( + song: "S", + dir: "D", + playlist: "P", + marker: "M", + ellipsis: "...", + song_style: None, + dir_style: None, + playlist_style: None, + ), + level_styles: ( + info: (fg: "green", bg: "black"), + warn: (fg: "yellow", bg: "black"), + error: (fg: "red", bg: "black"), + debug: (fg: "light_green", bg: "black"), + trace: (fg: "magenta", bg: "black"), + ), + progress_bar: ( + symbols: ["█", "█", "█", " ", "█"], + track_style: None, + elapsed_style: (fg: "green"), + thumb_style: (fg: "blue"), + use_track_when_empty: true, + ), + scrollbar: ( + symbols: ["│", "█", "▲", "▼"], + track_style: (), + ends_style: (), + thumb_style: (fg: "blue"), + ), + tab_bar: ( + active_style: (fg: "black", bg: "blue", modifiers: "Bold"), + inactive_style: (), + ), + lyrics: ( + timestamp: false + ), + browser_song_format: [ + ( + kind: Group([ + (kind: Property(Track)), + (kind: Text(" ")), + ]) + ), + ( + kind: Group([ + (kind: Property(Artist)), + (kind: Text(" - ")), + (kind: Property(Title)), + ]), + default: (kind: Property(Filename)) + ), + ], + song_table_format: [ + ( + prop: (kind: Property(Artist), + default: (kind: Text("Unknown")) + ), + label_prop: (kind: Text("Artist")), + width: "20%", + ), + ( + prop: (kind: Property(Title), + default: (kind: Text("Unknown")) + ), + label_prop: (kind: Text("Title")), + width: "35%", + ), + ( + prop: (kind: Property(Album), style: (fg: "white"), + default: (kind: Text("Unknown Album"), style: (fg: "white")) + ), + label_prop: (kind: Text("Album")), + width: "30%", + ), + ( + prop: (kind: Property(Duration), + default: (kind: Text("-")) + ), + label_prop: (kind: Text("Duration")), + width: "15%", + alignment: Right, + ), + ], + layout: Split( + direction: Vertical, + panes: [ + ( + size: "4", + pane: Split( + direction: Horizontal, + panes: [ + ( + size: "35", + borders: "LEFT | TOP | BOTTOM", + border_symbols: Inherited(parent: Rounded, bottom_left: "├"), + pane: Component("header_left") + ), + ( + size: "100%", + borders: "ALL", + border_symbols: Inherited(parent: Rounded, top_left: "┬", top_right: "┬", bottom_left: "┴", bottom_right: "┴"), + pane: Component("header_center") + ), + ( + size: "35", + borders: "RIGHT | TOP | BOTTOM", + border_symbols: Inherited(parent: Rounded, bottom_right: "┤"), + pane: Component("header_right") + ), + ] + ) + ), + ( + pane: Pane(Tabs), + borders: "RIGHT | LEFT | BOTTOM", + border_symbols: Rounded, + size: "2", + ), + ( + pane: Pane(TabContent), + size: "100%", + ), + ( + size: "3", + pane: Split( + direction: Horizontal, + panes: [ + ( + size: "12", + borders: "ALL", + border_symbols: Inherited(parent: Rounded, top_right: "┬", bottom_right: "┴"), + pane: Component("input_mode") + ), + ( + size: "100%", + borders: "TOP | BOTTOM | RIGHT", + border_symbols: Rounded, + border_title: [(kind: Text(" ")), (kind: Property(Status(QueueLength()))), (kind: Text(" songs / ")), (kind: Property(Status(QueueTimeTotal()))), (kind: Text(" total time "))], + border_title_alignment: Right, + pane: Component("progress_bar"), + ), + ] + ), + ), + ], + ), + components: { + "state": Pane(Property( + content: [ + (kind: Text("["), style: (fg: "yellow", modifiers: "Bold")), + (kind: Property(Status(StateV2( ))), style: (fg: "yellow", modifiers: "Bold")), + (kind: Text("]"), style: (fg: "yellow", modifiers: "Bold")), + ], align: Left, + )), + "title": Pane(Property( + content: [ + (kind: Property(Song(Title)), style: (modifiers: "Bold"), + default: (kind: Text("No Song"), style: (modifiers: "Bold"))), + ], align: Center, scroll_speed: 1 + )), + "volume": Split( + direction: Horizontal, + panes: [ + (size: "1", pane: Pane(Property(content: [(kind: Text(""))]))), + (size: "100%", pane: Pane(Volume(kind: Slider(symbols: (filled: "─", thumb: "●", track: "─"))))), + (size: "3", pane: Pane(Property(content: [(kind: Property(Status(Volume)), style: (fg: "blue"))], align: Right))), + (size: "2", pane: Pane(Property(content: [(kind: Text("%"), style: (fg: "blue"))]))), + ] + ), + "elapsed_and_bitrate": Pane(Property( + content: [ + (kind: Property(Status(Elapsed))), + (kind: Text(" / ")), + (kind: Property(Status(Duration))), + (kind: Group([ + (kind: Text(" (")), + (kind: Property(Status(Bitrate))), + (kind: Text(" kbps)")), + ])), + ], + align: Left, + )), + "artist_and_album": Pane(Property( + content: [ + (kind: Property(Song(Artist)), style: (fg: "yellow", modifiers: "Bold"), + default: (kind: Text("Unknown"), style: (fg: "yellow", modifiers: "Bold"))), + (kind: Text(" - ")), + (kind: Property(Song(Album)), default: (kind: Text("Unknown Album"))), + ], align: Center, scroll_speed: 1 + )), + "states": Split( + direction: Horizontal, + panes: [ + ( + size: "1", + pane: Pane(Empty()) + ), + ( + size: "100%", + pane: Pane(Property(content: [(kind: Property(Status(InputBuffer())), style: (fg: "blue"), align: Left)])) + ), + ( + size: "6", + pane: Pane(Property(content: [ + (kind: Text("["), style: (fg: "blue", modifiers: "Bold")), + (kind: Property(Status(RepeatV2( + on_label: "z", + off_label: "z", + on_style: (fg: "yellow", modifiers: "Bold"), + off_style: (fg: "blue", modifiers: "Dim"), + )))), + (kind: Property(Status(RandomV2( + on_label: "x", + off_label: "x", + on_style: (fg: "yellow", modifiers: "Bold"), + off_style: (fg: "blue", modifiers: "Dim"), + )))), + (kind: Property(Status(ConsumeV2( + on_label: "c", + off_label: "c", + oneshot_label: "c", + on_style: (fg: "yellow", modifiers: "Bold"), + off_style: (fg: "blue", modifiers: "Dim"), + oneshot_style: (fg: "red", modifiers: "Dim"), + )))), + (kind: Property(Status(SingleV2( + on_label: "v", + off_label: "v", + oneshot_label: "v", + on_style: (fg: "yellow", modifiers: "Bold"), + off_style: (fg: "blue", modifiers: "Dim"), + oneshot_style: (fg: "red", modifiers: "Bold"), + )))), + (kind: Text("]"), style: (fg: "blue", modifiers: "Bold")), + ], + align: Right + )) + ), + ] + ), + "input_mode": Pane(Property( + content: [ + (kind: Transform(Replace(content: (kind: Property(Status(InputMode()))), replacements: [ + (match: "Normal", replace: (kind: Text(" NORMAL "), style: (fg: "black", bg: "blue"))), + (match: "Insert", replace: (kind: Text(" INSERT "), style: (fg: "black", bg: "green"))), + ]))) + ], align: Center + )), + "header_left": Split( + direction: Vertical, + panes: [ + (size: "1", pane: Component("state")), + (size: "1", pane: Component("elapsed_and_bitrate")), + ] + ), + "header_center": Split( + direction: Vertical, + panes: [ + (size: "1", pane: Component("title")), + (size: "1", pane: Component("artist_and_album")), + ] + ), + "header_right": Split( + direction: Vertical, + panes: [ + (size: "1", pane: Component("volume")), + (size: "1", pane: Component("states")), + ] + ), + "progress_bar": Split( + direction: Horizontal, + panes: [ + ( + size: "1", + pane: Pane(Empty()) + ), + ( + size: "100%", + pane: Pane(ProgressBar) + ), + ( + size: "1", + pane: Pane(Empty()) + ), + ] + ) + }, +)