Loading app/src/App.tsx +1 −0 Original line number Original line Diff line number Diff line Loading @@ -457,6 +457,7 @@ function App(): JSX.Element { hidden={newXYZDataDialogHidden} hidden={newXYZDataDialogHidden} closeFunction={() => { setNewXYZDataDialogHidden(true) }} closeFunction={() => { setNewXYZDataDialogHidden(true) }} dataReducer={[data, dispatchData]} dataReducer={[data, dispatchData]} selectionsReducer={[selections, dispatchSelections]} ></NewXYZDataDialog> ></NewXYZDataDialog> <ImportWorkspaceDialog <ImportWorkspaceDialog hidden={workspaceFileImportDialogHidden} hidden={workspaceFileImportDialogHidden} Loading app/src/components/dialogs/NewXYZDataDialog.tsx +25 −3 Original line number Original line Diff line number Diff line Loading @@ -3,15 +3,18 @@ import { vec3 } from 'gl-matrix'; import React, { Dispatch, useEffect, useRef, useState } from 'react'; import React, { Dispatch, useEffect, useRef, useState } from 'react'; import { CSVDelimiter, FileState, FileType, ParseResult, parseResultToXYZ, parseToRows, ParseConfiguration, ParseResultCSV, ParseResultPDB } from '../../modules/parsing'; import { CSVDelimiter, FileState, FileType, ParseResult, parseResultToXYZ, parseToRows, ParseConfiguration, ParseResultCSV, ParseResultPDB } from '../../modules/parsing'; import { DataState, DataAction, DataActionKind, BinPositionsData, isoDataID } from '../../modules/storage/models/data'; import { DataState, DataAction, DataActionKind, BinPositionsData, isoDataID } from '../../modules/storage/models/data'; import { SelectionAction, SelectionActionKind, SelectionState } from '../../modules/storage/models/selections'; import { UploadTextFilesButton } from '../buttons/UploadTextFilesButton'; import { UploadTextFilesButton } from '../buttons/UploadTextFilesButton'; export function NewXYZDataDialog(props: { export function NewXYZDataDialog(props: { hidden: boolean, hidden: boolean, closeFunction: () => void, closeFunction: () => void, dataReducer: [DataState, Dispatch<DataAction>] dataReducer: [DataState, Dispatch<DataAction>], selectionsReducer: [SelectionState, Dispatch<SelectionAction>], }): JSX.Element { }): JSX.Element { const [data, dispatchData] = props.dataReducer; const [data, dispatchData] = props.dataReducer; const [selections, dispatchSelections] = props.selectionsReducer; // Reference to the true input file obscured by a fake one (for styling purposes) // Reference to the true input file obscured by a fake one (for styling purposes) const inputFileElement = useRef<HTMLInputElement | null>(null); const inputFileElement = useRef<HTMLInputElement | null>(null); Loading Loading @@ -72,7 +75,7 @@ export function NewXYZDataDialog(props: { } else { } else { const parsedResult: ParseResultPDB = parsedResultUntyped as ParseResultPDB; const parsedResult: ParseResultPDB = parsedResultUntyped as ParseResultPDB; const data: BinPositionsData = { const data3D: BinPositionsData = { id: isoDataID.wrap(-1), // will be replaced in reducer id: isoDataID.wrap(-1), // will be replaced in reducer name: files[0].name + (parsedFile.length > 1 ? "(" + i + ")" : ""), name: files[0].name + (parsedFile.length > 1 ? "(" + i + ")" : ""), type: '3d-positions', type: '3d-positions', Loading @@ -86,8 +89,27 @@ export function NewXYZDataDialog(props: { dispatchData({ dispatchData({ type: DataActionKind.ADD_DATA, type: DataActionKind.ADD_DATA, data: data data: data3D }); }); const data3DID = data.dataMaxId + 1; if (parsedResult.ranges.length > 0) { console.log(parsedResult.ranges); for (const [rangeIndex, range] of parsedResult.ranges.entries()) { dispatchSelections({ type: SelectionActionKind.ADD, name: 'Chromosome ' + rangeIndex, dataID: isoDataID.wrap(data3DID), dataSize: data3D.values.length, bins: new Uint16Array(parsedResult.atoms.length).fill(1, range.from, range.to), }); } } } } } } Loading app/src/modules/storage/models/selections.ts +5 −2 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,9 @@ export type SelectionActionAdd = { dataID: DataID; dataID: DataID; dataSize: number; dataSize: number; name?: string; bins?: Uint16Array; } } export type SelectionActionUpdate = { export type SelectionActionUpdate = { Loading Loading @@ -83,9 +86,9 @@ export function selectionReducer(state: SelectionState, action: SelectionAction) selections: [...state.selections, { selections: [...state.selections, { id: isoSelectionID.wrap(maxId), id: isoSelectionID.wrap(maxId), dataID: action.dataID, dataID: action.dataID, name: "Selection " + maxId, name: action.name || ("Selection " + maxId), color: hexToRGBAUnit(randomColor(), 1.0), color: hexToRGBAUnit(randomColor(), 1.0), bins: new Uint16Array(action.dataSize) bins: action.bins || new Uint16Array(action.dataSize) }] }] }; }; } } Loading Loading
app/src/App.tsx +1 −0 Original line number Original line Diff line number Diff line Loading @@ -457,6 +457,7 @@ function App(): JSX.Element { hidden={newXYZDataDialogHidden} hidden={newXYZDataDialogHidden} closeFunction={() => { setNewXYZDataDialogHidden(true) }} closeFunction={() => { setNewXYZDataDialogHidden(true) }} dataReducer={[data, dispatchData]} dataReducer={[data, dispatchData]} selectionsReducer={[selections, dispatchSelections]} ></NewXYZDataDialog> ></NewXYZDataDialog> <ImportWorkspaceDialog <ImportWorkspaceDialog hidden={workspaceFileImportDialogHidden} hidden={workspaceFileImportDialogHidden} Loading
app/src/components/dialogs/NewXYZDataDialog.tsx +25 −3 Original line number Original line Diff line number Diff line Loading @@ -3,15 +3,18 @@ import { vec3 } from 'gl-matrix'; import React, { Dispatch, useEffect, useRef, useState } from 'react'; import React, { Dispatch, useEffect, useRef, useState } from 'react'; import { CSVDelimiter, FileState, FileType, ParseResult, parseResultToXYZ, parseToRows, ParseConfiguration, ParseResultCSV, ParseResultPDB } from '../../modules/parsing'; import { CSVDelimiter, FileState, FileType, ParseResult, parseResultToXYZ, parseToRows, ParseConfiguration, ParseResultCSV, ParseResultPDB } from '../../modules/parsing'; import { DataState, DataAction, DataActionKind, BinPositionsData, isoDataID } from '../../modules/storage/models/data'; import { DataState, DataAction, DataActionKind, BinPositionsData, isoDataID } from '../../modules/storage/models/data'; import { SelectionAction, SelectionActionKind, SelectionState } from '../../modules/storage/models/selections'; import { UploadTextFilesButton } from '../buttons/UploadTextFilesButton'; import { UploadTextFilesButton } from '../buttons/UploadTextFilesButton'; export function NewXYZDataDialog(props: { export function NewXYZDataDialog(props: { hidden: boolean, hidden: boolean, closeFunction: () => void, closeFunction: () => void, dataReducer: [DataState, Dispatch<DataAction>] dataReducer: [DataState, Dispatch<DataAction>], selectionsReducer: [SelectionState, Dispatch<SelectionAction>], }): JSX.Element { }): JSX.Element { const [data, dispatchData] = props.dataReducer; const [data, dispatchData] = props.dataReducer; const [selections, dispatchSelections] = props.selectionsReducer; // Reference to the true input file obscured by a fake one (for styling purposes) // Reference to the true input file obscured by a fake one (for styling purposes) const inputFileElement = useRef<HTMLInputElement | null>(null); const inputFileElement = useRef<HTMLInputElement | null>(null); Loading Loading @@ -72,7 +75,7 @@ export function NewXYZDataDialog(props: { } else { } else { const parsedResult: ParseResultPDB = parsedResultUntyped as ParseResultPDB; const parsedResult: ParseResultPDB = parsedResultUntyped as ParseResultPDB; const data: BinPositionsData = { const data3D: BinPositionsData = { id: isoDataID.wrap(-1), // will be replaced in reducer id: isoDataID.wrap(-1), // will be replaced in reducer name: files[0].name + (parsedFile.length > 1 ? "(" + i + ")" : ""), name: files[0].name + (parsedFile.length > 1 ? "(" + i + ")" : ""), type: '3d-positions', type: '3d-positions', Loading @@ -86,8 +89,27 @@ export function NewXYZDataDialog(props: { dispatchData({ dispatchData({ type: DataActionKind.ADD_DATA, type: DataActionKind.ADD_DATA, data: data data: data3D }); }); const data3DID = data.dataMaxId + 1; if (parsedResult.ranges.length > 0) { console.log(parsedResult.ranges); for (const [rangeIndex, range] of parsedResult.ranges.entries()) { dispatchSelections({ type: SelectionActionKind.ADD, name: 'Chromosome ' + rangeIndex, dataID: isoDataID.wrap(data3DID), dataSize: data3D.values.length, bins: new Uint16Array(parsedResult.atoms.length).fill(1, range.from, range.to), }); } } } } } } Loading
app/src/modules/storage/models/selections.ts +5 −2 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,9 @@ export type SelectionActionAdd = { dataID: DataID; dataID: DataID; dataSize: number; dataSize: number; name?: string; bins?: Uint16Array; } } export type SelectionActionUpdate = { export type SelectionActionUpdate = { Loading Loading @@ -83,9 +86,9 @@ export function selectionReducer(state: SelectionState, action: SelectionAction) selections: [...state.selections, { selections: [...state.selections, { id: isoSelectionID.wrap(maxId), id: isoSelectionID.wrap(maxId), dataID: action.dataID, dataID: action.dataID, name: "Selection " + maxId, name: action.name || ("Selection " + maxId), color: hexToRGBAUnit(randomColor(), 1.0), color: hexToRGBAUnit(randomColor(), 1.0), bins: new Uint16Array(action.dataSize) bins: action.bins || new Uint16Array(action.dataSize) }] }] }; }; } } Loading