sample-amp/src/main.rs

126 lines
3.6 KiB
Rust
Raw Normal View History

use diesel::prelude::*;
2023-06-26 19:09:17 +00:00
use diesel::r2d2::{ConnectionManager, Pool};
2023-06-15 08:04:31 +00:00
use gtk::gdk::Display;
2023-06-12 04:16:57 +00:00
use gtk::prelude::*;
use relm4::{factory::FactoryVecDeque, prelude::*};
2023-06-12 03:00:11 +00:00
mod library_list;
2023-06-26 18:45:17 +00:00
mod sample_list;
2023-06-12 03:00:11 +00:00
use library_list::LibraryListItem;
2023-06-12 00:56:16 +00:00
mod app_msg;
use app_msg::AppMsg;
2023-06-26 19:09:17 +00:00
use sample_amp::get_connection_pool;
2023-06-12 04:16:57 +00:00
use sample_amp::models::Library;
use sample_amp::schema::libraries;
2023-06-26 18:45:17 +00:00
use crate::sample_list::SampleListModel;
struct AppModel {
2023-06-26 18:45:17 +00:00
sample_list: Controller<SampleListModel>,
2023-06-12 03:00:11 +00:00
libraries: FactoryVecDeque<LibraryListItem>,
2023-06-26 19:09:17 +00:00
pool: Pool<ConnectionManager<SqliteConnection>>,
}
#[relm4::component]
impl SimpleComponent for AppModel {
type Input = AppMsg;
2023-06-26 18:45:17 +00:00
type Output = ();
2023-06-26 18:45:17 +00:00
type Init = ();
fn init(
_: Self::Init,
window: &Self::Root,
sender: ComponentSender<Self>,
) -> relm4::ComponentParts<Self> {
let mut model = AppModel {
2023-06-26 19:09:17 +00:00
pool: get_connection_pool(),
2023-06-26 18:45:17 +00:00
libraries: FactoryVecDeque::new(gtk::ListBox::default(), sender.input_sender()),
sample_list: SampleListModel::builder().launch(()).detach(),
};
let sample_view = model.sample_list.widget();
// todo: cleaner
let library_results = libraries::dsl::libraries
.select(Library::as_select())
2023-06-26 19:09:17 +00:00
.load(&mut model.pool.get().expect("Expected a connection."))
2023-06-26 18:45:17 +00:00
.expect("Error loading libraries");
model.libraries.guard().push_back("All".to_string());
for lib in library_results {
model.libraries.guard().push_back(lib.name);
}
let library_view = model.libraries.widget();
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) {
match message {
AppMsg::Close => {
relm4::main_application().quit();
}
}
}
view! {
gtk::Window {
2023-06-11 23:18:30 +00:00
set_title: Some("SampleAmp"),
2023-06-12 01:20:56 +00:00
set_default_width: 1000,
set_default_height: 600,
connect_close_request[sender] => move |_| {
2023-06-11 23:18:30 +00:00
sender.input(AppMsg::Close);
gtk::Inhibit(true)
},
gtk::Box {
gtk::ScrolledWindow {
2023-06-12 00:56:16 +00:00
set_css_classes: &["sidebar"],
set_hscrollbar_policy: gtk::PolicyType::Never,
#[local_ref]
2023-06-12 03:00:11 +00:00
library_view -> gtk::ListBox{
2023-06-12 00:56:16 +00:00
set_css_classes: &["navigation-sidebar"]
}
},
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_hexpand: true,
2023-06-26 18:45:17 +00:00
#[local_ref]
sample_view -> gtk::ScrolledWindow {},
gtk::Box {
2023-06-11 23:18:30 +00:00
set_height_request: 100,
2023-06-15 08:04:31 +00:00
set_margin_all: 5,
2023-06-11 23:18:30 +00:00
gtk::Label {
#[watch]
set_label: "Sample playback",
},
2023-06-11 23:18:30 +00:00
}
}
}
}
}
}
2023-06-15 08:04:31 +00:00
fn load_css() {
let provider = gtk::CssProvider::new();
provider.load_from_data(include_str!("../css/style.css"));
2023-06-15 08:05:08 +00:00
gtk::style_context_add_provider_for_display(
&Display::default().expect("Could not connect to a display."),
&provider,
gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
);
2023-06-15 08:04:31 +00:00
}
fn main() {
let app = RelmApp::new("relm.test.simple_manual");
2023-06-15 08:04:31 +00:00
relm4::main_application().connect_startup(|_| load_css());
relm4_icons::initialize_icons();
2023-06-12 03:59:49 +00:00
app.run::<AppModel>(());
}