@@ -2,10 +2,11 @@ import Field from './Field';
22import PropTypes from 'prop-types' ;
33import React , { Component } from 'react' ;
44import { connectToContainer } from 'lib' ;
5- import { NumericFraction } from './derived' ;
65import ResizableRect from 'react-resizable-rotatable-draggable' ;
6+ import RadioBlocks from '../widgets/RadioBlocks' ;
7+ import DualNumeric from './DualNumeric' ;
78
8- const maxWidth = 300 ;
9+ const maxWidth = 286 ;
910const gridRes = 8 ;
1011
1112class UnconnectedRectanglePositioner extends Component {
@@ -18,6 +19,7 @@ class UnconnectedRectanglePositioner extends Component {
1819 y : [ 'yaxis.domain[0]' , 'yaxis.domain[1]' ] ,
1920 }
2021 : { x : [ 'domain.x[0]' , 'domain.x[1]' ] , y : [ 'domain.y[0]' , 'domain.y[1]' ] } ;
22+ this . state = { snap : true } ;
2123 }
2224
2325 sendUpdate ( { x, y, width, height, fieldWidthPx, fieldHeightPx} ) {
@@ -26,7 +28,9 @@ class UnconnectedRectanglePositioner extends Component {
2628 const y0 = ( fieldHeightPx - ( height + y ) ) / fieldHeightPx ;
2729 const y1 = ( fieldHeightPx - y ) / fieldHeightPx ;
2830
29- const snap = v => Math . round ( v * gridRes ) / gridRes ;
31+ const snap = this . state . snap
32+ ? v => Math . round ( v * gridRes ) / gridRes
33+ : v => v ;
3034
3135 const payload = { } ;
3236
@@ -61,25 +65,48 @@ class UnconnectedRectanglePositioner extends Component {
6165 const left = fieldWidthPx * x [ 0 ] ;
6266 const top = fieldHeightPx * ( 1 - y [ 1 ] ) ;
6367
68+ let zoomable = '' ;
69+ if (
70+ ! fullContainer . xaxis ||
71+ ! fullContainer . yaxis ||
72+ ( ! fullContainer . xaxis . overlaying && ! fullContainer . yaxis . overlaying )
73+ ) {
74+ zoomable = 'n, w, s, e, nw, ne, se, sw' ;
75+ } else if ( ! fullContainer . xaxis . overlaying ) {
76+ zoomable = 'e, w' ;
77+ } else if ( ! fullContainer . yaxis . overlaying ) {
78+ zoomable = 'n, s' ;
79+ }
80+
6481 return (
6582 < Field { ...this . props } attr = { attr } >
83+ < Field label = { _ ( 'Snap to Grid' ) } >
84+ < RadioBlocks
85+ alignment = "center"
86+ onOptionChange = { snap => this . setState ( { snap : snap } ) }
87+ activeOption = { this . state . snap }
88+ options = { [
89+ { label : _ ( 'On' ) , value : true } ,
90+ { label : _ ( 'Off' ) , value : false } ,
91+ ] }
92+ />
93+ </ Field >
6694 < div
95+ className = "rect-container"
6796 style = { {
6897 width : fieldWidthPx ,
6998 height : fieldHeightPx ,
70- border : '1px solid grey' ,
71- position : 'relative' ,
7299 } }
73100 >
74101 { Array ( gridRes * gridRes )
75102 . fill ( 0 )
76103 . map ( ( v , i ) => (
77104 < div
78105 key = { i }
106+ className = "rect-grid"
79107 style = { {
80108 width : fieldWidthPx / gridRes - 1 ,
81109 height : fieldHeightPx / gridRes - 1 ,
82- float : 'left' ,
83110 borderTop : i < gridRes ? '0' : '1px solid lightgray' ,
84111 borderLeft : i % gridRes ? '1px solid lightgray' : '0' ,
85112 } }
@@ -92,8 +119,8 @@ class UnconnectedRectanglePositioner extends Component {
92119 left = { left }
93120 top = { top }
94121 rotatable = { false }
95- draggable = { false }
96- zoomable = "n, w, s, e, nw, ne, se, sw"
122+ draggable = { ! this . state . snap }
123+ zoomable = { zoomable }
97124 onResize = { style => {
98125 this . sendUpdate ( {
99126 fieldWidthPx,
@@ -104,12 +131,44 @@ class UnconnectedRectanglePositioner extends Component {
104131 y : style . top ,
105132 } ) ;
106133 } }
134+ onDrag = { ( deltaX , deltaY ) => {
135+ this . sendUpdate ( {
136+ fieldWidthPx,
137+ fieldHeightPx,
138+ width,
139+ height,
140+ x : left + deltaX ,
141+ y : top + deltaY ,
142+ } ) ;
143+ } }
107144 />
108145 </ div >
109- < NumericFraction label = { _ ( 'X Start' ) } attr = { this . attr . x [ 0 ] } />
110- < NumericFraction label = { _ ( 'X End' ) } attr = { this . attr . x [ 1 ] } />
111- < NumericFraction label = { _ ( 'Y Start' ) } attr = { this . attr . y [ 0 ] } />
112- < NumericFraction label = { _ ( 'Y End' ) } attr = { this . attr . y [ 1 ] } />
146+ { fullContainer . xaxis && fullContainer . xaxis . overlaying ? (
147+ ''
148+ ) : (
149+ < DualNumeric
150+ label = { _ ( 'X' ) }
151+ attr = { this . attr . x [ 0 ] }
152+ attr2 = { this . attr . x [ 1 ] }
153+ percentage
154+ step = { 1 }
155+ min = { 0 }
156+ max = { 100 }
157+ />
158+ ) }
159+ { fullContainer . yaxis && fullContainer . yaxis . overlaying ? (
160+ ''
161+ ) : (
162+ < DualNumeric
163+ label = { _ ( 'Y' ) }
164+ attr = { this . attr . y [ 0 ] }
165+ attr2 = { this . attr . y [ 1 ] }
166+ percentage
167+ step = { 1 }
168+ min = { 0 }
169+ max = { 100 }
170+ />
171+ ) }
113172 </ Field >
114173 ) ;
115174 }
0 commit comments