added a second tab

This commit is contained in:
Nickiel12 2024-05-01 20:18:23 -07:00
parent b286aedd03
commit 22a81ee44e
5 changed files with 83 additions and 18 deletions

View file

@ -42,6 +42,7 @@ pub enum ApplicationEvent {
StartSocket(String), StartSocket(String),
SocketMessage(Message), SocketMessage(Message),
MoveEvent(MoveEvent, ConnectionType), MoveEvent(MoveEvent, ConnectionType),
EnableAutomatic(bool),
} }
struct CoordState<'a> { struct CoordState<'a> {
@ -234,6 +235,11 @@ pub async fn start_coordinator(
state.socket_send(socket_message).await; state.socket_send(socket_message).await;
} }
ApplicationEvent::EnableAutomatic(do_enable) => {
if let Ok(mut ts) = state.tracker_state.lock() {
ts.enabled = do_enable;
}
},
ApplicationEvent::MoveEvent(coord, priority) => { ApplicationEvent::MoveEvent(coord, priority) => {
// If Automatic control, but local event happens, override the automatice events for 2 seconds // If Automatic control, but local event happens, override the automatice events for 2 seconds
if priority <= state.current_priority if priority <= state.current_priority

View file

@ -27,9 +27,9 @@ pub mod shared_video_pipe;
use crate::coordinator::{ApplicationEvent, ConnectionType}; use crate::coordinator::{ApplicationEvent, ConnectionType};
pub struct TrackerState { pub struct TrackerState {
pub has_active_connection: bool,
pub tracking_id: u32, pub tracking_id: u32,
pub last_detect: Instant, pub last_detect: Instant,
pub enabled: bool,
} }
pub async fn start_socketserver( pub async fn start_socketserver(

View file

@ -1,23 +1,23 @@
use std::rc::Rc;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Instant; use std::time::Instant;
use gtk::cairo::Context; use gtk::cairo::Context;
use gtk::ffi::gtk_picture_set_keep_aspect_ratio;
use gtk::gdk::Paintable; use gtk::gdk::Paintable;
use gtk::{glib, prelude::*, AspectFrame, Box, Entry, Label, ListBox}; use gtk::{glib, prelude::*, AspectFrame, Label, ListBox};
use gtk::{Application, ApplicationWindow, Button}; use gtk::{Application, ApplicationWindow};
use log::{info, error}; use log::{info, error};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tokio::runtime::Handle; use tokio::runtime::Handle;
use tokio_tungstenite::tungstenite::Message;
use crate::config::{load_config, save_config}; use crate::config::load_config;
use crate::coordinator::{start_coordinator, ApplicationEvent, MoveEvent}; use crate::coordinator::{start_coordinator, ApplicationEvent, MoveEvent};
use crate::remote_sources::TrackerState; use crate::remote_sources::TrackerState;
mod socket_panel; mod socket_panel;
mod tracker_panel;
use socket_panel::SocketPanel; use socket_panel::SocketPanel;
use tracker_panel::TrackerPanel;
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct AppState { pub struct AppState {
@ -89,7 +89,7 @@ pub fn build_ui(app: &Application, runtime: Handle) {
let tracker_state = Arc::new(Mutex::new(TrackerState { let tracker_state = Arc::new(Mutex::new(TrackerState {
tracking_id: 0, tracking_id: 0,
last_detect: Instant::now(), last_detect: Instant::now(),
has_active_connection: false, enabled: true,
})); }));
@ -109,12 +109,17 @@ pub fn build_ui(app: &Application, runtime: Handle) {
.build(); .build();
let tabpanel = gtk::Notebook::builder() let tabpanel = gtk::Notebook::builder()
.enable_popup(true)
.build(); .build();
let socket_panel = Arc::new(SocketPanel::new(&initial_settings)); let socket_panel = Arc::new(SocketPanel::new(&initial_settings));
socket_panel.connect_button_callback(to_mec.clone()); socket_panel.connect_button_callback(to_mec.clone());
tabpanel.append_page(socket_panel.get_top_level(), Some(&gtk::Label::new(Some("Cam Connection")))); tabpanel.append_page(socket_panel.get_top_level(), Some(&gtk::Label::new(Some("Cam Connection"))));
let tracker_panel = TrackerPanel::new();
tracker_panel.connect_button_callback(to_mec.clone());
tabpanel.append_page(tracker_panel.get_top_level(), Some(&Label::new(Some("Auto Settings"))));
let axis_label = Label::builder() let axis_label = Label::builder()
.label("X: 0 Y: )") .label("X: 0 Y: )")
.justify(gtk::Justification::Center) .justify(gtk::Justification::Center)
@ -156,7 +161,7 @@ pub fn build_ui(app: &Application, runtime: Handle) {
glib::spawn_future_local( glib::spawn_future_local(
glib::clone!(@weak axis_label, @weak conn_status_label, @strong socket_panel, @strong gui_recv, @weak drawable => async move { glib::clone!(@weak axis_label, @weak conn_status_label, @weak tabpanel, @strong socket_panel, @strong gui_recv, @weak drawable => async move {
while let Ok(d) = gui_recv.recv().await { while let Ok(d) = gui_recv.recv().await {
drawable.queue_draw(); drawable.queue_draw();
match d { match d {
@ -169,9 +174,12 @@ pub fn build_ui(app: &Application, runtime: Handle) {
let label = { let label = {
if v { if v {
socket_panel.set_sensitive(false); socket_panel.set_sensitive(false);
// tabpanel.set_show_tabs(true);
"Currently Connected" "Currently Connected"
} else { } else {
socket_panel.set_sensitive(true); socket_panel.set_sensitive(true);
tabpanel.set_page(0);
// tabpanel.set_show_tabs(false);
"Currently Disconnected" "Currently Disconnected"
} }
}; };

View file

@ -1,5 +1,5 @@
use async_channel::Sender; use async_channel::Sender;
use gtk::{glib::{self, GString}, prelude::{BoxExt, ButtonExt, EditableExt, WidgetExt}, Box, Button, Entry}; use gtk::{glib, prelude::{BoxExt, ButtonExt, EditableExt, WidgetExt}, Box, Button, Entry};
use log::error; use log::error;
use crate::{config::save_config, coordinator::ApplicationEvent}; use crate::{config::save_config, coordinator::ApplicationEvent};
@ -63,14 +63,6 @@ impl SocketPanel {
self.connect_button.set_label(new_label); self.connect_button.set_label(new_label);
} }
pub fn get_ip_text(&self) -> GString {
self.ip_entry.text()
}
pub fn get_port_text(&self) -> GString {
self.port_entry.text()
}
pub fn connect_button_callback(&self, to_mec: Sender<ApplicationEvent>) { pub fn connect_button_callback(&self, to_mec: Sender<ApplicationEvent>) {
let ip_entry = &self.ip_entry; let ip_entry = &self.ip_entry;

59
src/ui/tracker_panel.rs Normal file
View file

@ -0,0 +1,59 @@
use async_channel::Sender;
use gtk::{prelude::{BoxExt, ButtonExt, ToggleButtonExt}, Box, Label, ToggleButton};
use log::error;
use crate::coordinator::ApplicationEvent;
pub struct TrackerPanel {
top_level: Box,
enable_disable: ToggleButton,
current_id: Label,
}
impl TrackerPanel {
pub fn new() -> TrackerPanel {
let top_level = Box::builder()
.orientation(gtk::Orientation::Vertical)
.spacing(5)
.margin_top(24)
.margin_start(24)
.margin_end(24)
.margin_bottom(12)
.build();
let enable_disable = ToggleButton::with_label("Enable Automatic Tracking");
let current_id = Label::builder()
.label("")
.can_focus(false)
.can_target(false)
.build();
top_level.append(&enable_disable);
top_level.append(&current_id);
TrackerPanel {
top_level,
enable_disable,
current_id,
}
}
pub fn get_top_level(&self) -> &Box {
&self.top_level
}
pub fn connect_button_callback(&self, to_mec: Sender<ApplicationEvent>) {
self.enable_disable.connect_clicked(move |button| {
if let Err(e) = to_mec.send_blocking(ApplicationEvent::EnableAutomatic(button.is_active())) {
error!("Could not send message to the MEC: {e}");
}
});
}
}