diff options
| author | bob <bcz@cs.brown.edu> | 2019-04-03 12:42:32 -0400 | 
|---|---|---|
| committer | bob <bcz@cs.brown.edu> | 2019-04-03 12:42:32 -0400 | 
| commit | 5fbee077873c3dd0a9b5939babbaa1fd4dfe1393 (patch) | |
| tree | 1418a22161e88c734f51c4e1a117c3957a14115d /src/client/views/ContextMenu.tsx | |
| parent | d9076d48a17a4ec2a5b4f4dbd82160bd10f1af22 (diff) | |
| parent | c406c8d123ce0aa9d63fb8a4dd90adfe83d2889d (diff) | |
merged with master
Diffstat (limited to 'src/client/views/ContextMenu.tsx')
| -rw-r--r-- | src/client/views/ContextMenu.tsx | 33 | 
1 files changed, 23 insertions, 10 deletions
| diff --git a/src/client/views/ContextMenu.tsx b/src/client/views/ContextMenu.tsx index fcb934860..cfa8ea7b7 100644 --- a/src/client/views/ContextMenu.tsx +++ b/src/client/views/ContextMenu.tsx @@ -13,6 +13,8 @@ export class ContextMenu extends React.Component {      @observable private _pageY: number = 0;      @observable private _display: string = "none";      @observable private _searchString: string = ""; +    // afaik displaymenu can be called before all the items are added to the menu, so can't determine in displayMenu what the height of the menu will be +    @observable private _yRelativeToTop: boolean = true;      private ref: React.RefObject<HTMLDivElement>; @@ -44,8 +46,13 @@ export class ContextMenu extends React.Component {      @action      displayMenu(x: number, y: number) { -        this._pageX = x -        this._pageY = y +        //maxX and maxY will change if the UI/font size changes, but will work for any amount +        //of items added to the menu +        let maxX = window.innerWidth - 150; +        let maxY = window.innerHeight - ((this._items.length + 1/*for search box*/) * 34 + 30); + +        this._pageX = x > maxX ? maxX : x; +        this._pageY = y > maxY ? maxY : y;          this._searchString = ""; @@ -54,8 +61,13 @@ export class ContextMenu extends React.Component {      intersects = (x: number, y: number): boolean => {          if (this.ref.current && this._display !== "none") { -            if (x >= this._pageX && x <= this._pageX + this.ref.current.getBoundingClientRect().width) { -                if (y >= this._pageY && y <= this._pageY + this.ref.current.getBoundingClientRect().height) { +            let menuSize = { width: this.ref.current.getBoundingClientRect().width, height: this.ref.current.getBoundingClientRect().height }; + +            let upperLeft = { x: this._pageX, y: this._yRelativeToTop ? this._pageY : window.innerHeight - (this._pageY + menuSize.height) }; +            let bottomRight = { x: this._pageX + menuSize.width, y: this._yRelativeToTop ? this._pageY + menuSize.height : window.innerHeight - this._pageY }; + +            if (x >= upperLeft.x && x <= bottomRight.x) { +                if (y >= upperLeft.y && y <= bottomRight.y) {                      return true;                  }              } @@ -64,14 +76,15 @@ export class ContextMenu extends React.Component {      }      render() { +        let style = this._yRelativeToTop ? { left: this._pageX, top: this._pageY, display: this._display } : +            { left: this._pageX, bottom: this._pageY, display: this._display }; + +          return ( -            <div className="contextMenu-cont" style={{ left: this._pageX, top: this._pageY, display: this._display }} ref={this.ref}> +            <div className="contextMenu-cont" style={style} ref={this.ref}>                  <input className="contextMenu-item" type="text" placeholder="Search . . ." value={this._searchString} onChange={this.onChange}></input> -                {this._items.filter(prop => { -                    return prop.description.toLowerCase().indexOf(this._searchString.toLowerCase()) !== -1; -                }).map(prop => { -                    return <ContextMenuItem {...prop} key={prop.description} /> -                })} +                {this._items.filter(prop => prop.description.toLowerCase().indexOf(this._searchString.toLowerCase()) !== -1). +                    map(prop => <ContextMenuItem {...prop} key={prop.description} />)}              </div>          )      } | 
