add selected area size indicator

This commit is contained in:
ochibani 2024-12-16 21:54:30 +02:00
parent a929272e6a
commit 745731a887
5 changed files with 80 additions and 13 deletions

View File

@ -37,9 +37,10 @@
<property name="margin-start">5</property>
<child>
<object class="GtkLabel" id="area_size_top">
<property name="name">area_size_top</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="label" translatable="yes">label</property>
<property name="label" translatable="yes">loading</property>
</object>
</child>
</object>
@ -97,9 +98,10 @@
<property name="margin-end">5</property>
<child>
<object class="GtkLabel" id="area_size_bottom">
<property name="name">area_size_bottom</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="label" translatable="yes">label</property>
<property name="label" translatable="yes">loading</property>
</object>
</child>
</object>

View File

@ -7,6 +7,7 @@
<property name="destroy-with-parent">True</property>
<property name="deletable">False</property>
<property name="resizable">False</property>
<property name="decorated">False</property>
<property name="modal">True</property>
</object>
</interface>

View File

@ -2,8 +2,14 @@ extern crate regex;
use anyhow::{anyhow, Result};
use display_info::DisplayInfo;
use glib::Continue;
use libadwaita::gtk::Label;
use libadwaita::Window;
use libadwaita::prelude::*;
use regex::Regex;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
#[cfg(target_os = "windows")]
use x_win::get_active_window;
@ -143,3 +149,39 @@ fn xwininfo_to_coordinate(xwininfo_output: String) -> Result<(u16, u16, u16, u16
Ok((x, y, width, height))
}
// Display area chooser window size
pub fn show_size(area_chooser_window: Window, area_size_bottom_label: Label, area_size_top_label: Label) -> Result<()> {
// Create a shared state for the area size
let size_labels = Rc::new(RefCell::new((area_size_top_label, area_size_bottom_label)));
// Use a timeout to periodically check the window size
glib::timeout_add_local(1000, {
let area_chooser_window = area_chooser_window.clone();
let size_labels = size_labels.clone();
move || {
if !area_chooser_window.is_active() {
return Continue(false); // Stop the timeout
}
let mut area_capture = AreaCapture::new().unwrap();
#[cfg(any(target_os = "freebsd", target_os = "linux"))]
let size = area_capture.get_window_by_name(
area_chooser_window.title().unwrap().as_str()
).unwrap();
#[cfg(target_os = "windows")]
let size = area_capture.get_active_window().unwrap();
// Update the labels
let (top_label, bottom_label) = size_labels.borrow_mut().to_owned();
top_label.set_text(&format!("{}x{}", size.width, size.height));
bottom_label.set_text(&format!("{}x{}", size.width, size.height));
Continue(true) // Continue the timeout
}
});
Ok(())
}

View File

@ -4,15 +4,25 @@
border-radius: 0px;
}
#area_grab_button:checked, #screen_grab_button:checked, #window_grab_button:checked {
color: @theme_selected_fg_color;
background: alpha(@theme_selected_bg_color, 0.5);
border: 1px solid @theme_selected_bg_color;
}
#area_set_button {
color: @theme_selected_fg_color;
background: @theme_selected_bg_color;
}
#area_grab_button:checked, #screen_grab_button:checked, #window_grab_button:checked {
#area_size_bottom {
color: @theme_selected_fg_color;
background: alpha(@theme_selected_bg_color, 0.5);
border: 1px solid @theme_selected_bg_color;
font-weight: bold;
}
#area_size_top {
color: @theme_selected_fg_color;
font-weight: bold;
}
#delay_window {

View File

@ -15,7 +15,7 @@ use std::ops::Add;
use std::path::Path;
use std::rc::Rc;
use crate::{/*area_capture,*/ config_management, fluent::get_bundle};
use crate::{area_capture, config_management, fluent::get_bundle};
use crate::timer::{recording_delay, start_timer, stop_timer};
pub fn run_ui(application: &Application) {
@ -131,7 +131,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
error_dialog.set_transient_for(Some(&main_window));
select_window.set_transient_for(Some(&main_window));
select_window.set_message_type(libadwaita::gtk::MessageType::Info);
select_window.set_text(Some(&get_bundle("click-window", None)));
select_window.set_secondary_text(Some(&get_bundle("click-window", None)));
main_window.set_application(Some(application));
main_window.set_title(Some(&get_bundle("blue-recorder", None)));
@ -516,7 +516,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
let text_buffer = TextBuffer::new(None);
if response == libadwaita::gtk::ResponseType::Accept {
if folder_chooser_native.file().is_none() {
text_buffer.set_text("failed to get save file path");
text_buffer.set_text("Failed to get save file path");
error_message.set_buffer(Some(&text_buffer));
error_dialog.show();
}
@ -553,9 +553,21 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
let _area_chooser_window = area_chooser_window.clone();
//let mut _area_capture = area_capture.clone();
let _area_switch = area_switch.clone();
let _error_dialog = error_dialog.clone();
let _error_message = error_message.clone();
area_grab_button.connect_clicked(move |_| {
config_management::set("default", "mode", "area");
_area_chooser_window.show();
if area_capture::show_size(
_area_chooser_window.clone(),
area_size_bottom_label.clone(),
area_size_top_label.clone(),
).is_err() {
let text_buffer = TextBuffer::new(None);
text_buffer.set_text("Failed to get area size value");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}
_area_switch.set_active(config_management::get_bool("default", "areacheck"));
_area_switch.set_sensitive(true);
});
@ -570,7 +582,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
/*if _area_capture
.borrow_mut()
.get_window_by_name(_area_chooser_window.title().unwrap().as_str()).is_err() {
text_buffer.set_text("failed to get area size value");
text_buffer.set_text("Failed to get area size value");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}*/
@ -596,7 +608,7 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
screen_grab_button_record_window.replace(false);
_area_chooser_window.hide();
/*if _area_capture.borrow_mut().reset().is_err() {
text_buffer.set_text("failed to get reset area_capture value");
text_buffer.set_text("Failed to get reset area_capture value");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}*/
@ -610,8 +622,6 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
window_grab_button.set_tooltip_text(Some(&get_bundle("window-tooltip", None)));
window_grab_label.set_label(&get_bundle("select-window", None));
window_grab_button.connect_clicked(move |_| {
select_window.show();
select_window.set_hide_on_close(true);
let text_buffer = TextBuffer::new(None);
config_management::set_bool("default", "areacheck", _area_switch.is_active());
_area_switch.set_active(false);
@ -621,8 +631,10 @@ fn build_ui(application: &Application, error_dialog: MessageDialog, error_messag
if is_wayland() {
window_grab_button_record_window.replace(true);
} else {
select_window.show();
select_window.set_hide_on_close(true);
/*if _area_capture.borrow_mut().get_area().is_err() {
text_buffer.set_text("failed to get window size value");
text_buffer.set_text("Failed to get window size value");
_error_message.set_buffer(Some(&text_buffer));
_error_dialog.show();
}*/