Show changed status
This commit is contained in:
parent
c84a256376
commit
3716300139
4 changed files with 80 additions and 36 deletions
17
src/main.rs
17
src/main.rs
|
|
@ -125,6 +125,7 @@ pub enum Message {
|
|||
SelectAll,
|
||||
SyntaxTheme(usize, bool),
|
||||
TabActivate(segmented_button::Entity),
|
||||
TabChanged(segmented_button::Entity),
|
||||
TabClose(segmented_button::Entity),
|
||||
Todo,
|
||||
ToggleContextPage(ContextPage),
|
||||
|
|
@ -706,8 +707,8 @@ impl Application for App {
|
|||
if tab.path_opt.is_none() {
|
||||
//TODO: use async file dialog
|
||||
tab.path_opt = rfd::FileDialog::new().save_file();
|
||||
title_opt = Some(tab.title());
|
||||
}
|
||||
title_opt = Some(tab.title());
|
||||
tab.save();
|
||||
}
|
||||
None => {
|
||||
|
|
@ -754,6 +755,15 @@ impl Application for App {
|
|||
self.tab_model.activate(entity);
|
||||
return self.update_tab();
|
||||
}
|
||||
Message::TabChanged(entity) => match self.tab_model.data::<Tab>(entity) {
|
||||
Some(tab) => {
|
||||
let mut title = tab.title();
|
||||
//TODO: better way of adding change indicator
|
||||
title.push_str(" \u{2022}");
|
||||
self.tab_model.text_set(entity, title);
|
||||
}
|
||||
None => {}
|
||||
},
|
||||
Message::TabClose(entity) => {
|
||||
// Activate closest item
|
||||
if let Some(position) = self.tab_model.position(entity) {
|
||||
|
|
@ -997,7 +1007,10 @@ impl Application for App {
|
|||
}
|
||||
}
|
||||
};
|
||||
tab_column = tab_column.push(text_box(&tab.editor, self.config.metrics()));
|
||||
tab_column = tab_column.push(
|
||||
text_box(&tab.editor, self.config.metrics())
|
||||
.on_changed(Message::TabChanged(self.tab_model.active())),
|
||||
);
|
||||
tab_column = tab_column.push(text(status).font(cosmic::font::Font::MONOSPACE));
|
||||
}
|
||||
None => {
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ impl Tab {
|
|||
|
||||
pub fn save(&mut self) {
|
||||
if let Some(path) = &self.path_opt {
|
||||
let editor = self.editor.lock().unwrap();
|
||||
let mut editor = self.editor.lock().unwrap();
|
||||
let mut text = String::new();
|
||||
for line in editor.buffer().lines.iter() {
|
||||
text.push_str(line.text());
|
||||
|
|
@ -85,6 +85,7 @@ impl Tab {
|
|||
}
|
||||
match fs::write(path, text) {
|
||||
Ok(()) => {
|
||||
editor.set_changed(false);
|
||||
log::info!("saved {:?}", path);
|
||||
}
|
||||
Err(err) => {
|
||||
|
|
@ -96,6 +97,11 @@ impl Tab {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn changed(&self) -> bool {
|
||||
let editor = self.editor.lock().unwrap();
|
||||
editor.changed()
|
||||
}
|
||||
|
||||
pub fn icon(&self, size: u16) -> Icon {
|
||||
match &self.path_opt {
|
||||
Some(path) => mime_icon(path, size),
|
||||
|
|
|
|||
|
|
@ -57,18 +57,23 @@ impl StyleSheet for Theme {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct TextBox<'a> {
|
||||
pub struct TextBox<'a, Message> {
|
||||
editor: &'a Mutex<ViEditor<'static>>,
|
||||
metrics: Metrics,
|
||||
padding: Padding,
|
||||
on_changed: Option<Message>,
|
||||
}
|
||||
|
||||
impl<'a> TextBox<'a> {
|
||||
impl<'a, Message> TextBox<'a, Message>
|
||||
where
|
||||
Message: Clone,
|
||||
{
|
||||
pub fn new(editor: &'a Mutex<ViEditor<'static>>, metrics: Metrics) -> Self {
|
||||
Self {
|
||||
editor,
|
||||
metrics,
|
||||
padding: Padding::new(0.0),
|
||||
on_changed: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -76,9 +81,20 @@ impl<'a> TextBox<'a> {
|
|||
self.padding = padding.into();
|
||||
self
|
||||
}
|
||||
|
||||
pub fn on_changed(mut self, on_changed: Message) -> Self {
|
||||
self.on_changed = Some(on_changed);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn text_box<'a>(editor: &'a Mutex<ViEditor<'static>>, metrics: Metrics) -> TextBox<'a> {
|
||||
pub fn text_box<'a, Message>(
|
||||
editor: &'a Mutex<ViEditor<'static>>,
|
||||
metrics: Metrics,
|
||||
) -> TextBox<'a, Message>
|
||||
where
|
||||
Message: Clone,
|
||||
{
|
||||
TextBox::new(editor, metrics)
|
||||
}
|
||||
|
||||
|
|
@ -149,8 +165,9 @@ fn draw_rect(
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, 'editor, Message, Renderer> Widget<Message, Renderer> for TextBox<'a>
|
||||
impl<'a, 'editor, Message, Renderer> Widget<Message, Renderer> for TextBox<'a, Message>
|
||||
where
|
||||
Message: Clone,
|
||||
Renderer: renderer::Renderer + image::Renderer<Handle = image::Handle>,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
|
|
@ -393,7 +410,7 @@ where
|
|||
cursor_position: mouse::Cursor,
|
||||
_renderer: &Renderer,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
_shell: &mut Shell<'_, Message>,
|
||||
shell: &mut Shell<'_, Message>,
|
||||
_viewport: &Rectangle<f32>,
|
||||
) -> Status {
|
||||
let state = tree.state.downcast_mut::<State>();
|
||||
|
|
@ -401,6 +418,7 @@ where
|
|||
let scrollbar_rect = state.scrollbar_rect.get();
|
||||
let mut editor = self.editor.lock().unwrap();
|
||||
let buffer_size = editor.buffer().size();
|
||||
let last_changed = editor.changed();
|
||||
let mut font_system = FONT_SYSTEM.lock().unwrap();
|
||||
let mut editor = editor.borrow_with(&mut font_system);
|
||||
|
||||
|
|
@ -567,16 +585,23 @@ where
|
|||
_ => (),
|
||||
}
|
||||
|
||||
if editor.changed() != last_changed {
|
||||
if let Some(on_changed) = &self.on_changed {
|
||||
shell.publish(on_changed.clone());
|
||||
}
|
||||
}
|
||||
|
||||
status
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'editor, Message, Renderer> From<TextBox<'a>> for Element<'a, Message, Renderer>
|
||||
impl<'a, 'editor, Message, Renderer> From<TextBox<'a, Message>> for Element<'a, Message, Renderer>
|
||||
where
|
||||
Message: Clone + 'a,
|
||||
Renderer: renderer::Renderer + image::Renderer<Handle = image::Handle>,
|
||||
Renderer::Theme: StyleSheet,
|
||||
{
|
||||
fn from(text_box: TextBox<'a>) -> Self {
|
||||
fn from(text_box: TextBox<'a, Message>) -> Self {
|
||||
Self::new(text_box)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue