feat: add basic touchscreen support

This is basically a migration from mouse events to
[pointer events](
  https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events
).

The `PointerEvent` interface inherits all of the `MouseEvent`
properties, meaning that existing code can essentially be left
as-is. The only major change is making sure we only respond to the
"primary" pointer.

Known issues include:
* stylus hover is not detected
* touchscreens do not have a concept of hover, making it difficult
  to e.g. resize areas
* no touch gesture support, e.g. "pinch-to-zoom"
This commit is contained in:
Felix Zedén Yverås
2024-06-26 20:43:56 +02:00
parent 075a98d444
commit cdecf7c633
8 changed files with 95 additions and 67 deletions

View File

@@ -22,7 +22,7 @@ export default function Table(props) {
const [hoveredField, setHoveredField] = useState(-1);
const {
tableData,
onMouseDown,
onPointerDown,
setHoveredTable,
handleGripField,
setLinkingLine,
@@ -67,7 +67,7 @@ export default function Table(props) {
width={settings.tableWidth}
height={height}
className="group drop-shadow-lg rounded-md cursor-move"
onMouseDown={onMouseDown}
onPointerDown={onPointerDown}
>
<div
onDoubleClick={openEditor}
@@ -266,14 +266,18 @@ export default function Table(props) {
? ""
: "border-b border-gray-400"
} group h-[36px] px-2 py-1 flex justify-between items-center gap-1 w-full overflow-hidden`}
onMouseEnter={() => {
onPointerEnter={(e) => {
if (!e.isPrimary) return;
setHoveredField(index);
setHoveredTable({
tableId: tableData.id,
field: index,
});
}}
onMouseLeave={() => {
onPointerLeave={(e) => {
if (!e.isPrimary) return;
setHoveredField(-1);
}}
>
@@ -284,7 +288,9 @@ export default function Table(props) {
>
<button
className="flex-shrink-0 w-[10px] h-[10px] bg-[#2f68adcc] rounded-full"
onMouseDown={() => {
onPointerDown={(e) => {
if (!e.isPrimary) return;
handleGripField(index);
setLinkingLine((prev) => ({
...prev,