Compare commits

..

No commits in common. "56aad3942f175e82a13681141cb9ab2279cbc7f4" and "ed3ac06d96c7e4850fb320dfae2a6a2213c82cc0" have entirely different histories.

4 changed files with 691 additions and 749 deletions

1320
Cargo.lock generated

File diff suppressed because it is too large Load diff

30
flake.lock generated
View file

@ -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": {

View file

@ -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
} }

View file

@ -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),
]; ];