diff --git a/src/main.rs b/src/main.rs index 70e2422..12ba061 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,11 @@ use image::{DynamicImage, ImageBuffer, RgbImage}; use gtk::{Button, Box as GtkBox, Orientation}; use gtk::glib::Propagation; use gtk::gdk_pixbuf::Pixbuf; +use std::fs; +use std::path::Path; +use gtk::gio::File; +use std::rc::Rc; +use std::cell::RefCell; fn main() { // Инициализация приложения @@ -30,43 +35,60 @@ fn build_ui(app: &Application) { .build(); window.set_resizable(false); + let selected_file = Rc::new(RefCell::new(None::)); + // Создание кнопки для открытия диалога выбора файла let button = Button::with_label("Select Image"); + let picture = Picture::new(); + picture.set_size_request(400, 400); { let window = window.clone(); - button.connect_clicked(move |_| { - // Создание FileDialog - let dialog = FileDialog::builder() - .title("Select an Image") - .accept_label("Open") - .build(); + let selected_file = selected_file.clone(); + let picture = picture.clone(); + button.connect_clicked(move |_| { + // Создание FileDialog + let dialog = FileDialog::builder() + .title("Select an Image") + .accept_label("Open") + .build(); - // Фильтр для изображений - let filter = gtk::FileFilter::new(); - filter.add_mime_type("image/*"); // Разрешить только изображения - filter.set_name(Some("Image Files")); - dialog.set_default_filter(Some(&filter)); + // Фильтр для изображений + let filter = gtk::FileFilter::new(); + filter.add_mime_type("image/png"); // Разрешить только изображения + filter.set_name(Some("Image Files")); + dialog.set_default_filter(Some(&filter)); - // Показ диалога и обработка результата - let window = window.clone(); - dialog.open(Some(&window), None::<>k::gio::Cancellable>, move |result| { - if let Ok(file) = result { - // Получение выбранного файла - let path = file.path().unwrap(); - println!("Selected image: {:?}", path); + // Показ диалога и обработка результата + let window = window.clone(); + let selected_file = selected_file.clone(); + let picture = picture.clone(); + dialog.open(Some(&window), None::<>k::gio::Cancellable>, move |result| { + if let Ok(file) = result { + // Получение выбранного файла + let path = file.path().unwrap(); + println!("Selected image: {:?}", path); - // Загрузка изображения (опционально) - if let Ok(pixbuf) = Pixbuf::from_file(&path) { - println!("Image loaded successfully: {}x{}", pixbuf.width(), pixbuf.height()); + // Загрузка изображения (опционально) + if let Ok(pixbuf) = Pixbuf::from_file(&path) { + println!("Image loaded successfully: {}x{}", pixbuf.width(), pixbuf.height()); + let _ = fs::copy(&path, "/tmp/modified.png"); + *selected_file.borrow_mut() = Some(file.clone()); + picture.set_pixbuf(Some(&pixbuf)); + + } else { + eprintln!("Failed to load image."); + } } else { - eprintln!("Failed to load image."); + eprintln!("File selection canceled."); } - } else { - eprintln!("File selection canceled."); - } + }); }); - });} + } + + if selected_file.borrow().is_some() { + button.set_visible(false); + } let br_slider = Scale::with_range(Orientation::Horizontal, -128., 128., 1.); br_slider.set_value(0.); @@ -91,6 +113,7 @@ fn build_ui(app: &Application) { let container = GtkBox::new(Orientation::Vertical, 8); container.append(&button); + container.append(&picture); container.append(&br_container); window.set_child(Some(&container));