Add connect mode, portals, backlinks and renames (stage 8d, v1)
Part 8d, the last of stage 8, and with it everything on DESIGN.md's v1 list. Connect mode (C): the cursor goes to another node, a dashed arrow in the visual color follows it, and Enter links the two; then the cursor goes back to where C was typed (the user's pick). d removes the line between them (a branch is cut, and the child comes loose), > puts the node under the other one, and <Space> a, l, c, s and t style the line as you watch, making it when it isn't there yet. Everything connect mode changes is one undo group, and Esc takes it back with History::cancel, which leaves nothing to redo. From visual mode every selected node connects, and the line pickers go back to connect mode when they close. Portals show their document live, from a cache of what each document file holds (open documents from their buffers, the others from their files, looked at every second): the root's title, its color and how many nodes it has, or ? when the document isn't there. Enter or gf goes through, as a jump, and the pane's breadcrumb starts with the documents it came through. <Space>p types :portal (the user's pick): a path as :e takes it, or the title of a new document. Backlinks are put right whenever a document is opened or saved; the root shows how many, the Note view lists them, gu goes up to them (the user's pick) and :backlinks lists them. File names follow the root's title: when it changed, the next save renames the file (-2 when the name is taken; a folder's default document keeps its name), and the portals pointing at it, its backlinks in the documents it leads to, the recent documents, the capital marks and the jump lists follow. A portal whose file was moved by hand finds its document in that folder by uid. Portals in a register keep full paths, so a pasted portal leads to the same document from any folder. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
bd819409f4
commit
ebe8a5988e
45 files changed
+2329
-148
No files matched your search
@@ -1,9 +1,12 @@
|
||||
//! Editing a node's text: rapid entry, empty titles, `o` inside a title,
|
||||
//! bodies and tags, and the document following the text.
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
use super::*;
|
||||
use crate::app::buffer::Buffer;
|
||||
use crate::app::mode::Mode;
|
||||
use crate::app::portals::Portals;
|
||||
use crate::input::bindings::Context;
|
||||
use crate::input::engine::{KeyEngine, Outcome};
|
||||
use crate::input::key::parse_keys;
|
||||
@@ -46,12 +49,15 @@ impl App {
|
||||
fn press(&mut self, keys: &str) {
|
||||
for key in parse_keys(keys, DEFAULT_LEADER).unwrap() {
|
||||
let normal = Mode::Normal;
|
||||
let portals = Portals::default();
|
||||
let ctx = ViewContext {
|
||||
doc: self.buffer.doc(),
|
||||
cursor: self.buffer.cursor(),
|
||||
mode: &normal,
|
||||
theme: &self.theme,
|
||||
settings: &self.settings,
|
||||
portals: &portals,
|
||||
folder: Path::new("."),
|
||||
};
|
||||
let actions = match &mut self.mode {
|
||||
Mode::Text(edit) if edit.editor.is_typing() => {
|
||||
@@ -79,12 +85,15 @@ impl App {
|
||||
}
|
||||
Action::App(AppAction::StartEdit(start)) => {
|
||||
let normal = Mode::Normal;
|
||||
let portals = Portals::default();
|
||||
let ctx = ViewContext {
|
||||
doc: self.buffer.doc(),
|
||||
cursor: self.buffer.cursor(),
|
||||
mode: &normal,
|
||||
theme: &self.theme,
|
||||
settings: &self.settings,
|
||||
portals: &portals,
|
||||
folder: Path::new("."),
|
||||
};
|
||||
match TextEdit::start(&ctx, start) {
|
||||
Ok(edit) => self.mode = Mode::Text(edit),
|
||||
|
||||
Reference in new issue
Block a user