- Select
+
@@ -132,11 +132,6 @@
display: flex;
align-items: center;
margin: 0 4px;
-
- .label {
- white-space: nowrap;
- font-weight: bold;
- }
}
}
@@ -177,21 +172,19 @@ import IconButton from "../widgets/buttons/IconButton.vue";
import PopoverButton from "../widgets/buttons/PopoverButton.vue";
import RadioInput from "../widgets/inputs/RadioInput.vue";
import NumberInput from "../widgets/inputs/NumberInput.vue";
+import DropdownInput from "../widgets/inputs/DropdownInput.vue";
+import { SectionsOfMenuListEntries } from "../widgets/floating-menus/MenuList.vue";
+
+const modeMenuEntries: SectionsOfMenuListEntries = [
+ [
+ { label: "Design Mode", icon: "ViewportDesignMode" },
+ { label: "Select Mode", icon: "ViewportSelectMode" },
+ ],
+];
const wasm = import("../../../wasm/pkg");
export default defineComponent({
- components: {
- LayoutRow,
- LayoutCol,
- WorkingColors,
- ShelfItem,
- Separator,
- IconButton,
- PopoverButton,
- RadioInput,
- NumberInput,
- },
methods: {
async canvasMouseDown(e: MouseEvent) {
const { on_mouse_down } = await wasm;
@@ -259,7 +252,20 @@ export default defineComponent({
MenuDirection,
SeparatorDirection,
SeparatorType,
+ modeMenuEntries,
};
},
+ components: {
+ LayoutRow,
+ LayoutCol,
+ WorkingColors,
+ ShelfItem,
+ Separator,
+ IconButton,
+ PopoverButton,
+ RadioInput,
+ NumberInput,
+ DropdownInput,
+ },
});
diff --git a/client/web/src/components/panels/LayerTree.vue b/client/web/src/components/panels/LayerTree.vue
index c633f61ed..50e57cfb2 100644
--- a/client/web/src/components/panels/LayerTree.vue
+++ b/client/web/src/components/panels/LayerTree.vue
@@ -1,6 +1,10 @@
+
+
+
+
@@ -38,6 +42,10 @@
margin: 0 4px;
align-items: center;
+ .dropdown-input {
+ flex: 0 0 auto;
+ }
+
.number-input {
flex: 1 1 100%;
}
@@ -88,19 +96,21 @@ import PopoverButton from "../widgets/buttons/PopoverButton.vue";
import { MenuDirection } from "../widgets/floating-menus/FloatingMenu.vue";
import IconButton from "../widgets/buttons/IconButton.vue";
import Icon from "../widgets/labels/Icon.vue";
+import DropdownInput from "../widgets/inputs/DropdownInput.vue";
+import { SectionsOfMenuListEntries } from "../widgets/floating-menus/MenuList.vue";
const wasm = import("../../../wasm/pkg");
+const blendModeMenuEntries: SectionsOfMenuListEntries = [
+ [{ label: "Normal" }],
+ [{ label: "Multiply" }, { label: "Darken" }, { label: "Color Burn" }, { label: "Linear Burn" }, { label: "Darker Color" }],
+ [{ label: "Screen" }, { label: "Lighten" }, { label: "Color Dodge" }, { label: "Linear Dodge (Add)" }, { label: "Lighter Color" }],
+ [{ label: "Overlay" }, { label: "Soft Light" }, { label: "Hard Light" }, { label: "Vivid Light" }, { label: "Linear Light" }, { label: "Pin Light" }, { label: "Hard Mix" }],
+ [{ label: "Difference" }, { label: "Exclusion" }, { label: "Subtract" }, { label: "Divide" }],
+ [{ label: "Hue" }, { label: "Saturation" }, { label: "Color" }, { label: "Luminosity" }],
+];
+
export default defineComponent({
- components: {
- LayoutRow,
- LayoutCol,
- Separator,
- PopoverButton,
- NumberInput,
- IconButton,
- Icon,
- },
props: {},
methods: {
async toggleLayerVisibility(path: BigUint64Array) {
@@ -125,10 +135,21 @@ export default defineComponent({
},
data() {
return {
+ blendModeMenuEntries,
MenuDirection,
SeparatorType,
layers: [] as Array,
};
},
+ components: {
+ LayoutRow,
+ LayoutCol,
+ Separator,
+ PopoverButton,
+ NumberInput,
+ IconButton,
+ Icon,
+ DropdownInput,
+ },
});
diff --git a/client/web/src/components/widgets/floating-menus/FloatingMenu.vue b/client/web/src/components/widgets/floating-menus/FloatingMenu.vue
index 8a23607b7..75b1b2980 100644
--- a/client/web/src/components/widgets/floating-menus/FloatingMenu.vue
+++ b/client/web/src/components/widgets/floating-menus/FloatingMenu.vue
@@ -2,7 +2,7 @@
-
+
@@ -140,6 +148,9 @@ export default defineComponent({
if (menuEntry.ref) menuEntry.ref.setOpen();
else throw new Error("The menu bar floating menu has no associated ref");
},
+ actionNotImplemented() {
+ alert("This action is not yet implemented");
+ },
},
data() {
return {
diff --git a/client/web/src/components/widgets/labels/Icon.vue b/client/web/src/components/widgets/labels/Icon.vue
index f2573a6c5..c3e9b0f6e 100644
--- a/client/web/src/components/widgets/labels/Icon.vue
+++ b/client/web/src/components/widgets/labels/Icon.vue
@@ -77,6 +77,8 @@ import GraphiteLogo from "../../../../assets/16px-solid/graphite-logo.svg";
import File from "../../../../assets/16px-solid/file.svg";
import Copy from "../../../../assets/16px-solid/copy.svg";
import Paste from "../../../../assets/16px-solid/paste.svg";
+import ViewportDesignMode from "../../../../assets/16px-solid/viewport-design-mode.svg";
+import ViewportSelectMode from "../../../../assets/16px-solid/viewport-select-mode.svg";
import SwapButton from "../../../../assets/12px-solid/swap.svg";
import ResetColorsButton from "../../../../assets/12px-solid/reset-colors.svg";
@@ -148,6 +150,8 @@ const icons = {
File: { component: File, size: 16 },
Copy: { component: Copy, size: 16 },
Paste: { component: Paste, size: 16 },
+ ViewportDesignMode: { component: ViewportDesignMode, size: 16 },
+ ViewportSelectMode: { component: ViewportSelectMode, size: 16 },
SwapButton: { component: SwapButton, size: 12 },
ResetColorsButton: { component: ResetColorsButton, size: 12 },
DropdownArrow: { component: DropdownArrow, size: 12 },
diff --git a/client/web/src/components/widgets/labels/TextLabel.vue b/client/web/src/components/widgets/labels/TextLabel.vue
new file mode 100644
index 000000000..4f307a154
--- /dev/null
+++ b/client/web/src/components/widgets/labels/TextLabel.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+