parent
2dabb788e6
commit
a77cb27f3b
|
@ -1,3 +1,6 @@
|
||||||
newline_style = "Unix"
|
newline_style = "Unix"
|
||||||
max_width = 180
|
max_width = 180
|
||||||
remove_nested_parens = true
|
remove_nested_parens = true
|
||||||
|
|
||||||
|
# Enable only with nightly channel via - cargo +nightly fmt
|
||||||
|
imports_granularity = "Module"
|
414
Cargo.lock
generated
414
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -5,24 +5,20 @@ use std::process;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
use commands::Commands;
|
use commands::Commands;
|
||||||
use czkawka_core::big_file::SearchMode;
|
use czkawka_core::bad_extensions::BadExtensions;
|
||||||
|
use czkawka_core::big_file::{self, BigFile, SearchMode};
|
||||||
|
use czkawka_core::broken_files::{self, BrokenFiles};
|
||||||
use czkawka_core::common::set_number_of_threads;
|
use czkawka_core::common::set_number_of_threads;
|
||||||
#[allow(unused_imports)] // It is used in release for print_results().
|
#[allow(unused_imports)] // It is used in release for print_results().
|
||||||
use czkawka_core::common_traits::*;
|
use czkawka_core::common_traits::*;
|
||||||
use czkawka_core::similar_images::test_image_conversion_speed;
|
use czkawka_core::duplicate::DuplicateFinder;
|
||||||
use czkawka_core::{
|
use czkawka_core::empty_files::{self, EmptyFiles};
|
||||||
bad_extensions::BadExtensions,
|
use czkawka_core::empty_folder::EmptyFolder;
|
||||||
big_file::{self, BigFile},
|
use czkawka_core::invalid_symlinks::{self, InvalidSymlinks};
|
||||||
broken_files::{self, BrokenFiles},
|
use czkawka_core::same_music::SameMusic;
|
||||||
duplicate::DuplicateFinder,
|
use czkawka_core::similar_images::{return_similarity_from_similarity_preset, test_image_conversion_speed, SimilarImages};
|
||||||
empty_files::{self, EmptyFiles},
|
use czkawka_core::similar_videos::SimilarVideos;
|
||||||
empty_folder::EmptyFolder,
|
use czkawka_core::temporary::{self, Temporary};
|
||||||
invalid_symlinks::{self, InvalidSymlinks},
|
|
||||||
same_music::SameMusic,
|
|
||||||
similar_images::{return_similarity_from_similarity_preset, SimilarImages},
|
|
||||||
similar_videos::SimilarVideos,
|
|
||||||
temporary::{self, Temporary},
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::commands::{
|
use crate::commands::{
|
||||||
Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs, SimilarImagesArgs,
|
Args, BadExtensionsArgs, BiggestFilesArgs, BrokenFilesArgs, DuplicatesArgs, EmptyFilesArgs, EmptyFoldersArgs, InvalidSymlinksArgs, SameMusicArgs, SimilarImagesArgs,
|
||||||
|
|
|
@ -59,7 +59,7 @@ serde_json = "1.0"
|
||||||
# Language
|
# Language
|
||||||
i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] }
|
i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] }
|
||||||
i18n-embed-fl = "0.6"
|
i18n-embed-fl = "0.6"
|
||||||
rust-embed = "6.7"
|
rust-embed = "6.8"
|
||||||
once_cell = "1.18"
|
once_cell = "1.18"
|
||||||
|
|
||||||
# Raw image files
|
# Raw image files
|
||||||
|
@ -68,9 +68,9 @@ imagepipe = "0.5"
|
||||||
|
|
||||||
# Checking for invalid extensions
|
# Checking for invalid extensions
|
||||||
mime_guess = "2.0"
|
mime_guess = "2.0"
|
||||||
infer = "0.13"
|
infer = "0.15"
|
||||||
|
|
||||||
num_cpus = "1.15"
|
num_cpus = "1.16"
|
||||||
|
|
||||||
# Heif/Heic
|
# Heif/Heic
|
||||||
libheif-rs = { version = "=0.18.0", optional = true } # Do not upgrade now, since Ubuntu 22.04 not works with newer version
|
libheif-rs = { version = "=0.18.0", optional = true } # Do not upgrade now, since Ubuntu 22.04 not works with newer version
|
||||||
|
|
|
@ -9,8 +9,7 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use humansize::format_size;
|
use humansize::{format_size, BINARY};
|
||||||
use humansize::BINARY;
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
||||||
use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, split_path};
|
use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, split_path};
|
||||||
|
|
|
@ -18,9 +18,9 @@ use rayon::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::common::{
|
use crate::common::{
|
||||||
check_folder_children, create_crash_message, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, PDF_FILES_EXTENSIONS,
|
check_folder_children, create_crash_message, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, AUDIO_FILES_EXTENSIONS,
|
||||||
|
IMAGE_RS_BROKEN_FILES_EXTENSIONS, PDF_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS,
|
||||||
};
|
};
|
||||||
use crate::common::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS};
|
|
||||||
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType};
|
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType};
|
||||||
use crate::common_directory::Directories;
|
use crate::common_directory::Directories;
|
||||||
use crate::common_extensions::Extensions;
|
use crate::common_extensions::Extensions;
|
||||||
|
|
|
@ -4,8 +4,7 @@ use std::collections::HashSet;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::hash::Hasher;
|
use std::hash::Hasher;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::io::{self, Error, ErrorKind};
|
use std::io::{self, BufReader, BufWriter, Error, ErrorKind};
|
||||||
use std::io::{BufReader, BufWriter};
|
|
||||||
#[cfg(target_family = "unix")]
|
#[cfg(target_family = "unix")]
|
||||||
use std::os::unix::fs::MetadataExt;
|
use std::os::unix::fs::MetadataExt;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
@ -15,8 +14,7 @@ use std::{fs, mem};
|
||||||
|
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use humansize::format_size;
|
use humansize::{format_size, BINARY};
|
||||||
use humansize::BINARY;
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use xxhash_rust::xxh3::Xxh3;
|
use xxhash_rust::xxh3::Xxh3;
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use i18n_embed::{
|
use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader};
|
||||||
fluent::{fluent_language_loader, FluentLanguageLoader},
|
use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer};
|
||||||
DefaultLocalizer, LanguageLoader, Localizer,
|
|
||||||
};
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use rust_embed::RustEmbed;
|
use rust_embed::RustEmbed;
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,7 @@ use std::{mem, panic};
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use lofty::TaggedFileExt;
|
use lofty::{read_from, AudioFile, ItemKey, TaggedFileExt};
|
||||||
use lofty::{read_from, AudioFile, ItemKey};
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use rusty_chromaprint::{match_fingerprints, Configuration, Fingerprinter};
|
use rusty_chromaprint::{match_fingerprints, Configuration, Fingerprinter};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -23,8 +22,9 @@ use symphonia::core::io::MediaSourceStream;
|
||||||
use symphonia::core::meta::MetadataOptions;
|
use symphonia::core::meta::MetadataOptions;
|
||||||
use symphonia::core::probe::Hint;
|
use symphonia::core::probe::Hint;
|
||||||
|
|
||||||
use crate::common::{create_crash_message, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, AUDIO_FILES_EXTENSIONS};
|
use crate::common::{
|
||||||
use crate::common::{filter_reference_folders_generic, open_cache_folder};
|
create_crash_message, filter_reference_folders_generic, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, AUDIO_FILES_EXTENSIONS,
|
||||||
|
};
|
||||||
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
|
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType};
|
||||||
use crate::common_directory::Directories;
|
use crate::common_directory::Directories;
|
||||||
use crate::common_extensions::Extensions;
|
use crate::common_extensions::Extensions;
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
use std::collections::{BTreeSet, HashMap, HashSet};
|
use std::collections::{BTreeSet, HashMap, HashSet};
|
||||||
use std::fs::{DirEntry, File, Metadata};
|
use std::fs::{DirEntry, File, Metadata};
|
||||||
use std::io::Write;
|
use std::io::{Write, *};
|
||||||
use std::io::*;
|
|
||||||
use std::mem;
|
|
||||||
use std::panic;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
use std::{mem, panic};
|
||||||
|
|
||||||
use bk_tree::BKTree;
|
use bk_tree::BKTree;
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use humansize::format_size;
|
use humansize::{format_size, BINARY};
|
||||||
use humansize::BINARY;
|
|
||||||
use image::GenericImageView;
|
use image::GenericImageView;
|
||||||
use image_hasher::{FilterType, HashAlg, HasherConfig};
|
use image_hasher::{FilterType, HashAlg, HasherConfig};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use std::collections::{BTreeMap, BTreeSet, HashMap};
|
use std::collections::{BTreeMap, BTreeSet, HashMap};
|
||||||
use std::fs::{DirEntry, File, Metadata};
|
use std::fs::{DirEntry, File, Metadata};
|
||||||
use std::io::Write;
|
use std::io::{Write, *};
|
||||||
use std::io::*;
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
|
@ -9,15 +8,13 @@ use std::sync::atomic::Ordering;
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use ffmpeg_cmdline_utils::FfmpegErrorKind::FfmpegNotFound;
|
use ffmpeg_cmdline_utils::FfmpegErrorKind::FfmpegNotFound;
|
||||||
use futures::channel::mpsc::UnboundedSender;
|
use futures::channel::mpsc::UnboundedSender;
|
||||||
use humansize::format_size;
|
use humansize::{format_size, BINARY};
|
||||||
use humansize::BINARY;
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use vid_dup_finder_lib::HashCreationErrorKind::DetermineVideo;
|
use vid_dup_finder_lib::HashCreationErrorKind::DetermineVideo;
|
||||||
use vid_dup_finder_lib::{NormalizedTolerance, VideoHash};
|
use vid_dup_finder_lib::{NormalizedTolerance, VideoHash};
|
||||||
|
|
||||||
use crate::common::open_cache_folder;
|
use crate::common::{check_folder_children, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, VIDEO_FILES_EXTENSIONS};
|
||||||
use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, VIDEO_FILES_EXTENSIONS};
|
|
||||||
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType};
|
use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType};
|
||||||
use crate::common_directory::Directories;
|
use crate::common_directory::Directories;
|
||||||
use crate::common_extensions::Extensions;
|
use crate::common_extensions::Extensions;
|
||||||
|
|
|
@ -26,13 +26,13 @@ futures = "0.3.28"
|
||||||
directories-next = "2.0"
|
directories-next = "2.0"
|
||||||
|
|
||||||
# For opening files
|
# For opening files
|
||||||
open = "4.1"
|
open = "5.0"
|
||||||
|
|
||||||
# To get image preview
|
# To get image preview
|
||||||
image = "0.24"
|
image = "0.24"
|
||||||
|
|
||||||
# To be able to use custom select
|
# To be able to use custom select
|
||||||
regex = "1.8"
|
regex = "1.9"
|
||||||
|
|
||||||
# To get image_hasher types
|
# To get image_hasher types
|
||||||
image_hasher = "1.2"
|
image_hasher = "1.2"
|
||||||
|
@ -46,7 +46,7 @@ fs_extra = "1.3"
|
||||||
# Language
|
# Language
|
||||||
i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] }
|
i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] }
|
||||||
i18n-embed-fl = "0.6"
|
i18n-embed-fl = "0.6"
|
||||||
rust-embed = "6.7"
|
rust-embed = "6.8"
|
||||||
once_cell = "1.18"
|
once_cell = "1.18"
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
|
|
@ -7,8 +7,7 @@ use chrono::NaiveDateTime;
|
||||||
use glib::Receiver;
|
use glib::Receiver;
|
||||||
use gtk4::prelude::*;
|
use gtk4::prelude::*;
|
||||||
use gtk4::{Entry, ListStore, TextView, TreeView, Widget};
|
use gtk4::{Entry, ListStore, TextView, TreeView, Widget};
|
||||||
use humansize::format_size;
|
use humansize::{format_size, BINARY};
|
||||||
use humansize::BINARY;
|
|
||||||
|
|
||||||
use czkawka_core::bad_extensions::BadExtensions;
|
use czkawka_core::bad_extensions::BadExtensions;
|
||||||
use czkawka_core::big_file::BigFile;
|
use czkawka_core::big_file::BigFile;
|
||||||
|
@ -1463,7 +1462,7 @@ fn similar_videos_add_to_list_store(list_store: &ListStore, file: &str, director
|
||||||
(ColumnsSimilarVideos::Modification as u32, &string_date),
|
(ColumnsSimilarVideos::Modification as u32, &string_date),
|
||||||
(ColumnsSimilarVideos::ModificationAsSecs as u32, &modified_date),
|
(ColumnsSimilarVideos::ModificationAsSecs as u32, &modified_date),
|
||||||
(ColumnsSimilarVideos::Color as u32, &color),
|
(ColumnsSimilarVideos::Color as u32, &color),
|
||||||
(ColumnsSimilarVideos::IsHeader as u32, &false),
|
(ColumnsSimilarVideos::IsHeader as u32, &is_header),
|
||||||
(ColumnsSimilarVideos::TextColor as u32, &TEXT_COLOR),
|
(ColumnsSimilarVideos::TextColor as u32, &TEXT_COLOR),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ where
|
||||||
let model = get_list_store(tree_view);
|
let model = get_list_store(tree_view);
|
||||||
|
|
||||||
if let Some(curr_iter) = model.iter_first() {
|
if let Some(curr_iter) = model.iter_first() {
|
||||||
assert!(model.get::<bool>(&curr_iter, column_header));
|
assert!(model.get::<bool>(&curr_iter, column_header)); // First item should be header
|
||||||
assert!(model.iter_next(&curr_iter)); // Must be at least one item
|
assert!(model.iter_next(&curr_iter)); // Must be at least two items
|
||||||
loop {
|
loop {
|
||||||
let mut iters = Vec::new();
|
let mut iters = Vec::new();
|
||||||
let mut all_have = false;
|
let mut all_have = false;
|
||||||
|
|
|
@ -55,7 +55,7 @@ pub enum PopoverTypes {
|
||||||
Date,
|
Date,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Eq, PartialEq, Copy, Clone, Hash)]
|
#[derive(Eq, PartialEq, Copy, Clone, Hash, Debug)]
|
||||||
pub enum BottomButtonsEnum {
|
pub enum BottomButtonsEnum {
|
||||||
Search,
|
Search,
|
||||||
Select,
|
Select,
|
||||||
|
|
|
@ -15,8 +15,6 @@ use czkawka_core::similar_images::SIMILAR_VALUES;
|
||||||
use czkawka_core::similar_videos::MAX_TOLERANCE;
|
use czkawka_core::similar_videos::MAX_TOLERANCE;
|
||||||
|
|
||||||
use crate::create_tree_view::*;
|
use crate::create_tree_view::*;
|
||||||
use crate::delete_things;
|
|
||||||
use crate::flg;
|
|
||||||
use crate::gui_structs::gui_data::*;
|
use crate::gui_structs::gui_data::*;
|
||||||
use crate::help_combo_box::{
|
use crate::help_combo_box::{
|
||||||
DUPLICATES_CHECK_METHOD_COMBO_BOX, DUPLICATES_HASH_TYPE_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX, IMAGES_HASH_TYPE_COMBO_BOX, IMAGES_RESIZE_ALGORITHM_COMBO_BOX,
|
DUPLICATES_CHECK_METHOD_COMBO_BOX, DUPLICATES_HASH_TYPE_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX, IMAGES_HASH_TYPE_COMBO_BOX, IMAGES_RESIZE_ALGORITHM_COMBO_BOX,
|
||||||
|
@ -27,6 +25,7 @@ use crate::localizer_core::generate_translation_hashmap;
|
||||||
use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum};
|
use crate::notebook_enums::{NotebookMainEnum, NotebookUpperEnum};
|
||||||
use crate::notebook_info::NOTEBOOKS_INFO;
|
use crate::notebook_info::NOTEBOOKS_INFO;
|
||||||
use crate::opening_selecting_records::*;
|
use crate::opening_selecting_records::*;
|
||||||
|
use crate::{delete_things, flg};
|
||||||
|
|
||||||
pub fn initialize_gui(gui_data: &mut GuiData) {
|
pub fn initialize_gui(gui_data: &mut GuiData) {
|
||||||
//// Initialize button
|
//// Initialize button
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
use i18n_embed::{
|
use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader};
|
||||||
fluent::{fluent_language_loader, FluentLanguageLoader},
|
use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer};
|
||||||
DefaultLocalizer, LanguageLoader, Localizer,
|
|
||||||
};
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use rust_embed::RustEmbed;
|
use rust_embed::RustEmbed;
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,7 @@ use futures::channel::mpsc;
|
||||||
use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender};
|
use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender};
|
||||||
use gtk4::gio::ApplicationFlags;
|
use gtk4::gio::ApplicationFlags;
|
||||||
use gtk4::prelude::*;
|
use gtk4::prelude::*;
|
||||||
use gtk4::Application;
|
use gtk4::{Application, Inhibit};
|
||||||
use gtk4::Inhibit;
|
|
||||||
|
|
||||||
use connect_things::connect_about_buttons::*;
|
use connect_things::connect_about_buttons::*;
|
||||||
use connect_things::connect_button_compare::*;
|
use connect_things::connect_button_compare::*;
|
||||||
|
|
|
@ -6,6 +6,7 @@ use crate::help_functions::{
|
||||||
};
|
};
|
||||||
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
|
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct NotebookObject {
|
pub struct NotebookObject {
|
||||||
pub notebook_type: NotebookMainEnum,
|
pub notebook_type: NotebookMainEnum,
|
||||||
pub available_modes: &'static [PopoverTypes],
|
pub available_modes: &'static [PopoverTypes],
|
||||||
|
|
Loading…
Reference in a new issue