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:
Keavon Chambers
2022-01-16 09:40:47 -08:00
parent 10205ef599
commit 94ecbf7112
7 changed files with 35 additions and 17 deletions
+3
View File
@@ -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)| {
+1
View File
@@ -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(),
); );
+2
View File
@@ -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);
+7 -4
View File
@@ -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);
+7 -1
View File
@@ -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()) {