aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/MainView.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/MainView.tsx')
-rw-r--r--src/client/views/MainView.tsx169
1 files changed, 97 insertions, 72 deletions
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 0c5a1003b..031926604 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -1,5 +1,8 @@
import { library } from '@fortawesome/fontawesome-svg-core';
-import { faArrowDown, faArrowUp, faBolt, faCaretUp, faCat, faCheck, faChevronRight, faClone, faCloudUploadAlt, faCommentAlt, faCut, faEllipsisV, faExclamation, faFilePdf, faFilm, faFont, faGlobeAsia, faLongArrowAltRight, faMusic, faObjectGroup, faPause, faPenNib, faPlay, faPortrait, faRedoAlt, faThumbtack, faTree, faTv, faUndoAlt } from '@fortawesome/free-solid-svg-icons';
+import {
+ faArrowDown, faArrowUp, faBolt, faCaretUp, faCat, faCheck, faChevronRight, faClone, faCloudUploadAlt, faCommentAlt, faCut, faEllipsisV, faExclamation, faFilePdf, faFilm, faFont, faGlobeAsia, faLongArrowAltRight,
+ faMusic, faObjectGroup, faPause, faMousePointer, faPenNib, faFileAudio, faPen, faEraser, faPlay, faPortrait, faRedoAlt, faThumbtack, faTree, faTv, faUndoAlt, faHighlighter, faMicrophone, faCompressArrowsAlt
+} from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { action, computed, configure, observable, reaction, runInAction } from 'mobx';
import { observer } from 'mobx-react';
@@ -20,7 +23,7 @@ import { HistoryUtil } from '../util/History';
import SharingManager from '../util/SharingManager';
import { Transform } from '../util/Transform';
import { CollectionLinearView } from './CollectionLinearView';
-import { CollectionBaseView, CollectionViewType } from './collections/CollectionBaseView';
+import { CollectionViewType, CollectionView } from './collections/CollectionView';
import { CollectionDockingView } from './collections/CollectionDockingView';
import { ContextMenu } from './ContextMenu';
import { DictationOverlay } from './DictationOverlay';
@@ -32,6 +35,10 @@ import { DocumentView } from './nodes/DocumentView';
import { OverlayView } from './OverlayView';
import PDFMenu from './pdf/PDFMenu';
import { PreviewCursor } from './PreviewCursor';
+import MarqueeOptionsMenu from './collections/collectionFreeForm/MarqueeOptionsMenu';
+import InkSelectDecorations from './InkSelectDecorations';
+import { Scripting } from '../util/Scripting';
+import { AudioBox } from './nodes/AudioBox';
@observer
export class MainView extends React.Component {
@@ -39,6 +46,7 @@ export class MainView extends React.Component {
private _buttonBarHeight = 75;
private _flyoutSizeOnDown = 0;
private _urlState: HistoryUtil.DocUrl;
+ private _docBtnRef = React.createRef<HTMLDivElement>();
@observable private _panelWidth: number = 0;
@observable private _panelHeight: number = 0;
@@ -98,11 +106,18 @@ export class MainView extends React.Component {
library.add(faGlobeAsia);
library.add(faUndoAlt);
library.add(faRedoAlt);
+ library.add(faMousePointer);
+ library.add(faPen);
+ library.add(faHighlighter);
+ library.add(faEraser);
+ library.add(faFileAudio);
library.add(faPenNib);
+ library.add(faMicrophone);
library.add(faFilm);
library.add(faMusic);
library.add(faTree);
library.add(faPlay);
+ library.add(faCompressArrowsAlt);
library.add(faPause);
library.add(faClone);
library.add(faCut);
@@ -117,12 +132,14 @@ export class MainView extends React.Component {
library.add(faBolt);
library.add(faChevronRight);
library.add(faEllipsisV);
+ library.add(faMusic);
this.initEventListeners();
this.initAuthenticationRouters();
}
globalPointerDown = action((e: PointerEvent) => {
this.isPointerDown = true;
+ AudioBox.Enabled = true;
const targets = document.elementsFromPoint(e.x, e.y);
if (targets && targets.length && targets[0].className.toString().indexOf("contextMenu") === -1) {
ContextMenu.Instance.closeMenu();
@@ -174,18 +191,14 @@ export class MainView extends React.Component {
y: 400,
width: this._panelWidth * .7,
height: this._panelHeight,
- title: "My Blank Collection"
+ title: "My Blank Collection",
+ backgroundColor: "white"
};
let workspaces: FieldResult<Doc>;
let freeformDoc = CurrentUserUtils.GuestTarget || Docs.Create.FreeformDocument([], freeformOptions);
var dockingLayout = { content: [{ type: 'row', content: [CollectionDockingView.makeDocumentConfig(freeformDoc, freeformDoc, 600)] }] };
let mainDoc = Docs.Create.DockDocument([freeformDoc], JSON.stringify(dockingLayout), {}, id);
if (this.userDoc && ((workspaces = Cast(this.userDoc.workspaces, Doc)) instanceof Doc)) {
- if (!this.userDoc.linkManagerDoc) {
- let linkManagerDoc = new Doc();
- linkManagerDoc.allLinks = new List<Doc>([]);
- this.userDoc.linkManagerDoc = linkManagerDoc;
- }
Doc.AddDocToList(workspaces, "data", mainDoc);
mainDoc.title = `Workspace ${DocListCast(workspaces.data).length}`;
}
@@ -218,7 +231,7 @@ export class MainView extends React.Component {
if (!state.nro) {
DocServer.Control.makeReadOnly();
}
- CollectionBaseView.SetSafeMode(true);
+ CollectionView.SetSafeMode(true);
} else if (state.nro || state.nro === null || state.readonly === false) {
} else if (doc.readOnly) {
DocServer.Control.makeReadOnly();
@@ -251,9 +264,11 @@ export class MainView extends React.Component {
@computed get dockingContent() {
const mainContainer = this.mainContainer;
+ let flyoutWidth = this.flyoutWidth; // bcz: need to be here because Measure messes with observables.
+ let flyoutTranslate = this._flyoutTranslate;
return <Measure offset onResize={this.onResize}>
{({ measureRef }) =>
- <div ref={measureRef} className="mainView-mainDiv" onDrop={this.onDrop}>
+ <div ref={measureRef} id="mainContent-div" style={{ width: `calc(100% - ${flyoutTranslate ? flyoutWidth : 0}px`, transform: `translate(${flyoutTranslate ? flyoutWidth : 0}px, 0px)` }} onDrop={this.onDrop}>
{!mainContainer ? (null) :
<DocumentView Document={mainContainer}
DataDoc={undefined}
@@ -284,13 +299,15 @@ export class MainView extends React.Component {
}
onPointerDown = (e: React.PointerEvent) => {
- this._flyoutSizeOnDown = e.clientX;
- document.removeEventListener("pointermove", this.onPointerMove);
- document.removeEventListener("pointerup", this.onPointerUp);
- document.addEventListener("pointermove", this.onPointerMove);
- document.addEventListener("pointerup", this.onPointerUp);
- e.stopPropagation();
- e.preventDefault();
+ if (this._flyoutTranslate) {
+ this._flyoutSizeOnDown = e.clientX;
+ document.removeEventListener("pointermove", this.onPointerMove);
+ document.removeEventListener("pointerup", this.onPointerUp);
+ document.addEventListener("pointermove", this.onPointerMove);
+ document.addEventListener("pointerup", this.onPointerUp);
+ e.stopPropagation();
+ e.preventDefault();
+ }
}
@action
@@ -334,18 +351,18 @@ export class MainView extends React.Component {
}
}
mainContainerXf = () => new Transform(0, -this._buttonBarHeight, 1);
- @computed
- get flyout() {
+
+ @computed get flyout() {
let sidebarContent = this.userDoc && this.userDoc.sidebarContainer;
if (!(sidebarContent instanceof Doc)) {
return (null);
}
- let libraryButtonDoc = Cast(CurrentUserUtils.UserDocument.libraryButtons, Doc) as Doc;
- libraryButtonDoc.columnWidth = this.flyoutWidth / 3 - 30;
- return <div className="mainView-flyoutContainer">
+ let sidebarButtonsDoc = Cast(CurrentUserUtils.UserDocument.sidebarButtons, Doc) as Doc;
+ sidebarButtonsDoc.columnWidth = this.flyoutWidth / 3 - 30;
+ return <div className="mainView-flyoutContainer" >
<div className="mainView-tabButtons" style={{ height: `${this._buttonBarHeight}px` }}>
<DocumentView
- Document={libraryButtonDoc}
+ Document={sidebarButtonsDoc}
DataDoc={undefined}
addDocument={undefined}
addDocTab={this.addDocTabFunc}
@@ -400,8 +417,7 @@ export class MainView extends React.Component {
</div></div>;
}
- @computed
- get mainContent() {
+ @computed get mainContent() {
const sidebar = this.userDoc && this.userDoc.sidebarContainer;
return !this.userDoc || !(sidebar instanceof Doc) ? (null) : (
<div className="mainView-mainContent" >
@@ -410,10 +426,10 @@ export class MainView extends React.Component {
style={{ cursor: "ew-resize", left: `${(this.flyoutWidth * (this._flyoutTranslate ? 1 : 0)) - 10}px`, backgroundColor: `${StrCast(sidebar.backgroundColor, "lightGray")}` }}
onPointerDown={this.onPointerDown} onPointerOver={this.pointerOverDragger}>
<span title="library View Dragger" style={{
- width: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "100%" : "5vw",
- height: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "100%" : "30vh",
- position: "absolute",
- top: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "" : "-10vh"
+ width: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "100%" : "3vw",
+ height: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "100%" : "100vh",
+ position: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "absolute" : "fixed",
+ top: (this.flyoutWidth !== 0 && this._flyoutTranslate) ? "" : "0"
}} />
</div>
<div className="mainView-libraryFlyout" style={{
@@ -432,66 +448,75 @@ export class MainView extends React.Component {
</div>);
}
+ public static expandFlyout = action(() => {
+ MainView.Instance._flyoutTranslate = true;
+ MainView.Instance.flyoutWidth = 250;
+ });
+
@computed get expandButton() {
- return !this._flyoutTranslate ? (<div className="mainView-expandFlyoutButton" title="Re-attach sidebar" onPointerDown={() => {
- runInAction(() => {
- this.flyoutWidth = 250;
- this._flyoutTranslate = true;
- });
- }}><FontAwesomeIcon icon="chevron-right" color="grey" size="lg" /></div>) : (null);
+ return !this._flyoutTranslate ? (<div className="mainView-expandFlyoutButton" title="Re-attach sidebar" onPointerDown={MainView.expandFlyout}><FontAwesomeIcon icon="chevron-right" color="grey" size="lg" /></div>) : (null);
}
- addButtonDoc = (doc: Doc) => {
- Doc.AddDocToList(CurrentUserUtils.UserDocument, "docButtons", doc);
- return true;
- }
- remButtonDoc = (doc: Doc) => {
- Doc.RemoveDocFromList(CurrentUserUtils.UserDocument, "docButtons", doc);
- return true;
+ addButtonDoc = (doc: Doc) => Doc.AddDocToList(CurrentUserUtils.UserDocument.expandingButtons as Doc, "data", doc);
+ remButtonDoc = (doc: Doc) => Doc.RemoveDocFromList(CurrentUserUtils.UserDocument.expandingButtons as Doc, "data", doc);
+ moveButtonDoc = (doc: Doc, targetCollection: Doc, addDocument: (document: Doc) => boolean) => this.remButtonDoc(doc) && addDocument(doc);
+
+ buttonBarXf = () => {
+ if (!this._docBtnRef.current) return Transform.Identity();
+ let { scale, translateX, translateY } = Utils.GetScreenTransform(this._docBtnRef.current);
+ return new Transform(-translateX, -translateY, 1 / scale);
}
@computed get docButtons() {
- return <div className="mainView-docButtons" style={{ left: (this._flyoutTranslate ? this.flyoutWidth : 0) + 20 }} >
- <MainViewNotifs />
- <CollectionLinearView Document={CurrentUserUtils.UserDocument} DataDoc={undefined}
- fieldKey={"docButtons"}
- fieldExt={""}
- showHiddenControls={true}
- select={emptyFunction}
- chromeCollapsed={true}
- active={returnFalse}
- isSelected={returnFalse}
- moveDocument={returnFalse}
- CollectionView={undefined}
- addDocument={this.addButtonDoc}
- addDocTab={this.addDocTabFunc}
- pinToPres={emptyFunction}
- removeDocument={this.remButtonDoc}
- ruleProvider={undefined}
- onClick={undefined}
- ScreenToLocalTransform={Transform.Identity}
- ContentScaling={returnOne}
- PanelWidth={this.flyoutWidthFunc}
- PanelHeight={this.getContentsHeight}
- renderDepth={0}
- focus={emptyFunction}
- whenActiveChanged={emptyFunction}
- ContainingCollectionView={undefined}
- ContainingCollectionDoc={undefined} />
- </div>;
+ if (CurrentUserUtils.UserDocument.expandingButtons instanceof Doc) {
+ return <div className="mainView-docButtons" ref={this._docBtnRef}
+ style={{ left: (this._flyoutTranslate ? this.flyoutWidth : 0) + 20, height: !CurrentUserUtils.UserDocument.expandingButtons.isExpanded ? "42px" : undefined }} >
+ <MainViewNotifs />
+ <CollectionLinearView
+ Document={CurrentUserUtils.UserDocument.expandingButtons}
+ DataDoc={undefined}
+ fieldKey={"data"}
+ annotationsKey={""}
+ select={emptyFunction}
+ chromeCollapsed={true}
+ active={returnFalse}
+ isSelected={returnFalse}
+ moveDocument={this.moveButtonDoc}
+ CollectionView={undefined}
+ addDocument={this.addButtonDoc}
+ addDocTab={this.addDocTabFunc}
+ pinToPres={emptyFunction}
+ removeDocument={this.remButtonDoc}
+ ruleProvider={undefined}
+ onClick={undefined}
+ ScreenToLocalTransform={this.buttonBarXf}
+ ContentScaling={returnOne}
+ PanelWidth={this.flyoutWidthFunc}
+ PanelHeight={this.getContentsHeight}
+ renderDepth={0}
+ focus={emptyFunction}
+ whenActiveChanged={emptyFunction}
+ ContainingCollectionView={undefined}
+ ContainingCollectionDoc={undefined} />
+ </div>;
+ }
+ return (null);
}
render() {
- return (<div className="mainView-container">
+ return (<div id="mainView-container">
<DictationOverlay />
<SharingManager />
<GoogleAuthenticationManager />
<DocumentDecorations />
+ <InkSelectDecorations />
{this.mainContent}
<PreviewCursor />
<ContextMenu />
{this.docButtons}
<PDFMenu />
+ <MarqueeOptionsMenu />
<OverlayView />
</div >);
}
-} \ No newline at end of file
+}
+Scripting.addGlobal(function freezeSidebar() { MainView.expandFlyout(); });