From 7330ec1ce9afa085eb9971d6b8ebd86cd977c641 Mon Sep 17 00:00:00 2001
From: Ivan Shubin
Date: Sat, 8 Feb 2025 07:26:22 +0100
Subject: [PATCH] added gradient rotation knob
---
assets/css/main.css | 24 ++++++++
.../components/editor/AdvancedColorEditor.vue | 57 +++++++++++++++++--
src/ui/dragndrop.js | 2 +-
3 files changed, 78 insertions(+), 5 deletions(-)
diff --git a/assets/css/main.css b/assets/css/main.css
index 4089917eb..8e7dfc3cb 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -2096,6 +2096,30 @@ ul.button-group.disabled > li, ul.button-group > li.disabled {
width: 38%;
padding: 0 5px 0 5px;
}
+.gradient-controls .gradient-rotation-knob {
+ user-select: none;
+ width: 75px;
+ height: 75px;
+}
+.gradient-controls .gradient-rotation-knob circle,
+.gradient-controls .gradient-rotation-knob line {
+ stroke: var(--base-strong);
+ stroke-width: 1px;
+ cursor: pointer;
+}
+.gradient-controls .gradient-rotation-knob circle.center {
+ stroke-width: 1px;
+ fill: var(--base-strong);
+ stroke: none
+}
+.gradient-controls .gradient-rotation-knob circle.full {
+ fill: var(--base-strong);
+}
+.gradient-controls .gradient-rotation-knob-container {
+ padding-left: 20px;
+ padding-top: 10px;
+}
+
.gradient-color-picker {
float: left;
width: 60%;
diff --git a/src/ui/components/editor/AdvancedColorEditor.vue b/src/ui/components/editor/AdvancedColorEditor.vue
index 1ee9e5a18..7a66f7b5a 100644
--- a/src/ui/components/editor/AdvancedColorEditor.vue
+++ b/src/ui/components/editor/AdvancedColorEditor.vue
@@ -28,7 +28,7 @@
-
+
@@ -76,14 +76,27 @@
Invert
-
+
@@ -100,6 +113,7 @@ import {parseColor, encodeColor} from '../../colors';
import utils from '../../utils';
import StoreUtils from '../../store/StoreUtils';
import myMath from '../../myMath';
+import { getPageCoordsFromEvent } from '../../dragndrop';
/**
@@ -133,7 +147,7 @@ export default {
disabled : {type: Boolean, default : false},
},
- components: {'color-picker': VueColor.Chrome, Modal, NumberTextfield},
+ components: {'ColorPicker': VueColor.Chrome, Modal, NumberTextfield},
beforeMount() {
this.updateCurrentColor(this.value);
@@ -186,6 +200,41 @@ export default {
},
methods: {
+ onGradientRotationKnobMouseDown(originalEvent) {
+ let mouseMoveEventName = originalEvent.touches ? 'touchmove' : 'mousemove';
+ let mouseUpEventName = originalEvent.touches ? 'touchend' : 'mouseup';
+
+ const onMouseMove = (event) => {
+ if (event.buttons === 0) {
+ reset(event);
+ return;
+ }
+ const rect = this.$refs.gradientRotationKnob.getBoundingClientRect();
+ const coords = getPageCoordsFromEvent(event);
+ const x = coords.pageX - rect.left - rect.width/2;
+ const y = coords.pageY - rect.top - rect.height/2;
+ if (Math.abs(x) + Math.abs(y) < 1) {
+ return;
+ }
+
+ this.color.gradient.direction = Math.round(myMath.fullAngleForVector(x, y) * 180 / Math.PI) + 90;
+ this.emitChange();
+ };
+ const onMouseUp = (event) => {
+ reset();
+ onMouseMove(event);
+ };
+
+ const reset = () => {
+ document.removeEventListener(mouseMoveEventName, onMouseMove);
+ document.removeEventListener(mouseUpEventName, onMouseUp);
+ };
+ document.addEventListener(mouseMoveEventName, onMouseMove);
+ document.addEventListener(mouseUpEventName, onMouseUp);
+
+ onMouseMove(originalEvent);
+ },
+
showModal() {
if (this.disabled) {
return;
diff --git a/src/ui/dragndrop.js b/src/ui/dragndrop.js
index 40c9cde73..73e0d6931 100644
--- a/src/ui/dragndrop.js
+++ b/src/ui/dragndrop.js
@@ -1,4 +1,4 @@
-function getPageCoordsFromEvent(event) {
+export function getPageCoordsFromEvent(event) {
if (event.changedTouches && event.changedTouches.length > 0) {
return {
pageX: event.changedTouches[0].pageX,