mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-26 18:48:11 +08:00
Add an editor preference for touched/enclosed/directional based selection (#2156)
* implemented left selection logic * added logic for right ward selection * removed the logs code * corrected capitalization error * corrected capitalization error * added radio buttons for selection_mode * fixed multiple selection of checkboxes * adapted to the RadioEntryData * State management bug * integrated message system to selection_mode * updated * updated * added selection mode to transition arms * removed from portfolio message and added preference in ToolMessageData * removed dead code of selection_mode from frontend logic * removed dead code for zoomWithScroll * Cleanup * Rename, simplify, use dashed box, and highlight only outlines of layers that'll get selected * More code review --------- Co-authored-by: Pratik Agrawal <patrik@Pratiks-MacBook-Air.local> Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
co-authored by
Pratik Agrawal
Keavon Chambers
parent
93880abc4c
commit
96c57605b7
@@ -1407,6 +1407,29 @@ impl DocumentMessageHandler {
|
||||
self.intersect_quad(viewport_quad, ipp).filter(|layer| !self.network_interface.is_artboard(&layer.to_node(), &[]))
|
||||
}
|
||||
|
||||
pub fn is_layer_fully_inside(&self, layer: &LayerNodeIdentifier, quad: graphene_core::renderer::Quad) -> bool {
|
||||
// Get the bounding box of the layer in document space
|
||||
let Some(bounding_box) = self.metadata().bounding_box_viewport(*layer) else { return false };
|
||||
|
||||
// Check if the bounding box is fully within the selection quad
|
||||
let [top_left, bottom_right] = bounding_box;
|
||||
|
||||
let quad_bbox = quad.bounding_box();
|
||||
|
||||
let quad_left = quad_bbox[0].x;
|
||||
let quad_right = quad_bbox[1].x;
|
||||
let quad_top = quad_bbox[0].y.max(quad_bbox[1].y); // Correct top
|
||||
let quad_bottom = quad_bbox[0].y.min(quad_bbox[1].y); // Correct bottom
|
||||
|
||||
// Extract layer's bounding box coordinates
|
||||
let layer_left = top_left.x;
|
||||
let layer_right = bottom_right.x;
|
||||
let layer_top = bottom_right.y;
|
||||
let layer_bottom = top_left.y;
|
||||
|
||||
layer_left >= quad_left && layer_right <= quad_right && layer_top <= quad_top && layer_bottom >= quad_bottom
|
||||
}
|
||||
|
||||
/// Find all of the layers that were clicked on from a viewport space location
|
||||
pub fn click_xray(&self, ipp: &InputPreprocessorMessageHandler) -> impl Iterator<Item = LayerNodeIdentifier> + '_ {
|
||||
let document_to_viewport = self.navigation_handler.calculate_offset_transform(ipp.viewport_bounds.center(), &self.document_ptz);
|
||||
|
||||
@@ -460,7 +460,7 @@ impl DoubleEndedIterator for DescendantsIter<'_> {
|
||||
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct NodeRelations {
|
||||
parent: Option<LayerNodeIdentifier>,
|
||||
pub parent: Option<LayerNodeIdentifier>,
|
||||
previous_sibling: Option<LayerNodeIdentifier>,
|
||||
next_sibling: Option<LayerNodeIdentifier>,
|
||||
first_child: Option<LayerNodeIdentifier>,
|
||||
|
||||
@@ -46,16 +46,16 @@ pub enum PortfolioMessage {
|
||||
document_id: DocumentId,
|
||||
},
|
||||
DestroyAllDocuments,
|
||||
EditorPreferences,
|
||||
FontLoaded {
|
||||
font_family: String,
|
||||
font_style: String,
|
||||
preview_url: String,
|
||||
data: Vec<u8>,
|
||||
},
|
||||
ImaginateCheckServerStatus,
|
||||
ImaginatePollServerStatus,
|
||||
EditorPreferences,
|
||||
ImaginateServerHostname,
|
||||
// ImaginateCheckServerStatus,
|
||||
// ImaginatePollServerStatus,
|
||||
// ImaginateServerHostname,
|
||||
Import,
|
||||
LoadDocumentResources {
|
||||
document_id: DocumentId,
|
||||
|
||||
@@ -9,6 +9,7 @@ use crate::messages::layout::utility_types::widget_prelude::*;
|
||||
use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type;
|
||||
use crate::messages::portfolio::document::utility_types::clipboards::{Clipboard, CopyBufferEntry, INTERNAL_CLIPBOARD_COUNT};
|
||||
use crate::messages::portfolio::document::DocumentMessageData;
|
||||
use crate::messages::preferences::SelectionMode;
|
||||
use crate::messages::prelude::*;
|
||||
use crate::messages::tool::utility_types::{HintData, HintGroup, ToolType};
|
||||
use crate::node_graph_executor::{ExportConfig, NodeGraphExecutor};
|
||||
@@ -38,6 +39,7 @@ pub struct PortfolioMessageHandler {
|
||||
copy_buffer: [Vec<CopyBufferEntry>; INTERNAL_CLIPBOARD_COUNT as usize],
|
||||
pub persistent_data: PersistentData,
|
||||
pub executor: NodeGraphExecutor,
|
||||
pub selection_mode: SelectionMode,
|
||||
}
|
||||
|
||||
impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMessageHandler {
|
||||
@@ -295,35 +297,35 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
|
||||
responses.add(NodeGraphMessage::RunDocumentGraph);
|
||||
}
|
||||
}
|
||||
PortfolioMessage::ImaginateCheckServerStatus => {
|
||||
let server_status = self.persistent_data.imaginate.server_status().clone();
|
||||
self.persistent_data.imaginate.poll_server_check();
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
if let Some(fut) = self.persistent_data.imaginate.initiate_server_check() {
|
||||
wasm_bindgen_futures::spawn_local(async move {
|
||||
let () = fut.await;
|
||||
use wasm_bindgen::prelude::*;
|
||||
// PortfolioMessage::ImaginateCheckServerStatus => {
|
||||
// let server_status = self.persistent_data.imaginate.server_status().clone();
|
||||
// self.persistent_data.imaginate.poll_server_check();
|
||||
// #[cfg(target_arch = "wasm32")]
|
||||
// if let Some(fut) = self.persistent_data.imaginate.initiate_server_check() {
|
||||
// wasm_bindgen_futures::spawn_local(async move {
|
||||
// let () = fut.await;
|
||||
// use wasm_bindgen::prelude::*;
|
||||
|
||||
#[wasm_bindgen(module = "/../frontend/src/editor.ts")]
|
||||
extern "C" {
|
||||
#[wasm_bindgen(js_name = injectImaginatePollServerStatus)]
|
||||
fn inject();
|
||||
}
|
||||
inject();
|
||||
})
|
||||
}
|
||||
if &server_status != self.persistent_data.imaginate.server_status() {
|
||||
responses.add(PropertiesPanelMessage::Refresh);
|
||||
}
|
||||
}
|
||||
PortfolioMessage::ImaginatePollServerStatus => {
|
||||
self.persistent_data.imaginate.poll_server_check();
|
||||
responses.add(PropertiesPanelMessage::Refresh);
|
||||
}
|
||||
// #[wasm_bindgen(module = "/../frontend/src/editor.ts")]
|
||||
// extern "C" {
|
||||
// #[wasm_bindgen(js_name = injectImaginatePollServerStatus)]
|
||||
// fn inject();
|
||||
// }
|
||||
// inject();
|
||||
// })
|
||||
// }
|
||||
// if &server_status != self.persistent_data.imaginate.server_status() {
|
||||
// responses.add(PropertiesPanelMessage::Refresh);
|
||||
// }
|
||||
// }
|
||||
// PortfolioMessage::ImaginatePollServerStatus => {
|
||||
// self.persistent_data.imaginate.poll_server_check();
|
||||
// responses.add(PropertiesPanelMessage::Refresh);
|
||||
// }
|
||||
PortfolioMessage::EditorPreferences => self.executor.update_editor_preferences(preferences.editor_preferences()),
|
||||
PortfolioMessage::ImaginateServerHostname => {
|
||||
self.persistent_data.imaginate.set_host_name(&preferences.imaginate_server_hostname);
|
||||
}
|
||||
// PortfolioMessage::ImaginateServerHostname => {
|
||||
// self.persistent_data.imaginate.set_host_name(&preferences.imaginate_server_hostname);
|
||||
// }
|
||||
PortfolioMessage::Import => {
|
||||
// This portfolio message wraps the frontend message so it can be listed as an action, which isn't possible for frontend messages
|
||||
responses.add(FrontendMessage::TriggerImport);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use graphene_std::{imaginate::ImaginatePersistentData, text::FontCache};
|
||||
use graphene_std::imaginate::ImaginatePersistentData;
|
||||
use graphene_std::text::FontCache;
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct PersistentData {
|
||||
|
||||
Reference in New Issue
Block a user