Compare commits
23 commits
pre-1.7-me
...
local/libc
| Author | SHA1 | Date | |
|---|---|---|---|
| 936e57b63e | |||
| c45b23aa85 | |||
|
|
bfc98bf219 | ||
|
|
14aba66228 | ||
|
|
430120f6ff | ||
|
|
9307793661 | ||
|
|
505ecd18fe | ||
|
|
4b4871ecf4 | ||
|
|
1054b6a7fd | ||
|
|
139cfaaf5c | ||
| 85da7f90f2 | |||
| 70c1765b1f | |||
| 20c47377a8 | |||
|
|
26f6ffd3e6 | ||
| 6150549a9b | |||
| de9ae6890a | |||
|
|
13b1d4aac0 | ||
|
|
6c800ce1f1 | ||
|
|
0e9c927f1a | ||
|
|
b23384043e | ||
|
|
4a5be62b02 | ||
|
|
8c9c15de85 | ||
|
|
e4006945c6 |
17 changed files with 541 additions and 685 deletions
959
Cargo.lock
generated
959
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "cosmic-edit"
|
||||
version = "1.6.0"
|
||||
version = "1.9.0"
|
||||
authors = ["Jeremy Soller <jeremy@system76.com>"]
|
||||
edition = "2024"
|
||||
license = "GPL-3.0-only"
|
||||
|
|
|
|||
18
debian/changelog
vendored
18
debian/changelog
vendored
|
|
@ -1,3 +1,21 @@
|
|||
cosmic-edit (1.9.0) noble; urgency=medium
|
||||
|
||||
* Epoch 1.9.0 version update
|
||||
|
||||
-- Michael Murphy <michael@mmurphy.dev> Mon, 14 Sep 2026 21:54:06 +0200
|
||||
|
||||
cosmic-edit (1.8.0) noble; urgency=medium
|
||||
|
||||
* Epoch 1.8.0 version update
|
||||
|
||||
-- Jeremy Soller <jeremy@system76.com> Wed, 02 Sep 2026 08:14:30 -0600
|
||||
|
||||
cosmic-edit (1.7.0) noble; urgency=medium
|
||||
|
||||
* Epoch 1.7.0 version update
|
||||
|
||||
-- Jeremy Soller <jeremy@system76.com> Tue, 25 Aug 2026 09:19:59 -0600
|
||||
|
||||
cosmic-edit (1.6.0) noble; urgency=medium
|
||||
|
||||
* Epoch 1.6.0 version update
|
||||
|
|
|
|||
5
debian/rules
vendored
5
debian/rules
vendored
|
|
@ -1,15 +1,12 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
export DESTDIR = debian/cosmic-edit
|
||||
export VENDOR ?= 1
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
override_dh_auto_clean:
|
||||
if ! ischroot && test "${VENDOR}" = "1"; then \
|
||||
just vendor; \
|
||||
fi
|
||||
ischroot || just vendor
|
||||
|
||||
override_dh_auto_build:
|
||||
just build-vendored
|
||||
|
|
|
|||
6
debian/source/options
vendored
6
debian/source/options
vendored
|
|
@ -1,4 +1,6 @@
|
|||
tar-ignore=.github
|
||||
tar-ignore=.vscode
|
||||
tar-ignore=target/.rustc_info.json
|
||||
tar-ignore=target/CACHEDIR.TAG
|
||||
tar-ignore=target/debug
|
||||
tar-ignore=target/release
|
||||
tar-ignore=vendor
|
||||
tar-ignore=target
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
save = Gem
|
||||
cancel = Annuller
|
||||
cancel = Afbryd
|
||||
quit = Afslut
|
||||
cosmic-text-editor = COSMIC-teksteditor
|
||||
new-document = Nyt dokument
|
||||
|
|
|
|||
0
i18n/fil/cosmic_edit.ftl
Normal file
0
i18n/fil/cosmic_edit.ftl
Normal file
|
|
@ -60,7 +60,7 @@ default-zoom-step = Nagyítási mérték
|
|||
### Keyboard shortcuts
|
||||
|
||||
keyboard-shortcuts = Gyorsbillentyűk
|
||||
enable-vim-bindings = Vim billentyűkombinációk engedélyezése
|
||||
enable-vim-bindings = Vim-billentyűkombinációk engedélyezése
|
||||
# Find
|
||||
find-placeholder = Keresés…
|
||||
find-previous = Előző találat
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
cancel = Sefsex
|
||||
cancel = Semmet
|
||||
undo = Ssemmet
|
||||
save = Sekles
|
||||
quit = Tuffɣa
|
||||
quit = Ffeɣ
|
||||
replace = Semselsi
|
||||
support = Tallalt
|
||||
support = Tallelt
|
||||
settings = Iɣewwaṛen
|
||||
appearance = Timeẓri
|
||||
theme = Asentel
|
||||
|
|
@ -16,7 +16,7 @@ default-size = Tiddi tamezwert
|
|||
zoom-out = Asemẓi
|
||||
view = Wali
|
||||
menu-settings = Iɣewwaṛen…
|
||||
match-desktop = Amṣada d tnarit
|
||||
match-desktop = Semṣada akked tnarit
|
||||
file = Afaylu
|
||||
new-window = Asfaylu amaynut
|
||||
edit = Ẓreg
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ support = Piştgirî
|
|||
quit = Biqedîne
|
||||
find-placeholder = Bibîne...
|
||||
copy = Jê bigire
|
||||
paste = Pêve bike
|
||||
paste = Pê ve bike
|
||||
match-desktop = Bi sermaseyê re li hev bîne
|
||||
select-all = Hemûyan hilbijêre
|
||||
zoom-in = Nêzîk bike
|
||||
|
|
|
|||
|
|
@ -1,8 +1,13 @@
|
|||
settings = Paramètres
|
||||
settings = Configuracion
|
||||
appearance = Aparéncia
|
||||
theme = Tèma
|
||||
match-desktop = Assortir al burèu
|
||||
dark = Fosc
|
||||
dark = Escur
|
||||
light = Clar
|
||||
file = Fichièr
|
||||
close-file = Tampar lo fichièr
|
||||
cancel = Anullar
|
||||
repository = Depaus
|
||||
menu-settings = Configuracion...
|
||||
quit = Quitar
|
||||
replace = Remplaçar
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
cosmic-text-editor = Edytor Tekstu COSMIC
|
||||
comment = Edytor tekstu pulpitu COSMIC
|
||||
comment = Edytor tekstu dla środowiska COSMIC
|
||||
new-document = Nowy dokument
|
||||
open-project = Otwórz projekt
|
||||
todo = TODO
|
||||
|
|
@ -64,7 +64,7 @@ default-zoom-step = Stopniowanie powiększania
|
|||
keyboard-shortcuts = Skróty klawiszowe
|
||||
enable-vim-bindings = Włącz tryb Vim
|
||||
# Find
|
||||
find-placeholder = Szukaj…
|
||||
find-placeholder = Wyszukaj…
|
||||
find-previous = Znajdź poprzedni
|
||||
find-next = Znajdź następny
|
||||
replace-placeholder = Zastąp…
|
||||
|
|
@ -106,8 +106,8 @@ cut = Wytnij
|
|||
copy = Kopiuj
|
||||
paste = Wklej
|
||||
select-all = Zaznacz wszystko
|
||||
find = Szukaj
|
||||
find-in-project = Szukaj w projekcie…
|
||||
find = Wyszukaj
|
||||
find-in-project = Wyszukaj w projekcie…
|
||||
spell-check = Sprawdź ortografię…
|
||||
|
||||
## View
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
cancel = ยกเลิก
|
||||
settings = การตั้งค่า
|
||||
dark = มืด
|
||||
light = สว่าง
|
||||
replace = แทนที่
|
||||
appearance = ลักษณะ
|
||||
55
src/main.rs
55
src/main.rs
|
|
@ -11,7 +11,7 @@ use cosmic::{
|
|||
cosmic_theme, executor,
|
||||
font::Font,
|
||||
iced::{
|
||||
self, Alignment, Background, Color, Length, Limits, Point, Subscription,
|
||||
self, Alignment, Background, Color, Length, Limits, Subscription,
|
||||
advanced::graphics::text::font_system,
|
||||
clipboard, event,
|
||||
futures::{self, SinkExt},
|
||||
|
|
@ -194,6 +194,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
||||
pub enum Action {
|
||||
Todo,
|
||||
NoOp,
|
||||
About,
|
||||
CloseFile,
|
||||
CloseProject(usize),
|
||||
|
|
@ -244,6 +245,7 @@ impl Action {
|
|||
fn message(&self, entity_opt: Option<Entity>) -> Message {
|
||||
match self {
|
||||
Self::Todo => Message::Todo,
|
||||
Self::NoOp => Message::NoOp,
|
||||
Self::About => Message::ToggleContextPage(ContextPage::About),
|
||||
Self::CloseFile => Message::CloseFile,
|
||||
Self::CloseProject(project_i) => Message::CloseProject(*project_i),
|
||||
|
|
@ -371,6 +373,7 @@ pub enum Message {
|
|||
Modifiers(Modifiers),
|
||||
NewFile,
|
||||
NewWindow,
|
||||
NoOp,
|
||||
NotifyEvent(notify::Event),
|
||||
NotifyWatcher(WatcherWrapper),
|
||||
OpenFile(PathBuf),
|
||||
|
|
@ -400,7 +403,7 @@ pub enum Message {
|
|||
SaveAsResult(segmented_button::Entity, DialogResult),
|
||||
Scroll(f32),
|
||||
SelectAll,
|
||||
Surface(surface::Action),
|
||||
Surface(surface::Action<Message>),
|
||||
SystemThemeModeChange(cosmic_theme::ThemeMode),
|
||||
SyntaxTheme(usize, bool),
|
||||
TabActivate(segmented_button::Entity),
|
||||
|
|
@ -409,7 +412,7 @@ pub enum Message {
|
|||
TabClose(segmented_button::Entity),
|
||||
TabCloseForce(segmented_button::Entity),
|
||||
TabContextAction(segmented_button::Entity, Action),
|
||||
TabContextMenu(segmented_button::Entity, Option<Point>),
|
||||
TabContextMenu(segmented_button::Entity, bool),
|
||||
TabNext,
|
||||
TabPrev,
|
||||
TabSetCursor(segmented_button::Entity, Cursor),
|
||||
|
|
@ -2162,6 +2165,9 @@ impl Application for App {
|
|||
}
|
||||
}
|
||||
}
|
||||
Message::NoOp => {
|
||||
// Do nothing
|
||||
}
|
||||
Message::NotifyEvent(event) => {
|
||||
// Reload tabs that changed
|
||||
let mut tab_reload = Vec::new();
|
||||
|
|
@ -2707,9 +2713,7 @@ impl Application for App {
|
|||
}
|
||||
}
|
||||
Message::Surface(a) => {
|
||||
return cosmic::task::message(cosmic::Action::Cosmic(
|
||||
cosmic::app::Action::Surface(a),
|
||||
));
|
||||
return cosmic::task::message(cosmic::Action::Surface(a));
|
||||
}
|
||||
Message::SystemThemeModeChange(_theme_mode) => {
|
||||
return self.update_config();
|
||||
|
|
@ -2788,7 +2792,9 @@ impl Application for App {
|
|||
}
|
||||
Message::TabCloseForce(entity) => {
|
||||
// Activate closest item
|
||||
if let Some(position) = self.tab_model.position(entity) {
|
||||
if self.tab_model.active() == entity
|
||||
&& let Some(position) = self.tab_model.position(entity)
|
||||
{
|
||||
if position > 0 {
|
||||
self.tab_model.activate_position(position - 1);
|
||||
} else {
|
||||
|
|
@ -2815,15 +2821,15 @@ impl Application for App {
|
|||
Message::TabContextAction(entity, action) => {
|
||||
if let Some(Tab::Editor(tab)) = self.tab_model.data_mut::<Tab>(entity) {
|
||||
// Close context menu
|
||||
tab.context_menu = None;
|
||||
tab.context_menu_open = false;
|
||||
// Run action's message
|
||||
return self.update(action.message(None));
|
||||
}
|
||||
}
|
||||
Message::TabContextMenu(entity, position_opt) => {
|
||||
Message::TabContextMenu(entity, open) => {
|
||||
if let Some(Tab::Editor(tab)) = self.tab_model.data_mut::<Tab>(entity) {
|
||||
// Update context menu
|
||||
tab.context_menu = position_opt;
|
||||
tab.context_menu_open = open;
|
||||
}
|
||||
}
|
||||
Message::TabNext => {
|
||||
|
|
@ -3028,12 +3034,19 @@ impl Application for App {
|
|||
}
|
||||
|
||||
fn header_start(&self) -> Vec<Element<'_, Message>> {
|
||||
let has_selection = match self.active_tab() {
|
||||
Some(Tab::Editor(tab)) => tab.editor.lock().unwrap().selection() != Selection::None,
|
||||
Some(Tab::GitDiff(_)) => false,
|
||||
None => false,
|
||||
};
|
||||
|
||||
vec![menu_bar(
|
||||
&self.core,
|
||||
&self.config,
|
||||
&self.config_state,
|
||||
&self.key_binds,
|
||||
&self.projects,
|
||||
has_selection,
|
||||
)]
|
||||
}
|
||||
|
||||
|
|
@ -3078,23 +3091,25 @@ impl Application for App {
|
|||
.on_focus(Message::FindFocused(false))
|
||||
.on_auto_scroll(Message::AutoScroll)
|
||||
.on_changed(Message::TabChanged(tab_id))
|
||||
.has_context_menu(tab.context_menu.is_some())
|
||||
.on_context_menu(move |position_opt| {
|
||||
Message::TabContextMenu(tab_id, position_opt)
|
||||
});
|
||||
.has_context_menu(tab.context_menu_open)
|
||||
.on_context_menu(move |open| Message::TabContextMenu(tab_id, open));
|
||||
if self.config.highlight_current_line {
|
||||
text_box = text_box.highlight_current_line();
|
||||
}
|
||||
if self.config.line_numbers {
|
||||
text_box = text_box.line_numbers();
|
||||
}
|
||||
let mut popover = widget::popover(text_box);
|
||||
if let Some(point) = tab.context_menu {
|
||||
popover = popover
|
||||
.popup(menu::context_menu(&self.key_binds, tab_id))
|
||||
.position(widget::popover::Position::Point(point));
|
||||
let has_selection = tab.editor.lock().unwrap().selection() != Selection::None;
|
||||
let mut context_menu = widget::context_menu(
|
||||
text_box,
|
||||
Some(menu::context_menu(&self.key_binds, tab_id, has_selection)),
|
||||
)
|
||||
.on_close(Message::TabContextMenu(tab_id, false))
|
||||
.on_surface_action(Message::Surface);
|
||||
if let Some(window_id) = self.core().main_window_id() {
|
||||
context_menu = context_menu.window_id(window_id);
|
||||
}
|
||||
tab_column = tab_column.push(popover);
|
||||
tab_column = tab_column.push(context_menu);
|
||||
if self.config.vim_bindings {
|
||||
let status = {
|
||||
let editor = tab.editor.lock().unwrap();
|
||||
|
|
|
|||
117
src/menu.rs
117
src/menu.rs
|
|
@ -1,18 +1,15 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use cosmic::widget::menu::Item as MenuItem;
|
||||
use cosmic::widget::menu::action::MenuAction;
|
||||
use cosmic::widget::menu::key_bind::KeyBind;
|
||||
use cosmic::{
|
||||
Element,
|
||||
app::Core,
|
||||
iced::{
|
||||
Background, Border, Length, advanced::widget::text::Style as TextStyle, widget::column,
|
||||
},
|
||||
theme,
|
||||
widget::{
|
||||
self, divider,
|
||||
menu::{ItemHeight, ItemWidth, menu_button},
|
||||
responsive_menu_bar, segmented_button, space,
|
||||
self,
|
||||
menu::{ItemHeight, ItemWidth},
|
||||
responsive_menu_bar, segmented_button,
|
||||
},
|
||||
};
|
||||
use std::{collections::HashMap, path::PathBuf, sync::LazyLock};
|
||||
|
|
@ -116,68 +113,49 @@ fn format_recent_menu_path(path: &PathBuf, home_dir_opt: Option<&PathBuf>) -> St
|
|||
truncate_middle(&display, RECENT_MENU_LABEL_MAX_CHARS)
|
||||
}
|
||||
|
||||
pub fn context_menu<'a>(
|
||||
/// A context menu action dispatched to the tab the menu was opened on.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub struct TabAction(pub segmented_button::Entity, pub Action);
|
||||
|
||||
impl MenuAction for TabAction {
|
||||
type Message = Message;
|
||||
|
||||
fn message(&self) -> Message {
|
||||
Message::TabContextAction(self.0, self.1)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn context_menu(
|
||||
key_binds: &HashMap<KeyBind, Action>,
|
||||
entity: segmented_button::Entity,
|
||||
) -> Element<'a, Message> {
|
||||
fn key_style(theme: &cosmic::Theme) -> TextStyle {
|
||||
// TODO use wayland popups
|
||||
let mut color = theme.cosmic().background(false).component.on;
|
||||
color.alpha *= 0.75;
|
||||
TextStyle {
|
||||
color: Some(color.into()),
|
||||
..Default::default()
|
||||
has_selection: bool,
|
||||
) -> Vec<widget::menu::Tree<Message>> {
|
||||
let item =
|
||||
|label: String, action: Action| MenuItem::Button(label, None, TabAction(entity, action));
|
||||
let optional = |label: String, action: Action, enabled: bool| {
|
||||
if enabled {
|
||||
MenuItem::Button(label, None, TabAction(entity, action))
|
||||
} else {
|
||||
MenuItem::ButtonDisabled(label, None, TabAction(entity, action))
|
||||
}
|
||||
}
|
||||
|
||||
let menu_item = |menu_label, menu_action| {
|
||||
let mut key = String::new();
|
||||
for (key_bind, key_action) in key_binds.iter() {
|
||||
if key_action == &menu_action {
|
||||
key = key_bind.to_string();
|
||||
break;
|
||||
}
|
||||
}
|
||||
menu_button(vec![
|
||||
widget::text(menu_label).into(),
|
||||
space::horizontal().into(),
|
||||
widget::text(key)
|
||||
.class(theme::Text::Custom(key_style))
|
||||
.into(),
|
||||
])
|
||||
.on_press(Message::TabContextAction(entity, menu_action))
|
||||
};
|
||||
|
||||
widget::container(
|
||||
cosmic::widget::menu::menu_column::MenuColumn::with_children([
|
||||
menu_item(fl!("undo"), Action::Undo).into(),
|
||||
menu_item(fl!("redo"), Action::Redo).into(),
|
||||
divider::horizontal::light().into(),
|
||||
menu_item(fl!("cut"), Action::Cut).into(),
|
||||
menu_item(fl!("copy"), Action::Copy).into(),
|
||||
menu_item(fl!("paste"), Action::Paste).into(),
|
||||
menu_item(fl!("select-all"), Action::SelectAll).into(),
|
||||
]),
|
||||
let key_binds: HashMap<KeyBind, TabAction> = key_binds
|
||||
.iter()
|
||||
.map(|(key_bind, action)| (key_bind.clone(), TabAction(entity, *action)))
|
||||
.collect();
|
||||
widget::menu::items(
|
||||
&key_binds,
|
||||
vec![
|
||||
item(fl!("undo"), Action::Undo),
|
||||
item(fl!("redo"), Action::Redo),
|
||||
MenuItem::Divider,
|
||||
optional(fl!("cut"), Action::Cut, has_selection),
|
||||
optional(fl!("copy"), Action::Copy, has_selection),
|
||||
item(fl!("paste"), Action::Paste),
|
||||
item(fl!("select-all"), Action::SelectAll),
|
||||
],
|
||||
)
|
||||
.padding(1)
|
||||
//TODO: move style to libcosmic
|
||||
.style(|theme| {
|
||||
let cosmic = theme.cosmic();
|
||||
let component = &cosmic.background(false).component;
|
||||
widget::container::Style {
|
||||
icon_color: Some(component.on.into()),
|
||||
text_color: Some(component.on.into()),
|
||||
background: Some(Background::Color(component.base.into())),
|
||||
border: Border {
|
||||
radius: cosmic.radius_s().map(|x| x + 1.0).into(),
|
||||
width: 1.0,
|
||||
color: component.divider.into(),
|
||||
},
|
||||
..Default::default()
|
||||
}
|
||||
})
|
||||
.width(Length::Fixed(240.0))
|
||||
.into()
|
||||
}
|
||||
|
||||
pub fn menu_bar<'a>(
|
||||
|
|
@ -186,6 +164,7 @@ pub fn menu_bar<'a>(
|
|||
config_state: &ConfigState,
|
||||
key_binds: &HashMap<KeyBind, Action>,
|
||||
projects: &Vec<(String, PathBuf)>,
|
||||
has_selection: bool,
|
||||
) -> Element<'a, Message> {
|
||||
//TODO: port to libcosmic
|
||||
let menu_tab_width = |tab_width: u16| {
|
||||
|
|
@ -278,8 +257,16 @@ pub fn menu_bar<'a>(
|
|||
MenuItem::Button(fl!("undo"), None, Action::Undo),
|
||||
MenuItem::Button(fl!("redo"), None, Action::Redo),
|
||||
MenuItem::Divider,
|
||||
MenuItem::Button(fl!("cut"), None, Action::Cut),
|
||||
MenuItem::Button(fl!("copy"), None, Action::Copy),
|
||||
if has_selection {
|
||||
MenuItem::Button(fl!("cut"), None, Action::Cut)
|
||||
} else {
|
||||
MenuItem::ButtonDisabled(fl!("cut"), None, Action::NoOp)
|
||||
},
|
||||
if has_selection {
|
||||
MenuItem::Button(fl!("copy"), None, Action::Copy)
|
||||
} else {
|
||||
MenuItem::ButtonDisabled(fl!("copy"), None, Action::NoOp)
|
||||
},
|
||||
MenuItem::Button(fl!("paste"), None, Action::Paste),
|
||||
MenuItem::Button(fl!("select-all"), None, Action::SelectAll),
|
||||
MenuItem::Divider,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use cosmic::{
|
||||
iced::{Point, advanced::graphics::text::font_system},
|
||||
widget::icon,
|
||||
};
|
||||
use cosmic::{iced::advanced::graphics::text::font_system, widget::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 regex::Regex;
|
||||
|
|
@ -51,7 +48,7 @@ pub struct EditorTab {
|
|||
pub path_opt: Option<PathBuf>,
|
||||
attrs: Attrs<'static>,
|
||||
pub editor: Mutex<ViEditor<'static, 'static>>,
|
||||
pub context_menu: Option<Point>,
|
||||
pub context_menu_open: bool,
|
||||
pub zoom_adj: i8,
|
||||
}
|
||||
|
||||
|
|
@ -75,7 +72,7 @@ impl EditorTab {
|
|||
path_opt: None,
|
||||
attrs,
|
||||
editor: Mutex::new(ViEditor::new(editor)),
|
||||
context_menu: None,
|
||||
context_menu_open: false,
|
||||
zoom_adj,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ pub struct TextBox<'a, Message> {
|
|||
on_focus: Option<Message>,
|
||||
click_timing: Duration,
|
||||
has_context_menu: bool,
|
||||
on_context_menu: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||
on_context_menu: Option<Box<dyn Fn(bool) -> Message + 'a>>,
|
||||
highlight_current_line: bool,
|
||||
line_numbers: bool,
|
||||
}
|
||||
|
|
@ -107,10 +107,7 @@ where
|
|||
self
|
||||
}
|
||||
|
||||
pub fn on_context_menu(
|
||||
mut self,
|
||||
on_context_menu: impl Fn(Option<Point>) -> Message + 'a,
|
||||
) -> Self {
|
||||
pub fn on_context_menu(mut self, on_context_menu: impl Fn(bool) -> Message + 'a) -> Self {
|
||||
self.on_context_menu = Some(Box::new(on_context_menu));
|
||||
self
|
||||
}
|
||||
|
|
@ -1267,14 +1264,9 @@ where
|
|||
|
||||
// Update context menu state
|
||||
if let Some(on_context_menu) = &self.on_context_menu {
|
||||
shell.publish((on_context_menu)(if self.has_context_menu {
|
||||
None
|
||||
} else {
|
||||
match button {
|
||||
Button::Right => Some(p),
|
||||
_ => None,
|
||||
}
|
||||
}));
|
||||
shell.publish((on_context_menu)(
|
||||
!self.has_context_menu && matches!(button, Button::Right),
|
||||
));
|
||||
}
|
||||
|
||||
shell.capture_event();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue