diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..2cc7b98 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,15 @@ +{ + "format_on_save": "on", + "lsp": { + "rust-analyzer": { + "initialization_options": { + "check": { + "command": "clippy", + }, + "rustfmt": { + "extraArgs": ["+nightly"], + }, + }, + }, + }, +} diff --git a/build.rs b/build.rs index 5edc53b..206e897 100644 --- a/build.rs +++ b/build.rs @@ -1,4 +1,5 @@ -use std::{env, fs, path::PathBuf}; +use std::path::PathBuf; +use std::{env, fs}; use xdgen::{App, Context, FluentString}; fn main() { diff --git a/examples/copy.rs b/examples/copy.rs index 6396209..7f37abd 100644 --- a/examples/copy.rs +++ b/examples/copy.rs @@ -1,6 +1,8 @@ -use cosmic_files::operation::recursive::Method; -use cosmic_files::operation::{Controller, ReplaceResult, recursive::Context}; -use std::{error::Error, io, path::PathBuf}; +use cosmic_files::operation::recursive::{Context, Method}; +use cosmic_files::operation::{Controller, ReplaceResult}; +use std::error::Error; +use std::io; +use std::path::PathBuf; #[compio::main] async fn main() -> Result<(), Box> { diff --git a/examples/dialog.rs b/examples/dialog.rs index be93576..df77069 100644 --- a/examples/dialog.rs +++ b/examples/dialog.rs @@ -1,15 +1,12 @@ -use cosmic::{ - Application, Element, - app::{self, Core, Settings, Task}, - executor, - iced::{Subscription, window}, - widget, -}; +use cosmic::app::{self, Core, Settings, Task}; +use cosmic::iced::{Subscription, window}; +use cosmic::{Application, Element, executor, widget}; use cosmic_files::dialog::{ Dialog, DialogChoice, DialogChoiceOption, DialogFilter, DialogFilterPattern, DialogKind, DialogMessage, DialogResult, DialogSettings, }; -use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; fn main() -> Result<(), Box> { let log_format = tracing_subscriber::fmt::format() diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..c1578aa --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +imports_granularity = "Module" diff --git a/src/app.rs b/src/app.rs index e259dc2..fcc411f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,8 +1,23 @@ // Copyright 2023 System76 // SPDX-License-Identifier: GPL-3.0-only +use cosmic::app::{self, Core, Task, context_drawer}; +use cosmic::cosmic_config::{self, ConfigSet}; +use cosmic::iced::clipboard::dnd::DndAction; +use cosmic::iced::core::SmolStr; +use cosmic::iced::core::widget::operation::focusable::unfocus; +use cosmic::iced::futures::{self, SinkExt}; +use cosmic::iced::keyboard::{Event as KeyEvent, Key, Modifiers}; #[cfg(all(feature = "wayland", feature = "desktop-applet"))] use cosmic::iced::platform_specific::shell::wayland::commands::overlap_notify::overlap_notify; +use cosmic::iced::runtime::{clipboard, task}; +use cosmic::iced::widget::button::focus; +use cosmic::iced::widget::scrollable; +use cosmic::iced::widget::scrollable::AbsoluteOffset; +use cosmic::iced::window::{self, Event as WindowEvent, Id as WindowId}; +use cosmic::iced::{ + self, Alignment, Event, Length, Rectangle, Size, Subscription, event, mouse, stream, +}; #[cfg(all(feature = "wayland", feature = "desktop-applet"))] use cosmic::iced::{ Limits, Point, @@ -14,92 +29,59 @@ use cosmic::iced::{ Anchor, KeyboardInteractivity, Layer, destroy_layer_surface, get_layer_surface, }, }; -use cosmic::{ - Application, ApplicationExt, Element, - app::{self, Core, Task, context_drawer}, - cosmic_config::{self, ConfigSet}, - cosmic_theme, executor, - iced::core::widget::operation::focusable::unfocus, - iced::runtime::{clipboard, task}, - iced::widget::{button::focus, scrollable::AbsoluteOffset}, - iced::{ - self, Alignment, Event, Length, Rectangle, Size, Subscription, - clipboard::dnd::DndAction, - core::SmolStr, - event, - futures::{self, SinkExt}, - keyboard::{Event as KeyEvent, Key, Modifiers}, - mouse, stream, - widget::scrollable, - window::{self, Event as WindowEvent, Id as WindowId}, - }, - style, surface, theme, - widget::{ - self, - about::About, - dnd_destination::DragId, - icon, - menu::{action::MenuAction, key_bind::KeyBind}, - segmented_button::{self, Entity, ReorderEvent}, - settings, space, - }, -}; +use cosmic::widget::about::About; +use cosmic::widget::dnd_destination::DragId; +use cosmic::widget::menu::action::MenuAction; +use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::segmented_button::{self, Entity, ReorderEvent}; +use cosmic::widget::{self, icon, settings, space}; +use cosmic::{Application, ApplicationExt, Element, cosmic_theme, executor, style, surface, theme}; use mime_guess::Mime; -use notify_debouncer_full::{ - DebouncedEvent, Debouncer, RecommendedCache, new_debouncer, - notify::{self, RecommendedWatcher}, -}; +use notify_debouncer_full::notify::{self, RecommendedWatcher}; +use notify_debouncer_full::{DebouncedEvent, Debouncer, RecommendedCache, new_debouncer}; use rustc_hash::{FxHashMap, FxHashSet}; use slotmap::Key as SlotMapKey; -use std::{ - any::TypeId, - collections::{BTreeMap, BTreeSet, HashMap, VecDeque}, - env, fmt, fs, - future::Future, - io, - num::NonZeroU16, - path::{Path, PathBuf}, - pin::Pin, - process, - sync::{Arc, LazyLock, Mutex}, - time::{self, Duration, Instant}, -}; +use std::any::TypeId; +use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque}; +use std::future::Future; +use std::num::NonZeroU16; +use std::path::{Path, PathBuf}; +use std::pin::Pin; +use std::sync::{Arc, LazyLock, Mutex}; +use std::time::{self, Duration, Instant}; +use std::{env, fmt, fs, io, process}; use tokio::sync::mpsc; use trash::TrashItem; #[cfg(all(feature = "wayland", feature = "desktop-applet"))] use wayland_client::{Proxy, protocol::wl_output::WlOutput}; -use crate::{ - FxOrderMap, - clipboard::{ - ClipboardCache, ClipboardCopy, ClipboardKind, ClipboardPaste, ClipboardPasteImage, - ClipboardPasteText, ClipboardPasteVideo, - }, - config::{ - AppTheme, Config, DesktopConfig, Favorite, IconSizes, State, TIME_CONFIG_ID, TabConfig, - TimeConfig, TypeToSearch, - }, - context_action, - dialog::{Dialog, DialogKind, DialogMessage, DialogResult, DialogSettings}, - fl, home_dir, - key_bind::key_binds, - localize::LANGUAGE_SORTER, - menu, - mime_app::{self, MimeApp, MimeAppCache}, - mime_icon, - mounter::{MOUNTERS, MounterAuth, MounterItem, MounterItems, MounterKey, MounterMessage}, - operation::{ - Controller, Operation, OperationError, OperationErrorType, OperationSelection, - ReplaceResult, copy_unique_path, - }, - spawn_detached::spawn_detached, - tab::{ - self, HOVER_DURATION, HeadingOptions, ItemMetadata, Location, SORT_OPTION_FALLBACK, - SearchLocation, Tab, - }, - trash::{Trash, TrashExt}, - zoom::{zoom_in_view, zoom_out_view, zoom_to_default}, +use crate::clipboard::{ + ClipboardCache, ClipboardCopy, ClipboardKind, ClipboardPaste, ClipboardPasteImage, + ClipboardPasteText, ClipboardPasteVideo, }; +use crate::config::{ + AppTheme, Config, DesktopConfig, Favorite, IconSizes, State, TIME_CONFIG_ID, TabConfig, + TimeConfig, TypeToSearch, +}; +use crate::dialog::{Dialog, DialogKind, DialogMessage, DialogResult, DialogSettings}; +use crate::key_bind::key_binds; +use crate::localize::LANGUAGE_SORTER; +use crate::mime_app::{self, MimeApp, MimeAppCache}; +use crate::mounter::{ + MOUNTERS, MounterAuth, MounterItem, MounterItems, MounterKey, MounterMessage, +}; +use crate::operation::{ + Controller, Operation, OperationError, OperationErrorType, OperationSelection, ReplaceResult, + copy_unique_path, +}; +use crate::spawn_detached::spawn_detached; +use crate::tab::{ + self, HOVER_DURATION, HeadingOptions, ItemMetadata, Location, SORT_OPTION_FALLBACK, + SearchLocation, Tab, +}; +use crate::trash::{Trash, TrashExt}; +use crate::zoom::{zoom_in_view, zoom_out_view, zoom_to_default}; +use crate::{FxOrderMap, context_action, fl, home_dir, menu, mime_icon}; static PERMANENT_DELETE_BUTTON_ID: LazyLock = LazyLock::new(|| widget::Id::new("permanent-delete-button")); @@ -7033,21 +7015,17 @@ impl Application for App { // Ideally, tests would use the cap-std crate which limits path traversal. #[cfg(test)] pub(crate) mod test_utils { - use std::{ - cmp::Ordering, - fs::File, - io::{self, Write}, - iter, - path::Path, - }; + use std::cmp::Ordering; + use std::fs::File; + use std::io::{self, Write}; + use std::iter; + use std::path::Path; use log::{debug, trace}; use tempfile::{TempDir, tempdir}; - use crate::{ - config::{IconSizes, TabConfig, ThumbCfg}, - tab::Item, - }; + use crate::config::{IconSizes, TabConfig, ThumbCfg}; + use crate::tab::Item; use super::*; diff --git a/src/archive.rs b/src/archive.rs index ba11cbb..cff0c1e 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -1,16 +1,14 @@ -use crate::{ - mime_icon::mime_for_path, - operation::{Controller, OpReader, OperationError, OperationErrorType, sync_to_disk}, -}; +use crate::mime_icon::mime_for_path; +use crate::operation::{Controller, OpReader, OperationError, OperationErrorType, sync_to_disk}; use cosmic::iced::futures; -use jiff::{Zoned, civil::DateTime, tz::TimeZone}; -use std::{ - collections::HashSet, - fs, - io::{self, Read, Write}, - path::{Path, PathBuf}, - time::SystemTime, -}; +use jiff::Zoned; +use jiff::civil::DateTime; +use jiff::tz::TimeZone; +use std::collections::HashSet; +use std::fs; +use std::io::{self, Read, Write}; +use std::path::{Path, PathBuf}; +use std::time::SystemTime; use zip::result::ZipError; pub const SUPPORTED_ARCHIVE_TYPES: &[&str] = &[ @@ -112,7 +110,8 @@ fn zip_extract>( password: Option<&str>, controller: Controller, ) -> zip::result::ZipResult<()> { - use std::{ffi::OsString, fs}; + use std::ffi::OsString; + use std::fs; use zip::result::ZipError; fn make_writable_dir_all>( diff --git a/src/channel.rs b/src/channel.rs index e91bc35..2a295f9 100644 --- a/src/channel.rs +++ b/src/channel.rs @@ -1,13 +1,9 @@ // Copyright 2025 System76 // SPDX-License-Identifier: MPL-2.0 -use std::{ - collections::VecDeque, - sync::{ - Arc, Mutex, - atomic::{AtomicBool, Ordering}, - }, -}; +use std::collections::VecDeque; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex}; /// Create a channel backed by `tokio::sync::Notify` and a sync mutex with a vec deque. pub fn channel() -> (Sender, Receiver) { diff --git a/src/clipboard.rs b/src/clipboard.rs index 7e21276..7af2f9f 100644 --- a/src/clipboard.rs +++ b/src/clipboard.rs @@ -2,12 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-only use cosmic::iced::clipboard::mime::{AllowedMimeTypes, AsMimeTypes}; -use std::{ - borrow::Cow, - error::Error, - path::{Path, PathBuf}, - str, -}; +use std::borrow::Cow; +use std::error::Error; +use std::path::{Path, PathBuf}; +use std::str; use url::Url; #[derive(Clone, Copy, Debug)] diff --git a/src/config.rs b/src/config.rs index 0ce9c22..2138d83 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,20 +1,18 @@ // SPDX-License-Identifier: GPL-3.0-only -use std::{any::TypeId, num::NonZeroU16, path::PathBuf}; +use std::any::TypeId; +use std::num::NonZeroU16; +use std::path::PathBuf; -use cosmic::{ - Application, - cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry}, - iced::Subscription, - theme, -}; +use cosmic::cosmic_config::cosmic_config_derive::CosmicConfigEntry; +use cosmic::cosmic_config::{self, CosmicConfigEntry}; +use cosmic::iced::Subscription; +use cosmic::{Application, theme}; use serde::{Deserialize, Serialize}; -use crate::{ - FxOrderMap, - app::App, - tab::{HeadingOptions, Location, View}, -}; +use crate::FxOrderMap; +use crate::app::App; +use crate::tab::{HeadingOptions, Location, View}; pub use crate::context_action::{ContextActionPreset, ContextActionSelection}; diff --git a/src/context_action.rs b/src/context_action.rs index 86f3bc6..639b964 100644 --- a/src/context_action.rs +++ b/src/context_action.rs @@ -4,7 +4,8 @@ use std::path::PathBuf; use serde::{Deserialize, Serialize}; -use crate::{mime_app, spawn_detached::spawn_detached}; +use crate::mime_app; +use crate::spawn_detached::spawn_detached; #[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub enum ContextActionSelection { diff --git a/src/dialog.rs b/src/dialog.rs index 976caf4..bca80ef 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -1,58 +1,46 @@ // Copyright 2023 System76 // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{ - Application, ApplicationExt, Element, - app::{Core, Task, context_drawer, cosmic::Cosmic}, - cosmic_config, cosmic_theme, executor, - iced::core::widget::operation, - iced::platform_specific::shell::{self as iced_winit, SurfaceIdWrapper}, - iced::widget::scrollable::AbsoluteOffset, - iced::{ - self, Alignment, Event, Length, Size, Subscription, - core::SmolStr, - event, - futures::{self, SinkExt}, - keyboard::{Event as KeyEvent, Key, Modifiers, key::Named}, - mouse, stream, - widget::scrollable, - window, - }, - theme, - widget::{ - self, Operation, - menu::{Action as MenuAction, KeyBind, key_bind::Modifier}, - segmented_button, - }, +use cosmic::app::cosmic::Cosmic; +use cosmic::app::{Core, Task, context_drawer}; +use cosmic::iced::core::SmolStr; +use cosmic::iced::core::widget::operation; +use cosmic::iced::futures::{self, SinkExt}; +use cosmic::iced::keyboard::key::Named; +use cosmic::iced::keyboard::{Event as KeyEvent, Key, Modifiers}; +use cosmic::iced::platform_specific::shell::{self as iced_winit, SurfaceIdWrapper}; +use cosmic::iced::widget::scrollable; +use cosmic::iced::widget::scrollable::AbsoluteOffset; +use cosmic::iced::{ + self, Alignment, Event, Length, Size, Subscription, event, mouse, stream, window, }; +use cosmic::widget::menu::key_bind::Modifier; +use cosmic::widget::menu::{Action as MenuAction, KeyBind}; +use cosmic::widget::{self, Operation, segmented_button}; +use cosmic::{Application, ApplicationExt, Element, cosmic_config, cosmic_theme, executor, theme}; use mime_guess::{Mime, mime}; -use notify_debouncer_full::{ - DebouncedEvent, Debouncer, RecommendedCache, new_debouncer, - notify::{self, RecommendedWatcher}, -}; +use notify_debouncer_full::notify::{self, RecommendedWatcher}; +use notify_debouncer_full::{DebouncedEvent, Debouncer, RecommendedCache, new_debouncer}; use recently_used_xbel::update_recently_used; use rustc_hash::{FxHashMap, FxHashSet}; -use std::{ - any::TypeId, - collections::{HashMap, VecDeque}, - env, fmt, fs, - path::PathBuf, - time::{self, Instant}, -}; +use std::any::TypeId; +use std::collections::{HashMap, VecDeque}; +use std::path::PathBuf; +use std::time::{self, Instant}; +use std::{env, fmt, fs}; -use crate::{ - app::{ - Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind, REPLACE_BUTTON_ID, - }, - config::{Config, DialogConfig, Favorite, TIME_CONFIG_ID, ThumbCfg, TimeConfig, TypeToSearch}, - fl, home_dir, - key_bind::key_binds, - localize::LANGUAGE_SORTER, - menu, - mounter::{MOUNTERS, MounterItem, MounterItems, MounterKey, MounterMessage}, - tab::{self, ItemMetadata, Location, SearchLocation, Tab}, - zoom::{zoom_in_view, zoom_out_view, zoom_to_default}, +use crate::app::{ + Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind, REPLACE_BUTTON_ID, }; +use crate::config::{ + Config, DialogConfig, Favorite, TIME_CONFIG_ID, ThumbCfg, TimeConfig, TypeToSearch, +}; +use crate::key_bind::key_binds; +use crate::localize::LANGUAGE_SORTER; +use crate::mounter::{MOUNTERS, MounterItem, MounterItems, MounterKey, MounterMessage}; +use crate::tab::{self, ItemMetadata, Location, SearchLocation, Tab}; +use crate::zoom::{zoom_in_view, zoom_out_view, zoom_to_default}; +use crate::{fl, home_dir, menu}; #[derive(Clone, Debug)] pub struct DialogMessage(cosmic::Action); diff --git a/src/key_bind.rs b/src/key_bind.rs index 57a9dbf..f47d403 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -1,11 +1,10 @@ -use cosmic::{ - iced::core::keyboard::key::Named, - iced::keyboard::Key, - widget::menu::key_bind::{KeyBind, Modifier}, -}; +use cosmic::iced::core::keyboard::key::Named; +use cosmic::iced::keyboard::Key; +use cosmic::widget::menu::key_bind::{KeyBind, Modifier}; use std::collections::HashMap; -use crate::{app::Action, tab}; +use crate::app::Action; +use crate::tab; //TODO: load from config pub fn key_binds(mode: &tab::Mode) -> HashMap { diff --git a/src/large_image.rs b/src/large_image.rs index 8686a97..1d78bc5 100644 --- a/src/large_image.rs +++ b/src/large_image.rs @@ -1,9 +1,7 @@ use cosmic::widget; use image::ImageReader; -use std::{ - collections::{HashMap, HashSet}, - path::{Path, PathBuf}, -}; +use std::collections::{HashMap, HashSet}; +use std::path::{Path, PathBuf}; /// Bytes per pixel in RGBA format (Red, Green, Blue, Alpha = 4 bytes) pub const RGBA_BYTES_PER_PIXEL: u64 = 4; diff --git a/src/lib.rs b/src/lib.rs index 3e89861..f2d04d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,15 +1,16 @@ // Copyright 2023 System76 // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{app::Settings, iced::Limits}; -use std::{env, fs, path::PathBuf, process}; -use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; +use cosmic::app::Settings; +use cosmic::iced::Limits; +use std::path::PathBuf; +use std::{env, fs, process}; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; -use crate::{ - app::{App, Flags}, - config::{Config, State}, - tab::Location, -}; +use crate::app::{App, Flags}; +use crate::config::{Config, State}; +use crate::tab::Location; pub mod app; mod archive; diff --git a/src/load_image.rs b/src/load_image.rs index d54fe7f..88ceb1b 100644 --- a/src/load_image.rs +++ b/src/load_image.rs @@ -1,11 +1,10 @@ use cosmic::iced::{core as iced_core, widget as iced_widget}; use iced_core::event::Event; -use iced_core::layout; -use iced_core::mouse; -use iced_core::overlay; -use iced_core::renderer; use iced_core::widget::{Operation, Tree}; -use iced_core::{Clipboard, Element, Layout, Length, Rectangle, Shell, Vector, Widget}; +use iced_core::{ + Clipboard, Element, Layout, Length, Rectangle, Shell, Vector, Widget, layout, mouse, overlay, + renderer, +}; pub fn loaded_image<'a, Message: 'static, Theme>( handle: ::Handle, diff --git a/src/localize.rs b/src/localize.rs index f561a42..b569807 100644 --- a/src/localize.rs +++ b/src/localize.rs @@ -1,13 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-only -use i18n_embed::{ - DefaultLocalizer, LanguageLoader, Localizer, - fluent::{FluentLanguageLoader, fluent_language_loader}, -}; -use icu::collator::{ - Collator, CollatorBorrowed, CollatorPreferences, options::CollatorOptions, - preferences::CollationNumericOrdering, -}; +use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader}; +use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer}; +use icu::collator::options::CollatorOptions; +use icu::collator::preferences::CollationNumericOrdering; +use icu::collator::{Collator, CollatorBorrowed, CollatorPreferences}; use icu::locale::Locale; use rust_embed::RustEmbed; use std::sync::LazyLock; diff --git a/src/menu.rs b/src/menu.rs index 9f3f158..4132fbf 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,30 +1,25 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{ - Element, - app::Core, - iced::{ - Alignment, Background, Border, Length, advanced::widget::text::Style as TextStyle, - keyboard::Modifiers, - }, - theme, - widget::{ - self, Row, button, column, container, divider, - menu::{self, ItemHeight, ItemWidth, MenuBar, key_bind::KeyBind}, - responsive_menu_bar, space, text, - }, +use cosmic::app::Core; +use cosmic::iced::advanced::widget::text::Style as TextStyle; +use cosmic::iced::keyboard::Modifiers; +use cosmic::iced::{Alignment, Background, Border, Length}; +use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::menu::{self, ItemHeight, ItemWidth, MenuBar}; +use cosmic::widget::{ + self, Row, button, column, container, divider, responsive_menu_bar, space, text, }; +use cosmic::{Element, theme}; use i18n_embed::LanguageLoader; use mime_guess::Mime; -use std::{collections::HashMap, sync::LazyLock}; +use std::collections::HashMap; +use std::sync::LazyLock; -use crate::{ - app::{Action, Message}, - config::{Config, ContextActionPreset}, - fl, - tab::{self, HeadingOptions, Location, LocationMenuAction, SearchLocation, Tab}, - trash::{Trash, TrashExt}, -}; +use crate::app::{Action, Message}; +use crate::config::{Config, ContextActionPreset}; +use crate::fl; +use crate::tab::{self, HeadingOptions, Location, LocationMenuAction, SearchLocation, Tab}; +use crate::trash::{Trash, TrashExt}; static MENU_ID: LazyLock = LazyLock::new(|| cosmic::widget::Id::new("responsive-menu")); diff --git a/src/mime_app.rs b/src/mime_app.rs index 4a55cdf..b3b299e 100644 --- a/src/mime_app.rs +++ b/src/mime_app.rs @@ -6,14 +6,11 @@ use cosmic::desktop; use cosmic::widget; pub use mime_guess::Mime; use rustc_hash::FxHashMap; -use std::{ - cmp::Ordering, - ffi::OsStr, - fs, io, - path::{Path, PathBuf}, - process, - time::Instant, -}; +use std::cmp::Ordering; +use std::ffi::OsStr; +use std::path::{Path, PathBuf}; +use std::time::Instant; +use std::{fs, io, process}; // Supported exec key field codes const EXEC_HANDLERS: [&str; 4] = ["%f", "%F", "%u", "%U"]; diff --git a/src/mime_icon.rs b/src/mime_icon.rs index 8d8d2e5..91ec3e8 100644 --- a/src/mime_icon.rs +++ b/src/mime_icon.rs @@ -3,11 +3,9 @@ use cosmic::widget::icon; use mime_guess::Mime; use rustc_hash::FxHashMap; -use std::{ - fs, - path::Path, - sync::{LazyLock, Mutex}, -}; +use std::fs; +use std::path::Path; +use std::sync::{LazyLock, Mutex}; pub const FALLBACK_MIME_ICON: &str = "text-x-generic"; diff --git a/src/mounter/gvfs.rs b/src/mounter/gvfs.rs index d6294b6..7c28668 100644 --- a/src/mounter/gvfs.rs +++ b/src/mounter/gvfs.rs @@ -1,18 +1,20 @@ -use cosmic::{ - Task, - iced::{Subscription, futures::SinkExt, stream}, - widget, -}; -use gio::{glib, prelude::*}; -use std::{any::TypeId, cell::Cell, future::pending, hash::Hash, path::PathBuf, sync::Arc}; +use cosmic::iced::futures::SinkExt; +use cosmic::iced::{Subscription, stream}; +use cosmic::{Task, widget}; +use gio::glib; +use gio::prelude::*; +use std::any::TypeId; +use std::cell::Cell; +use std::future::pending; +use std::hash::Hash; +use std::path::PathBuf; +use std::sync::Arc; use tokio::sync::mpsc; use super::{Mounter, MounterAuth, MounterItem, MounterItems, MounterMessage}; -use crate::{ - config::IconSizes, - err_str, - tab::{self, DirSize, ItemMetadata, ItemThumbnail, Location}, -}; +use crate::config::IconSizes; +use crate::err_str; +use crate::tab::{self, DirSize, ItemMetadata, ItemThumbnail, Location}; const TARGET_URI_ATTRIBUTE: &str = "standard::target-uri"; diff --git a/src/mounter/mod.rs b/src/mounter/mod.rs index b97f32a..3171c0f 100644 --- a/src/mounter/mod.rs +++ b/src/mounter/mod.rs @@ -1,13 +1,13 @@ -use cosmic::{Task, iced::Subscription, widget}; -use std::{ - collections::BTreeMap, - fmt, - path::PathBuf, - sync::{Arc, LazyLock}, -}; +use cosmic::iced::Subscription; +use cosmic::{Task, widget}; +use std::collections::BTreeMap; +use std::fmt; +use std::path::PathBuf; +use std::sync::{Arc, LazyLock}; use tokio::sync::mpsc; -use crate::{config::IconSizes, tab}; +use crate::config::IconSizes; +use crate::tab; #[cfg(feature = "gvfs")] mod gvfs; diff --git a/src/mouse_area.rs b/src/mouse_area.rs index a57b36a..73bd710 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -3,21 +3,17 @@ use std::time::Instant; use crate::tab::DOUBLE_CLICK_DURATION; -use cosmic::{ - Element, Renderer, Theme, - iced::core::{ - Clipboard, Color, Layout, Length, Point, Rectangle, Shell, Size, Vector, Widget, - border::Border, - event::Event, - layout, - mouse::{self, click}, - overlay, - renderer::{self, Quad, Renderer as _}, - touch, - widget::{Operation, Tree, tree}, - }, - widget::Id, +use cosmic::iced::core::border::Border; +use cosmic::iced::core::event::Event; +use cosmic::iced::core::mouse::{self, click}; +use cosmic::iced::core::renderer::{self, Quad, Renderer as _}; +use cosmic::iced::core::widget::{Operation, Tree, tree}; +use cosmic::iced::core::{ + Clipboard, Color, Layout, Length, Point, Rectangle, Shell, Size, Vector, Widget, layout, + overlay, touch, }; +use cosmic::widget::Id; +use cosmic::{Element, Renderer, Theme}; /// Emit messages on mouse events. #[allow(missing_debug_implementations)] diff --git a/src/operation/mod.rs b/src/operation/mod.rs index b4a66e9..886055a 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -1,20 +1,15 @@ -use crate::{ - app::{ArchiveType, DialogPage, Message, REPLACE_BUTTON_ID}, - archive, - config::IconSizes, - fl, - spawn_detached::spawn_detached, - tab, -}; -use cosmic::iced::futures::{self, SinkExt, StreamExt, channel::mpsc::Sender, stream}; -use std::{ - borrow::Cow, - fmt::Formatter, - fs, - io::{self, Read, Write}, - path::{Path, PathBuf}, - sync::Arc, -}; +use crate::app::{ArchiveType, DialogPage, Message, REPLACE_BUTTON_ID}; +use crate::config::IconSizes; +use crate::spawn_detached::spawn_detached; +use crate::{archive, fl, tab}; +use cosmic::iced::futures::channel::mpsc::Sender; +use cosmic::iced::futures::{self, SinkExt, StreamExt, stream}; +use std::borrow::Cow; +use std::fmt::Formatter; +use std::fs; +use std::io::{self, Read, Write}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; use tokio::sync::{Mutex as TokioMutex, mpsc}; use walkdir::WalkDir; use zip::AesMode::Aes256; @@ -1243,28 +1238,23 @@ fn wrap_compio_spawn_error(err: Box) -> OperationError #[cfg(test)] mod tests { - use std::{ - fs::{self, File}, - io, - path::PathBuf, - }; + use std::fs::{self, File}; + use std::io; + use std::path::PathBuf; - use cosmic::iced::futures::{StreamExt, channel::mpsc, future}; + use cosmic::iced::futures::channel::mpsc; + use cosmic::iced::futures::{StreamExt, future}; use log::debug; use test_log::test; use tokio::sync; use super::{Controller, Operation, OperationError, OperationSelection, ReplaceResult}; - use crate::{ - app::{ - DialogPage, Message, - test_utils::{ - NAME_LEN, NUM_DIRS, NUM_FILES, NUM_HIDDEN, NUM_NESTED, empty_fs, filter_dirs, - filter_files, simple_fs, - }, - }, - fl, + use crate::app::test_utils::{ + NAME_LEN, NUM_DIRS, NUM_FILES, NUM_HIDDEN, NUM_NESTED, empty_fs, filter_dirs, filter_files, + simple_fs, }; + use crate::app::{DialogPage, Message}; + use crate::fl; /// Simple wrapper around `[Operation::Copy]` pub async fn operation_copy( diff --git a/src/operation/reader.rs b/src/operation/reader.rs index 75088df..9f45441 100644 --- a/src/operation/reader.rs +++ b/src/operation/reader.rs @@ -1,4 +1,5 @@ -use std::{fs, io, path::Path}; +use std::path::Path; +use std::{fs, io}; use crate::operation::OperationError; diff --git a/src/operation/recursive.rs b/src/operation/recursive.rs index 047d09b..a3bd2c4 100644 --- a/src/operation/recursive.rs +++ b/src/operation/recursive.rs @@ -6,15 +6,20 @@ use crate::operation::{OperationError, sync_to_disk}; use anyhow::Context as AnyhowContext; use compio::BufResult; use compio::buf::{IntoInner, IoBuf}; -use compio::driver::{ToSharedFd, op::AsyncifyFd}; +use compio::driver::ToSharedFd; +use compio::driver::op::AsyncifyFd; use compio::io::{AsyncReadAt, AsyncWriteAt}; use cosmic::iced::futures; use futures::{FutureExt, StreamExt}; +use std::cell::Cell; +use std::error::Error; +use std::fs; use std::future::Future; +use std::ops::ControlFlow; +use std::path::PathBuf; use std::pin::Pin; use std::rc::Rc; use std::time::Instant; -use std::{cell::Cell, error::Error, fs, ops::ControlFlow, path::PathBuf}; use walkdir::WalkDir; #[cfg(feature = "gvfs")] diff --git a/src/tab.rs b/src/tab.rs index 91164c8..b80aaf4 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -1,91 +1,71 @@ #[cfg(feature = "desktop")] use cosmic::desktop::fde::{DesktopEntry, get_languages_from_env}; -use cosmic::{ - Apply, Element, cosmic_theme, font, - iced::core::{mouse::ScrollDelta, widget::tree}, - iced::{ - Alignment, Border, Color, ContentFit, Length, Point, Rectangle, Size, Subscription, Vector, - advanced::{ - graphics, - text::{self, Paragraph}, - }, - alignment::Vertical, - clipboard::dnd::DndAction, - futures::{self, SinkExt}, - keyboard::Modifiers, - padding, stream, - widget::{ - rule, - scrollable::{self, AbsoluteOffset, Viewport}, - stack, - }, - window, - }, - theme, - widget::{ - self, DndDestination, DndSource, Id, RcElementWrapper, Widget, - menu::{action::MenuAction, key_bind::KeyBind}, - space, - }, +use cosmic::iced::advanced::graphics; +use cosmic::iced::advanced::text::{self, Paragraph}; +use cosmic::iced::alignment::Vertical; +use cosmic::iced::clipboard::dnd::DndAction; +use cosmic::iced::core::mouse::ScrollDelta; +use cosmic::iced::core::widget::tree; +use cosmic::iced::futures::{self, SinkExt}; +use cosmic::iced::keyboard::Modifiers; +use cosmic::iced::widget::scrollable::{self, AbsoluteOffset, Viewport}; +use cosmic::iced::widget::{rule, stack}; +use cosmic::iced::{ + Alignment, Border, Color, ContentFit, Length, Point, Rectangle, Size, Subscription, Vector, + padding, stream, window, }; +use cosmic::widget::menu::action::MenuAction; +use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::{self, DndDestination, DndSource, Id, RcElementWrapper, Widget, space}; +use cosmic::{Apply, Element, cosmic_theme, font, theme}; use i18n_embed::LanguageLoader; -use icu::{ - datetime::{ - DateTimeFormatter, DateTimeFormatterPreferences, fieldsets, input::DateTime, - options::TimePrecision, - }, - locale::preferences::extensions::unicode::keywords::HourCycle, -}; +use icu::datetime::input::DateTime; +use icu::datetime::options::TimePrecision; +use icu::datetime::{DateTimeFormatter, DateTimeFormatterPreferences, fieldsets}; +use icu::locale::preferences::extensions::unicode::keywords::HourCycle; use image::{DynamicImage, ImageReader}; use jiff_icu::ConvertFrom; use mime_guess::{Mime, mime}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; +use std::borrow::Cow; +use std::cell::Cell; +use std::cmp::{Ordering, Reverse}; +use std::collections::{BTreeMap, BTreeSet, HashMap}; +use std::error::Error; +use std::fmt::{self, Display}; +use std::fs::{self, File, Metadata}; +use std::hash::Hash; +use std::io::{BufRead, BufReader}; #[cfg(unix)] use std::os::unix::fs::MetadataExt; -use std::{ - borrow::Cow, - cell::Cell, - cmp::{Ordering, Reverse}, - collections::{BTreeMap, BTreeSet, HashMap}, - error::Error, - fmt::{self, Display}, - fs::{self, File, Metadata}, - hash::Hash, - io::{BufRead, BufReader}, - path::{self, Path, PathBuf}, - sync::{Arc, LazyLock, RwLock, atomic}, - time::{Duration, Instant, SystemTime}, -}; +use std::path::{self, Path, PathBuf}; +use std::sync::{Arc, LazyLock, RwLock, atomic}; +use std::time::{Duration, Instant, SystemTime}; use tempfile::NamedTempFile; use tokio::sync::mpsc; use trash::{TrashItem, TrashItemMetadata, TrashItemSize}; use walkdir::WalkDir; -use crate::{ - FxOrderMap, - app::{Action, PreviewItem, PreviewKind}, - clipboard::{ClipboardCopy, ClipboardKind, ClipboardPaste}, - config::{ - ContextActionPreset, DesktopConfig, ICON_SCALE_MAX, ICON_SIZE_GRID, IconSizes, TabConfig, - ThumbCfg, - }, - dialog::DialogKind, - fl, - large_image::{ - LargeImageManager, decode_large_image, exceeds_memory_limit, should_use_dedicated_worker, - should_use_tiling, - }, - localize::{LANGUAGE_SORTER, LOCALE}, - menu, mime_app, - mime_icon::{mime_for_path, mime_icon}, - mounter::MOUNTERS, - mouse_area, - operation::{Controller, OperationError}, - thumbnail_cacher::{CachedThumbnail, ThumbnailCacher, ThumbnailSize}, - thumbnailer::thumbnailer, - trash::{Trash, TrashExt}, +use crate::app::{Action, PreviewItem, PreviewKind}; +use crate::clipboard::{ClipboardCopy, ClipboardKind, ClipboardPaste}; +use crate::config::{ + ContextActionPreset, DesktopConfig, ICON_SCALE_MAX, ICON_SIZE_GRID, IconSizes, TabConfig, + ThumbCfg, }; +use crate::dialog::DialogKind; +use crate::large_image::{ + LargeImageManager, decode_large_image, exceeds_memory_limit, should_use_dedicated_worker, + should_use_tiling, +}; +use crate::localize::{LANGUAGE_SORTER, LOCALE}; +use crate::mime_icon::{mime_for_path, mime_icon}; +use crate::mounter::MOUNTERS; +use crate::operation::{Controller, OperationError}; +use crate::thumbnail_cacher::{CachedThumbnail, ThumbnailCacher, ThumbnailSize}; +use crate::thumbnailer::thumbnailer; +use crate::trash::{Trash, TrashExt}; +use crate::{FxOrderMap, fl, menu, mime_app, mouse_area}; pub const DOUBLE_CLICK_DURATION: Duration = Duration::from_millis(500); pub const HOVER_DURATION: Duration = Duration::from_millis(1600); @@ -7040,21 +7020,22 @@ fn text_editor_class( #[cfg(test)] mod tests { - use std::{fs, io, path::PathBuf}; + use std::path::PathBuf; + use std::{fs, io}; - use cosmic::{iced::mouse::ScrollDelta, iced::runtime::keyboard::Modifiers, widget}; + use cosmic::iced::mouse::ScrollDelta; + use cosmic::iced::runtime::keyboard::Modifiers; + use cosmic::widget; use log::{debug, trace}; use tempfile::TempDir; use test_log::test; use super::{Location, Message, Tab, respond_to_scroll_direction, scan_path}; - use crate::{ - app::test_utils::{ - NAME_LEN, NUM_DIRS, NUM_FILES, NUM_HIDDEN, NUM_NESTED, assert_eq_tab_path, empty_fs, - eq_path_item, filter_dirs, read_dir_sorted, simple_fs, tab_click_new, - }, - config::{IconSizes, TabConfig, ThumbCfg}, + use crate::app::test_utils::{ + NAME_LEN, NUM_DIRS, NUM_FILES, NUM_HIDDEN, NUM_NESTED, assert_eq_tab_path, empty_fs, + eq_path_item, filter_dirs, read_dir_sorted, simple_fs, tab_click_new, }; + use crate::config::{IconSizes, TabConfig, ThumbCfg}; // Boilerplate for tab tests. Checks if simulated clicks selected items. fn tab_selects_item( diff --git a/src/thumbnail_cacher.rs b/src/thumbnail_cacher.rs index e4d616e..e42d343 100644 --- a/src/thumbnail_cacher.rs +++ b/src/thumbnail_cacher.rs @@ -1,16 +1,14 @@ use image::DynamicImage; use md5::{Digest, Md5}; use rustc_hash::FxHashMap; +use std::error::Error; +use std::fs::{self, File}; +use std::io::{self, BufReader, BufWriter}; #[cfg(unix)] use std::os::unix::fs::PermissionsExt; -use std::{ - error::Error, - fs::{self, File}, - io::{self, BufReader, BufWriter}, - path::{Path, PathBuf}, - sync::LazyLock, - time::UNIX_EPOCH, -}; +use std::path::{Path, PathBuf}; +use std::sync::LazyLock; +use std::time::UNIX_EPOCH; use tempfile::NamedTempFile; use url::Url; diff --git a/src/thumbnailer.rs b/src/thumbnailer.rs index f7786ed..b9de821 100644 --- a/src/thumbnailer.rs +++ b/src/thumbnailer.rs @@ -5,13 +5,10 @@ use cosmic::desktop::fde::GenericEntry; use mime_guess::Mime; use rustc_hash::FxHashMap; -use std::{ - fs, - path::Path, - process, - sync::{LazyLock, Mutex}, - time::Instant, -}; +use std::path::Path; +use std::sync::{LazyLock, Mutex}; +use std::time::Instant; +use std::{fs, process}; #[derive(Clone, Debug)] pub struct Thumbnailer { diff --git a/src/trash.rs b/src/trash.rs index f46bc48..30d140f 100644 --- a/src/trash.rs +++ b/src/trash.rs @@ -1,11 +1,10 @@ use cosmic::widget; use regex::Regex; -use std::{collections::HashSet, path::PathBuf}; +use std::collections::HashSet; +use std::path::PathBuf; -use crate::{ - config::IconSizes, - tab::{Item, SearchItem}, -}; +use crate::config::IconSizes; +use crate::tab::{Item, SearchItem}; pub trait TrashExt { fn is_empty() -> bool { @@ -81,7 +80,8 @@ impl TrashExt for Trash { } fn scan(sizes: IconSizes) -> Vec { - use crate::{localize::LANGUAGE_SORTER, tab::item_from_trash_entry}; + use crate::localize::LANGUAGE_SORTER; + use crate::tab::item_from_trash_entry; use std::cmp::Ordering; let entries = match trash::os_limited::list() { diff --git a/src/zoom.rs b/src/zoom.rs index 600d0b5..89ae5b8 100644 --- a/src/zoom.rs +++ b/src/zoom.rs @@ -1,6 +1,7 @@ use std::num::NonZeroU16; -use crate::{config::IconSizes, tab::View}; +use crate::config::IconSizes; +use crate::tab::View; static DEFAULT_ZOOM: NonZeroU16 = NonZeroU16::new(100).unwrap(); static MIN_ZOOM: NonZeroU16 = NonZeroU16::new(50).unwrap();