gir
This commit is contained in:
parent
4193fb72c2
commit
1f289ecf1e
18 changed files with 137 additions and 53 deletions
|
@ -1,11 +1,11 @@
|
|||
using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $UiPlayQueue: Adw.Bin {
|
||||
template $AudreyUiPlayQueue: Adw.Bin {
|
||||
name: "play-queue";
|
||||
|
||||
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 {
|
||||
name: "empty";
|
||||
|
@ -31,7 +31,7 @@ template $UiPlayQueue: Adw.Bin {
|
|||
activate => $on_row_activated ();
|
||||
|
||||
model: NoSelection {
|
||||
model: bind template.playbin as <$Playbin>.play_queue;
|
||||
model: bind template.playbin as <$AudreyPlaybin>.play_queue;
|
||||
};
|
||||
|
||||
factory: SignalListItemFactory {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using Gtk 4.0;
|
||||
|
||||
template $UiPlayQueueSong: Box {
|
||||
template $AudreyUiPlayQueueSong: Box {
|
||||
height-request: 48;
|
||||
spacing: 12;
|
||||
margin-start: 6;
|
||||
|
@ -35,7 +35,7 @@ template $UiPlayQueueSong: Box {
|
|||
margin-top: 1;
|
||||
margin-bottom: 1;
|
||||
pixel-size: 50;
|
||||
paintable: bind template.song as <$PlaybinSong>.thumbnail;
|
||||
paintable: bind template.song as <$AudreyPlaybinSong>.thumbnail;
|
||||
}
|
||||
|
||||
Box title_box {
|
||||
|
@ -58,7 +58,7 @@ template $UiPlayQueueSong: Box {
|
|||
max-width-chars: 90;
|
||||
justify: fill;
|
||||
|
||||
label: bind template.song as <$PlaybinSong>.title;
|
||||
label: bind template.song as <$AudreyPlaybinSong>.title;
|
||||
}
|
||||
|
||||
Label {
|
||||
|
@ -71,7 +71,7 @@ template $UiPlayQueueSong: Box {
|
|||
max-width-chars: 90;
|
||||
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;
|
||||
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 {
|
||||
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>;
|
||||
styles [ "flat" ]
|
||||
valign: center;
|
||||
|
@ -116,7 +116,7 @@ template $UiPlayQueueSong: Box {
|
|||
|
||||
DropTarget {
|
||||
actions: move;
|
||||
formats: "UiPlayQueueSong";
|
||||
formats: "AudreyUiPlayQueueSong";
|
||||
preload: true;
|
||||
|
||||
drop => $on_drop ();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $UiPlaybar: Adw.Bin {
|
||||
template $AudreyUiPlaybar: Adw.Bin {
|
||||
child: CenterBox {
|
||||
hexpand: true;
|
||||
styles [
|
||||
|
@ -66,7 +66,7 @@ template $UiPlaybar: Adw.Bin {
|
|||
"numeric",
|
||||
]
|
||||
|
||||
label: bind $format_timestamp (template.playbin as <$Playbin>.position) as <string>;
|
||||
label: bind $format_timestamp (template.playbin as <$AudreyPlaybin>.position) as <string>;
|
||||
}
|
||||
|
||||
[center]
|
||||
|
@ -74,12 +74,12 @@ template $UiPlaybar: Adw.Bin {
|
|||
name: "seek-scale";
|
||||
orientation: horizontal;
|
||||
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 {
|
||||
lower: 0;
|
||||
value: bind template.playbin as <$Playbin>.position;
|
||||
upper: bind template.playbin as <$Playbin>.duration;
|
||||
value: bind template.playbin as <$AudreyPlaybin>.position;
|
||||
upper: bind template.playbin as <$AudreyPlaybin>.duration;
|
||||
};
|
||||
|
||||
change-value => $on_play_position_seek ();
|
||||
|
@ -92,7 +92,7 @@ template $UiPlaybar: Adw.Bin {
|
|||
"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 {
|
||||
icon-name: "media-skip-backward";
|
||||
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 ();
|
||||
}
|
||||
|
@ -111,15 +111,15 @@ template $UiPlaybar: Adw.Bin {
|
|||
Button {
|
||||
icon-name: "media-seek-backward";
|
||||
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 ();
|
||||
}
|
||||
|
||||
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;
|
||||
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 ();
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ template $UiPlaybar: Adw.Bin {
|
|||
Button {
|
||||
icon-name: "media-seek-forward";
|
||||
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 ();
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ template $UiPlaybar: Adw.Bin {
|
|||
Button {
|
||||
icon-name: "media-skip-forward";
|
||||
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 ();
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ template $UiPlaybar: Adw.Bin {
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
clicked => $on_mute_toggle ();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $UiSetup: Adw.PreferencesDialog {
|
||||
template $AudreyUiSetup: Adw.PreferencesDialog {
|
||||
title: _("Setup");
|
||||
|
||||
Adw.ToolbarView {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Gtk 4.0;
|
||||
using Adw 1;
|
||||
|
||||
template $UiWindow: Adw.ApplicationWindow {
|
||||
template $AudreyUiWindow: Adw.ApplicationWindow {
|
||||
title: _("audrey");
|
||||
default-width: 800;
|
||||
default-height: 600;
|
||||
|
@ -109,7 +109,7 @@ template $UiWindow: Adw.ApplicationWindow {
|
|||
}
|
||||
}
|
||||
|
||||
$UiPlayQueue play_queue {
|
||||
$AudreyUiPlayQueue play_queue {
|
||||
hexpand: true;
|
||||
halign: fill;
|
||||
|
||||
|
@ -126,7 +126,7 @@ template $UiWindow: Adw.ApplicationWindow {
|
|||
};
|
||||
|
||||
[bottom]
|
||||
$UiPlaybar playbar {
|
||||
$AudreyUiPlaybar playbar {
|
||||
song: bind template.song;
|
||||
playbin: bind template.playbin;
|
||||
playing_cover_art: bind template.playing_cover_art;
|
||||
|
|
|
@ -34,4 +34,5 @@ audrey_c = static_library(
|
|||
'--gresources',
|
||||
meson.project_source_root() / 'resources/audrey.gresource.xml',
|
||||
],
|
||||
vala_gir: 'audrey-0.gir',
|
||||
)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[DBus (name = "org.mpris.MediaPlayer2")]
|
||||
class Mpris : Object {
|
||||
class Audrey.Mpris : Object {
|
||||
internal signal void on_raise ();
|
||||
internal signal void on_quit ();
|
||||
|
||||
|
@ -32,7 +32,7 @@ class Mpris : Object {
|
|||
}
|
||||
|
||||
[DBus (name = "org.mpris.MediaPlayer2.Player")]
|
||||
class MprisPlayer : Object {
|
||||
class Audrey.MprisPlayer : Object {
|
||||
internal signal void on_next ();
|
||||
internal signal void on_previous ();
|
||||
internal signal void on_pause ();
|
||||
|
|
2
src/playbin.rs
Normal file
2
src/playbin.rs
Normal file
|
@ -0,0 +1,2 @@
|
|||
mod song;
|
||||
pub use song::Song;
|
|
@ -1,15 +1,15 @@
|
|||
public enum PlaybinState {
|
||||
public enum Audrey.PlaybinState {
|
||||
STOPPED,
|
||||
PAUSED,
|
||||
PLAYING,
|
||||
}
|
||||
|
||||
private struct CommandCallback {
|
||||
private struct Audrey.CommandCallback {
|
||||
unowned SourceFunc callback;
|
||||
int error;
|
||||
}
|
||||
|
||||
public class PlaybinSong : Object {
|
||||
public class Audrey.PlaybinSong : Object {
|
||||
private Subsonic.Song inner;
|
||||
public string id { get { return inner.id; } }
|
||||
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 int _volume = 100;
|
||||
private bool _mute = false;
|
||||
|
|
14
src/playbin/song.rs
Normal file
14
src/playbin/song.rs
Normal 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>);
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
public errordomain Subsonic.Error {
|
||||
public errordomain Audrey.Subsonic.Error {
|
||||
BAD_AUTHN,
|
||||
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 id;
|
||||
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 name;
|
||||
|
||||
|
@ -53,7 +53,7 @@ public class Subsonic.Album : Object {
|
|||
}
|
||||
}
|
||||
|
||||
public struct Subsonic.Song {
|
||||
public struct Audrey.Subsonic.Song {
|
||||
public string id;
|
||||
public string title;
|
||||
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 string url;
|
||||
private string parameters;
|
||||
|
|
2
src/ui/play_queue.rs
Normal file
2
src/ui/play_queue.rs
Normal file
|
@ -0,0 +1,2 @@
|
|||
mod song;
|
||||
pub use song::Song;
|
|
@ -1,7 +1,7 @@
|
|||
// song widget+drag behavior taken from gnome music
|
||||
|
||||
[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 show_position { 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")]
|
||||
public class Ui.PlayQueue : Adw.Bin {
|
||||
public class Audrey.Ui.PlayQueue : Adw.Bin {
|
||||
private weak Playbin _playbin;
|
||||
public Playbin playbin {
|
||||
get { return _playbin; }
|
||||
|
|
65
src/ui/play_queue/song.rs
Normal file
65
src/ui/play_queue/song.rs
Normal 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;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
[GtkTemplate (ui = "/eu/callcc/audrey/playbar.ui")]
|
||||
class Ui.Playbar : Adw.Bin {
|
||||
class Audrey.Ui.Playbar : Adw.Bin {
|
||||
public PlaybinSong? song { get; set; }
|
||||
public Gdk.Paintable? playing_cover_art { get; set; }
|
||||
public weak Playbin playbin { get; set; }
|
||||
|
|
|
@ -17,7 +17,7 @@ static void salt_password (string password, out string token, out string salt) {
|
|||
}
|
||||
|
||||
[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 bool authn_can_edit { get; private set; default = true; }
|
||||
|
|
|
@ -2,18 +2,18 @@ mod ffi {
|
|||
use gtk::glib;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct UiWindow {
|
||||
pub struct AudreyUiWindow {
|
||||
parent_instance: adw::ffi::AdwApplicationWindow,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct UiWindowClass {
|
||||
pub struct AudreyUiWindowClass {
|
||||
parent_class: adw::ffi::AdwApplicationWindowClass,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
pub fn ui_window_get_type() -> glib::ffi::GType;
|
||||
pub fn ui_window_new(app: *mut gtk::ffi::GtkApplication) -> *mut UiWindow;
|
||||
pub fn audrey_ui_window_get_type() -> glib::ffi::GType;
|
||||
pub fn audrey_ui_window_new(app: *mut gtk::ffi::GtkApplication) -> *mut AudreyUiWindow;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,12 +21,12 @@ use adw::prelude::*;
|
|||
use gtk::{gio, glib};
|
||||
|
||||
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,
|
||||
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
|
||||
|
||||
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 {
|
||||
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)) }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[GtkTemplate (ui = "/eu/callcc/audrey/window.ui")]
|
||||
class Ui.Window : Adw.ApplicationWindow {
|
||||
[GtkChild] public unowned Ui.PlayQueue play_queue;
|
||||
[GtkChild] public unowned Ui.Playbar playbar;
|
||||
class Audrey.Ui.Window : Adw.ApplicationWindow {
|
||||
[GtkChild] public unowned PlayQueue play_queue;
|
||||
[GtkChild] public unowned Playbar playbar;
|
||||
//[GtkChild] public unowned Adw.ButtonRow shuffle_all_tracks;
|
||||
|
||||
private Setup setup;
|
||||
|
|
Loading…
Reference in a new issue