2024-02-13 12:29:50 -07:00
|
|
|
use cosmic::{
|
2025-09-03 23:24:38 +02:00
|
|
|
Application, Element,
|
2024-10-21 14:14:43 -06:00
|
|
|
app::{self, Core, Settings, Task},
|
2024-02-13 12:29:50 -07:00
|
|
|
executor,
|
2025-09-03 23:24:38 +02:00
|
|
|
iced::{Subscription, window},
|
|
|
|
|
widget,
|
2024-02-13 12:29:50 -07:00
|
|
|
};
|
2025-07-21 15:55:54 -06:00
|
|
|
use cosmic_files::dialog::{
|
|
|
|
|
Dialog, DialogChoice, DialogChoiceOption, DialogFilter, DialogFilterPattern, DialogKind,
|
|
|
|
|
DialogMessage, DialogResult, DialogSettings,
|
|
|
|
|
};
|
2024-02-13 12:29:50 -07:00
|
|
|
|
2024-02-01 15:55:52 -07:00
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
2024-02-15 15:03:01 -07:00
|
|
|
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("warn")).init();
|
|
|
|
|
|
2024-02-13 12:29:50 -07:00
|
|
|
let settings = Settings::default();
|
|
|
|
|
app::run::<App>(settings, ())?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
|
pub enum Message {
|
|
|
|
|
DialogMessage(DialogMessage),
|
2024-02-26 14:11:45 -07:00
|
|
|
DialogOpen(DialogKind),
|
2024-02-13 12:29:50 -07:00
|
|
|
DialogResult(DialogResult),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct App {
|
|
|
|
|
core: Core,
|
|
|
|
|
dialog_opt: Option<Dialog<Message>>,
|
|
|
|
|
result_opt: Option<DialogResult>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Application for App {
|
|
|
|
|
type Executor = executor::Default;
|
|
|
|
|
type Flags = ();
|
|
|
|
|
type Message = Message;
|
|
|
|
|
|
|
|
|
|
const APP_ID: &'static str = "com.system76.CosmicFilesDialogExample";
|
|
|
|
|
|
|
|
|
|
fn core(&self) -> &Core {
|
|
|
|
|
&self.core
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn core_mut(&mut self) -> &mut Core {
|
|
|
|
|
&mut self.core
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-21 14:14:43 -06:00
|
|
|
fn init(core: Core, _flags: Self::Flags) -> (Self, Task<Message>) {
|
2024-02-13 12:29:50 -07:00
|
|
|
(
|
|
|
|
|
Self {
|
|
|
|
|
core,
|
|
|
|
|
dialog_opt: None,
|
|
|
|
|
result_opt: None,
|
|
|
|
|
},
|
2024-10-21 14:14:43 -06:00
|
|
|
Task::none(),
|
2024-02-13 12:29:50 -07:00
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-21 14:14:43 -06:00
|
|
|
fn update(&mut self, message: Message) -> Task<Message> {
|
2024-02-13 12:29:50 -07:00
|
|
|
match message {
|
|
|
|
|
Message::DialogMessage(dialog_message) => {
|
|
|
|
|
if let Some(dialog) = &mut self.dialog_opt {
|
|
|
|
|
return dialog.update(dialog_message);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-02-26 14:11:45 -07:00
|
|
|
Message::DialogOpen(dialog_kind) => {
|
2024-02-13 12:29:50 -07:00
|
|
|
if self.dialog_opt.is_none() {
|
2025-07-21 15:55:54 -06:00
|
|
|
let (mut dialog, task) = Dialog::new(
|
2025-07-01 09:54:00 -06:00
|
|
|
DialogSettings::new().kind(dialog_kind),
|
2024-02-15 15:03:01 -07:00
|
|
|
Message::DialogMessage,
|
|
|
|
|
Message::DialogResult,
|
|
|
|
|
);
|
2025-07-21 15:55:54 -06:00
|
|
|
let mut tasks = vec![task];
|
|
|
|
|
dialog.set_choices(vec![
|
|
|
|
|
DialogChoice::ComboBox {
|
|
|
|
|
id: "example-combobox".into(),
|
|
|
|
|
label: "Combobox".into(),
|
|
|
|
|
options: vec![
|
|
|
|
|
DialogChoiceOption {
|
|
|
|
|
id: "foo".into(),
|
|
|
|
|
label: "foo".into(),
|
|
|
|
|
},
|
|
|
|
|
DialogChoiceOption {
|
|
|
|
|
id: "bar".into(),
|
|
|
|
|
label: "bar".into(),
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
selected: Some(0),
|
|
|
|
|
},
|
|
|
|
|
DialogChoice::CheckBox {
|
|
|
|
|
id: "example-checkbox".into(),
|
|
|
|
|
label: "Checkbox".into(),
|
|
|
|
|
value: false,
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
tasks.push(dialog.set_filters(
|
|
|
|
|
vec![DialogFilter {
|
|
|
|
|
label: "Any file".into(),
|
|
|
|
|
patterns: vec![DialogFilterPattern::Glob("*".into())],
|
|
|
|
|
}],
|
|
|
|
|
Some(0),
|
|
|
|
|
));
|
2024-02-13 12:29:50 -07:00
|
|
|
self.dialog_opt = Some(dialog);
|
2025-07-21 15:55:54 -06:00
|
|
|
return Task::batch(tasks);
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Message::DialogResult(result) => {
|
|
|
|
|
self.dialog_opt = None;
|
|
|
|
|
self.result_opt = Some(result);
|
2024-02-01 17:43:41 -07:00
|
|
|
}
|
|
|
|
|
}
|
2024-02-13 12:29:50 -07:00
|
|
|
|
2024-10-21 14:14:43 -06:00
|
|
|
Task::none()
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn view_window(&self, window_id: window::Id) -> Element<Message> {
|
|
|
|
|
match &self.dialog_opt {
|
|
|
|
|
Some(dialog) => dialog.view(window_id),
|
2024-11-25 03:24:24 +01:00
|
|
|
None => widget::text::body("No dialog").into(),
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn view(&self) -> Element<Message> {
|
2024-11-25 03:24:24 +01:00
|
|
|
let mut column = widget::column().spacing(8).padding(8);
|
2024-02-15 15:03:01 -07:00
|
|
|
{
|
2024-02-26 14:11:45 -07:00
|
|
|
let mut button = widget::button::standard("Open File");
|
|
|
|
|
if self.dialog_opt.is_none() {
|
|
|
|
|
button = button.on_press(Message::DialogOpen(DialogKind::OpenFile));
|
|
|
|
|
}
|
|
|
|
|
column = column.push(button);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
let mut button = widget::button::standard("Open Multiple Files");
|
|
|
|
|
if self.dialog_opt.is_none() {
|
|
|
|
|
button = button.on_press(Message::DialogOpen(DialogKind::OpenMultipleFiles));
|
|
|
|
|
}
|
|
|
|
|
column = column.push(button);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
let mut button = widget::button::standard("Open Folder");
|
|
|
|
|
if self.dialog_opt.is_none() {
|
|
|
|
|
button = button.on_press(Message::DialogOpen(DialogKind::OpenFolder));
|
|
|
|
|
}
|
|
|
|
|
column = column.push(button);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
let mut button = widget::button::standard("Open Multiple Folders");
|
2024-02-15 15:03:01 -07:00
|
|
|
if self.dialog_opt.is_none() {
|
2024-02-26 14:11:45 -07:00
|
|
|
button = button.on_press(Message::DialogOpen(DialogKind::OpenMultipleFolders));
|
2024-02-15 15:03:01 -07:00
|
|
|
}
|
|
|
|
|
column = column.push(button);
|
|
|
|
|
}
|
|
|
|
|
{
|
2024-02-26 14:11:45 -07:00
|
|
|
let mut button = widget::button::standard("Save File");
|
2024-02-15 15:03:01 -07:00
|
|
|
if self.dialog_opt.is_none() {
|
2024-02-26 14:11:45 -07:00
|
|
|
button = button.on_press(Message::DialogOpen(DialogKind::SaveFile {
|
2024-02-26 14:31:50 -07:00
|
|
|
filename: "test".to_string(),
|
2024-02-26 14:11:45 -07:00
|
|
|
}));
|
2024-02-15 15:03:01 -07:00
|
|
|
}
|
|
|
|
|
column = column.push(button);
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
if let Some(result) = &self.result_opt {
|
|
|
|
|
match result {
|
|
|
|
|
DialogResult::Cancel => {
|
2024-11-25 03:24:24 +01:00
|
|
|
column = column.push(widget::text::body("Cancel"));
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
DialogResult::Open(paths) => {
|
|
|
|
|
for path in paths.iter() {
|
2024-11-25 03:24:24 +01:00
|
|
|
column = column.push(widget::text::body(format!("{}", path.display())));
|
2024-02-13 12:29:50 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
column.into()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn subscription(&self) -> Subscription<Message> {
|
|
|
|
|
match &self.dialog_opt {
|
|
|
|
|
Some(dialog) => dialog.subscription(),
|
|
|
|
|
None => Subscription::none(),
|
|
|
|
|
}
|
2024-02-01 17:43:41 -07:00
|
|
|
}
|
2024-02-01 15:55:52 -07:00
|
|
|
}
|