Use iced FontSystem and fix #122
This commit is contained in:
parent
76c659fb21
commit
38058fb2e6
3 changed files with 34 additions and 32 deletions
25
src/main.rs
25
src/main.rs
|
|
@ -6,6 +6,7 @@ use cosmic::{
|
||||||
cosmic_theme, executor,
|
cosmic_theme, executor,
|
||||||
font::Font,
|
font::Font,
|
||||||
iced::{
|
iced::{
|
||||||
|
advanced::graphics::text::font_system,
|
||||||
clipboard, event,
|
clipboard, event,
|
||||||
futures::{self, SinkExt},
|
futures::{self, SinkExt},
|
||||||
keyboard::{self, Modifiers},
|
keyboard::{self, Modifiers},
|
||||||
|
|
@ -18,7 +19,7 @@ use cosmic::{
|
||||||
Application, ApplicationExt, Apply, Element,
|
Application, ApplicationExt, Apply, Element,
|
||||||
};
|
};
|
||||||
use cosmic_files::dialog::{Dialog, DialogKind, DialogMessage, DialogResult};
|
use cosmic_files::dialog::{Dialog, DialogKind, DialogMessage, DialogResult};
|
||||||
use cosmic_text::{Cursor, Edit, Family, FontSystem, Selection, SwashCache, SyntaxSystem, ViMode};
|
use cosmic_text::{Cursor, Edit, Family, Selection, SwashCache, SyntaxSystem, ViMode};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{
|
use std::{
|
||||||
any::TypeId,
|
any::TypeId,
|
||||||
|
|
@ -65,8 +66,6 @@ mod tab;
|
||||||
use self::text_box::text_box;
|
use self::text_box::text_box;
|
||||||
mod text_box;
|
mod text_box;
|
||||||
|
|
||||||
//TODO: re-use iced FONT_SYSTEM
|
|
||||||
static FONT_SYSTEM: OnceLock<Mutex<FontSystem>> = OnceLock::new();
|
|
||||||
static ICON_CACHE: OnceLock<Mutex<IconCache>> = OnceLock::new();
|
static ICON_CACHE: OnceLock<Mutex<IconCache>> = OnceLock::new();
|
||||||
static LINE_NUMBER_CACHE: OnceLock<Mutex<LineNumberCache>> = OnceLock::new();
|
static LINE_NUMBER_CACHE: OnceLock<Mutex<LineNumberCache>> = OnceLock::new();
|
||||||
static SWASH_CACHE: OnceLock<Mutex<SwashCache>> = OnceLock::new();
|
static SWASH_CACHE: OnceLock<Mutex<SwashCache>> = OnceLock::new();
|
||||||
|
|
@ -78,7 +77,6 @@ pub fn icon_cache_get(name: &'static str, size: u16) -> icon::Icon {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
FONT_SYSTEM.get_or_init(|| Mutex::new(FontSystem::new()));
|
|
||||||
ICON_CACHE.get_or_init(|| Mutex::new(IconCache::new()));
|
ICON_CACHE.get_or_init(|| Mutex::new(IconCache::new()));
|
||||||
LINE_NUMBER_CACHE.get_or_init(|| Mutex::new(LineNumberCache::new()));
|
LINE_NUMBER_CACHE.get_or_init(|| Mutex::new(LineNumberCache::new()));
|
||||||
SWASH_CACHE.get_or_init(|| Mutex::new(SwashCache::new()));
|
SWASH_CACHE.get_or_init(|| Mutex::new(SwashCache::new()));
|
||||||
|
|
@ -972,8 +970,8 @@ impl App {
|
||||||
.iter()
|
.iter()
|
||||||
.position(|theme_name| theme_name == &self.config.syntax_theme_light);
|
.position(|theme_name| theme_name == &self.config.syntax_theme_light);
|
||||||
let font_selected = {
|
let font_selected = {
|
||||||
let font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
let current_font_name = font_system.db().family_name(&Family::Monospace);
|
let current_font_name = font_system.raw().db().family_name(&Family::Monospace);
|
||||||
self.font_names
|
self.font_names
|
||||||
.iter()
|
.iter()
|
||||||
.position(|font_name| font_name == current_font_name)
|
.position(|font_name| font_name == current_font_name)
|
||||||
|
|
@ -1063,8 +1061,9 @@ impl Application for App {
|
||||||
fn init(core: Core, flags: Self::Flags) -> (Self, Command<Self::Message>) {
|
fn init(core: Core, flags: Self::Flags) -> (Self, Command<Self::Message>) {
|
||||||
// Update font name from config
|
// Update font name from config
|
||||||
{
|
{
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
font_system
|
font_system
|
||||||
|
.raw()
|
||||||
.db_mut()
|
.db_mut()
|
||||||
.set_monospace_family(&flags.config.font_name);
|
.set_monospace_family(&flags.config.font_name);
|
||||||
}
|
}
|
||||||
|
|
@ -1073,10 +1072,10 @@ impl Application for App {
|
||||||
|
|
||||||
let font_names = {
|
let font_names = {
|
||||||
let mut font_names = Vec::new();
|
let mut font_names = Vec::new();
|
||||||
let font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
//TODO: do not repeat, used in Tab::new
|
//TODO: do not repeat, used in Tab::new
|
||||||
let attrs = cosmic_text::Attrs::new().family(Family::Monospace);
|
let attrs = cosmic_text::Attrs::new().family(Family::Monospace);
|
||||||
for face in font_system.db().faces() {
|
for face in font_system.raw().db().faces() {
|
||||||
if attrs.matches(face) && face.monospaced {
|
if attrs.matches(face) && face.monospaced {
|
||||||
//TODO: get localized name if possible
|
//TODO: get localized name if possible
|
||||||
let font_name = face
|
let font_name = face
|
||||||
|
|
@ -1343,8 +1342,8 @@ impl Application for App {
|
||||||
if font_name != &self.config.font_name {
|
if font_name != &self.config.font_name {
|
||||||
// Update font name from config
|
// Update font name from config
|
||||||
{
|
{
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
font_system.db_mut().set_monospace_family(font_name);
|
font_system.raw().db_mut().set_monospace_family(font_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset line number cache
|
// Reset line number cache
|
||||||
|
|
@ -2127,7 +2126,9 @@ impl Application for App {
|
||||||
None => popover.show_popup(false),
|
None => popover.show_popup(false),
|
||||||
};
|
};
|
||||||
tab_column = tab_column.push(popover);
|
tab_column = tab_column.push(popover);
|
||||||
tab_column = tab_column.push(text(status).font(Font::MONOSPACE));
|
if !status.is_empty() {
|
||||||
|
tab_column = tab_column.push(text(status).font(Font::MONOSPACE));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some(Tab::GitDiff(tab)) => {
|
Some(Tab::GitDiff(tab)) => {
|
||||||
let mut diff_widget = widget::column::with_capacity(tab.diff.hunks.len());
|
let mut diff_widget = widget::column::with_capacity(tab.diff.hunks.len());
|
||||||
|
|
|
||||||
18
src/tab.rs
18
src/tab.rs
|
|
@ -1,7 +1,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
iced::Point,
|
iced::{advanced::graphics::text::font_system, Point},
|
||||||
widget::{icon, Icon},
|
widget::{icon, Icon},
|
||||||
};
|
};
|
||||||
use cosmic_text::{Attrs, Buffer, Edit, Shaping, SyntaxEditor, ViEditor, Wrap};
|
use cosmic_text::{Attrs, Buffer, Edit, Shaping, SyntaxEditor, ViEditor, Wrap};
|
||||||
|
|
@ -12,7 +12,7 @@ use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{fl, git::GitDiff, mime_icon, Config, FALLBACK_MIME_ICON, FONT_SYSTEM, SYNTAX_SYSTEM};
|
use crate::{fl, git::GitDiff, mime_icon, Config, FALLBACK_MIME_ICON, SYNTAX_SYSTEM};
|
||||||
|
|
||||||
pub enum Tab {
|
pub enum Tab {
|
||||||
Editor(EditorTab),
|
Editor(EditorTab),
|
||||||
|
|
@ -47,7 +47,7 @@ impl EditorTab {
|
||||||
|
|
||||||
let mut buffer = Buffer::new_empty(config.metrics());
|
let mut buffer = Buffer::new_empty(config.metrics());
|
||||||
buffer.set_text(
|
buffer.set_text(
|
||||||
&mut FONT_SYSTEM.get().unwrap().lock().unwrap(),
|
font_system().write().unwrap().raw(),
|
||||||
"",
|
"",
|
||||||
attrs,
|
attrs,
|
||||||
Shaping::Advanced,
|
Shaping::Advanced,
|
||||||
|
|
@ -75,8 +75,8 @@ impl EditorTab {
|
||||||
|
|
||||||
pub fn set_config(&mut self, config: &Config) {
|
pub fn set_config(&mut self, config: &Config) {
|
||||||
let mut editor = self.editor.lock().unwrap();
|
let mut editor = self.editor.lock().unwrap();
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
let mut editor = editor.borrow_with(&mut font_system);
|
let mut editor = editor.borrow_with(font_system.raw());
|
||||||
editor.set_auto_indent(config.auto_indent);
|
editor.set_auto_indent(config.auto_indent);
|
||||||
editor.set_passthrough(!config.vim_bindings);
|
editor.set_passthrough(!config.vim_bindings);
|
||||||
editor.set_tab_width(config.tab_width);
|
editor.set_tab_width(config.tab_width);
|
||||||
|
|
@ -93,8 +93,8 @@ impl EditorTab {
|
||||||
|
|
||||||
pub fn open(&mut self, path: PathBuf) {
|
pub fn open(&mut self, path: PathBuf) {
|
||||||
let mut editor = self.editor.lock().unwrap();
|
let mut editor = self.editor.lock().unwrap();
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
let mut editor = editor.borrow_with(&mut font_system);
|
let mut editor = editor.borrow_with(font_system.raw());
|
||||||
match editor.load_text(&path, self.attrs) {
|
match editor.load_text(&path, self.attrs) {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
log::info!("opened {:?}", path);
|
log::info!("opened {:?}", path);
|
||||||
|
|
@ -115,8 +115,8 @@ impl EditorTab {
|
||||||
|
|
||||||
pub fn reload(&mut self) {
|
pub fn reload(&mut self) {
|
||||||
let mut editor = self.editor.lock().unwrap();
|
let mut editor = self.editor.lock().unwrap();
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
let mut editor = editor.borrow_with(&mut font_system);
|
let mut editor = editor.borrow_with(font_system.raw());
|
||||||
if let Some(path) = &self.path_opt {
|
if let Some(path) = &self.path_opt {
|
||||||
// Save scroll
|
// Save scroll
|
||||||
let scroll = editor.with_buffer(|buffer| buffer.scroll());
|
let scroll = editor.with_buffer(|buffer| buffer.scroll());
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
cosmic_theme::palette::{blend::Compose, WithAlpha},
|
cosmic_theme::palette::{blend::Compose, WithAlpha},
|
||||||
iced::{
|
iced::{
|
||||||
|
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},
|
||||||
|
|
@ -32,7 +33,7 @@ use std::{
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{line_number::LineNumberKey, FONT_SYSTEM, LINE_NUMBER_CACHE, SWASH_CACHE};
|
use crate::{line_number::LineNumberKey, LINE_NUMBER_CACHE, SWASH_CACHE};
|
||||||
|
|
||||||
pub struct TextBox<'a, Message> {
|
pub struct TextBox<'a, Message> {
|
||||||
editor: &'a Mutex<ViEditor<'static, 'static>>,
|
editor: &'a Mutex<ViEditor<'static, 'static>>,
|
||||||
|
|
@ -231,7 +232,7 @@ where
|
||||||
let mut editor = self.editor.lock().unwrap();
|
let mut editor = self.editor.lock().unwrap();
|
||||||
//TODO: set size?
|
//TODO: set size?
|
||||||
editor
|
editor
|
||||||
.borrow_with(&mut FONT_SYSTEM.get().unwrap().lock().unwrap())
|
.borrow_with(font_system().write().unwrap().raw())
|
||||||
.shape_as_needed(true);
|
.shape_as_needed(true);
|
||||||
|
|
||||||
editor.with_buffer(|buffer| {
|
editor.with_buffer(|buffer| {
|
||||||
|
|
@ -333,7 +334,7 @@ where
|
||||||
let image_w = image_w - scrollbar_w;
|
let image_w = image_w - scrollbar_w;
|
||||||
|
|
||||||
// Lock font system (used throughout)
|
// Lock font system (used throughout)
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
|
|
||||||
// Calculate line number information
|
// Calculate line number information
|
||||||
let (line_number_chars, editor_offset_x) = if self.line_numbers {
|
let (line_number_chars, editor_offset_x) = if self.line_numbers {
|
||||||
|
|
@ -351,7 +352,7 @@ where
|
||||||
let mut line_number_cache = LINE_NUMBER_CACHE.get().unwrap().lock().unwrap();
|
let mut line_number_cache = LINE_NUMBER_CACHE.get().unwrap().lock().unwrap();
|
||||||
if let Some(layout_line) = line_number_cache
|
if let Some(layout_line) = line_number_cache
|
||||||
.get(
|
.get(
|
||||||
&mut font_system,
|
font_system.raw(),
|
||||||
LineNumberKey {
|
LineNumberKey {
|
||||||
number: 1,
|
number: 1,
|
||||||
width: line_number_chars,
|
width: line_number_chars,
|
||||||
|
|
@ -380,7 +381,7 @@ where
|
||||||
// Set metrics and size
|
// Set metrics and size
|
||||||
editor.with_buffer_mut(|buffer| {
|
editor.with_buffer_mut(|buffer| {
|
||||||
buffer.set_metrics_and_size(
|
buffer.set_metrics_and_size(
|
||||||
&mut font_system,
|
font_system.raw(),
|
||||||
metrics,
|
metrics,
|
||||||
(image_w - editor_offset_x) as f32,
|
(image_w - editor_offset_x) as f32,
|
||||||
image_h as f32,
|
image_h as f32,
|
||||||
|
|
@ -388,7 +389,7 @@ where
|
||||||
});
|
});
|
||||||
|
|
||||||
// Shape and layout as needed
|
// Shape and layout as needed
|
||||||
editor.shape_as_needed(&mut font_system, true);
|
editor.shape_as_needed(font_system.raw(), true);
|
||||||
|
|
||||||
let mut handle_opt = state.handle_opt.lock().unwrap();
|
let mut handle_opt = state.handle_opt.lock().unwrap();
|
||||||
if editor.redraw() || handle_opt.is_none() {
|
if editor.redraw() || handle_opt.is_none() {
|
||||||
|
|
@ -453,7 +454,7 @@ where
|
||||||
|
|
||||||
if let Some(layout_line) = line_number_cache
|
if let Some(layout_line) = line_number_cache
|
||||||
.get(
|
.get(
|
||||||
&mut font_system,
|
font_system.raw(),
|
||||||
LineNumberKey {
|
LineNumberKey {
|
||||||
number: line_number,
|
number: line_number,
|
||||||
width: line_number_chars,
|
width: line_number_chars,
|
||||||
|
|
@ -475,7 +476,7 @@ where
|
||||||
layout_glyph.physical((0., line_y), metrics.font_size);
|
layout_glyph.physical((0., line_y), metrics.font_size);
|
||||||
|
|
||||||
swash_cache.with_pixels(
|
swash_cache.with_pixels(
|
||||||
&mut font_system,
|
font_system.raw(),
|
||||||
physical_glyph.cache_key,
|
physical_glyph.cache_key,
|
||||||
gutter_foreground,
|
gutter_foreground,
|
||||||
|x, y, color| {
|
|x, y, color| {
|
||||||
|
|
@ -501,7 +502,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw editor
|
// Draw editor
|
||||||
editor.draw(&mut font_system, &mut swash_cache, |x, y, w, h, color| {
|
editor.draw(font_system.raw(), &mut swash_cache, |x, y, w, h, color| {
|
||||||
draw_rect(
|
draw_rect(
|
||||||
pixels,
|
pixels,
|
||||||
Canvas {
|
Canvas {
|
||||||
|
|
@ -687,8 +688,8 @@ where
|
||||||
let mut editor = self.editor.lock().unwrap();
|
let mut editor = self.editor.lock().unwrap();
|
||||||
let buffer_size = editor.with_buffer(|buffer| buffer.size());
|
let buffer_size = editor.with_buffer(|buffer| buffer.size());
|
||||||
let last_changed = editor.changed();
|
let last_changed = editor.changed();
|
||||||
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap();
|
let mut font_system = font_system().write().unwrap();
|
||||||
let mut editor = editor.borrow_with(&mut font_system);
|
let mut editor = editor.borrow_with(font_system.raw());
|
||||||
|
|
||||||
let mut status = Status::Ignored;
|
let mut status = Status::Ignored;
|
||||||
match event {
|
match event {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue