Skip to content

Commit 4fead6e

Browse files
zeroisheroKeavon
andauthored
Add option to toggle ruler visibility (#1479)
* Sending Toggle Ruler message and setting visibility. Text and markers not working * Added resize on mount for Ruler Input * Set default for rulers_visible to pass test * Ruler Visibility portfolio wide instead of document * Sending Toggle Ruler message and setting visibility. Text and markers not working * Ruler Visibility portfolio wide instead of document * Cleanup * Reorganize the View menu bar; add toggle rulers hotkey * Remove non-working redundant bools, and make rulers set per-document --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
1 parent 4fdf841 commit 4fead6e

9 files changed

Lines changed: 68 additions & 17 deletions

File tree

editor/src/messages/frontend/frontend_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ pub enum FrontendMessage {
173173
origin: (f64, f64),
174174
spacing: f64,
175175
interval: f64,
176+
visible: bool,
176177
},
177178
UpdateDocumentScrollbars {
178179
position: (f64, f64),

editor/src/messages/input_mapper/default_mapping.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ pub fn default_mapping() -> Mapping {
343343
entry!(KeyDown(KeyI); modifiers=[Accel], action_dispatch=PortfolioMessage::Import),
344344
entry!(KeyDown(KeyX); modifiers=[Accel], action_dispatch=PortfolioMessage::Cut { clipboard: Clipboard::Device }),
345345
entry!(KeyDown(KeyC); modifiers=[Accel], action_dispatch=PortfolioMessage::Copy { clipboard: Clipboard::Device }),
346+
entry!(KeyDown(KeyR); modifiers=[Alt], action_dispatch=PortfolioMessage::ToggleRulers),
346347
//
347348
// FrontendMessage
348349
entry!(KeyDown(KeyV); modifiers=[Accel], action_dispatch=FrontendMessage::TriggerPaste),

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ use graphene_core::raster::ImageFrame;
3030
use glam::{DAffine2, DVec2};
3131
use serde::{Deserialize, Serialize};
3232

33+
/// Utility function for providing a default boolean value to serde.
34+
#[inline(always)]
35+
fn return_true() -> bool {
36+
true
37+
}
38+
3339
#[derive(Clone, Debug, Serialize, Deserialize)]
3440
pub struct DocumentMessageHandler {
3541
pub document_legacy: DocumentLegacy,
@@ -43,6 +49,8 @@ pub struct DocumentMessageHandler {
4349
#[serde(skip)]
4450
pub snapping_state: SnappingState,
4551
pub overlays_visible: bool,
52+
#[serde(default = "return_true")]
53+
pub rulers_visible: bool,
4654

4755
#[serde(skip)]
4856
pub document_undo_history: VecDeque<DocumentSave>,
@@ -81,6 +89,7 @@ impl Default for DocumentMessageHandler {
8189
view_mode: ViewMode::default(),
8290
snapping_state: SnappingState::default(),
8391
overlays_visible: true,
92+
rulers_visible: true,
8493

8594
document_undo_history: VecDeque::new(),
8695
document_redo_history: VecDeque::new(),
@@ -614,6 +623,7 @@ impl MessageHandler<DocumentMessage, DocumentInputs<'_>> for DocumentMessageHand
614623
origin: ruler_origin.into(),
615624
spacing: ruler_spacing,
616625
interval: ruler_interval,
626+
visible: self.rulers_visible,
617627
});
618628
}
619629
RenderScrollbars => {

editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ use crate::messages::prelude::*;
66
#[derive(Debug, Clone, Default)]
77
pub struct MenuBarMessageHandler {
88
no_active_document: bool,
9+
rulers_hidden: bool,
910
}
1011

11-
impl MessageHandler<MenuBarMessage, bool> for MenuBarMessageHandler {
12+
impl MessageHandler<MenuBarMessage, (bool, bool)> for MenuBarMessageHandler {
1213
#[remain::check]
13-
fn process_message(&mut self, message: MenuBarMessage, responses: &mut VecDeque<Message>, has_active_document: bool) {
14+
fn process_message(&mut self, message: MenuBarMessage, responses: &mut VecDeque<Message>, (has_active_document, rulers_hidden): (bool, bool)) {
1415
use MenuBarMessage::*;
1516
self.no_active_document = !has_active_document;
16-
17+
self.rulers_hidden = rulers_hidden;
1718
#[remain::sorted]
1819
match message {
1920
SendLayout => self.send_layout(responses, LayoutTarget::MenuBar),
@@ -289,8 +290,17 @@ impl LayoutHolder for MenuBarMessageHandler {
289290
disabled: no_active_document,
290291
..MenuBarEntry::default()
291292
},
293+
],
294+
vec![
295+
MenuBarEntry {
296+
label: "Zoom to Fit Selection".into(),
297+
shortcut: action_keys!(NavigationMessageDiscriminant::FitViewportToSelection),
298+
action: MenuBarEntry::create_action(|_| NavigationMessage::FitViewportToSelection.into()),
299+
disabled: no_active_document,
300+
..MenuBarEntry::default()
301+
},
292302
MenuBarEntry {
293-
label: "Zoom to Fit".into(),
303+
label: "Zoom to Fit All".into(),
294304
shortcut: action_keys!(DocumentMessageDiscriminant::ZoomCanvasToFitAll),
295305
action: MenuBarEntry::create_action(|_| DocumentMessage::ZoomCanvasToFitAll.into()),
296306
disabled: no_active_document,
@@ -312,9 +322,10 @@ impl LayoutHolder for MenuBarMessageHandler {
312322
},
313323
],
314324
vec![MenuBarEntry {
315-
label: "Frame Selected".into(),
316-
shortcut: action_keys!(NavigationMessageDiscriminant::FitViewportToSelection),
317-
action: MenuBarEntry::create_action(|_| NavigationMessage::FitViewportToSelection.into()),
325+
label: "Rulers".into(),
326+
icon: Some(if self.rulers_hidden { "CheckboxUnchecked" } else { "CheckboxChecked" }.into()),
327+
shortcut: action_keys!(PortfolioMessageDiscriminant::ToggleRulers),
328+
action: MenuBarEntry::create_action(|_| PortfolioMessage::ToggleRulers.into()),
318329
disabled: no_active_document,
319330
..MenuBarEntry::default()
320331
}],

editor/src/messages/portfolio/portfolio_message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub enum PortfolioMessage {
114114
document_id: u64,
115115
layer_path: Vec<LayerId>,
116116
},
117+
ToggleRulers,
117118
UpdateDocumentWidgets,
118119
UpdateOpenDocumentsList,
119120
}

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ impl MessageHandler<PortfolioMessage, (&InputPreprocessorMessageHandler, &Prefer
3838
match message {
3939
// Sub-messages
4040
#[remain::unsorted]
41-
PortfolioMessage::MenuBar(message) => self.menu_bar_message_handler.process_message(message, responses, has_active_document),
41+
PortfolioMessage::MenuBar(message) => {
42+
if let Some(document_id) = self.active_document_id {
43+
if let Some(document) = self.documents.get_mut(&document_id) {
44+
self.menu_bar_message_handler.process_message(message, responses, (has_active_document, document.rulers_visible));
45+
}
46+
}
47+
}
4248
#[remain::unsorted]
4349
PortfolioMessage::Document(message) => {
4450
if let Some(document_id) = self.active_document_id {
@@ -517,6 +523,14 @@ impl MessageHandler<PortfolioMessage, (&InputPreprocessorMessageHandler, &Prefer
517523
});
518524
}
519525
}
526+
PortfolioMessage::ToggleRulers => {
527+
if let Some(document) = self.active_document_mut() {
528+
document.rulers_visible = !document.rulers_visible;
529+
530+
responses.add(DocumentMessage::RenderRulers);
531+
responses.add(MenuBarMessage::SendLayout);
532+
}
533+
}
520534
PortfolioMessage::UpdateDocumentWidgets => {
521535
if let Some(document) = self.active_document() {
522536
document.update_document_widgets(responses);
@@ -552,6 +566,7 @@ impl MessageHandler<PortfolioMessage, (&InputPreprocessorMessageHandler, &Prefer
552566
OpenDocument,
553567
PasteIntoFolder,
554568
PrevDocument,
569+
ToggleRulers,
555570
);
556571

557572
if self.graph_view_overlay_open {

frontend/src/components/panels/Document.svelte

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
let rulerOrigin: XY = { x: 0, y: 0 };
5858
let rulerSpacing = 100;
5959
let rulerInterval = 100;
60+
let rulersVisible = true;
6061
6162
// Rendered SVG viewport data
6263
let artworkSvg = "";
@@ -213,10 +214,11 @@
213214
scrollbarMultiplier = multiplier;
214215
}
215216
216-
export function updateDocumentRulers(origin: XY, spacing: number, interval: number) {
217+
export function updateDocumentRulers(origin: XY, spacing: number, interval: number, visible: boolean) {
217218
rulerOrigin = origin;
218219
rulerSpacing = spacing;
219220
rulerInterval = interval;
221+
rulersVisible = visible;
220222
}
221223
222224
// Update mouse cursor icon
@@ -371,8 +373,8 @@
371373
editor.subscriptions.subscribeJsMessage(UpdateDocumentRulers, async (data) => {
372374
await tick();
373375
374-
const { origin, spacing, interval } = data;
375-
updateDocumentRulers(origin, spacing, interval);
376+
const { origin, spacing, interval, visible } = data;
377+
updateDocumentRulers(origin, spacing, interval, visible);
376378
});
377379
378380
// Update mouse cursor icon
@@ -440,13 +442,17 @@
440442
</LayoutCol>
441443
</LayoutCol>
442444
<LayoutCol class="table">
443-
<LayoutRow class="ruler-or-scrollbar top-ruler">
444-
<RulerInput origin={rulerOrigin.x} majorMarkSpacing={rulerSpacing} numberInterval={rulerInterval} direction="Horizontal" bind:this={rulerHorizontal} />
445-
</LayoutRow>
445+
{#if rulersVisible}
446+
<LayoutRow class="ruler-or-scrollbar top-ruler">
447+
<RulerInput origin={rulerOrigin.x} majorMarkSpacing={rulerSpacing} numberInterval={rulerInterval} direction="Horizontal" bind:this={rulerHorizontal} />
448+
</LayoutRow>
449+
{/if}
446450
<LayoutRow class="viewport-container">
447-
<LayoutCol class="ruler-or-scrollbar">
448-
<RulerInput origin={rulerOrigin.y} majorMarkSpacing={rulerSpacing} numberInterval={rulerInterval} direction="Vertical" bind:this={rulerVertical} />
449-
</LayoutCol>
451+
{#if rulersVisible}
452+
<LayoutCol class="ruler-or-scrollbar">
453+
<RulerInput origin={rulerOrigin.y} majorMarkSpacing={rulerSpacing} numberInterval={rulerInterval} direction="Vertical" bind:this={rulerVertical} />
454+
</LayoutCol>
455+
{/if}
450456
<LayoutCol class="viewport-container" styles={{ cursor: canvasCursor }}>
451457
{#if cursorEyedropper}
452458
<EyedropperPreview

frontend/src/components/widgets/inputs/RulerInput.svelte

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
</script>
44

55
<script lang="ts">
6+
import { onMount } from "svelte";
7+
68
const RULER_THICKNESS = 16;
79
const MAJOR_MARK_THICKNESS = 16;
810
const MEDIUM_MARK_THICKNESS = 6;
@@ -96,6 +98,8 @@
9698
const remainder = n % m;
9799
return Math.floor(remainder >= 0 ? remainder : remainder + m);
98100
}
101+
102+
onMount(resize);
99103
</script>
100104

101105
<div class={`ruler-input ${direction.toLowerCase()}`} bind:this={rulerInput}>

frontend/src/wasm-communication/messages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,8 @@ export class UpdateDocumentRulers extends JsMessage {
473473
readonly spacing!: number;
474474

475475
readonly interval!: number;
476+
477+
readonly visible!: boolean;
476478
}
477479

478480
export class UpdateEyedropperSamplingState extends JsMessage {

0 commit comments

Comments
 (0)