mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 02:08:12 +08:00
Make the toggle overlays button functional (#484)
* Make the toggle overlays button functional * Move state from the OverlaysMessageHandler to DocumentMessageHandler * Code review fixes
This commit is contained in:
@@ -91,6 +91,9 @@ pub enum DocumentMessage {
|
|||||||
SetOpacityForSelectedLayers {
|
SetOpacityForSelectedLayers {
|
||||||
opacity: f64,
|
opacity: f64,
|
||||||
},
|
},
|
||||||
|
SetOverlaysVisibility {
|
||||||
|
visible: bool,
|
||||||
|
},
|
||||||
SetSelectedLayers {
|
SetSelectedLayers {
|
||||||
replacement_selected_layers: Vec<Vec<LayerId>>,
|
replacement_selected_layers: Vec<Vec<LayerId>>,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ pub struct DocumentMessageHandler {
|
|||||||
artboard_message_handler: ArtboardMessageHandler,
|
artboard_message_handler: ArtboardMessageHandler,
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
transform_layer_handler: TransformLayerMessageHandler,
|
transform_layer_handler: TransformLayerMessageHandler,
|
||||||
|
pub overlays_visible: bool,
|
||||||
pub snapping_enabled: bool,
|
pub snapping_enabled: bool,
|
||||||
pub view_mode: ViewMode,
|
pub view_mode: ViewMode,
|
||||||
pub version: String,
|
pub version: String,
|
||||||
@@ -61,6 +62,7 @@ impl Default for DocumentMessageHandler {
|
|||||||
artboard_message_handler: ArtboardMessageHandler::default(),
|
artboard_message_handler: ArtboardMessageHandler::default(),
|
||||||
transform_layer_handler: TransformLayerMessageHandler::default(),
|
transform_layer_handler: TransformLayerMessageHandler::default(),
|
||||||
snapping_enabled: true,
|
snapping_enabled: true,
|
||||||
|
overlays_visible: true,
|
||||||
view_mode: ViewMode::default(),
|
view_mode: ViewMode::default(),
|
||||||
version: GRAPHITE_DOCUMENT_VERSION.to_string(),
|
version: GRAPHITE_DOCUMENT_VERSION.to_string(),
|
||||||
}
|
}
|
||||||
@@ -703,11 +705,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
|
|||||||
responses.push_back(ToolMessage::DocumentIsDirty.into());
|
responses.push_back(ToolMessage::DocumentIsDirty.into());
|
||||||
}
|
}
|
||||||
Overlays(message) => {
|
Overlays(message) => {
|
||||||
self.overlays_message_handler.process_action(
|
self.overlays_message_handler.process_action(message, self.overlays_visible, responses);
|
||||||
message,
|
|
||||||
(Self::layer_metadata_mut_no_borrow_self(&mut self.layer_metadata, &[]), &self.graphene_document, ipp),
|
|
||||||
responses,
|
|
||||||
);
|
|
||||||
// responses.push_back(OverlaysMessage::RenderOverlays.into());
|
// responses.push_back(OverlaysMessage::RenderOverlays.into());
|
||||||
}
|
}
|
||||||
Redo => {
|
Redo => {
|
||||||
@@ -909,6 +907,10 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
|
|||||||
responses.push_back(DocumentOperation::SetLayerOpacity { path, opacity }.into());
|
responses.push_back(DocumentOperation::SetLayerOpacity { path, opacity }.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SetOverlaysVisibility { visible } => {
|
||||||
|
self.overlays_visible = visible;
|
||||||
|
responses.push_back(OverlaysMessage::Rerender.into());
|
||||||
|
}
|
||||||
SetSelectedLayers { replacement_selected_layers } => {
|
SetSelectedLayers { replacement_selected_layers } => {
|
||||||
let selected = self.layer_metadata.iter_mut().filter(|(_, layer_metadata)| layer_metadata.selected);
|
let selected = self.layer_metadata.iter_mut().filter(|(_, layer_metadata)| layer_metadata.selected);
|
||||||
selected.for_each(|(path, layer_metadata)| {
|
selected.for_each(|(path, layer_metadata)| {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
pub enum OverlaysMessage {
|
pub enum OverlaysMessage {
|
||||||
ClearAllOverlays,
|
ClearAllOverlays,
|
||||||
DispatchOperation(Box<DocumentOperation>),
|
DispatchOperation(Box<DocumentOperation>),
|
||||||
|
Rerender,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<DocumentOperation> for OverlaysMessage {
|
impl From<DocumentOperation> for OverlaysMessage {
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
use super::layer_panel::LayerMetadata;
|
|
||||||
use crate::input::InputPreprocessorMessageHandler;
|
|
||||||
use crate::message_prelude::*;
|
use crate::message_prelude::*;
|
||||||
|
|
||||||
use graphene::document::Document;
|
|
||||||
use graphene::document::Document as GrapheneDocument;
|
use graphene::document::Document as GrapheneDocument;
|
||||||
use graphene::layers::style::ViewMode;
|
use graphene::layers::style::ViewMode;
|
||||||
|
|
||||||
@@ -11,12 +8,11 @@ pub struct OverlaysMessageHandler {
|
|||||||
pub overlays_graphene_document: GrapheneDocument,
|
pub overlays_graphene_document: GrapheneDocument,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MessageHandler<OverlaysMessage, (&mut LayerMetadata, &Document, &InputPreprocessorMessageHandler)> for OverlaysMessageHandler {
|
impl MessageHandler<OverlaysMessage, bool> for OverlaysMessageHandler {
|
||||||
#[remain::check]
|
#[remain::check]
|
||||||
fn process_action(&mut self, message: OverlaysMessage, _data: (&mut LayerMetadata, &Document, &InputPreprocessorMessageHandler), responses: &mut VecDeque<Message>) {
|
fn process_action(&mut self, message: OverlaysMessage, overlays_visible: bool, responses: &mut VecDeque<Message>) {
|
||||||
use OverlaysMessage::*;
|
use OverlaysMessage::*;
|
||||||
|
|
||||||
// let (layer_metadata, document, ipp) = data;
|
|
||||||
#[remain::sorted]
|
#[remain::sorted]
|
||||||
match message {
|
match message {
|
||||||
ClearAllOverlays => todo!(),
|
ClearAllOverlays => todo!(),
|
||||||
@@ -24,12 +20,17 @@ impl MessageHandler<OverlaysMessage, (&mut LayerMetadata, &Document, &InputPrepr
|
|||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(e) => log::error!("OverlaysError: {:?}", e),
|
Err(e) => log::error!("OverlaysError: {:?}", e),
|
||||||
},
|
},
|
||||||
|
Rerender => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render overlays
|
// Render overlays
|
||||||
responses.push_back(
|
responses.push_back(
|
||||||
FrontendMessage::UpdateDocumentOverlays {
|
FrontendMessage::UpdateDocumentOverlays {
|
||||||
svg: self.overlays_graphene_document.render_root(ViewMode::Normal),
|
svg: if overlays_visible {
|
||||||
|
self.overlays_graphene_document.render_root(ViewMode::Normal)
|
||||||
|
} else {
|
||||||
|
String::from("")
|
||||||
|
},
|
||||||
}
|
}
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ img {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.unsupported-modal {
|
.unsupported-modal {
|
||||||
background: var(--color-3-darkgray);
|
background: var(--color-3-darkgray);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@@ -199,6 +200,7 @@ img {
|
|||||||
color: var(--color-accent-hover);
|
color: var(--color-accent-hover);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.unsupported-modal-button {
|
.unsupported-modal-button {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
background: var(--color-1-nearblack);
|
background: var(--color-1-nearblack);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="spacer"></div>
|
<div class="spacer"></div>
|
||||||
<div class="right side">
|
<div class="right side">
|
||||||
<OptionalInput v-model:checked="snappingEnabled" @update:checked="(newStatus: boolean) => setSnap(newStatus)" :icon="'Snapping'" title="Snapping" />
|
<OptionalInput v-model:checked="snappingEnabled" @update:checked="(snap: boolean) => setSnapping(snap)" :icon="'Snapping'" title="Snapping" />
|
||||||
<PopoverButton>
|
<PopoverButton>
|
||||||
<h3>Snapping</h3>
|
<h3>Snapping</h3>
|
||||||
<p>The contents of this popover menu are coming soon</p>
|
<p>The contents of this popover menu are coming soon</p>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<Separator :type="'Unrelated'" />
|
<Separator :type="'Unrelated'" />
|
||||||
|
|
||||||
<OptionalInput v-model:checked="overlaysEnabled" @update:checked="() => dialog.comingSoon(99)" :icon="'Overlays'" title="Overlays" />
|
<OptionalInput v-model:checked="overlaysEnabled" @update:checked="(visible: boolean) => setOverlaysVisibility(visible)" :icon="'Overlays'" title="Overlays" />
|
||||||
<PopoverButton>
|
<PopoverButton>
|
||||||
<h3>Overlays</h3>
|
<h3>Overlays</h3>
|
||||||
<p>The contents of this popover menu are coming soon</p>
|
<p>The contents of this popover menu are coming soon</p>
|
||||||
@@ -283,8 +283,11 @@ import Separator from "@/components/widgets/separators/Separator.vue";
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
inject: ["editor", "dialog"],
|
inject: ["editor", "dialog"],
|
||||||
methods: {
|
methods: {
|
||||||
setSnap(newStatus: boolean) {
|
setSnapping(snap: boolean) {
|
||||||
this.editor.instance.set_snapping(newStatus);
|
this.editor.instance.set_snapping(snap);
|
||||||
|
},
|
||||||
|
setOverlaysVisibility(visible: boolean) {
|
||||||
|
this.editor.instance.set_overlays_visibility(visible);
|
||||||
},
|
},
|
||||||
setViewMode(newViewMode: string) {
|
setViewMode(newViewMode: string) {
|
||||||
this.editor.instance.set_view_mode(newViewMode);
|
this.editor.instance.set_view_mode(newViewMode);
|
||||||
|
|||||||
@@ -415,12 +415,18 @@ impl JsEditorHandle {
|
|||||||
self.dispatch(message);
|
self.dispatch(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set snapping disabled / enabled
|
/// Set snapping on or off
|
||||||
pub fn set_snapping(&self, snap: bool) {
|
pub fn set_snapping(&self, snap: bool) {
|
||||||
let message = DocumentMessage::SetSnapping { snap };
|
let message = DocumentMessage::SetSnapping { snap };
|
||||||
self.dispatch(message);
|
self.dispatch(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set display of overlays on or off
|
||||||
|
pub fn set_overlays_visibility(&self, visible: bool) {
|
||||||
|
let message = DocumentMessage::SetOverlaysVisibility { visible };
|
||||||
|
self.dispatch(message);
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the view mode to change the way layers are drawn in the viewport
|
/// Set the view mode to change the way layers are drawn in the viewport
|
||||||
pub fn set_view_mode(&self, view_mode: String) -> Result<(), JsValue> {
|
pub fn set_view_mode(&self, view_mode: String) -> Result<(), JsValue> {
|
||||||
if let Some(view_mode) = translate_view_mode(view_mode.as_str()) {
|
if let Some(view_mode) = translate_view_mode(view_mode.as_str()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user