Compare commits

...

2 commits

Author SHA1 Message Date
2f70f61547 don' use the libsecret crate 2024-10-29 19:13:58 +01:00
1f289ecf1e gir 2024-10-29 15:46:33 +01:00
22 changed files with 688 additions and 266 deletions

263
Cargo.lock generated
View file

@ -9,7 +9,6 @@ dependencies = [
"glib-build-tools", "glib-build-tools",
"gtk4", "gtk4",
"libadwaita", "libadwaita",
"libsecret",
] ]
[[package]] [[package]]
@ -32,7 +31,7 @@ checksum = "e8a0ea147c94108c9613235388f540e4d14c327f7081c9e471fc8ee8a2533e69"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"cairo-sys-rs", "cairo-sys-rs",
"glib 0.20.4", "glib",
"libc", "libc",
] ]
@ -42,19 +41,9 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f"
dependencies = [ dependencies = [
"glib-sys 0.20.4", "glib-sys",
"libc", "libc",
"system-deps 7.0.3", "system-deps",
]
[[package]]
name = "cfg-expr"
version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
dependencies = [
"smallvec",
"target-lexicon",
] ]
[[package]] [[package]]
@ -153,8 +142,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19"
dependencies = [ dependencies = [
"gdk-pixbuf-sys", "gdk-pixbuf-sys",
"gio 0.20.4", "gio",
"glib 0.20.4", "glib",
"libc", "libc",
] ]
@ -164,11 +153,11 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d"
dependencies = [ dependencies = [
"gio-sys 0.20.4", "gio-sys",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"libc", "libc",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -180,8 +169,8 @@ dependencies = [
"cairo-rs", "cairo-rs",
"gdk-pixbuf", "gdk-pixbuf",
"gdk4-sys", "gdk4-sys",
"gio 0.20.4", "gio",
"glib 0.20.4", "glib",
"libc", "libc",
"pango", "pango",
] ]
@ -194,31 +183,13 @@ checksum = "7d3c03d1ea9d5199f14f060890fde68a3b5ec5699144773d1fa6abf337bfbc9c"
dependencies = [ dependencies = [
"cairo-sys-rs", "cairo-sys-rs",
"gdk-pixbuf-sys", "gdk-pixbuf-sys",
"gio-sys 0.20.4", "gio-sys",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"libc", "libc",
"pango-sys", "pango-sys",
"pkg-config", "pkg-config",
"system-deps 7.0.3", "system-deps",
]
[[package]]
name = "gio"
version = "0.19.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c49f117d373ffcc98a35d114db5478bc223341cff53e39a5d6feced9e2ddffe"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-util",
"gio-sys 0.19.8",
"glib 0.19.9",
"libc",
"pin-project-lite",
"smallvec",
"thiserror",
] ]
[[package]] [[package]]
@ -231,61 +202,26 @@ dependencies = [
"futures-core", "futures-core",
"futures-io", "futures-io",
"futures-util", "futures-util",
"gio-sys 0.20.4", "gio-sys",
"glib 0.20.4", "glib",
"libc", "libc",
"pin-project-lite", "pin-project-lite",
"smallvec", "smallvec",
] ]
[[package]]
name = "gio-sys"
version = "0.19.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cd743ba4714d671ad6b6234e8ab2a13b42304d0e13ab7eba1dcdd78a7d6d4ef"
dependencies = [
"glib-sys 0.19.8",
"gobject-sys 0.19.8",
"libc",
"system-deps 6.2.2",
"windows-sys",
]
[[package]] [[package]]
name = "gio-sys" name = "gio-sys"
version = "0.20.4" version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f7efc368de04755344f0084104835b6bb71df2c1d41e37d863947392a894779" checksum = "4f7efc368de04755344f0084104835b6bb71df2c1d41e37d863947392a894779"
dependencies = [ dependencies = [
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"libc", "libc",
"system-deps 7.0.3", "system-deps",
"windows-sys", "windows-sys",
] ]
[[package]]
name = "glib"
version = "0.19.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39650279f135469465018daae0ba53357942a5212137515777d5fdca74984a44"
dependencies = [
"bitflags",
"futures-channel",
"futures-core",
"futures-executor",
"futures-task",
"futures-util",
"gio-sys 0.19.8",
"glib-macros 0.19.9",
"glib-sys 0.19.8",
"gobject-sys 0.19.8",
"libc",
"memchr",
"smallvec",
"thiserror",
]
[[package]] [[package]]
name = "glib" name = "glib"
version = "0.20.4" version = "0.20.4"
@ -298,10 +234,10 @@ dependencies = [
"futures-executor", "futures-executor",
"futures-task", "futures-task",
"futures-util", "futures-util",
"gio-sys 0.20.4", "gio-sys",
"glib-macros 0.20.4", "glib-macros",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"libc", "libc",
"memchr", "memchr",
"smallvec", "smallvec",
@ -313,20 +249,7 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7029c2651d9b5d5a3eea93ec8a1995665c6d3a69ce9bf6042ad9064d134736d8" checksum = "7029c2651d9b5d5a3eea93ec8a1995665c6d3a69ce9bf6042ad9064d134736d8"
dependencies = [ dependencies = [
"gio 0.20.4", "gio",
]
[[package]]
name = "glib-macros"
version = "0.19.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4429b0277a14ae9751350ad9b658b1be0abb5b54faa5bcdf6e74a3372582fad7"
dependencies = [
"heck",
"proc-macro-crate",
"proc-macro2",
"quote",
"syn",
] ]
[[package]] [[package]]
@ -342,16 +265,6 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "glib-sys"
version = "0.19.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c2dc18d3a82b0006d470b13304fbbb3e0a9bd4884cf985a60a7ed733ac2c4a5"
dependencies = [
"libc",
"system-deps 6.2.2",
]
[[package]] [[package]]
name = "glib-sys" name = "glib-sys"
version = "0.20.4" version = "0.20.4"
@ -359,18 +272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f9eca5d88cfa6a453b00d203287c34a2b7cac3a7831779aa2bb0b3c7233752b" checksum = "5f9eca5d88cfa6a453b00d203287c34a2b7cac3a7831779aa2bb0b3c7233752b"
dependencies = [ dependencies = [
"libc", "libc",
"system-deps 7.0.3", "system-deps",
]
[[package]]
name = "gobject-sys"
version = "0.19.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e697e252d6e0416fd1d9e169bda51c0f1c926026c39ca21fbe8b1bb5c3b8b9e"
dependencies = [
"glib-sys 0.19.8",
"libc",
"system-deps 6.2.2",
] ]
[[package]] [[package]]
@ -379,9 +281,9 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462"
dependencies = [ dependencies = [
"glib-sys 0.20.4", "glib-sys",
"libc", "libc",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -390,7 +292,7 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe"
dependencies = [ dependencies = [
"glib 0.20.4", "glib",
"graphene-sys", "graphene-sys",
"libc", "libc",
] ]
@ -401,10 +303,10 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99"
dependencies = [ dependencies = [
"glib-sys 0.20.4", "glib-sys",
"libc", "libc",
"pkg-config", "pkg-config",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -415,7 +317,7 @@ checksum = "aa21a2f7c51ee1c6cc1242c2faf3aae2b7566138f182696759987bde8219e922"
dependencies = [ dependencies = [
"cairo-rs", "cairo-rs",
"gdk4", "gdk4",
"glib 0.20.4", "glib",
"graphene-rs", "graphene-rs",
"gsk4-sys", "gsk4-sys",
"libc", "libc",
@ -430,12 +332,12 @@ checksum = "0f9fb607554f9f4e8829eb7ea301b0fde051e1dbfd5d16b143a8a9c2fac6c01b"
dependencies = [ dependencies = [
"cairo-sys-rs", "cairo-sys-rs",
"gdk4-sys", "gdk4-sys",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"graphene-sys", "graphene-sys",
"libc", "libc",
"pango-sys", "pango-sys",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -449,8 +351,8 @@ dependencies = [
"futures-channel", "futures-channel",
"gdk-pixbuf", "gdk-pixbuf",
"gdk4", "gdk4",
"gio 0.20.4", "gio",
"glib 0.20.4", "glib",
"graphene-rs", "graphene-rs",
"gsk4", "gsk4",
"gtk4-macros", "gtk4-macros",
@ -480,14 +382,14 @@ dependencies = [
"cairo-sys-rs", "cairo-sys-rs",
"gdk-pixbuf-sys", "gdk-pixbuf-sys",
"gdk4-sys", "gdk4-sys",
"gio-sys 0.20.4", "gio-sys",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"graphene-sys", "graphene-sys",
"gsk4-sys", "gsk4-sys",
"libc", "libc",
"pango-sys", "pango-sys",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -519,8 +421,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ff9c222b5c783729de45185f07b2fec2d43a7f9c63961e777d3667e20443878" checksum = "2ff9c222b5c783729de45185f07b2fec2d43a7f9c63961e777d3667e20443878"
dependencies = [ dependencies = [
"gdk4", "gdk4",
"gio 0.20.4", "gio",
"glib 0.20.4", "glib",
"gtk4", "gtk4",
"libadwaita-sys", "libadwaita-sys",
"libc", "libc",
@ -534,13 +436,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c44d8bdbad31d6639e1f20cc9c1424f1a8e02d751fc28d44659bf743fb9eca6" checksum = "1c44d8bdbad31d6639e1f20cc9c1424f1a8e02d751fc28d44659bf743fb9eca6"
dependencies = [ dependencies = [
"gdk4-sys", "gdk4-sys",
"gio-sys 0.20.4", "gio-sys",
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"gtk4-sys", "gtk4-sys",
"libc", "libc",
"pango-sys", "pango-sys",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -549,32 +451,6 @@ version = "0.2.161"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
[[package]]
name = "libsecret"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50c6ccddc706a38eca477b4d7857acd6c76c7d6fba5d47b4b2e7d800e5a17194"
dependencies = [
"gio 0.19.8",
"glib 0.19.9",
"libc",
"libsecret-sys",
]
[[package]]
name = "libsecret-sys"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a1af48e61f1c8e77e9705296f346e45b637754a92348a79b4c62df84d0654c2"
dependencies = [
"gio-sys 0.19.8",
"glib-sys 0.19.8",
"gobject-sys 0.19.8",
"libc",
"pkg-config",
"system-deps 6.2.2",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.4" version = "2.7.4"
@ -596,8 +472,8 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa26aa54b11094d72141a754901cd71d9356432bb8147f9cace8d9c7ba95f356" checksum = "aa26aa54b11094d72141a754901cd71d9356432bb8147f9cace8d9c7ba95f356"
dependencies = [ dependencies = [
"gio 0.20.4", "gio",
"glib 0.20.4", "glib",
"libc", "libc",
"pango-sys", "pango-sys",
] ]
@ -608,10 +484,10 @@ version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838"
dependencies = [ dependencies = [
"glib-sys 0.20.4", "glib-sys",
"gobject-sys 0.20.4", "gobject-sys",
"libc", "libc",
"system-deps 7.0.3", "system-deps",
] ]
[[package]] [[package]]
@ -729,26 +605,13 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "system-deps"
version = "6.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
dependencies = [
"cfg-expr 0.15.8",
"heck",
"pkg-config",
"toml",
"version-compare",
]
[[package]] [[package]]
name = "system-deps" name = "system-deps"
version = "7.0.3" version = "7.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005"
dependencies = [ dependencies = [
"cfg-expr 0.17.0", "cfg-expr",
"heck", "heck",
"pkg-config", "pkg-config",
"toml", "toml",
@ -761,26 +624,6 @@ version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "thiserror"
version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "toml" name = "toml"
version = "0.8.19" version = "0.8.19"

View file

@ -6,7 +6,6 @@ edition = "2021"
[dependencies] [dependencies]
adw = { version = "0.7.0", package = "libadwaita", features = ["v1_6"] } adw = { version = "0.7.0", package = "libadwaita", features = ["v1_6"] }
gtk = { version = "0.9.2", package = "gtk4", features = ["v4_16"] } gtk = { version = "0.9.2", package = "gtk4", features = ["v4_16"] }
libsecret = { version = "0.5.0", features = ["v0_21"] }
[build-dependencies] [build-dependencies]
glib-build-tools = "0.20.0" glib-build-tools = "0.20.0"

View file

@ -1,11 +1,11 @@
using Gtk 4.0; using Gtk 4.0;
using Adw 1; using Adw 1;
template $UiPlayQueue: Adw.Bin { template $AudreyUiPlayQueue: Adw.Bin {
name: "play-queue"; name: "play-queue";
child: Stack { child: Stack {
visible-child-name: bind $visible_child_name (template.playbin as <$Playbin>.play-queue-length) as <string>; visible-child-name: bind $visible_child_name (template.playbin as <$AudreyPlaybin>.play-queue-length) as <string>;
StackPage { StackPage {
name: "empty"; name: "empty";
@ -31,7 +31,7 @@ template $UiPlayQueue: Adw.Bin {
activate => $on_row_activated (); activate => $on_row_activated ();
model: NoSelection { model: NoSelection {
model: bind template.playbin as <$Playbin>.play_queue; model: bind template.playbin as <$AudreyPlaybin>.play_queue;
}; };
factory: SignalListItemFactory { factory: SignalListItemFactory {

View file

@ -1,6 +1,6 @@
using Gtk 4.0; using Gtk 4.0;
template $UiPlayQueueSong: Box { template $AudreyUiPlayQueueSong: Box {
height-request: 48; height-request: 48;
spacing: 12; spacing: 12;
margin-start: 6; margin-start: 6;
@ -35,7 +35,7 @@ template $UiPlayQueueSong: Box {
margin-top: 1; margin-top: 1;
margin-bottom: 1; margin-bottom: 1;
pixel-size: 50; pixel-size: 50;
paintable: bind template.song as <$PlaybinSong>.thumbnail; paintable: bind template.song as <$AudreyPlaybinSong>.thumbnail;
} }
Box title_box { Box title_box {
@ -58,7 +58,7 @@ template $UiPlayQueueSong: Box {
max-width-chars: 90; max-width-chars: 90;
justify: fill; justify: fill;
label: bind template.song as <$PlaybinSong>.title; label: bind template.song as <$AudreyPlaybinSong>.title;
} }
Label { Label {
@ -71,7 +71,7 @@ template $UiPlayQueueSong: Box {
max-width-chars: 90; max-width-chars: 90;
justify: fill; justify: fill;
label: bind template.song as <$PlaybinSong>.artist; label: bind template.song as <$AudreyPlaybinSong>.artist;
} }
} }
} }
@ -83,12 +83,12 @@ template $UiPlayQueueSong: Box {
single-line-mode: true; single-line-mode: true;
styles [ "numeric", "dim-label" ] styles [ "numeric", "dim-label" ]
label: bind $format_duration (template.song as <$PlaybinSong>.duration) as <string>; label: bind $format_duration (template.song as <$AudreyPlaybinSong>.duration) as <string>;
} }
Button { Button {
focusable: true; focusable: true;
// TODO icon-name: bind $star_button_icon_name (template.song as <$PlaybinSong>.starred) as <string>; // TODO icon-name: bind $star_button_icon_name (template.song as <$AudreyPlaybinSong>.starred) as <string>;
icon-name: bind $star_button_icon_name () as <string>; icon-name: bind $star_button_icon_name () as <string>;
styles [ "flat" ] styles [ "flat" ]
valign: center; valign: center;
@ -116,7 +116,7 @@ template $UiPlayQueueSong: Box {
DropTarget { DropTarget {
actions: move; actions: move;
formats: "UiPlayQueueSong"; formats: "AudreyUiPlayQueueSong";
preload: true; preload: true;
drop => $on_drop (); drop => $on_drop ();

View file

@ -1,7 +1,7 @@
using Gtk 4.0; using Gtk 4.0;
using Adw 1; using Adw 1;
template $UiPlaybar: Adw.Bin { template $AudreyUiPlaybar: Adw.Bin {
child: CenterBox { child: CenterBox {
hexpand: true; hexpand: true;
styles [ styles [
@ -66,7 +66,7 @@ template $UiPlaybar: Adw.Bin {
"numeric", "numeric",
] ]
label: bind $format_timestamp (template.playbin as <$Playbin>.position) as <string>; label: bind $format_timestamp (template.playbin as <$AudreyPlaybin>.position) as <string>;
} }
[center] [center]
@ -74,12 +74,12 @@ template $UiPlaybar: Adw.Bin {
name: "seek-scale"; name: "seek-scale";
orientation: horizontal; orientation: horizontal;
width-request: 400; width-request: 400;
sensitive: bind $playbin_active (template.playbin as <$Playbin>.state as <$PlaybinState>) as <bool>; sensitive: bind $playbin_active (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <bool>;
adjustment: Adjustment { adjustment: Adjustment {
lower: 0; lower: 0;
value: bind template.playbin as <$Playbin>.position; value: bind template.playbin as <$AudreyPlaybin>.position;
upper: bind template.playbin as <$Playbin>.duration; upper: bind template.playbin as <$AudreyPlaybin>.duration;
}; };
change-value => $on_play_position_seek (); change-value => $on_play_position_seek ();
@ -92,7 +92,7 @@ template $UiPlaybar: Adw.Bin {
"numeric", "numeric",
] ]
label: bind $format_timestamp (template.playbin as <$Playbin>.duration) as <string>; label: bind $format_timestamp (template.playbin as <$AudreyPlaybin>.duration) as <string>;
} }
} }
@ -103,7 +103,7 @@ template $UiPlaybar: Adw.Bin {
Button { Button {
icon-name: "media-skip-backward"; icon-name: "media-skip-backward";
valign: center; valign: center;
sensitive: bind $playbin_active (template.playbin as <$Playbin>.state as <$PlaybinState>) as <bool>; sensitive: bind $playbin_active (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <bool>;
clicked => $on_skip_backward_clicked (); clicked => $on_skip_backward_clicked ();
} }
@ -111,15 +111,15 @@ template $UiPlaybar: Adw.Bin {
Button { Button {
icon-name: "media-seek-backward"; icon-name: "media-seek-backward";
valign: center; valign: center;
sensitive: bind $playbin_active (template.playbin as <$Playbin>.state as <$PlaybinState>) as <bool>; sensitive: bind $playbin_active (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <bool>;
clicked => $seek_backward (); clicked => $seek_backward ();
} }
Button { Button {
icon-name: bind $play_pause_icon_name (template.playbin as <$Playbin>.state as <$PlaybinState>) as <string>; icon-name: bind $play_pause_icon_name (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <string>;
valign: center; valign: center;
sensitive: bind $can_press_play (template.playbin as <$Playbin>.state as <$PlaybinState>, template.playbin as <$Playbin>.play-queue-length) as <bool>; sensitive: bind $can_press_play (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>, template.playbin as <$AudreyPlaybin>.play-queue-length) as <bool>;
clicked => $on_play_pause_clicked (); clicked => $on_play_pause_clicked ();
} }
@ -127,7 +127,7 @@ template $UiPlaybar: Adw.Bin {
Button { Button {
icon-name: "media-seek-forward"; icon-name: "media-seek-forward";
valign: center; valign: center;
sensitive: bind $playbin_active (template.playbin as <$Playbin>.state as <$PlaybinState>) as <bool>; sensitive: bind $playbin_active (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <bool>;
clicked => $seek_forward (); clicked => $seek_forward ();
} }
@ -135,7 +135,7 @@ template $UiPlaybar: Adw.Bin {
Button { Button {
icon-name: "media-skip-forward"; icon-name: "media-skip-forward";
valign: center; valign: center;
sensitive: bind $playbin_active (template.playbin as <$Playbin>.state as <$PlaybinState>) as <bool>; sensitive: bind $playbin_active (template.playbin as <$AudreyPlaybin>.state as <$AudreyPlaybinState>) as <bool>;
clicked => $on_skip_forward_clicked (); clicked => $on_skip_forward_clicked ();
} }
@ -150,7 +150,7 @@ template $UiPlaybar: Adw.Bin {
} }
Button { Button {
icon-name: bind $mute_button_icon_name (template.playbin as <$Playbin>.mute) as <string>; icon-name: bind $mute_button_icon_name (template.playbin as <$AudreyPlaybin>.mute) as <string>;
valign: center; valign: center;
clicked => $on_mute_toggle (); clicked => $on_mute_toggle ();

View file

@ -1,7 +1,7 @@
using Gtk 4.0; using Gtk 4.0;
using Adw 1; using Adw 1;
template $UiSetup: Adw.PreferencesDialog { template $AudreyUiSetup: Adw.PreferencesDialog {
title: _("Setup"); title: _("Setup");
Adw.ToolbarView { Adw.ToolbarView {

View file

@ -1,7 +1,7 @@
using Gtk 4.0; using Gtk 4.0;
using Adw 1; using Adw 1;
template $UiWindow: Adw.ApplicationWindow { template $AudreyUiWindow: Adw.ApplicationWindow {
title: _("audrey"); title: _("audrey");
default-width: 800; default-width: 800;
default-height: 600; default-height: 600;
@ -109,7 +109,7 @@ template $UiWindow: Adw.ApplicationWindow {
} }
} }
$UiPlayQueue play_queue { $AudreyUiPlayQueue play_queue {
hexpand: true; hexpand: true;
halign: fill; halign: fill;
@ -126,7 +126,7 @@ template $UiWindow: Adw.ApplicationWindow {
}; };
[bottom] [bottom]
$UiPlaybar playbar { $AudreyUiPlaybar playbar {
song: bind template.song; song: bind template.song;
playbin: bind template.playbin; playbin: bind template.playbin;
playing_cover_art: bind template.playing_cover_art; playing_cover_art: bind template.playing_cover_art;

497
src/ffi.rs Normal file
View file

@ -0,0 +1,497 @@
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from /usr/share/gir-1.0
// from ../o/src
// DO NOT EDIT
#![allow(non_camel_case_types, non_upper_case_globals, non_snake_case)]
#![allow(clippy::approx_constant, clippy::type_complexity, clippy::unreadable_literal, clippy::upper_case_acronyms)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#[allow(unused_imports)]
use libc::{c_int, c_char, c_uchar, c_float, c_uint, c_double,
c_short, c_ushort, c_long, c_ulong,
c_void, size_t, ssize_t, time_t, off_t, intptr_t, uintptr_t, FILE};
#[cfg(unix)]
#[allow(unused_imports)]
use libc::{dev_t, gid_t, pid_t, socklen_t, uid_t};
#[allow(unused_imports)]
use gtk::{gio, glib::{gboolean, gconstpointer, gpointer, GType}};
// Enums
pub type AudreyPlaybinState = c_int;
pub const AUDREY_PLAYBIN_STATE_STOPPED: AudreyPlaybinState = 0;
pub const AUDREY_PLAYBIN_STATE_PAUSED: AudreyPlaybinState = 1;
pub const AUDREY_PLAYBIN_STATE_PLAYING: AudreyPlaybinState = 2;
pub type AudreySubsonicError = c_int;
pub const AUDREY_SUBSONIC_ERROR_BAD_AUTHN: AudreySubsonicError = 0;
pub const AUDREY_SUBSONIC_ERROR_ERROR: AudreySubsonicError = 1;
// Callbacks
pub type AudreySubsonicSongCallback = Option<unsafe extern "C" fn(*mut AudreySubsonicSong, *mut c_void)>;
// Records
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyApplicationClass {
pub parent_class: adw::AdwApplicationClass,
}
impl ::std::fmt::Debug for AudreyApplicationClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyApplicationClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreyApplicationPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreyApplicationPrivate = _AudreyApplicationPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyPlaybinClass {
pub parent_class: gobject::GObjectClass,
}
impl ::std::fmt::Debug for AudreyPlaybinClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyPlaybinClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreyPlaybinPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreyPlaybinPrivate = _AudreyPlaybinPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyPlaybinSongClass {
pub parent_class: gobject::GObjectClass,
}
impl ::std::fmt::Debug for AudreyPlaybinSongClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyPlaybinSongClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreyPlaybinSongPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreyPlaybinSongPrivate = _AudreyPlaybinSongPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicAlbumClass {
pub parent_class: gobject::GObjectClass,
}
impl ::std::fmt::Debug for AudreySubsonicAlbumClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicAlbumClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreySubsonicAlbumPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreySubsonicAlbumPrivate = _AudreySubsonicAlbumPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicArtistClass {
pub parent_class: gobject::GObjectClass,
}
impl ::std::fmt::Debug for AudreySubsonicArtistClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicArtistClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreySubsonicArtistPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreySubsonicArtistPrivate = _AudreySubsonicArtistPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicClientClass {
pub parent_class: gobject::GObjectClass,
}
impl ::std::fmt::Debug for AudreySubsonicClientClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicClientClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreySubsonicClientPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreySubsonicClientPrivate = _AudreySubsonicClientPrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicSong {
pub id: *mut c_char,
pub title: *mut c_char,
pub album: *mut c_char,
pub artist: *mut c_char,
pub track: i64,
pub year: i64,
pub starred: *mut glib::GDateTime,
pub duration: i64,
pub play_count: i64,
pub genre: *mut c_char,
pub cover_art: *mut c_char,
}
impl ::std::fmt::Debug for AudreySubsonicSong {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicSong @ {self:p}"))
.field("id", &self.id)
.field("title", &self.title)
.field("album", &self.album)
.field("artist", &self.artist)
.field("track", &self.track)
.field("year", &self.year)
.field("starred", &self.starred)
.field("duration", &self.duration)
.field("play_count", &self.play_count)
.field("genre", &self.genre)
.field("cover_art", &self.cover_art)
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyUiPlayQueueClass {
pub parent_class: adw::AdwBinClass,
}
impl ::std::fmt::Debug for AudreyUiPlayQueueClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyUiPlayQueueClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreyUiPlayQueuePrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreyUiPlayQueuePrivate = _AudreyUiPlayQueuePrivate;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyUiSetupClass {
pub parent_class: adw::AdwPreferencesDialogClass,
}
impl ::std::fmt::Debug for AudreyUiSetupClass {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyUiSetupClass @ {self:p}"))
.finish()
}
}
#[repr(C)]
pub struct _AudreyUiSetupPrivate {
_data: [u8; 0],
_marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}
pub type AudreyUiSetupPrivate = _AudreyUiSetupPrivate;
// Classes
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyApplication {
pub parent_instance: adw::AdwApplication,
pub priv_: *mut AudreyApplicationPrivate,
}
impl ::std::fmt::Debug for AudreyApplication {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyApplication @ {self:p}"))
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyPlaybin {
pub parent_instance: gobject::GObject,
pub priv_: *mut AudreyPlaybinPrivate,
}
impl ::std::fmt::Debug for AudreyPlaybin {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyPlaybin @ {self:p}"))
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyPlaybinSong {
pub parent_instance: gobject::GObject,
pub priv_: *mut AudreyPlaybinSongPrivate,
}
impl ::std::fmt::Debug for AudreyPlaybinSong {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyPlaybinSong @ {self:p}"))
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicAlbum {
pub parent_instance: gobject::GObject,
pub priv_: *mut AudreySubsonicAlbumPrivate,
pub id: *mut c_char,
pub name: *mut c_char,
}
impl ::std::fmt::Debug for AudreySubsonicAlbum {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicAlbum @ {self:p}"))
.field("id", &self.id)
.field("name", &self.name)
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicArtist {
pub parent_instance: gobject::GObject,
pub priv_: *mut AudreySubsonicArtistPrivate,
pub index: *mut c_char,
pub id: *mut c_char,
pub cover_art: *mut c_char,
pub artist_image_url: *mut c_char,
pub album_count: i64,
}
impl ::std::fmt::Debug for AudreySubsonicArtist {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicArtist @ {self:p}"))
.field("index", &self.index)
.field("id", &self.id)
.field("cover_art", &self.cover_art)
.field("artist_image_url", &self.artist_image_url)
.field("album_count", &self.album_count)
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreySubsonicClient {
pub parent_instance: gobject::GObject,
pub priv_: *mut AudreySubsonicClientPrivate,
}
impl ::std::fmt::Debug for AudreySubsonicClient {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreySubsonicClient @ {self:p}"))
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyUiPlayQueue {
pub parent_instance: adw::AdwBin,
pub priv_: *mut AudreyUiPlayQueuePrivate,
}
impl ::std::fmt::Debug for AudreyUiPlayQueue {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyUiPlayQueue @ {self:p}"))
.finish()
}
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct AudreyUiSetup {
pub parent_instance: adw::AdwPreferencesDialog,
pub priv_: *mut AudreyUiSetupPrivate,
pub token: *mut c_char,
pub salt: *mut c_char,
}
impl ::std::fmt::Debug for AudreyUiSetup {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
f.debug_struct(&format!("AudreyUiSetup @ {self:p}"))
.field("token", &self.token)
.field("salt", &self.salt)
.finish()
}
}
#[link(name = "audrey")]
extern "C" {
//=========================================================================
// AudreyPlaybinState
//=========================================================================
pub fn audrey_playbin_state_get_type() -> GType;
//=========================================================================
// AudreySubsonicError
//=========================================================================
pub fn audrey_subsonic_error_get_type() -> GType;
//=========================================================================
// AudreySubsonicSong
//=========================================================================
pub fn audrey_subsonic_song_get_type() -> GType;
pub fn audrey_subsonic_song_init(self_: *mut AudreySubsonicSong, reader: *mut json::JsonReader);
//=========================================================================
// AudreyApplication
//=========================================================================
pub fn audrey_application_get_type() -> GType;
pub fn audrey_application_new() -> *mut AudreyApplication;
//=========================================================================
// AudreyPlaybin
//=========================================================================
pub fn audrey_playbin_get_type() -> GType;
pub fn audrey_playbin_new() -> *mut AudreyPlaybin;
pub fn audrey_playbin_seek(self_: *mut AudreyPlaybin, position: c_double);
pub fn audrey_playbin_select_track(self_: *mut AudreyPlaybin, position: c_uint);
pub fn audrey_playbin_pause(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_play(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_go_to_next_track(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_go_to_prev_track(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_remove_track(self_: *mut AudreyPlaybin, position: c_uint);
pub fn audrey_playbin_clear(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_append_track(self_: *mut AudreyPlaybin, song: *mut AudreySubsonicSong);
pub fn audrey_playbin_append_track_async(self_: *mut AudreyPlaybin, song: *mut AudreySubsonicSong, _callback_: gio::GAsyncReadyCallback, _callback__target: *mut c_void);
pub fn audrey_playbin_append_track_finish(self_: *mut AudreyPlaybin, _res_: *mut gio::GAsyncResult);
pub fn audrey_playbin_move_track(self_: *mut AudreyPlaybin, from: c_uint, to: c_uint);
pub fn audrey_playbin_stop(self_: *mut AudreyPlaybin);
pub fn audrey_playbin_get_state(self_: *mut AudreyPlaybin) -> AudreyPlaybinState;
pub fn audrey_playbin_get_volume(self_: *mut AudreyPlaybin) -> c_int;
pub fn audrey_playbin_set_volume(self_: *mut AudreyPlaybin, value: c_int);
pub fn audrey_playbin_get_mute(self_: *mut AudreyPlaybin) -> gboolean;
pub fn audrey_playbin_set_mute(self_: *mut AudreyPlaybin, value: gboolean);
pub fn audrey_playbin_get_play_queue_position(self_: *mut AudreyPlaybin) -> c_int;
pub fn audrey_playbin_get_position(self_: *mut AudreyPlaybin) -> c_double;
pub fn audrey_playbin_get_duration(self_: *mut AudreyPlaybin) -> c_double;
pub fn audrey_playbin_get_api(self_: *mut AudreyPlaybin) -> *mut AudreySubsonicClient;
pub fn audrey_playbin_set_api(self_: *mut AudreyPlaybin, value: *mut AudreySubsonicClient);
pub fn audrey_playbin_get_play_queue(self_: *mut AudreyPlaybin) -> *mut gio::GListModel;
pub fn audrey_playbin_get_play_queue_length(self_: *mut AudreyPlaybin) -> c_uint;
//=========================================================================
// AudreyPlaybinSong
//=========================================================================
pub fn audrey_playbin_song_get_type() -> GType;
pub fn audrey_playbin_song_new(api: *mut AudreySubsonicClient, song: *mut AudreySubsonicSong) -> *mut AudreyPlaybinSong;
pub fn audrey_playbin_song_need_cover_art(self_: *mut AudreyPlaybinSong);
pub fn audrey_playbin_song_get_id(self_: *mut AudreyPlaybinSong) -> *const c_char;
pub fn audrey_playbin_song_get_title(self_: *mut AudreyPlaybinSong) -> *const c_char;
pub fn audrey_playbin_song_get_artist(self_: *mut AudreyPlaybinSong) -> *const c_char;
pub fn audrey_playbin_song_get_album(self_: *mut AudreyPlaybinSong) -> *const c_char;
pub fn audrey_playbin_song_get_genre(self_: *mut AudreyPlaybinSong) -> *const c_char;
pub fn audrey_playbin_song_get_duration(self_: *mut AudreyPlaybinSong) -> i64;
pub fn audrey_playbin_song_get_track(self_: *mut AudreyPlaybinSong) -> i64;
pub fn audrey_playbin_song_get_play_count(self_: *mut AudreyPlaybinSong) -> i64;
pub fn audrey_playbin_song_get_thumbnail(self_: *mut AudreyPlaybinSong) -> *mut gdk::GdkPaintable;
//=========================================================================
// AudreySubsonicAlbum
//=========================================================================
pub fn audrey_subsonic_album_get_type() -> GType;
pub fn audrey_subsonic_album_new(reader: *mut json::JsonReader) -> *mut AudreySubsonicAlbum;
//=========================================================================
// AudreySubsonicArtist
//=========================================================================
pub fn audrey_subsonic_artist_get_type() -> GType;
pub fn audrey_subsonic_artist_new(index: *const c_char, reader: *mut json::JsonReader) -> *mut AudreySubsonicArtist;
pub fn audrey_subsonic_artist_get_name(self_: *mut AudreySubsonicArtist) -> *const c_char;
//=========================================================================
// AudreySubsonicClient
//=========================================================================
pub fn audrey_subsonic_client_get_type() -> GType;
pub fn audrey_subsonic_client_new_with_token(url: *const c_char, username: *const c_char, token: *const c_char, salt: *const c_char) -> *mut AudreySubsonicClient;
pub fn audrey_subsonic_client_ping(self_: *mut AudreySubsonicClient, _callback_: gio::GAsyncReadyCallback, _callback__target: *mut c_void);
pub fn audrey_subsonic_client_ping_finish(self_: *mut AudreySubsonicClient, _res_: *mut gio::GAsyncResult, error: *mut *mut glib::GError);
pub fn audrey_subsonic_client_scrobble(self_: *mut AudreySubsonicClient, id: *const c_char, _callback_: gio::GAsyncReadyCallback, _callback__target: *mut c_void);
pub fn audrey_subsonic_client_scrobble_finish(self_: *mut AudreySubsonicClient, _res_: *mut gio::GAsyncResult, error: *mut *mut glib::GError);
pub fn audrey_subsonic_client_get_random_songs(self_: *mut AudreySubsonicClient, parameters: *const c_char, callback: AudreySubsonicSongCallback, callback_target: *mut c_void, _callback_: gio::GAsyncReadyCallback, _callback__target: *mut c_void);
pub fn audrey_subsonic_client_get_random_songs_finish(self_: *mut AudreySubsonicClient, _res_: *mut gio::GAsyncResult, error: *mut *mut glib::GError);
pub fn audrey_subsonic_client_stream_uri(self_: *mut AudreySubsonicClient, id: *const c_char) -> *mut c_char;
pub fn audrey_subsonic_client_cover_art_uri(self_: *mut AudreySubsonicClient, id: *const c_char, size: c_int) -> *mut c_char;
pub fn audrey_subsonic_client_cover_art(self_: *mut AudreySubsonicClient, id: *const c_char, size: c_int, priority: c_int, cancellable: *mut gio::GCancellable, _callback_: gio::GAsyncReadyCallback, _callback__target: *mut c_void);
pub fn audrey_subsonic_client_cover_art_finish(self_: *mut AudreySubsonicClient, _res_: *mut gio::GAsyncResult, error: *mut *mut glib::GError) -> *mut gdk_pixbuf::GdkPixbuf;
pub fn audrey_subsonic_client_new() -> *mut AudreySubsonicClient;
//=========================================================================
// AudreyUiPlayQueue
//=========================================================================
pub fn audrey_ui_play_queue_get_type() -> GType;
pub fn audrey_ui_play_queue_new() -> *mut AudreyUiPlayQueue;
pub fn audrey_ui_play_queue_get_playbin(self_: *mut AudreyUiPlayQueue) -> *mut AudreyPlaybin;
pub fn audrey_ui_play_queue_set_playbin(self_: *mut AudreyUiPlayQueue, value: *mut AudreyPlaybin);
pub fn audrey_ui_play_queue_get_can_clear_all(self_: *mut AudreyUiPlayQueue) -> gboolean;
//=========================================================================
// AudreyUiSetup
//=========================================================================
pub fn audrey_ui_setup_get_type() -> GType;
pub fn audrey_ui_setup_load(self_: *mut AudreyUiSetup);
pub fn audrey_ui_setup_save(self_: *mut AudreyUiSetup);
pub fn audrey_ui_setup_new() -> *mut AudreyUiSetup;
pub fn audrey_ui_setup_get_status(self_: *mut AudreyUiSetup) -> *const c_char;
pub fn audrey_ui_setup_get_authn_can_edit(self_: *mut AudreyUiSetup) -> gboolean;
pub fn audrey_ui_setup_get_authn_can_validate(self_: *mut AudreyUiSetup) -> gboolean;
pub fn audrey_ui_setup_get_server_url(self_: *mut AudreyUiSetup) -> *const c_char;
pub fn audrey_ui_setup_set_server_url(self_: *mut AudreyUiSetup, value: *const c_char);
pub fn audrey_ui_setup_get_username(self_: *mut AudreyUiSetup) -> *const c_char;
pub fn audrey_ui_setup_set_username(self_: *mut AudreyUiSetup, value: *const c_char);
pub fn audrey_ui_setup_get_password(self_: *mut AudreyUiSetup) -> *const c_char;
pub fn audrey_ui_setup_set_password(self_: *mut AudreyUiSetup, value: *const c_char);
}

View file

@ -6,12 +6,11 @@ pub mod ui;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{gio, glib}; use gtk::{gio, glib};
extern crate libsecret;
#[link(name = "audrey")] #[link(name = "audrey")]
#[link(name = "gcrypt")] #[link(name = "gcrypt")]
#[link(name = "json-glib-1.0")] #[link(name = "json-glib-1.0")]
#[link(name = "mpv")] #[link(name = "mpv")]
#[link(name = "secret-1")]
#[link(name = "soup-3.0")] #[link(name = "soup-3.0")]
extern "C" {} extern "C" {}

View file

@ -34,4 +34,5 @@ audrey_c = static_library(
'--gresources', '--gresources',
meson.project_source_root() / 'resources/audrey.gresource.xml', meson.project_source_root() / 'resources/audrey.gresource.xml',
], ],
vala_gir: 'audrey-0.gir',
) )

View file

@ -1,5 +1,5 @@
[DBus (name = "org.mpris.MediaPlayer2")] [DBus (name = "org.mpris.MediaPlayer2")]
class Mpris : Object { class Audrey.Mpris : Object {
internal signal void on_raise (); internal signal void on_raise ();
internal signal void on_quit (); internal signal void on_quit ();
@ -32,7 +32,7 @@ class Mpris : Object {
} }
[DBus (name = "org.mpris.MediaPlayer2.Player")] [DBus (name = "org.mpris.MediaPlayer2.Player")]
class MprisPlayer : Object { class Audrey.MprisPlayer : Object {
internal signal void on_next (); internal signal void on_next ();
internal signal void on_previous (); internal signal void on_previous ();
internal signal void on_pause (); internal signal void on_pause ();

2
src/playbin.rs Normal file
View file

@ -0,0 +1,2 @@
mod song;
pub use song::Song;

View file

@ -1,15 +1,15 @@
public enum PlaybinState { public enum Audrey.PlaybinState {
STOPPED, STOPPED,
PAUSED, PAUSED,
PLAYING, PLAYING,
} }
private struct CommandCallback { private struct Audrey.CommandCallback {
unowned SourceFunc callback; unowned SourceFunc callback;
int error; int error;
} }
public class PlaybinSong : Object { public class Audrey.PlaybinSong : Object {
private Subsonic.Song inner; private Subsonic.Song inner;
public string id { get { return inner.id; } } public string id { get { return inner.id; } }
public string title { get { return inner.title; } } public string title { get { return inner.title; } }
@ -59,7 +59,7 @@ public class PlaybinSong : Object {
} }
} }
public class Playbin : GLib.Object { public class Audrey.Playbin : GLib.Object {
private Mpv.Handle mpv = new Mpv.Handle (); private Mpv.Handle mpv = new Mpv.Handle ();
private int _volume = 100; private int _volume = 100;
private bool _mute = false; private bool _mute = false;

14
src/playbin/song.rs Normal file
View file

@ -0,0 +1,14 @@
mod imp {
#[derive(gtk::Properties, Default)]
#[properties(wrapper_type = super::Song)]
pub struct Song {
inner: RefCell<subsonic::Song>,
#[property(get = |song| song.inner.borrow().id)]
id: &'static str,
}
}
glib::wrapper! {
pub struct Song(ObjectSubclass<imp::Song>);
}

View file

@ -1,11 +1,11 @@
public errordomain Subsonic.Error { public errordomain Audrey.Subsonic.Error {
BAD_AUTHN, BAD_AUTHN,
ERROR, ERROR,
} }
public delegate void Subsonic.SongCallback (Song song); public delegate void Audrey.Subsonic.SongCallback (Song song);
public class Subsonic.Artist : Object { public class Audrey.Subsonic.Artist : Object {
public string index; public string index;
public string id; public string id;
public string name { get; private set; } public string name { get; private set; }
@ -38,7 +38,7 @@ public class Subsonic.Artist : Object {
} }
} }
public class Subsonic.Album : Object { public class Audrey.Subsonic.Album : Object {
public string id; public string id;
public string name; public string name;
@ -53,7 +53,7 @@ public class Subsonic.Album : Object {
} }
} }
public struct Subsonic.Song { public struct Audrey.Subsonic.Song {
public string id; public string id;
public string title; public string title;
public string album; public string album;
@ -109,7 +109,7 @@ public struct Subsonic.Song {
} }
} }
public class Subsonic.Client : Object { public class Audrey.Subsonic.Client : Object {
private Soup.Session session; private Soup.Session session;
private string url; private string url;
private string parameters; private string parameters;

2
src/ui/play_queue.rs Normal file
View file

@ -0,0 +1,2 @@
mod song;
pub use song::Song;

View file

@ -1,7 +1,7 @@
// song widget+drag behavior taken from gnome music // song widget+drag behavior taken from gnome music
[GtkTemplate (ui = "/eu/callcc/audrey/play_queue_song.ui")] [GtkTemplate (ui = "/eu/callcc/audrey/play_queue_song.ui")]
class Ui.PlayQueueSong : Gtk.Box { class Audrey.Ui.PlayQueueSong : Gtk.Box {
public bool draggable { get; set; default = false; } public bool draggable { get; set; default = false; }
public bool show_position { get; set; default = false; } public bool show_position { get; set; default = false; }
public bool show_artist { get; set; default = false; } public bool show_artist { get; set; default = false; }
@ -112,7 +112,7 @@ class Ui.PlayQueueSong : Gtk.Box {
} }
[GtkTemplate (ui = "/eu/callcc/audrey/play_queue.ui")] [GtkTemplate (ui = "/eu/callcc/audrey/play_queue.ui")]
public class Ui.PlayQueue : Adw.Bin { public class Audrey.Ui.PlayQueue : Adw.Bin {
private weak Playbin _playbin; private weak Playbin _playbin;
public Playbin playbin { public Playbin playbin {
get { return _playbin; } get { return _playbin; }

65
src/ui/play_queue/song.rs Normal file
View file

@ -0,0 +1,65 @@
mod imp {
use std::cell::RefCell;
//use crate::playbin;
use gtk::{glib, prelude::*, subclass::prelude::*};
#[derive(gtk::CompositeTemplate, glib::Properties, Default)]
#[template(resource = "/eu/callcc/audrey/play_queue_song.ui")]
#[properties(wrapper_type = super::Song)]
pub struct Song {
#[property(get, set, default = false)]
draggable: RefCell<bool>,
#[property(get, set, default = false)]
show_position: RefCell<bool>,
#[property(get, set, default = false)]
show_artist: RefCell<bool>,
#[property(get, set, default = false)]
show_cover: RefCell<bool>,
#[property(get, set = Self::set_current, default = false)]
current: RefCell<bool>,
#[property(get, set)]
displayed_position: RefCell<u32>,
//#[property(get, set)]
//song: playbin::Song,
//playbin: playbin::Playbin,
connection: RefCell<u64>,
drag_x: RefCell<f64>,
drag_y: RefCell<f64>,
drag_widget: RefCell<Option<gtk::ListBox>>,
}
#[glib::object_subclass]
impl ObjectSubclass for Song {
const NAME: &'static str = "AudreyUiPlayQueueSong";
type Type = super::Song;
type ParentType = gtk::Box;
}
#[glib::derived_properties]
impl ObjectImpl for Song {}
impl WidgetImpl for Song {}
impl BoxImpl for Song {}
#[gtk::template_callbacks]
impl Song {
fn set_current(&self, value: bool) {
*self.current.borrow_mut() = value;
if value {
self.obj().add_css_class("playing");
} else {
self.obj().remove_css_class("playing");
}
}
}
}
use gtk::glib;
glib::wrapper! {
pub struct Song(ObjectSubclass<imp::Song>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}

View file

@ -1,5 +1,5 @@
[GtkTemplate (ui = "/eu/callcc/audrey/playbar.ui")] [GtkTemplate (ui = "/eu/callcc/audrey/playbar.ui")]
class Ui.Playbar : Adw.Bin { class Audrey.Ui.Playbar : Adw.Bin {
public PlaybinSong? song { get; set; } public PlaybinSong? song { get; set; }
public Gdk.Paintable? playing_cover_art { get; set; } public Gdk.Paintable? playing_cover_art { get; set; }
public weak Playbin playbin { get; set; } public weak Playbin playbin { get; set; }

View file

@ -17,7 +17,7 @@ static void salt_password (string password, out string token, out string salt) {
} }
[GtkTemplate (ui = "/eu/callcc/audrey/setup.ui")] [GtkTemplate (ui = "/eu/callcc/audrey/setup.ui")]
public class Ui.Setup : Adw.PreferencesDialog { public class Audrey.Ui.Setup : Adw.PreferencesDialog {
public string status { get; private set; default = _("Not connected"); } public string status { get; private set; default = _("Not connected"); }
public bool authn_can_edit { get; private set; default = true; } public bool authn_can_edit { get; private set; default = true; }

View file

@ -2,18 +2,18 @@ mod ffi {
use gtk::glib; use gtk::glib;
#[repr(C)] #[repr(C)]
pub struct UiWindow { pub struct AudreyUiWindow {
parent_instance: adw::ffi::AdwApplicationWindow, parent_instance: adw::ffi::AdwApplicationWindow,
} }
#[repr(C)] #[repr(C)]
pub struct UiWindowClass { pub struct AudreyUiWindowClass {
parent_class: adw::ffi::AdwApplicationWindowClass, parent_class: adw::ffi::AdwApplicationWindowClass,
} }
extern "C" { extern "C" {
pub fn ui_window_get_type() -> glib::ffi::GType; pub fn audrey_ui_window_get_type() -> glib::ffi::GType;
pub fn ui_window_new(app: *mut gtk::ffi::GtkApplication) -> *mut UiWindow; pub fn audrey_ui_window_new(app: *mut gtk::ffi::GtkApplication) -> *mut AudreyUiWindow;
} }
} }
@ -21,12 +21,12 @@ use adw::prelude::*;
use gtk::{gio, glib}; use gtk::{gio, glib};
glib::wrapper! { glib::wrapper! {
pub struct Window(Object<ffi::UiWindow, ffi::UiWindowClass>) pub struct Window(Object<ffi::AudreyUiWindow, ffi::AudreyUiWindowClass>)
@extends adw::ApplicationWindow, gtk::ApplicationWindow, gtk::Window, gtk::Widget, @extends adw::ApplicationWindow, gtk::ApplicationWindow, gtk::Window, gtk::Widget,
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager; @implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
match fn { match fn {
type_ => || ffi::ui_window_get_type(), type_ => || ffi::audrey_ui_window_get_type(),
} }
} }
@ -34,6 +34,6 @@ impl Window {
pub fn new(app: &impl IsA<gtk::Application>) -> Self { pub fn new(app: &impl IsA<gtk::Application>) -> Self {
use glib::translate::*; use glib::translate::*;
unsafe { from_glib_none(ffi::ui_window_new(app.as_ref().to_glib_none().0)) } unsafe { from_glib_none(ffi::audrey_ui_window_new(app.as_ref().to_glib_none().0)) }
} }
} }

View file

@ -1,7 +1,7 @@
[GtkTemplate (ui = "/eu/callcc/audrey/window.ui")] [GtkTemplate (ui = "/eu/callcc/audrey/window.ui")]
class Ui.Window : Adw.ApplicationWindow { class Audrey.Ui.Window : Adw.ApplicationWindow {
[GtkChild] public unowned Ui.PlayQueue play_queue; [GtkChild] public unowned PlayQueue play_queue;
[GtkChild] public unowned Ui.Playbar playbar; [GtkChild] public unowned Playbar playbar;
//[GtkChild] public unowned Adw.ButtonRow shuffle_all_tracks; //[GtkChild] public unowned Adw.ButtonRow shuffle_all_tracks;
private Setup setup; private Setup setup;