Open and image
This commit is contained in:
parent
ac17f705ba
commit
84099d4928
75
src/main.rs
75
src/main.rs
@ -5,6 +5,11 @@ use image::{DynamicImage, ImageBuffer, RgbImage};
|
|||||||
use gtk::{Button, Box as GtkBox, Orientation};
|
use gtk::{Button, Box as GtkBox, Orientation};
|
||||||
use gtk::glib::Propagation;
|
use gtk::glib::Propagation;
|
||||||
use gtk::gdk_pixbuf::Pixbuf;
|
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() {
|
fn main() {
|
||||||
// Инициализация приложения
|
// Инициализация приложения
|
||||||
@ -30,43 +35,60 @@ fn build_ui(app: &Application) {
|
|||||||
.build();
|
.build();
|
||||||
window.set_resizable(false);
|
window.set_resizable(false);
|
||||||
|
|
||||||
|
let selected_file = Rc::new(RefCell::new(None::<File>));
|
||||||
|
|
||||||
// Создание кнопки для открытия диалога выбора файла
|
// Создание кнопки для открытия диалога выбора файла
|
||||||
let button = Button::with_label("Select Image");
|
let button = Button::with_label("Select Image");
|
||||||
|
let picture = Picture::new();
|
||||||
|
picture.set_size_request(400, 400);
|
||||||
|
|
||||||
{
|
{
|
||||||
let window = window.clone();
|
let window = window.clone();
|
||||||
button.connect_clicked(move |_| {
|
let selected_file = selected_file.clone();
|
||||||
// Создание FileDialog
|
let picture = picture.clone();
|
||||||
let dialog = FileDialog::builder()
|
button.connect_clicked(move |_| {
|
||||||
.title("Select an Image")
|
// Создание FileDialog
|
||||||
.accept_label("Open")
|
let dialog = FileDialog::builder()
|
||||||
.build();
|
.title("Select an Image")
|
||||||
|
.accept_label("Open")
|
||||||
|
.build();
|
||||||
|
|
||||||
// Фильтр для изображений
|
// Фильтр для изображений
|
||||||
let filter = gtk::FileFilter::new();
|
let filter = gtk::FileFilter::new();
|
||||||
filter.add_mime_type("image/*"); // Разрешить только изображения
|
filter.add_mime_type("image/png"); // Разрешить только изображения
|
||||||
filter.set_name(Some("Image Files"));
|
filter.set_name(Some("Image Files"));
|
||||||
dialog.set_default_filter(Some(&filter));
|
dialog.set_default_filter(Some(&filter));
|
||||||
|
|
||||||
// Показ диалога и обработка результата
|
// Показ диалога и обработка результата
|
||||||
let window = window.clone();
|
let window = window.clone();
|
||||||
dialog.open(Some(&window), None::<>k::gio::Cancellable>, move |result| {
|
let selected_file = selected_file.clone();
|
||||||
if let Ok(file) = result {
|
let picture = picture.clone();
|
||||||
// Получение выбранного файла
|
dialog.open(Some(&window), None::<>k::gio::Cancellable>, move |result| {
|
||||||
let path = file.path().unwrap();
|
if let Ok(file) = result {
|
||||||
println!("Selected image: {:?}", path);
|
// Получение выбранного файла
|
||||||
|
let path = file.path().unwrap();
|
||||||
|
println!("Selected image: {:?}", path);
|
||||||
|
|
||||||
// Загрузка изображения (опционально)
|
// Загрузка изображения (опционально)
|
||||||
if let Ok(pixbuf) = Pixbuf::from_file(&path) {
|
if let Ok(pixbuf) = Pixbuf::from_file(&path) {
|
||||||
println!("Image loaded successfully: {}x{}", pixbuf.width(), pixbuf.height());
|
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 {
|
} 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.);
|
let br_slider = Scale::with_range(Orientation::Horizontal, -128., 128., 1.);
|
||||||
br_slider.set_value(0.);
|
br_slider.set_value(0.);
|
||||||
@ -91,6 +113,7 @@ fn build_ui(app: &Application) {
|
|||||||
|
|
||||||
let container = GtkBox::new(Orientation::Vertical, 8);
|
let container = GtkBox::new(Orientation::Vertical, 8);
|
||||||
container.append(&button);
|
container.append(&button);
|
||||||
|
container.append(&picture);
|
||||||
container.append(&br_container);
|
container.append(&br_container);
|
||||||
|
|
||||||
window.set_child(Some(&container));
|
window.set_child(Some(&container));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user