Merge pull request #388 from git-f0x/master
Migrate to Rust 2024 and update dependencies
This commit is contained in:
commit
7b1572e586
11 changed files with 350 additions and 725 deletions
881
Cargo.lock
generated
881
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
21
Cargo.toml
21
Cargo.toml
|
|
@ -2,20 +2,17 @@
|
||||||
name = "cosmic-edit"
|
name = "cosmic-edit"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Jeremy Soller <jeremy@system76.com>"]
|
authors = ["Jeremy Soller <jeremy@system76.com>"]
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
rust-version = "1.71"
|
rust-version = "1.85"
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
vergen = { version = "8", features = ["git", "gitcl"] }
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
dirs = "6"
|
dirs = "6"
|
||||||
env_logger = "0.11.6"
|
env_logger = "0.11.8"
|
||||||
grep = "0.3.2"
|
grep = "0.3.2"
|
||||||
ignore = "0.4.23"
|
ignore = "0.4.23"
|
||||||
log = "0.4.25"
|
log = "0.4.28"
|
||||||
notify = "6.1.1"
|
notify = "8.2.0"
|
||||||
open = "5.3.2"
|
open = "5.3.2"
|
||||||
paste = "1.0.15"
|
paste = "1.0.15"
|
||||||
patch = "0.7.0"
|
patch = "0.7.0"
|
||||||
|
|
@ -28,11 +25,11 @@ two-face = "0.4.3"
|
||||||
# Internationalization
|
# Internationalization
|
||||||
icu_collator = "1.5"
|
icu_collator = "1.5"
|
||||||
icu_provider = { version = "1.5", features = ["sync"] }
|
icu_provider = { version = "1.5", features = ["sync"] }
|
||||||
i18n-embed = { version = "0.15", features = [
|
i18n-embed = { version = "0.16", features = [
|
||||||
"fluent-system",
|
"fluent-system",
|
||||||
"desktop-requester",
|
"desktop-requester",
|
||||||
] }
|
] }
|
||||||
i18n-embed-fl = "0.9"
|
i18n-embed-fl = "0.10"
|
||||||
rust-embed = "8"
|
rust-embed = "8"
|
||||||
|
|
||||||
[dependencies.cosmic-files]
|
[dependencies.cosmic-files]
|
||||||
|
|
@ -50,7 +47,7 @@ features = ["syntect", "vi"]
|
||||||
git = "https://github.com/pop-os/libcosmic.git"
|
git = "https://github.com/pop-os/libcosmic.git"
|
||||||
default-features = false
|
default-features = false
|
||||||
#TODO: a11y feature crashes file choser dialog
|
#TODO: a11y feature crashes file choser dialog
|
||||||
features = ["dbus-config", "multi-window", "tokio", "winit", "surface-message"]
|
features = ["about", "dbus-config", "multi-window", "tokio", "winit", "surface-message"]
|
||||||
|
|
||||||
[target.'cfg(unix)'.dependencies]
|
[target.'cfg(unix)'.dependencies]
|
||||||
fork = "0.2"
|
fork = "0.2"
|
||||||
|
|
@ -68,8 +65,6 @@ debug = true
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
onig = { git = "https://github.com/rust-onig/rust-onig.git", branch = "main" }
|
onig = { git = "https://github.com/rust-onig/rust-onig.git", branch = "main" }
|
||||||
onig_sys = { git = "https://github.com/rust-onig/rust-onig.git", branch = "main" }
|
onig_sys = { git = "https://github.com/rust-onig/rust-onig.git", branch = "main" }
|
||||||
# https://github.com/smol-rs/polling/pull/235
|
|
||||||
polling = { git = "https://github.com/jackpot51/polling.git", branch = "master" }
|
|
||||||
|
|
||||||
# [patch.'https://github.com/pop-os/libcosmic']
|
# [patch.'https://github.com/pop-os/libcosmic']
|
||||||
# libcosmic = { path = "../libcosmic" }
|
# libcosmic = { path = "../libcosmic" }
|
||||||
|
|
|
||||||
17
build.rs
17
build.rs
|
|
@ -1,17 +0,0 @@
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
// Rebuild if i18n files change
|
|
||||||
println!("cargo:rerun-if-changed=i18n");
|
|
||||||
|
|
||||||
// Emit version information (if not cached by just vendor)
|
|
||||||
let mut vergen = vergen::EmitBuilder::builder();
|
|
||||||
println!("cargo:rerun-if-env-changed=VERGEN_GIT_COMMIT_DATE");
|
|
||||||
if std::env::var_os("VERGEN_GIT_COMMIT_DATE").is_none() {
|
|
||||||
vergen.git_commit_date();
|
|
||||||
}
|
|
||||||
println!("cargo:rerun-if-env-changed=VERGEN_GIT_SHA");
|
|
||||||
if std::env::var_os("VERGEN_GIT_SHA").is_none() {
|
|
||||||
vergen.git_sha(false);
|
|
||||||
}
|
|
||||||
vergen.fail_on_error().emit()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,8 @@ todo = TODO
|
||||||
# Context Pages
|
# Context Pages
|
||||||
|
|
||||||
## About
|
## About
|
||||||
git-description = Git commit {$hash} on {$date}
|
repository = Repository
|
||||||
|
support = Support
|
||||||
|
|
||||||
## Document statistics
|
## Document statistics
|
||||||
document-statistics = Document statistics
|
document-statistics = Document statistics
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
cosmic_config::{self, cosmic_config_derive::CosmicConfigEntry, CosmicConfigEntry},
|
cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry},
|
||||||
theme,
|
theme,
|
||||||
};
|
};
|
||||||
use cosmic_text::Metrics;
|
use cosmic_text::Metrics;
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ use std::str::FromStr;
|
||||||
use std::sync::OnceLock;
|
use std::sync::OnceLock;
|
||||||
|
|
||||||
use i18n_embed::{
|
use i18n_embed::{
|
||||||
fluent::{fluent_language_loader, FluentLanguageLoader},
|
|
||||||
DefaultLocalizer, LanguageLoader, Localizer,
|
DefaultLocalizer, LanguageLoader, Localizer,
|
||||||
|
fluent::{FluentLanguageLoader, fluent_language_loader},
|
||||||
};
|
};
|
||||||
use icu_collator::{Collator, CollatorOptions, Numeric};
|
use icu_collator::{Collator, CollatorOptions, Numeric};
|
||||||
use icu_provider::DataLocale;
|
use icu_provider::DataLocale;
|
||||||
|
|
|
||||||
115
src/main.rs
115
src/main.rs
|
|
@ -5,22 +5,21 @@ use cosmic::widget::menu::action::MenuAction;
|
||||||
use cosmic::widget::menu::key_bind::KeyBind;
|
use cosmic::widget::menu::key_bind::KeyBind;
|
||||||
use cosmic::widget::segmented_button::Entity;
|
use cosmic::widget::segmented_button::Entity;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
action,
|
Application, ApplicationExt, Apply, Element, action,
|
||||||
app::{context_drawer, Core, Settings, Task},
|
app::{Core, Settings, Task, context_drawer},
|
||||||
cosmic_config::{self, CosmicConfigEntry},
|
cosmic_config::{self, CosmicConfigEntry},
|
||||||
cosmic_theme, executor,
|
cosmic_theme, executor,
|
||||||
font::Font,
|
font::Font,
|
||||||
iced::{
|
iced::{
|
||||||
self,
|
self, Alignment, Background, Color, Length, Limits, Point, Subscription,
|
||||||
advanced::graphics::text::font_system,
|
advanced::graphics::text::font_system,
|
||||||
clipboard, event,
|
clipboard, event,
|
||||||
futures::{self, SinkExt},
|
futures::{self, SinkExt},
|
||||||
keyboard::{self, Modifiers},
|
keyboard::{self, Modifiers},
|
||||||
stream, window, Alignment, Background, Color, Length, Limits, Point, Subscription,
|
stream, window,
|
||||||
},
|
},
|
||||||
style, theme,
|
style, theme,
|
||||||
widget::{self, button, icon, nav_bar, segmented_button},
|
widget::{self, about::About, button, icon, nav_bar, segmented_button},
|
||||||
Application, ApplicationExt, Apply, Element,
|
|
||||||
};
|
};
|
||||||
use cosmic_files::{
|
use cosmic_files::{
|
||||||
dialog::{Dialog, DialogKind, DialogMessage, DialogResult, DialogSettings},
|
dialog::{Dialog, DialogKind, DialogMessage, DialogResult, DialogSettings},
|
||||||
|
|
@ -38,7 +37,7 @@ use std::{
|
||||||
};
|
};
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
|
|
||||||
use config::{AppTheme, Config, ConfigState, CONFIG_VERSION};
|
use config::{AppTheme, CONFIG_VERSION, Config, ConfigState};
|
||||||
mod config;
|
mod config;
|
||||||
|
|
||||||
use git::{GitDiff, GitDiffLine, GitRepository, GitStatus, GitStatusKind};
|
use git::{GitDiff, GitDiffLine, GitRepository, GitStatus, GitStatusKind};
|
||||||
|
|
@ -440,6 +439,7 @@ pub enum Find {
|
||||||
|
|
||||||
pub struct App {
|
pub struct App {
|
||||||
core: Core,
|
core: Core,
|
||||||
|
about: About,
|
||||||
nav_model: segmented_button::SingleSelectModel,
|
nav_model: segmented_button::SingleSelectModel,
|
||||||
tab_model: segmented_button::SingleSelectModel,
|
tab_model: segmented_button::SingleSelectModel,
|
||||||
config_handler: Option<cosmic_config::Config>,
|
config_handler: Option<cosmic_config::Config>,
|
||||||
|
|
@ -850,38 +850,6 @@ impl App {
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn about(&self) -> Element<Message> {
|
|
||||||
let cosmic_theme::Spacing { space_xxs, .. } = self.core().system_theme().cosmic().spacing;
|
|
||||||
let repository = "https://github.com/pop-os/cosmic-edit";
|
|
||||||
let hash = env!("VERGEN_GIT_SHA");
|
|
||||||
let short_hash: String = hash.chars().take(7).collect();
|
|
||||||
let date = env!("VERGEN_GIT_COMMIT_DATE");
|
|
||||||
widget::column::with_children(vec![
|
|
||||||
widget::svg(widget::svg::Handle::from_memory(
|
|
||||||
&include_bytes!(
|
|
||||||
"../res/icons/hicolor/128x128/apps/com.system76.CosmicEdit.svg"
|
|
||||||
)[..],
|
|
||||||
))
|
|
||||||
.into(),
|
|
||||||
widget::text::title3(fl!("cosmic-text-editor")).into(),
|
|
||||||
widget::button::link(repository)
|
|
||||||
.on_press(Message::LaunchUrl(repository.to_string()))
|
|
||||||
.padding(0)
|
|
||||||
.into(),
|
|
||||||
widget::button::link(fl!(
|
|
||||||
"git-description",
|
|
||||||
hash = short_hash.as_str(),
|
|
||||||
date = date
|
|
||||||
))
|
|
||||||
.on_press(Message::LaunchUrl(format!("{}/commits/{}", repository, hash)))
|
|
||||||
.padding(0)
|
|
||||||
.into(),
|
|
||||||
])
|
|
||||||
.align_x(Alignment::Center)
|
|
||||||
.spacing(space_xxs)
|
|
||||||
.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn document_statistics(&self) -> Element<Message> {
|
fn document_statistics(&self) -> Element<Message> {
|
||||||
//TODO: calculate in the background
|
//TODO: calculate in the background
|
||||||
let mut character_count = 0;
|
let mut character_count = 0;
|
||||||
|
|
@ -911,24 +879,26 @@ impl App {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
widget::settings::view_column(vec![widget::settings::section()
|
widget::settings::view_column(vec![
|
||||||
.add(
|
widget::settings::section()
|
||||||
widget::settings::item::builder(fl!("word-count"))
|
.add(
|
||||||
.control(widget::text(word_count.to_string())),
|
widget::settings::item::builder(fl!("word-count"))
|
||||||
)
|
.control(widget::text(word_count.to_string())),
|
||||||
.add(
|
)
|
||||||
widget::settings::item::builder(fl!("character-count"))
|
.add(
|
||||||
.control(widget::text(character_count.to_string())),
|
widget::settings::item::builder(fl!("character-count"))
|
||||||
)
|
.control(widget::text(character_count.to_string())),
|
||||||
.add(
|
)
|
||||||
widget::settings::item::builder(fl!("character-count-no-spaces"))
|
.add(
|
||||||
.control(widget::text(character_count_no_spaces.to_string())),
|
widget::settings::item::builder(fl!("character-count-no-spaces"))
|
||||||
)
|
.control(widget::text(character_count_no_spaces.to_string())),
|
||||||
.add(
|
)
|
||||||
widget::settings::item::builder(fl!("line-count"))
|
.add(
|
||||||
.control(widget::text(line_count.to_string())),
|
widget::settings::item::builder(fl!("line-count"))
|
||||||
)
|
.control(widget::text(line_count.to_string())),
|
||||||
.into()])
|
)
|
||||||
|
.into(),
|
||||||
|
])
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1182,10 +1152,12 @@ impl App {
|
||||||
items
|
items
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
vec![search_input
|
vec![
|
||||||
.on_input(Message::ProjectSearchValue)
|
search_input
|
||||||
.on_submit(|_| Message::ProjectSearchSubmit)
|
.on_input(Message::ProjectSearchValue)
|
||||||
.into()]
|
.on_submit(|_| Message::ProjectSearchSubmit)
|
||||||
|
.into(),
|
||||||
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1364,8 +1336,24 @@ impl Application for App {
|
||||||
zoom_steps.push(zoom_step);
|
zoom_steps.push(zoom_step);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let about = About::default()
|
||||||
|
.name(fl!("cosmic-text-editor"))
|
||||||
|
.icon(icon::from_name(Self::APP_ID))
|
||||||
|
.version(env!("CARGO_PKG_VERSION"))
|
||||||
|
.author("System76")
|
||||||
|
.license("GPL-3.0-only")
|
||||||
|
.developers([("Jeremy Soller", "jeremy@system76.com")])
|
||||||
|
.links([
|
||||||
|
(fl!("repository"), "https://github.com/pop-os/cosmic-edit"),
|
||||||
|
(
|
||||||
|
fl!("support"),
|
||||||
|
"https://github.com/pop-os/cosmic-edit/issues",
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
|
||||||
let mut app = App {
|
let mut app = App {
|
||||||
core,
|
core,
|
||||||
|
about,
|
||||||
nav_model: nav_bar::Model::builder().build(),
|
nav_model: nav_bar::Model::builder().build(),
|
||||||
tab_model: segmented_button::Model::builder().build(),
|
tab_model: segmented_button::Model::builder().build(),
|
||||||
config_handler: flags.config_handler,
|
config_handler: flags.config_handler,
|
||||||
|
|
@ -2737,8 +2725,9 @@ impl Application for App {
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(match self.context_page {
|
Some(match self.context_page {
|
||||||
ContextPage::About => context_drawer::context_drawer(
|
ContextPage::About => context_drawer::about(
|
||||||
self.about(),
|
&self.about,
|
||||||
|
Message::LaunchUrl,
|
||||||
Message::ToggleContextPage(ContextPage::About),
|
Message::ToggleContextPage(ContextPage::About),
|
||||||
),
|
),
|
||||||
ContextPage::DocumentStatistics => context_drawer::context_drawer(
|
ContextPage::DocumentStatistics => context_drawer::context_drawer(
|
||||||
|
|
|
||||||
10
src/menu.rs
10
src/menu.rs
|
|
@ -1,22 +1,22 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::widget::menu::key_bind::KeyBind;
|
|
||||||
use cosmic::widget::menu::Item as MenuItem;
|
use cosmic::widget::menu::Item as MenuItem;
|
||||||
|
use cosmic::widget::menu::key_bind::KeyBind;
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
|
Element,
|
||||||
app::Core,
|
app::Core,
|
||||||
iced::{advanced::widget::text::Style as TextStyle, widget::column, Background, Length},
|
iced::{Background, Length, advanced::widget::text::Style as TextStyle, widget::column},
|
||||||
iced_core::Border,
|
iced_core::Border,
|
||||||
theme,
|
theme,
|
||||||
widget::{
|
widget::{
|
||||||
self, divider, horizontal_space,
|
self, divider, horizontal_space,
|
||||||
menu::{menu_button, ItemHeight, ItemWidth},
|
menu::{ItemHeight, ItemWidth, menu_button},
|
||||||
responsive_menu_bar, segmented_button,
|
responsive_menu_bar, segmented_button,
|
||||||
},
|
},
|
||||||
Element,
|
|
||||||
};
|
};
|
||||||
use std::{collections::HashMap, path::PathBuf, sync::LazyLock};
|
use std::{collections::HashMap, path::PathBuf, sync::LazyLock};
|
||||||
|
|
||||||
use crate::{fl, Action, Config, ConfigState, Message};
|
use crate::{Action, Config, ConfigState, Message, fl};
|
||||||
|
|
||||||
static MENU_ID: LazyLock<cosmic::widget::Id> =
|
static MENU_ID: LazyLock<cosmic::widget::Id> =
|
||||||
LazyLock::new(|| cosmic::widget::Id::new("responsive-menu"));
|
LazyLock::new(|| cosmic::widget::Id::new("responsive-menu"));
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use grep::matcher::{Match, Matcher};
|
use grep::matcher::{Match, Matcher};
|
||||||
use grep::regex::RegexMatcher;
|
use grep::regex::RegexMatcher;
|
||||||
use grep::searcher::{sinks::UTF8, Searcher};
|
use grep::searcher::{Searcher, sinks::UTF8};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
iced::{advanced::graphics::text::font_system, Point},
|
iced::{Point, advanced::graphics::text::font_system},
|
||||||
widget::icon,
|
widget::icon,
|
||||||
};
|
};
|
||||||
use cosmic_files::mime_icon::{mime_for_path, mime_icon, FALLBACK_MIME_ICON};
|
use cosmic_files::mime_icon::{FALLBACK_MIME_ICON, mime_for_path, mime_icon};
|
||||||
use cosmic_text::{Attrs, Buffer, Cursor, Edit, Selection, Shaping, SyntaxEditor, ViEditor, Wrap};
|
use cosmic_text::{Attrs, Buffer, Cursor, Edit, Selection, Shaping, SyntaxEditor, ViEditor, Wrap};
|
||||||
use notify::Watcher;
|
use notify::Watcher;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
@ -16,7 +16,7 @@ use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{fl, git::GitDiff, Config, SYNTAX_SYSTEM};
|
use crate::{Config, SYNTAX_SYSTEM, fl, git::GitDiff};
|
||||||
|
|
||||||
pub enum Tab {
|
pub enum Tab {
|
||||||
Editor(EditorTab),
|
Editor(EditorTab),
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,29 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
cosmic_theme::palette::{blend::Compose, WithAlpha},
|
Renderer,
|
||||||
|
cosmic_theme::palette::{WithAlpha, blend::Compose},
|
||||||
iced::{
|
iced::{
|
||||||
|
Color, Element, Length, Padding, Point, Rectangle, Size, Vector,
|
||||||
advanced::graphics::text::font_system,
|
advanced::graphics::text::font_system,
|
||||||
event::{Event, Status},
|
event::{Event, Status},
|
||||||
keyboard::{Event as KeyEvent, Modifiers},
|
keyboard::{Event as KeyEvent, Modifiers},
|
||||||
mouse::{self, Button, Event as MouseEvent, ScrollDelta},
|
mouse::{self, Button, Event as MouseEvent, ScrollDelta},
|
||||||
Color, Element, Length, Padding, Point, Rectangle, Size, Vector,
|
|
||||||
},
|
},
|
||||||
iced_core::{
|
iced_core::{
|
||||||
|
Border, Radians, Shell,
|
||||||
clipboard::Clipboard,
|
clipboard::Clipboard,
|
||||||
image,
|
image,
|
||||||
keyboard::{key::Named, Key},
|
keyboard::{Key, key::Named},
|
||||||
layout::{self, Layout},
|
layout::{self, Layout},
|
||||||
renderer::{self, Quad, Renderer as _},
|
renderer::{self, Quad, Renderer as _},
|
||||||
widget::{
|
widget::{
|
||||||
self,
|
self, Id, Widget,
|
||||||
operation::{self, Operation},
|
operation::{self, Operation},
|
||||||
tree, Id, Widget,
|
tree,
|
||||||
},
|
},
|
||||||
Border, Radians, Shell,
|
|
||||||
},
|
},
|
||||||
theme::Theme,
|
theme::Theme,
|
||||||
Renderer,
|
|
||||||
};
|
};
|
||||||
use cosmic_text::{
|
use cosmic_text::{
|
||||||
Action, BorrowedWithFontSystem, Edit, Metrics, Motion, Scroll, Selection, ViEditor,
|
Action, BorrowedWithFontSystem, Edit, Metrics, Motion, Scroll, Selection, ViEditor,
|
||||||
|
|
@ -35,7 +35,7 @@ use std::{
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{line_number::LineNumberKey, LINE_NUMBER_CACHE, SWASH_CACHE};
|
use crate::{LINE_NUMBER_CACHE, SWASH_CACHE, line_number::LineNumberKey};
|
||||||
|
|
||||||
pub struct TextBox<'a, Message> {
|
pub struct TextBox<'a, Message> {
|
||||||
editor: &'a Mutex<ViEditor<'static, 'static>>,
|
editor: &'a Mutex<ViEditor<'static, 'static>>,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue