Skip to content

Commit 6c9240b

Browse files
committed
store is added, draw mode is working
1 parent bd5304b commit 6c9240b

File tree

9 files changed

+122
-44
lines changed

9 files changed

+122
-44
lines changed

package-lock.json

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"@fortawesome/free-solid-svg-icons": "^5.15.4",
1414
"@fortawesome/vue-fontawesome": "^2.0.6",
1515
"core-js": "^3.6.5",
16-
"vue": "^2.6.11"
16+
"vue": "^2.6.11",
17+
"vuex": "^3.6.2"
1718
},
1819
"devDependencies": {
1920
"@vue/cli-plugin-babel": "~4.5.0",

src/components/ContentComponent.vue

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<template>
22
<div id="content">
33
<toolbar-component
4-
:penThickness="penThickness"
5-
@thickness-change="thicknessChange"
64
@clear-canvas="clearCanvas"
75
/>
86
<canvas-component
9-
:penThickness="penThickness"
107
ref="canvasComponent"
118
/>
129
</div>
@@ -18,11 +15,6 @@ import CanvasComponent from "@/components/content_components/CanvasComponent.vue
1815
1916
export default {
2017
name: "ContentComponent",
21-
data: function () {
22-
return {
23-
penThickness: "1"
24-
}
25-
},
2618
components: {
2719
ToolbarComponent,
2820
CanvasComponent
@@ -31,9 +23,6 @@ export default {
3123
clearCanvas() {
3224
this.$refs.canvasComponent.clearCanvas();
3325
},
34-
thicknessChange(value) {
35-
this.penThickness = value;
36-
}
3726
}
3827
}
3928
</script>

src/components/content_components/CanvasComponent.vue

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@
88
</template>
99

1010
<script>
11+
import { mapGetters } from "vuex";
12+
1113
export default {
1214
name: "CanvasComponent",
13-
props: {
14-
penThickness: {
15-
type: String,
16-
required: true
17-
}
18-
},
1915
data: function () {
2016
return {
2117
canvas: "",
@@ -24,6 +20,9 @@ export default {
2420
prevY: 0
2521
}
2622
},
23+
computed: {
24+
...mapGetters(["getThickness", "getDrawMode"]),
25+
},
2726
mounted: function () {
2827
const canvas = this.$el.querySelector("canvas");
2928
this.canvas = canvas;
@@ -38,15 +37,17 @@ export default {
3837
this.prevY = event.offsetY;
3938
},
4039
draw(event) {
41-
this.drawLine(this.prevX, this.prevY, event.offsetX, event.offsetY);
40+
if (this.getDrawMode) {
41+
this.drawLine(this.prevX, this.prevY, event.offsetX, event.offsetY);
42+
}
4243
this.prevX = event.offsetX;
4344
this.prevY = event.offsetY;
4445
},
4546
drawLine(x1, y1, x2, y2) {
4647
const ctx = this.ctx;
4748
ctx.beginPath();
4849
ctx.strokeStyle = "#000";
49-
ctx.lineWidth = this.penThickness;
50+
ctx.lineWidth = this.getThickness;
5051
ctx.moveTo(x1, y1);
5152
ctx.lineTo(x2, y2);
5253
ctx.stroke();

src/components/content_components/ToolbarComponent.vue

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<template>
22
<div id="toolbar">
33
<div>
4-
<div id="drawMode">Draw Mode: Off</div>
4+
<div
5+
id="drawMode"
6+
@click="callDrawModeFunc"
7+
>Draw Mode: {{drawMode}}</div>
58
<div id="drawModeInfo">
69
<font-awesome-icon icon="info-circle" />
710
Press d to switch
@@ -19,34 +22,47 @@
1922
>
2023
<font-awesome-icon icon="times" /> Clear
2124
</div>
22-
<custom-range-input
23-
:penThickness="penThickness"
24-
@thickness-change="thicknessChange"
25-
/>
25+
<custom-range-input />
2626
</div>
2727
</template>
2828

2929
<script>
3030
import CustomRangeInput from "@/components/helper_components/CustomRangeInput.vue";
31+
import { mapActions, mapGetters } from "vuex";
3132
3233
export default {
3334
name: "ToolbarComponent",
34-
props: {
35-
penThickness: {
36-
type: String,
37-
required: true
38-
}
39-
},
4035
components: {
4136
CustomRangeInput
4237
},
38+
computed: {
39+
...mapGetters(["getDrawMode"]),
40+
drawMode: function () {
41+
return this.getDrawMode ? "On" : "Off";
42+
}
43+
},
44+
created: function () {
45+
window.addEventListener("keyup", this.drawKeyListener);
46+
},
4347
methods: {
48+
...mapActions(["changeThickness", "changeDrawMode"]),
4449
clearCanvas() {
4550
this.$emit("clear-canvas");
4651
},
4752
thicknessChange(value) {
48-
this.$emit("thickness-change", value)
53+
this.changeThickness(value);
54+
},
55+
callDrawModeFunc() {
56+
this.changeDrawMode(!this.getDrawMode);
57+
},
58+
drawKeyListener(event) {
59+
if (event.key.toLowerCase() === "d") {
60+
this.callDrawModeFunc();
61+
}
4962
}
63+
},
64+
beforeDestroy: function() {
65+
window.removeEventListener("keyup", this.drawKeyListener);
5066
}
5167
}
5268
</script>

src/components/helper_components/CustomRangeInput.vue

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,35 @@
88
v-model="rangeInput.value"
99
@change="thicknessChange"
1010
/>
11-
<p>{{rangeInput.value}}</p>
11+
<p>{{rangeInput.value}} px</p>
1212
</div>
1313
</template>
1414

1515
<script>
16+
import { mapGetters, mapActions } from "vuex";
17+
1618
export default {
1719
name: "CustomRangeInput",
18-
props: {
19-
penThickness: {
20-
type: String,
21-
required: true
22-
}
23-
},
2420
data: function () {
2521
return {
2622
rangeInput: {
2723
step: "1",
2824
min: "1",
2925
max: "10",
30-
value: this.penThickness
26+
value: "3"
3127
}
3228
}
3329
},
30+
created: function() {
31+
this.changeThickness(this.rangeInput.value);
32+
},
33+
computed: {
34+
...mapGetters(["getThickness"]),
35+
},
3436
methods: {
37+
...mapActions(["changeThickness"]),
3538
thicknessChange() {
36-
this.$emit("thickness-change", this.rangeInput.value);
39+
this.changeThickness(this.rangeInput.value);
3740
}
3841
}
3942
}

src/main.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Vue from 'vue';
22
import App from './App.vue';
3+
import store from "@/store";
34
import "@/assets/global.scss";
45

56
// Import font awesome
@@ -11,10 +12,9 @@ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
1112
library.add(faInfoCircle, faPencilAlt, faEraser, faTimes);
1213
Vue.component('font-awesome-icon', FontAwesomeIcon);
1314

14-
15-
1615
Vue.config.productionTip = false
1716

1817
new Vue({
18+
store,
1919
render: h => h(App),
2020
}).$mount('#app')

src/store/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Vuex from "vuex";
2+
import Vue from "vue";
3+
import drawing from "@/store/modules/drawing";
4+
5+
Vue.use(Vuex);
6+
7+
export default new Vuex.Store({
8+
modules: {
9+
drawing
10+
}
11+
})

src/store/modules/drawing.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const state = {
2+
color: null,
3+
thickness: null,
4+
drawMode: true
5+
}
6+
7+
const getters = {
8+
getColor: state => state.color,
9+
getThickness: state => state.thickness,
10+
getDrawMode: state => state.drawMode
11+
}
12+
13+
const actions = {
14+
changeColor({ commit }, color) {
15+
commit("setColor", color);
16+
},
17+
changeThickness({ commit }, thickness) {
18+
commit("setThickness", thickness);
19+
},
20+
changeDrawMode({ commit }, drawMode) {
21+
commit("setDrawMode", drawMode);
22+
}
23+
}
24+
25+
const mutations = {
26+
setColor(state, payload) {
27+
state.color = payload;
28+
},
29+
setThickness(state, payload) {
30+
state.thickness = payload;
31+
},
32+
setDrawMode(state, payload) {
33+
state.drawMode = payload;
34+
}
35+
}
36+
37+
export default {
38+
state,
39+
getters,
40+
actions,
41+
mutations
42+
}

0 commit comments

Comments
 (0)