mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-19 19:08:05 +08:00
Add initial tool settings messaging to backend
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<h3>{{ option.title }}</h3>
|
||||
<p>{{ option.placeholder_text }}</p>
|
||||
</PopoverButton>
|
||||
<NumberInput v-if="option.kind === 'number'" :initialValue="option.initial" :step="option.step" :updateOnCallback="false" />
|
||||
<NumberInput v-if="option.kind === 'number'" :callback="option.callback" :initialValue="option.initial" :step="option.step" :updateOnCallback="false" />
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
@@ -28,6 +28,8 @@ 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>;
|
||||
|
||||
@@ -54,60 +56,64 @@ interface NumberOption {
|
||||
kind: "number";
|
||||
initial: number;
|
||||
step: number;
|
||||
callback?: Function;
|
||||
}
|
||||
|
||||
const optionsMap: ToolOptionsMap = new Map([
|
||||
[
|
||||
"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 }]],
|
||||
]);
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
activeTool: { type: String },
|
||||
},
|
||||
computed: {},
|
||||
methods: {},
|
||||
methods: {
|
||||
async setToolSettings() {
|
||||
const { set_tool_settings, ToolSettings } = await wasm;
|
||||
set_tool_settings(this.$props.activeTool || "Select", new ToolSettings());
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
optionsMap,
|
||||
optionsMap: new Map([
|
||||
[
|
||||
"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,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
@@ -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))
|
||||
|
||||
@@ -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::*;
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user