From a11fb8802bb00e4ce1dda6dc0c5c69a66649451d Mon Sep 17 00:00:00 2001
From: ochibani <11yzyv86j@relay.firefox.com>
Date: Fri, 27 Dec 2024 20:11:01 +0200
Subject: [PATCH] add record & stop button logic

---
 gui/interfaces/main.ui |   1 +
 gui/src/ui.rs          | 177 ++++++++++++++++++++++++++++++++++++-----
 locales/ar.ftl         |   4 +-
 locales/ar_YE.ftl      |   4 +-
 locales/en.ftl         |   4 +-
 locales/en_US.ftl      |   4 +-
 6 files changed, 172 insertions(+), 22 deletions(-)

diff --git a/gui/interfaces/main.ui b/gui/interfaces/main.ui
index f68962f..c5b9821 100644
--- a/gui/interfaces/main.ui
+++ b/gui/interfaces/main.ui
@@ -135,6 +135,7 @@
 										<property name="visible">True</property>
 										<property name="can-focus">True</property>
 										<property name="receives-default">True</property>
+										<property name="has-tooltip">True</property>
 									</object>
 								</child>
 								<child type="end">
diff --git a/gui/src/ui.rs b/gui/src/ui.rs
index 14f4d72..6c623bb 100644
--- a/gui/src/ui.rs
+++ b/gui/src/ui.rs
@@ -3,7 +3,7 @@ use anyhow::Result;
 use blue_recorder_core::ffmpeg_linux::Ffmpeg;
 #[cfg(target_os = "windows")]
 use blue_recorder_core::ffmpeg_windows::Ffmpeg;
-use blue_recorder_core::utils::{is_wayland, RecordMode};
+use blue_recorder_core::utils::{is_wayland, play_record, RecordMode};
 use chrono::Utc;
 use cpal::traits::{DeviceTrait, HostTrait};
 use libadwaita::{Application, Window};
@@ -116,6 +116,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
     let screen_grab_icon: Image = builder.object("screen_grab_icon").unwrap();
     let screen_grab_label: Label = builder.object("screen_grab_label").unwrap();
     let select_window: Window = builder.object("select_window").unwrap();
+    #[cfg(target_os = "windows")]
     let select_window_label: Label = builder.object("select_window_label").unwrap();
     let speaker_switch: CheckButton = builder.object("speakerswitch").unwrap();
     let stop_button: Button = builder.object("stopbutton").unwrap();
@@ -195,7 +196,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
     let output_device = if host_output_device.is_some() {
         host_output_device.unwrap().name()?
     } else {
-      String::from("")
+      String::new()
     };
 
     audio_source_combobox.append(Some("default"), &get_bundle("audio-input", None));
@@ -771,19 +772,24 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
     }));
 
     // Record button
+    let _audio_input_switch = audio_input_switch.clone();
     //let bundle_msg = get_bundle("already-exist", None);
     let _delay_spin = delay_spin.clone();
     delay_window_button.set_label(&get_bundle("delay-window-stop", None));
     delay_window_title.set_label(&get_bundle("delay-title", None));
     let _delay_window = delay_window.clone();
     let _delay_window_button = delay_window_button.clone();
+    let _error_dialog = error_dialog.clone();
+    let _error_message = error_message.clone();
     let _ffmpeg_record_interface = ffmpeg_record_interface.clone();
     //let main_context = glib::MainContext::default();
     let _main_window = main_window.clone();
     let _play_button = play_button.clone();
     let _record_button = record_button.clone();
     let _record_time_label = record_time_label.clone();
+    let _speaker_switch = speaker_switch.clone();
     let _stop_button = stop_button.clone();
+    let _video_switch = video_switch.clone();
     record_button.set_tooltip_text(Some(&get_bundle("record-tooltip", None)));
     record_label.set_label(&get_bundle("record", None));
     //let wayland_record = main_context.block_on(WaylandRecorder::new());
@@ -807,37 +813,159 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
                 _area_capture.height,
                 mode,
             );
-            /*match start_video_record {
-                None => {
-                    // Do nothing if the start_record function return nothing
+            let start_audio_input_record = _ffmpeg_record_interface.borrow_mut().start_input_audio();
+            let start_audio_output_record = _ffmpeg_record_interface.borrow_mut().start_output_audio();
+            if !_audio_input_switch.is_active() &&
+                !_speaker_switch.is_active() &&
+                !_video_switch.is_active()
+            {
+                // Do nothing
+            } else {
+                start_timer(record_time_label.clone());
+                record_time_label.set_visible(true);
+                if hide_switch.is_active() {
+                    _main_window.minimize();
                 }
-                _ => {
-                    //start_timer(record_time_label.clone());
-                    record_time_label.set_visible(true);
-                    if hide_switch.is_active() {
-                        _main_window.minimize();
+                _audio_input_switch.set_sensitive(false);
+                _speaker_switch.set_sensitive(false);
+                _video_switch.set_sensitive(false);
+                _play_button.hide();
+                _record_button.hide();
+                _stop_button.show();
+                if _audio_input_switch.is_active() {
+                    match start_audio_input_record {
+                        Ok(_) => {
+                            // Do nothing
+                            },
+                        Err(error) => {
+                            let text_buffer = TextBuffer::new(None);
+                            text_buffer.set_text(&format!("{}", error));
+                            _error_message.set_buffer(Some(&text_buffer));
+                            _error_dialog.show();
+                            _audio_input_switch.set_sensitive(true);
+                            _speaker_switch.set_sensitive(true);
+                            _video_switch.set_sensitive(true);
+                            _record_button.show();
+                            _stop_button.hide();
+                        },
                     }
-                    _play_button.hide();
-                    _record_button.hide();
-                    _stop_button.show();
                 }
-            }*/
+                if _speaker_switch.is_active() {
+                    match start_audio_output_record {
+                        Ok(_) => {
+                            // Do nothing
+                            },
+                        Err(error) => {
+                            let text_buffer = TextBuffer::new(None);
+                            text_buffer.set_text(&format!("{}", error));
+                            _error_message.set_buffer(Some(&text_buffer));
+                            _error_dialog.show();
+                            _audio_input_switch.set_sensitive(true);
+                            _speaker_switch.set_sensitive(true);
+                            _video_switch.set_sensitive(true);
+                            _record_button.show();
+                            _stop_button.hide();
+                        },
+                    }
+                }
+                if _video_switch.is_active() {
+                    match start_video_record {
+                        Ok(_) => {
+                            // Do nothing
+                            },
+                        Err(error) => {
+                            let text_buffer = TextBuffer::new(None);
+                            text_buffer.set_text(&format!("{}", error));
+                            _error_message.set_buffer(Some(&text_buffer));
+                            _error_dialog.show();
+                            _audio_input_switch.set_sensitive(true);
+                            _speaker_switch.set_sensitive(true);
+                            _video_switch.set_sensitive(true);
+                            _record_button.show();
+                            _stop_button.hide();
+                        },
+                    }
+                }
+            }
         }
     });
 
     // Stop record button
+    let _audio_input_switch = audio_input_switch.clone();
+    let _error_dialog = error_dialog.clone();
+    let _error_message = error_message.clone();
     let mut _ffmpeg_record_interface = ffmpeg_record_interface.clone();
     let _play_button = play_button.clone();
+    let _speaker_switch = speaker_switch.clone();
     let _stop_button = stop_button.clone();
+    let _video_switch = video_switch.clone();
     stop_button.set_tooltip_text(Some(&get_bundle("stop-tooltip", None)));
     stop_label.set_label(&get_bundle("stop-recording", None));
     stop_button.connect_clicked(move |_| {
         _record_time_label.set_visible(false);
-        //stop_timer(_record_time_label.clone());
-        //_ffmpeg_record_interface.borrow_mut().clone().stop_record();
+        stop_timer(_record_time_label.clone());
+        if _audio_input_switch.is_active() {
+            match _ffmpeg_record_interface.borrow_mut().stop_input_audio() {
+                Ok(_) => {
+                    // Do nothing
+                    },
+                Err(error) => {
+                    let text_buffer = TextBuffer::new(None);
+                    text_buffer.set_text(&format!("{}", error));
+                    _error_message.set_buffer(Some(&text_buffer));
+                    _error_dialog.show();
+                    _audio_input_switch.set_sensitive(true);
+                    _speaker_switch.set_sensitive(true);
+                    _video_switch.set_sensitive(true);
+                    record_button.show();
+                    _stop_button.hide();
+                },
+            }
+        }
+        if _speaker_switch.is_active() {
+            match _ffmpeg_record_interface.borrow_mut().stop_output_audio() {
+                Ok(_) => {
+                    // Do nothing
+                    },
+                Err(error) => {
+                    let text_buffer = TextBuffer::new(None);
+                    text_buffer.set_text(&format!("{}", error));
+                    _error_message.set_buffer(Some(&text_buffer));
+                    _error_dialog.show();
+                    _audio_input_switch.set_sensitive(true);
+                    _speaker_switch.set_sensitive(true);
+                    _video_switch.set_sensitive(true);
+                    record_button.show();
+                    _stop_button.hide();
+                },
+            }
+        }
+        if _video_switch.is_active() {
+            match _ffmpeg_record_interface.borrow_mut().stop_video() {
+                Ok(_) => {
+                    // Do nothing
+                    },
+                Err(error) => {
+                    let text_buffer = TextBuffer::new(None);
+                    text_buffer.set_text(&format!("{}", error));
+                    _error_message.set_buffer(Some(&text_buffer));
+                    _error_dialog.show();
+                    _audio_input_switch.set_sensitive(true);
+                    _speaker_switch.set_sensitive(true);
+                    _video_switch.set_sensitive(true);
+                    record_button.show();
+                    _stop_button.hide();
+                },
+            }
+        }
+        _audio_input_switch.set_sensitive(true);
+        _speaker_switch.set_sensitive(true);
+        _video_switch.set_sensitive(true);
         record_button.show();
         _stop_button.hide();
         _play_button.show();
+        _play_button.set_sensitive(false);
+        _play_button.set_tooltip_text(Some(&get_bundle("play-inactive-tooltip", None)));
     });
 
     // Delay window button
@@ -845,9 +973,22 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
     delay_window_button.connect_clicked(move |_| {});
 
     // Play button
-    //let mut _ffmpeg_record_interface = ffmpeg_record_interface.clone();
+    let _error_dialog = error_dialog.clone();
+    let _error_message = error_message.clone();
+    let mut _ffmpeg_record_interface = ffmpeg_record_interface.clone();
     play_button.connect_clicked(move |_| {
-        //_ffmpeg_record_interface.borrow_mut().clone().play_record();
+        let file_name = _ffmpeg_record_interface.borrow_mut().filename.clone();
+        match play_record(&file_name) {
+            Ok(_) => {
+                // Do nothing
+            },
+            Err(error) => {
+                let text_buffer = TextBuffer::new(None);
+                text_buffer.set_text(&format!("{}", error));
+                _error_message.set_buffer(Some(&text_buffer));
+                _error_dialog.show();
+            },
+        }
     });
 
     // About dialog
diff --git a/locales/ar.ftl b/locales/ar.ftl
index c4a6de7..d8ec1ea 100644
--- a/locales/ar.ftl
+++ b/locales/ar.ftl
@@ -172,13 +172,15 @@ format-tooltip = لاختيار صيغة الخَرج
 frames-tooltip = عدد الإطارات في الثانية
 hide-tooltip = لإخفاء نافذة المسجل الأزرق عند بدء التسجيل
 mouse-tooltip = يظهر مؤشر الفأرة عند التسجيل
-video-bitrate-tooltip = Set video bitrate in KB/s
+play-tooltip = Click to play video
+play-inactive-tooltip = Please wait until the file is saved
 record-tooltip = يبدأ تسجيل الشاشة
 screen-tooltip = يحدد الشاشة ليسجلها
 show-area-tooltip = Show selected area during record
 speaker-tooltip = Speakr sound recording
 stop-tooltip = وقف تسجيل الشاشة
 tray-minimize-tooltip = Minimize application to tray icon
+video-bitrate-tooltip = Set video bitrate in KB/s
 video-tooltip = يسجل الشاشة
 wayland-tooltip = غير مدعوم في وايلاند
 window-tooltip = يحدد نافذة ليسجلها
diff --git a/locales/ar_YE.ftl b/locales/ar_YE.ftl
index c4a6de7..d8ec1ea 100644
--- a/locales/ar_YE.ftl
+++ b/locales/ar_YE.ftl
@@ -172,13 +172,15 @@ format-tooltip = لاختيار صيغة الخَرج
 frames-tooltip = عدد الإطارات في الثانية
 hide-tooltip = لإخفاء نافذة المسجل الأزرق عند بدء التسجيل
 mouse-tooltip = يظهر مؤشر الفأرة عند التسجيل
-video-bitrate-tooltip = Set video bitrate in KB/s
+play-tooltip = Click to play video
+play-inactive-tooltip = Please wait until the file is saved
 record-tooltip = يبدأ تسجيل الشاشة
 screen-tooltip = يحدد الشاشة ليسجلها
 show-area-tooltip = Show selected area during record
 speaker-tooltip = Speakr sound recording
 stop-tooltip = وقف تسجيل الشاشة
 tray-minimize-tooltip = Minimize application to tray icon
+video-bitrate-tooltip = Set video bitrate in KB/s
 video-tooltip = يسجل الشاشة
 wayland-tooltip = غير مدعوم في وايلاند
 window-tooltip = يحدد نافذة ليسجلها
diff --git a/locales/en.ftl b/locales/en.ftl
index 223ae86..a5ca725 100644
--- a/locales/en.ftl
+++ b/locales/en.ftl
@@ -172,13 +172,15 @@ format-tooltip = Select file format
 frames-tooltip = Set frames rate
 hide-tooltip = Hide window when start recording
 mouse-tooltip = Mouse appears in video recording
-video-bitrate-tooltip = Set video bitrate in KB/s
+play-tooltip = Click to play video
+play-inactive-tooltip = Please wait until the file is saved
 record-tooltip = Start screen record
 screen-tooltip = Select screen to record
 show-area-tooltip = Show selected area during record
 speaker-tooltip = Speakr sound recording
 stop-tooltip = Stop screen recording
 tray-minimize-tooltip = Minimize application to tray icon
+video-bitrate-tooltip = Set video bitrate in KB/s
 video-tooltip = Video recording
 wayland-tooltip = Not supported in Wayland
 window-tooltip = Select window to record
diff --git a/locales/en_US.ftl b/locales/en_US.ftl
index 223ae86..a5ca725 100644
--- a/locales/en_US.ftl
+++ b/locales/en_US.ftl
@@ -172,13 +172,15 @@ format-tooltip = Select file format
 frames-tooltip = Set frames rate
 hide-tooltip = Hide window when start recording
 mouse-tooltip = Mouse appears in video recording
-video-bitrate-tooltip = Set video bitrate in KB/s
+play-tooltip = Click to play video
+play-inactive-tooltip = Please wait until the file is saved
 record-tooltip = Start screen record
 screen-tooltip = Select screen to record
 show-area-tooltip = Show selected area during record
 speaker-tooltip = Speakr sound recording
 stop-tooltip = Stop screen recording
 tray-minimize-tooltip = Minimize application to tray icon
+video-bitrate-tooltip = Set video bitrate in KB/s
 video-tooltip = Video recording
 wayland-tooltip = Not supported in Wayland
 window-tooltip = Select window to record