Skip to content

Commit f225756

Browse files
Fix text layer getting deselected after clicking out of Text tool interactive editing (#2144)
* properties panel remains active when user edits text layer * Keep text layers selected after editing * Update editor/src/messages/portfolio/document/document_message_handler.rs * Delete Empty Text Layer on Escape or Right Click * Fix: delete empty text layer on right click --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent 39a7b76 commit f225756

File tree

4 files changed

+48
-16
lines changed

4 files changed

+48
-16
lines changed

editor/src/messages/tool/tool_messages/text_tool.rs

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub enum TextToolMessage {
5656
CommitText,
5757
EditSelected,
5858
Interact,
59-
TextChange { new_text: String },
59+
TextChange { new_text: String, is_right_click: bool },
6060
UpdateBounds { new_text: String },
6161
UpdateOptions(TextOptionsUpdate),
6262
}
@@ -241,6 +241,19 @@ struct TextToolData {
241241
}
242242

243243
impl TextToolData {
244+
fn delete_empty_layer(&mut self, font_cache: &FontCache, responses: &mut VecDeque<Message>) -> TextToolFsmState {
245+
// Remove the editable textbox UI first
246+
self.set_editing(false, font_cache, responses);
247+
248+
// Delete the empty text layer and update the graph
249+
responses.add(NodeGraphMessage::DeleteNodes {
250+
node_ids: vec![self.layer.to_node()],
251+
delete_children: true,
252+
});
253+
responses.add(NodeGraphMessage::RunDocumentGraph);
254+
255+
TextToolFsmState::Ready
256+
}
244257
/// Set the editing state of the currently modifying layer
245258
fn set_editing(&self, editable: bool, font_cache: &FontCache, responses: &mut VecDeque<Message>) {
246259
if let Some(editing_text) = self.editing_text.as_ref().filter(|_| editable) {
@@ -253,9 +266,13 @@ impl TextToolData {
253266
transform: editing_text.transform.to_cols_array(),
254267
});
255268
} else {
269+
// Check if DisplayRemoveEditableTextbox is already in the responses queue
270+
let has_remove_textbox = responses.iter().any(|msg| matches!(msg, Message::Frontend(FrontendMessage::DisplayRemoveEditableTextbox)));
256271
responses.add(FrontendMessage::DisplayRemoveEditableTextbox);
257-
// Clear all selected nodes when no longer editing
258-
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: Vec::new() });
272+
273+
if has_remove_textbox {
274+
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: Vec::new() });
275+
}
259276
}
260277
}
261278

@@ -474,20 +491,34 @@ impl Fsm for TextToolFsmState {
474491
TextToolFsmState::Ready
475492
}
476493
(TextToolFsmState::Editing, TextToolMessage::CommitText) => {
477-
responses.add(FrontendMessage::TriggerTextCommit);
494+
if tool_data.new_text.is_empty() {
495+
return tool_data.delete_empty_layer(font_cache, responses);
496+
}
478497

498+
responses.add(FrontendMessage::TriggerTextCommit);
479499
TextToolFsmState::Editing
480500
}
481-
(TextToolFsmState::Editing, TextToolMessage::TextChange { new_text }) => {
482-
tool_data.set_editing(false, font_cache, responses);
501+
(TextToolFsmState::Editing, TextToolMessage::TextChange { new_text, is_right_click }) => {
502+
tool_data.new_text = new_text;
483503

484-
responses.add(NodeGraphMessage::SetInput {
485-
input_connector: InputConnector::node(graph_modification_utils::get_text_id(tool_data.layer, &document.network_interface).unwrap(), 1),
486-
input: NodeInput::value(TaggedValue::String(new_text), false),
487-
});
488-
responses.add(NodeGraphMessage::RunDocumentGraph);
504+
if !is_right_click {
505+
tool_data.set_editing(false, font_cache, responses);
489506

490-
TextToolFsmState::Ready
507+
responses.add(NodeGraphMessage::SetInput {
508+
input_connector: InputConnector::node(graph_modification_utils::get_text_id(tool_data.layer, &document.network_interface).unwrap(), 1),
509+
input: NodeInput::value(TaggedValue::String(tool_data.new_text.clone()), false),
510+
});
511+
responses.add(NodeGraphMessage::RunDocumentGraph);
512+
513+
TextToolFsmState::Ready
514+
} else {
515+
if tool_data.new_text.is_empty() {
516+
return tool_data.delete_empty_layer(font_cache, responses);
517+
}
518+
519+
responses.add(FrontendMessage::TriggerTextCommit);
520+
TextToolFsmState::Editing
521+
}
491522
}
492523
(TextToolFsmState::Editing, TextToolMessage::UpdateBounds { new_text }) => {
493524
tool_data.new_text = new_text;

frontend/src/components/panels/Document.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@
300300
export function triggerTextCommit() {
301301
if (!textInput) return;
302302
const textCleaned = textInputCleanup(textInput.innerText);
303-
editor.handle.onChangeText(textCleaned);
303+
editor.handle.onChangeText(textCleaned, false);
304304
}
305305
306306
export async function displayEditableTextbox(displayEditableTextbox: DisplayEditableTextbox) {

frontend/src/io-managers/input.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli
172172
}
173173

174174
if (!inTextInput && !inContextMenu) {
175-
if (textToolInteractiveInputElement) editor.handle.onChangeText(textInputCleanup(textToolInteractiveInputElement.innerText));
175+
const isRightClick = e.button === 2;
176+
if (textToolInteractiveInputElement) editor.handle.onChangeText(textInputCleanup(textToolInteractiveInputElement.innerText), isRightClick);
176177
else viewportPointerInteractionOngoing = isTargetingCanvas instanceof Element;
177178
}
178179

frontend/wasm/src/editor_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,8 @@ impl EditorHandle {
433433

434434
/// A text box was committed
435435
#[wasm_bindgen(js_name = onChangeText)]
436-
pub fn on_change_text(&self, new_text: String) -> Result<(), JsValue> {
437-
let message = TextToolMessage::TextChange { new_text };
436+
pub fn on_change_text(&self, new_text: String, is_right_click: bool) -> Result<(), JsValue> {
437+
let message = TextToolMessage::TextChange { new_text, is_right_click };
438438
self.dispatch(message);
439439

440440
Ok(())

0 commit comments

Comments
 (0)