Compare commits
No commits in common. "56aad3942f175e82a13681141cb9ab2279cbc7f4" and "ed3ac06d96c7e4850fb320dfae2a6a2213c82cc0" have entirely different histories.
56aad3942f
...
ed3ac06d96
4 changed files with 691 additions and 749 deletions
1320
Cargo.lock
generated
1320
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
30
flake.lock
generated
30
flake.lock
generated
|
|
@ -6,11 +6,11 @@
|
||||||
"rust-analyzer-src": "rust-analyzer-src"
|
"rust-analyzer-src": "rust-analyzer-src"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765435813,
|
"lastModified": 1759214609,
|
||||||
"narHash": "sha256-C6tT7K1Lx6VsYw1BY5S3OavtapUvEnDQtmQB5DSgbCc=",
|
"narHash": "sha256-+V3SeMjAMd9j9JTECk9oc0gWhtsk79rFEbYf/tHjywo=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "fenix",
|
"repo": "fenix",
|
||||||
"rev": "6399553b7a300c77e7f07342904eb696a5b6bf9d",
|
"rev": "f93a2d7225bc7a93d3379acff8fe722e21d97852",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -65,11 +65,11 @@
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763384566,
|
"lastModified": 1752689277,
|
||||||
"narHash": "sha256-r+wgI+WvNaSdxQmqaM58lVNvJYJ16zoq+tKN20cLst4=",
|
"narHash": "sha256-uldUBFkZe/E7qbvxa3mH1ItrWZyT6w1dBKJQF/3ZSsc=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "naersk",
|
"repo": "naersk",
|
||||||
"rev": "d4155d6ebb70fbe2314959842f744aa7cabbbf6a",
|
"rev": "0e72363d0938b0208d6c646d10649164c43f4d64",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -80,11 +80,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765186076,
|
"lastModified": 1759036355,
|
||||||
"narHash": "sha256-hM20uyap1a0M9d344I692r+ik4gTMyj60cQWO+hAYP8=",
|
"narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "addf7cf5f383a3101ecfba091b98d0a1263dc9b8",
|
"rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -112,11 +112,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_3": {
|
"nixpkgs_3": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765472234,
|
"lastModified": 1759036355,
|
||||||
"narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=",
|
"narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b",
|
"rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -137,11 +137,11 @@
|
||||||
"rust-analyzer-src": {
|
"rust-analyzer-src": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765400135,
|
"lastModified": 1759134797,
|
||||||
"narHash": "sha256-D3+4hfNwUhG0fdCpDhOASLwEQ1jKuHi4mV72up4kLQM=",
|
"narHash": "sha256-YPi+jL3tx/yC5J5l7/OB7Lnlr9BMTzYnZtm7tRJzUNg=",
|
||||||
"owner": "rust-lang",
|
"owner": "rust-lang",
|
||||||
"repo": "rust-analyzer",
|
"repo": "rust-analyzer",
|
||||||
"rev": "fface27171988b3d605ef45cf986c25533116f7e",
|
"rev": "062ac7a5451e8e92a32e22a60d86882d6a034f3f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
||||||
|
|
@ -703,6 +703,14 @@ impl cosmic::Application for App {
|
||||||
) -> Option<
|
) -> Option<
|
||||||
cosmic::app::context_drawer::ContextDrawer<Self::Message>,
|
cosmic::app::context_drawer::ContextDrawer<Self::Message>,
|
||||||
> {
|
> {
|
||||||
|
ContextDrawer {
|
||||||
|
title: Some("Context".into()),
|
||||||
|
header_actions: vec![],
|
||||||
|
header: Some("hi".into()),
|
||||||
|
content: "Sup".into(),
|
||||||
|
footer: Some("foot".into()),
|
||||||
|
on_close: Message::None,
|
||||||
|
};
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
use miette::{IntoDiagnostic, Result};
|
use miette::{IntoDiagnostic, Result};
|
||||||
use obws::{Client, responses::scenes::Scene};
|
use obws::{
|
||||||
|
Client, requests::scenes::SceneId, responses::scenes::Scene,
|
||||||
|
};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
fs::File,
|
fs::File,
|
||||||
|
|
@ -23,9 +25,8 @@ use cosmic::{
|
||||||
},
|
},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
widget::{
|
widget::{
|
||||||
Container, Id, Row, Space, container, context_menu,
|
Container, Id, Row, Space, container, context_menu, icon,
|
||||||
horizontal_space, icon, image, menu, mouse_area, responsive,
|
image, menu, mouse_area, responsive, scrollable, text,
|
||||||
scrollable, text,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use iced_video_player::{Position, Video, VideoPlayer, gst_pbutils};
|
use iced_video_player::{Position, Video, VideoPlayer, gst_pbutils};
|
||||||
|
|
@ -94,10 +95,11 @@ pub(crate) enum Message {
|
||||||
Error(String),
|
Error(String),
|
||||||
None,
|
None,
|
||||||
RightClickSlide(usize, usize),
|
RightClickSlide(usize, usize),
|
||||||
AssignObsScene(usize),
|
ObsStartStream,
|
||||||
|
ObsStopStream,
|
||||||
|
ObsSceneAssign(usize),
|
||||||
UpdateObsScenes(Vec<Scene>),
|
UpdateObsScenes(Vec<Scene>),
|
||||||
AddObsClient(Arc<Client>),
|
AddObsClient(Arc<Client>),
|
||||||
AssignSlideAction(slide_actions::Action),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for Message {
|
impl std::fmt::Debug for Message {
|
||||||
|
|
@ -147,17 +149,15 @@ impl std::fmt::Debug for Message {
|
||||||
.field(arg0)
|
.field(arg0)
|
||||||
.field(arg1)
|
.field(arg1)
|
||||||
.finish(),
|
.finish(),
|
||||||
Self::AssignObsScene(arg0) => {
|
Self::ObsStartStream => write!(f, "ObsStartStream"),
|
||||||
|
Self::ObsStopStream => write!(f, "ObsStopStream"),
|
||||||
|
Self::ObsSceneAssign(arg0) => {
|
||||||
f.debug_tuple("ObsSceneAssign").field(arg0).finish()
|
f.debug_tuple("ObsSceneAssign").field(arg0).finish()
|
||||||
}
|
}
|
||||||
Self::UpdateObsScenes(arg0) => {
|
Self::UpdateObsScenes(arg0) => {
|
||||||
f.debug_tuple("UpdateObsScenes").field(arg0).finish()
|
f.debug_tuple("UpdateObsScenes").field(arg0).finish()
|
||||||
}
|
}
|
||||||
Self::AddObsClient(_) => write!(f, "AddObsClient"),
|
Self::AddObsClient(_) => write!(f, "AddObsClient"),
|
||||||
Self::AssignSlideAction(action) => f
|
|
||||||
.debug_tuple("AssignSlideAction")
|
|
||||||
.field(action)
|
|
||||||
.finish(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -177,18 +177,10 @@ impl menu::Action for MenuAction {
|
||||||
fn message(&self) -> Self::Message {
|
fn message(&self) -> Self::Message {
|
||||||
match self {
|
match self {
|
||||||
MenuAction::ObsSceneAssign(scene) => {
|
MenuAction::ObsSceneAssign(scene) => {
|
||||||
Message::AssignObsScene(*scene)
|
Message::ObsSceneAssign(*scene)
|
||||||
}
|
}
|
||||||
MenuAction::ObsStartStream => Message::AssignSlideAction(
|
MenuAction::ObsStartStream => Message::ObsStartStream,
|
||||||
slide_actions::Action::Obs {
|
MenuAction::ObsStopStream => Message::ObsStopStream,
|
||||||
action: ObsAction::StartStream,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
MenuAction::ObsStopStream => Message::AssignSlideAction(
|
|
||||||
slide_actions::Action::Obs {
|
|
||||||
action: ObsAction::StopStream,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
MenuAction::ObsStartRecord => todo!(),
|
MenuAction::ObsStartRecord => todo!(),
|
||||||
MenuAction::ObsStopRecord => todo!(),
|
MenuAction::ObsStopRecord => todo!(),
|
||||||
}
|
}
|
||||||
|
|
@ -345,7 +337,7 @@ impl Presenter {
|
||||||
debug!(?scenes, "updating obs scenes");
|
debug!(?scenes, "updating obs scenes");
|
||||||
self.obs_scenes = Some(scenes);
|
self.obs_scenes = Some(scenes);
|
||||||
}
|
}
|
||||||
Message::AssignObsScene(scene_index) => {
|
Message::ObsSceneAssign(scene_index) => {
|
||||||
let Some(scenes) = &self.obs_scenes else {
|
let Some(scenes) = &self.obs_scenes else {
|
||||||
return Action::None;
|
return Action::None;
|
||||||
};
|
};
|
||||||
|
|
@ -412,27 +404,8 @@ impl Presenter {
|
||||||
self.slide_action_map = Some(map);
|
self.slide_action_map = Some(map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::AssignSlideAction(action) => {
|
Message::ObsStartStream => todo!(),
|
||||||
if let Some(map) = self.slide_action_map.as_mut() {
|
Message::ObsStopStream => todo!(),
|
||||||
if let Some(actions) =
|
|
||||||
map.get_mut(&self.context_menu_id.unwrap())
|
|
||||||
{
|
|
||||||
actions.push(action)
|
|
||||||
} else {
|
|
||||||
map.insert(
|
|
||||||
self.context_menu_id.unwrap(),
|
|
||||||
vec![action],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let mut map = HashMap::new();
|
|
||||||
map.insert(
|
|
||||||
self.context_menu_id.unwrap(),
|
|
||||||
vec![action],
|
|
||||||
);
|
|
||||||
self.slide_action_map = Some(map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Message::ActivateSlide(item_index, slide_index) => {
|
Message::ActivateSlide(item_index, slide_index) => {
|
||||||
debug!(slide_index, item_index);
|
debug!(slide_index, item_index);
|
||||||
if let Some(slide) = self
|
if let Some(slide) = self
|
||||||
|
|
@ -770,11 +743,11 @@ impl Presenter {
|
||||||
)))
|
)))
|
||||||
})
|
})
|
||||||
.on_exit(Message::HoveredSlide(None))
|
.on_exit(Message::HoveredSlide(None))
|
||||||
.on_release(Message::ClickSlide(
|
.on_press(Message::ClickSlide(
|
||||||
item_index,
|
item_index,
|
||||||
slide_index,
|
slide_index,
|
||||||
))
|
))
|
||||||
.on_right_release(Message::RightClickSlide(
|
.on_right_press(Message::RightClickSlide(
|
||||||
item_index,
|
item_index,
|
||||||
slide_index,
|
slide_index,
|
||||||
));
|
));
|
||||||
|
|
@ -798,7 +771,7 @@ impl Presenter {
|
||||||
items.push(divider.into());
|
items.push(divider.into());
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
let scrollable =
|
let row =
|
||||||
scrollable(container(Row::from_vec(items)).style(|t| {
|
scrollable(container(Row::from_vec(items)).style(|t| {
|
||||||
let style = container::Style::default();
|
let style = container::Style::default();
|
||||||
style.border(Border::default().width(2))
|
style.border(Border::default().width(2))
|
||||||
|
|
@ -807,7 +780,8 @@ impl Presenter {
|
||||||
.height(Length::Fill)
|
.height(Length::Fill)
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.id(self.scroll_id.clone());
|
.id(self.scroll_id.clone());
|
||||||
self.context_menu(scrollable.into())
|
let context_menu = self.context_menu(row.into());
|
||||||
|
context_menu.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn context_menu<'a>(
|
fn context_menu<'a>(
|
||||||
|
|
@ -815,6 +789,9 @@ impl Presenter {
|
||||||
items: Element<'a, Message>,
|
items: Element<'a, Message>,
|
||||||
) -> Element<'a, Message> {
|
) -> Element<'a, Message> {
|
||||||
if self.context_menu_id.is_some() {
|
if self.context_menu_id.is_some() {
|
||||||
|
let before_icon =
|
||||||
|
icon::from_path("./res/split-above.svg".into())
|
||||||
|
.symbolic(true);
|
||||||
let mut scenes = vec![];
|
let mut scenes = vec![];
|
||||||
if let Some(obs_scenes) = &self.obs_scenes {
|
if let Some(obs_scenes) = &self.obs_scenes {
|
||||||
for scene in obs_scenes {
|
for scene in obs_scenes {
|
||||||
|
|
@ -828,14 +805,9 @@ impl Presenter {
|
||||||
}
|
}
|
||||||
let menu_items = vec![
|
let menu_items = vec![
|
||||||
menu::Item::Button(
|
menu::Item::Button(
|
||||||
"Start Stream".to_string(),
|
"Test Scene".to_string(),
|
||||||
None,
|
None,
|
||||||
MenuAction::ObsStartStream,
|
MenuAction::ObsSceneAssign(0),
|
||||||
),
|
|
||||||
menu::Item::Button(
|
|
||||||
"Stop Stream".to_string(),
|
|
||||||
None,
|
|
||||||
MenuAction::ObsStopStream,
|
|
||||||
),
|
),
|
||||||
menu::Item::Folder("Obs Scene".to_string(), scenes),
|
menu::Item::Folder("Obs Scene".to_string(), scenes),
|
||||||
];
|
];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue