Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 3 additions & 43 deletions client/web/src/components/panels/Document.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,7 @@

<Separator :type="SeparatorType.Section" />

<IconButton :icon="'AlignHorizontalLeft'" :size="24" title="Horizontal Align Left" />
<IconButton :icon="'AlignHorizontalCenter'" :size="24" title="Horizontal Align Center" />
<IconButton :icon="'AlignHorizontalRight'" :size="24" gapAfter title="Horizontal Align Right" />

<Separator :type="SeparatorType.Unrelated" />

<IconButton :icon="'AlignVerticalTop'" :size="24" title="Vertical Align Top" />
<IconButton :icon="'AlignVerticalCenter'" :size="24" title="Vertical Align Center" />
<IconButton :icon="'AlignVerticalBottom'" :size="24" title="Vertical Align Bottom" />

<Separator :type="SeparatorType.Related" />

<PopoverButton>
<h3>Align</h3>
<p>More alignment-related buttons will be here</p>
</PopoverButton>

<Separator :type="SeparatorType.Section" />

<IconButton :icon="'FlipHorizontal'" :size="24" title="Flip Horizontal" />
<IconButton :icon="'FlipVertical'" :size="24" title="Flip Vertical" />

<Separator :type="SeparatorType.Related" />

<PopoverButton>
<h3>Flip</h3>
<p>More flip-related buttons will be here</p>
</PopoverButton>

<Separator :type="SeparatorType.Section" />

<IconButton :icon="'BooleanUnion'" :size="24" title="Boolean Union" />
<IconButton :icon="'BooleanSubtractFront'" :size="24" title="Boolean Subtract Front" />
<IconButton :icon="'BooleanSubtractBack'" :size="24" title="Boolean Subtract Back" />
<IconButton :icon="'BooleanIntersect'" :size="24" title="Boolean Intersect" />
<IconButton :icon="'BooleanDifference'" :size="24" title="Boolean Difference" />

<Separator :type="SeparatorType.Related" />

<PopoverButton>
<h3>Boolean</h3>
<p>More boolean-related buttons will be here</p>
</PopoverButton>
<ToolOptions :activeTool="activeTool" />
</div>
<div class="spacer"></div>
<div class="right side">
Expand Down Expand Up @@ -255,6 +213,7 @@ import RadioInput from "@/components/widgets/inputs/RadioInput.vue";
import NumberInput from "@/components/widgets/inputs/NumberInput.vue";
import DropdownInput from "@/components/widgets/inputs/DropdownInput.vue";
import OptionalInput from "@/components/widgets/inputs/OptionalInput.vue";
import ToolOptions from "@/components/widgets/options/ToolOptions.vue";
import { SectionsOfMenuListEntries } from "@/components/widgets/floating-menus/MenuList.vue";

const modeMenuEntries: SectionsOfMenuListEntries = [
Expand Down Expand Up @@ -401,6 +360,7 @@ export default defineComponent({
NumberInput,
DropdownInput,
OptionalInput,
ToolOptions,
},
});
</script>
127 changes: 127 additions & 0 deletions client/web/src/components/widgets/options/ToolOptions.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<template>
<div class="tool-options">
<template v-for="(option, index) in optionsMap.get(activeTool) || []" :key="index">
<IconButton v-if="option.kind === 'icon'" :icon="option.icon" :size="24" :title="option.title" />
<Separator v-if="option.kind === 'separator'" :type="option.type" />
<PopoverButton v-if="option.kind === 'popover'">
<h3>{{ option.title }}</h3>
<p>{{ option.placeholder_text }}</p>
</PopoverButton>
<NumberInput v-if="option.kind === 'number'" :callback="option.callback" :initialValue="option.initial" :step="option.step" :updateOnCallback="false" />
</template>
</div>
</template>

<style lang="scss">
.tool-options {
height: 100%;
flex: 0 0 auto;
display: flex;
align-items: center;
}
</style>

<script lang="ts">
import { defineComponent } from "vue";
import Separator, { SeparatorType } from "@/components/widgets/separators/Separator.vue";
import IconButton from "@/components/widgets/buttons/IconButton.vue";
import PopoverButton from "@/components/widgets/buttons/PopoverButton.vue";
import NumberInput from "@/components/widgets/inputs/NumberInput.vue";

const wasm = import("@/../wasm/pkg");

type ToolOptionsList = Array<ToolOptions>;
type ToolOptionsMap = Map<string, ToolOptionsList>;

Comment thread
henryksloan marked this conversation as resolved.
type ToolOptions = IconOption | SeparatorOption | PopoverOption | NumberOption;

interface IconOption {
Comment thread
henryksloan marked this conversation as resolved.
Outdated
kind: "icon";
icon: string;
title: string;
}

interface SeparatorOption {
kind: "separator";
type: SeparatorType;
}

interface PopoverOption {
kind: "popover";
title: string;
placeholder_text: string;
Comment thread
henryksloan marked this conversation as resolved.
Outdated
}

interface NumberOption {
kind: "number";
initial: number;
step: number;
callback?: Function;
}

export default defineComponent({
props: {
activeTool: { type: String },
},
computed: {},
methods: {
async setToolSettings() {
const { set_tool_settings, ToolSettings } = await wasm;
set_tool_settings(this.$props.activeTool || "Select", new ToolSettings());
},
},
data() {
return {
optionsMap: new Map([
Comment thread
henryksloan marked this conversation as resolved.
Outdated
[
"Select",
[
{ kind: "icon", icon: "AlignHorizontalLeft", title: "Horizontal Align Left" },
{ kind: "icon", icon: "AlignHorizontalCenter", title: "Horizontal Align Center" },
{ kind: "icon", icon: "AlignHorizontalRight", title: "Horizontal Align Right" },

{ kind: "separator", type: SeparatorType.Unrelated },

{ kind: "icon", icon: "AlignVerticalTop", title: "Vertical Align Top" },
{ kind: "icon", icon: "AlignVerticalCenter", title: "Vertical Align Center" },
{ kind: "icon", icon: "AlignVerticalBottom", title: "Vertical Align Bottom" },

{ kind: "separator", type: SeparatorType.Related },

{ kind: "popover", title: "Align", placeholder_text: "More alignment-related buttons will be here" },

{ kind: "separator", type: SeparatorType.Section },

{ kind: "icon", icon: "FlipHorizontal", title: "Flip Horizontal" },
{ kind: "icon", icon: "FlipVertical", title: "Flip Vertical" },

{ kind: "separator", type: SeparatorType.Related },

{ kind: "popover", title: "Flip", placeholder_text: "More flip-related buttons will be here" },

{ kind: "separator", type: SeparatorType.Section },

{ kind: "icon", icon: "BooleanUnion", title: "Boolean Union" },
{ kind: "icon", icon: "BooleanSubtractFront", title: "Boolean Subtract Front" },
{ kind: "icon", icon: "BooleanSubtractBack", title: "Boolean Subtract Back" },
{ kind: "icon", icon: "BooleanIntersect", title: "Boolean Intersect" },
{ kind: "icon", icon: "BooleanDifference", title: "Boolean Difference" },

{ kind: "separator", type: SeparatorType.Related },

{ kind: "popover", title: "Boolean", placeholder_text: "More boolean-related buttons will be here" },
],
],
["Shape", [{ kind: "number", initial: 6, step: 1, callback: this.setToolSettings }]],
]),
SeparatorType,
};
},
components: {
Separator,
IconButton,
PopoverButton,
NumberInput,
},
});
</script>
11 changes: 10 additions & 1 deletion client/web/wasm/src/document.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::shims::Error;
use crate::wrappers::{translate_key, translate_tool, Color};
use crate::wrappers::{translate_key, translate_tool, Color, ToolSettings};
use crate::EDITOR_STATE;
use editor_core::input::input_preprocessor::ModifierKeys;
use editor_core::input::mouse::ScrollDelta;
Expand All @@ -23,6 +23,15 @@ pub fn select_tool(tool: String) -> Result<(), JsValue> {
})
}

/// Update the settings for a given tool
#[wasm_bindgen]
pub fn set_tool_settings(tool: String, settings: ToolSettings) -> Result<(), JsValue> {
EDITOR_STATE.with(|editor| match translate_tool(&tool) {
Some(tool) => editor.borrow_mut().handle_message(ToolMessage::SetToolSettings(tool, settings.inner())).map_err(convert_error),
None => Err(Error::new(&format!("Couldn't select {} because it was not recognized as a valid tool", tool)).into()),
})
}

#[wasm_bindgen]
pub fn select_document(document: usize) -> Result<(), JsValue> {
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::SelectDocument(document)).map_err(convert_error))
Expand Down
22 changes: 22 additions & 0 deletions client/web/wasm/src/wrappers.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use crate::shims::Error;
use editor_core::input::keyboard::Key;
use editor_core::tool::tool_settings::Shape;
use editor_core::tool::tool_settings::ToolSettings as InnerToolSettings;
use editor_core::tool::{SelectAppendMode, ToolType};
use editor_core::Color as InnerColor;
use wasm_bindgen::prelude::*;
Expand All @@ -24,6 +26,26 @@ impl Color {
}
}

#[wasm_bindgen]
pub struct ToolSettings(InnerToolSettings);

#[wasm_bindgen]
impl ToolSettings {
#[wasm_bindgen(constructor)]
pub fn new() -> Result<ToolSettings, JsValue> {
// TODO
Ok(Self(InnerToolSettings::Shape {
shape: Shape::Polygon { vertices: 6 },
}))
}
}

impl ToolSettings {
pub fn inner(&self) -> InnerToolSettings {
self.0
}
}

macro_rules! match_string_to_enum {
(match ($e:expr) {$($var:ident),* $(,)?}) => {
match $e {
Expand Down
2 changes: 1 addition & 1 deletion core/editor/src/tool/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub trait Fsm {
pub struct DocumentToolData {
pub primary_color: Color,
pub secondary_color: Color,
tool_settings: HashMap<ToolType, ToolSettings>,
pub tool_settings: HashMap<ToolType, ToolSettings>,
}

type SubToolMessageHandler = dyn for<'a> MessageHandler<ToolMessage, ToolActionHandlerData<'a>>;
Expand Down
8 changes: 6 additions & 2 deletions core/editor/src/tool/tool_message_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use document_core::color::Color;
use crate::input::InputPreprocessor;
use crate::{
document::Document,
tool::{ToolFsmState, ToolType},
tool::{tool_settings::ToolSettings, ToolFsmState, ToolType},
};
use std::collections::VecDeque;

Expand All @@ -16,6 +16,7 @@ pub enum ToolMessage {
SelectSecondaryColor(Color),
SwapColors,
ResetColors,
SetToolSettings(ToolType, ToolSettings),
#[child]
Fill(FillMessage),
#[child]
Expand Down Expand Up @@ -89,6 +90,9 @@ impl MessageHandler<ToolMessage, (&Document, &InputPreprocessor)> for ToolMessag
.into(),
)
}
SetToolSettings(tool_type, tool_settings) => {
self.tool_state.document_tool_data.tool_settings.insert(tool_type, tool_settings);
}
message => {
let tool_type = match message {
Fill(_) => ToolType::Fill,
Expand All @@ -111,7 +115,7 @@ impl MessageHandler<ToolMessage, (&Document, &InputPreprocessor)> for ToolMessag
}
}
fn actions(&self) -> ActionList {
let mut list = actions!(ToolMessageDiscriminant; ResetColors, SwapColors, SelectTool);
let mut list = actions!(ToolMessageDiscriminant; ResetColors, SwapColors, SelectTool, SetToolSettings);
list.extend(self.tool_state.tool_data.active_tool().actions());
list
}
Expand Down
7 changes: 7 additions & 0 deletions core/editor/src/tool/tools/shape.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ impl Fsm for ShapeToolFsmState {
data.drag_current = input.mouse.position;

data.sides = 6;
if let Some(tool_settings) = tool_data.tool_settings.get(&crate::tool::ToolType::Shape) {
if let crate::tool::ToolSettings::Shape { shape } = tool_settings {
if let crate::tool::Shape::Polygon { vertices } = shape {
data.sides = *vertices as u8;
Comment thread
henryksloan marked this conversation as resolved.
Outdated
}
}
};

responses.push_back(Operation::MountWorkingFolder { path: vec![] }.into());
Dragging
Expand Down