aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbob <bcz@cs.brown.edu>2019-02-01 14:36:41 -0500
committerbob <bcz@cs.brown.edu>2019-02-01 14:36:41 -0500
commit588e1edf046aea0f280117f4aaa5b9853258c05b (patch)
tree8085ad763f8af34b1c794a44af069ae42f80e556
parent30c8a29abae61a47d0b17b86727729f0e55f7f69 (diff)
fixed zordering of dragged items. image lightbox shows on double tap now.
-rw-r--r--src/fields/Key.ts1
-rw-r--r--src/views/collections/CollectionFreeFormView.tsx21
-rw-r--r--src/views/nodes/DocumentView.tsx10
-rw-r--r--src/views/nodes/ImageBox.tsx29
4 files changed, 53 insertions, 8 deletions
diff --git a/src/fields/Key.ts b/src/fields/Key.ts
index 4da800fac..5cd43f55e 100644
--- a/src/fields/Key.ts
+++ b/src/fields/Key.ts
@@ -41,6 +41,7 @@ export namespace KeyStore {
export const Scale = new Key("Scale");
export const Width = new Key("Width");
export const Height = new Key("Height");
+ export const ZIndex = new Key("ZIndex");
export const Data = new Key("Data");
export const Layout = new Key("Layout");
export const LayoutKeys = new Key("LayoutKeys");
diff --git a/src/views/collections/CollectionFreeFormView.tsx b/src/views/collections/CollectionFreeFormView.tsx
index ffb39426d..24daa2fbc 100644
--- a/src/views/collections/CollectionFreeFormView.tsx
+++ b/src/views/collections/CollectionFreeFormView.tsx
@@ -19,6 +19,7 @@ import { CollectionDockingView } from "./CollectionDockingView";
export class CollectionFreeFormView extends React.Component<CollectionViewProps> {
private _containerRef = React.createRef<HTMLDivElement>();
private _canvasRef = React.createRef<HTMLDivElement>();
+ private _nodeContainerRef = React.createRef<HTMLDivElement>();
constructor(props: CollectionViewProps) {
super(props);
@@ -51,10 +52,28 @@ export class CollectionFreeFormView extends React.Component<CollectionViewProps>
const docY = (screenY - translateY) / sscale / scale;
doc.x = docX;
doc.y = docY;
+ this.bringToFront(doc);
}
e.stopPropagation();
}
+ private bringToFront(doc: DocumentView) {
+ const { fieldKey, Document: Document } = this.props;
+
+ const value: Document[] = Document.GetListField<Document>(fieldKey, []);
+ var topmost = value.reduce((topmost, d) => Math.max(d.GetNumberField(KeyStore.ZIndex, 0), topmost), -1000);
+ value.map(d => {
+ var zind = d.GetNumberField(KeyStore.ZIndex, 0);
+ if (zind != topmost - 1 - (topmost - zind) && d != doc.props.Document) {
+ d.SetFieldValue(KeyStore.ZIndex, topmost - 1 - (topmost - zind), NumberField);
+ }
+ })
+
+ if (doc.props.Document.GetNumberField(KeyStore.ZIndex, 0) != 0) {
+ doc.props.Document.SetFieldValue(KeyStore.ZIndex, 0, NumberField);
+ }
+ }
+
componentDidMount() {
if (this._containerRef.current) {
DragManager.MakeDropTarget(this._containerRef.current, {
@@ -191,7 +210,7 @@ export class CollectionFreeFormView extends React.Component<CollectionViewProps>
}} onDrop={this.onDrop} onDragOver={this.onDragOver} ref={this._containerRef}>
<div className="collectionfreeformview" style={{ transform: `translate(${panx}px, ${pany}px) scale(${currScale}, ${currScale})`, transformOrigin: `left, top` }} ref={this._canvasRef}>
- <div className="node-container">
+ <div className="node-container" ref={this._nodeContainerRef}>
{value.map(doc => {
return (<DocumentView key={doc.Id} ContainingCollectionView={this} Document={doc} ContainingDocumentView={this.props.ContainingDocumentView} />);
})}
diff --git a/src/views/nodes/DocumentView.tsx b/src/views/nodes/DocumentView.tsx
index 34a95747b..560cc0ee0 100644
--- a/src/views/nodes/DocumentView.tsx
+++ b/src/views/nodes/DocumentView.tsx
@@ -154,6 +154,15 @@ export class DocumentView extends React.Component<DocumentViewProps> {
this.props.Document.SetFieldValue(KeyStore.Height, h, NumberField)
}
+ @computed
+ get zIndex(): number {
+ return this.props.Document.GetFieldValue(KeyStore.ZIndex, NumberField, Number(0));
+ }
+
+ set zIndex(h: number) {
+ this.props.Document.SetFieldValue(KeyStore.ZIndex, h, NumberField)
+ }
+
@action
dragComplete = (e: DragManager.DragCompleteEvent) => {
}
@@ -359,6 +368,7 @@ export class DocumentView extends React.Component<DocumentViewProps> {
width: freestyling ? this.width : "100%",
height: freestyling ? this.height : "100%",
position: freestyling ? "absolute" : "relative",
+ zIndex: freestyling ? this.zIndex : 0,
}}
onContextMenu={this.onContextMenu}
onPointerDown={this.onPointerDown}>
diff --git a/src/views/nodes/ImageBox.tsx b/src/views/nodes/ImageBox.tsx
index 4535cef98..ffdcbae05 100644
--- a/src/views/nodes/ImageBox.tsx
+++ b/src/views/nodes/ImageBox.tsx
@@ -33,13 +33,30 @@ export class ImageBox extends React.Component<DocumentFieldViewProps, ImageBoxSt
componentWillUnmount() {
}
+ _downX: number = 0;
+ _downY: number = 0;
+ _singleTap = false;
+ _lastTap: number = 0;
onPointerDown = (e: React.PointerEvent): void => {
const { containingDocumentView } = this.props;
- this._wasSelected = SelectionManager.IsSelected(containingDocumentView);
- let me = this;
- if (e.buttons === 1 && SelectionManager.IsSelected(me.props.containingDocumentView)) {
- e.stopPropagation();
+ if (Date.now() - this._lastTap < 300) {
+ if (e.buttons === 1 && SelectionManager.IsSelected(containingDocumentView)) {
+ e.stopPropagation();
+ this._downX = e.clientX;
+ this._downY = e.clientY;
+ document.removeEventListener("pointerup", this.onPointerUp);
+ document.addEventListener("pointerup", this.onPointerUp);
+ }
+ } else {
+ this._lastTap = Date.now();
+ }
+ }
+ onPointerUp = (e: PointerEvent): void => {
+ document.removeEventListener("pointerup", this.onPointerUp);
+ if (Math.abs(e.clientX - this._downX) < 2 && Math.abs(e.clientY - this._downY) < 2) {
+ this.setState({ isOpen: true })
}
+ e.stopPropagation();
}
render() {
@@ -63,9 +80,7 @@ export class ImageBox extends React.Component<DocumentFieldViewProps, ImageBoxSt
}
return (
<div className="imageBox-cont" onPointerDown={this.onPointerDown} ref={this._ref} >
- <button className="imageBox-button" type="button" onClick={() => this.setState({ isOpen: this._wasSelected })}>
- <img src={images[0]} width="100%" alt="Image not found" />
- </button>
+ <img src={images[0]} width="100%" alt="Image not found" />
{lightbox()}
</div>)
}