Skip to content

Commit 819a669

Browse files
committed
3d support region set view
1 parent cebed7e commit 819a669

File tree

7 files changed

+198
-114
lines changed

7 files changed

+198
-114
lines changed

frontend/src/App.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,14 @@ interface AppStateProps {
100100
suggestedMetaSets: Set<string>;
101101
}
102102

103-
interface RGBAColor {
104-
rgb: {
105-
r: number;
106-
g: number;
107-
b: number;
108-
a: number;
109-
}
110-
}
103+
// interface RGBAColor {
104+
// rgb: {
105+
// r: number;
106+
// g: number;
107+
// b: number;
108+
// a: number;
109+
// }
110+
// }
111111

112112
class App extends React.PureComponent<AppProps, AppStateProps> {
113113
static propTypes = {
@@ -265,7 +265,10 @@ class App extends React.PureComponent<AppProps, AppStateProps> {
265265

266266
newHighlight = (start: number, end: number, tag: string = '') => {
267267
const interval = new HighlightInterval(start, end, tag);
268-
this.props.onSetHighlights([...this.props.highlights, interval])
268+
const existing = this.props.highlights.find(h => h.start === start && h.end === end)
269+
if (!existing) {
270+
this.props.onSetHighlights([...this.props.highlights, interval])
271+
}
269272
}
270273

271274
// setHighlightColor = (color: RGBAColor) => {

frontend/src/AppLayout.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ function mapStateToProps(state) {
3939
tracks: state.browser.present.tracks,
4040
isShowingVR: state.browser.present.isShowingVR,
4141
layout: state.browser.present.layout,
42+
selectedSet: state.browser.present.regionSetView,
4243
};
4344
}
4445

@@ -47,6 +48,7 @@ const callbacks = {
4748
onTracksChanged: ActionCreators.setTracks,
4849
onToggleVR: ActionCreators.toggleVR,
4950
onSetLayout: ActionCreators.setLayout,
51+
onSetSelected: ActionCreators.setRegionSetView,
5052
};
5153

5254
class AppLayout extends React.PureComponent {
@@ -280,7 +282,7 @@ class AppLayout extends React.PureComponent {
280282

281283
render3dmolContainer = (node) => {
282284
const model = node.getModel();
283-
const { viewRegion, genomeConfig, tracks, onNewViewRegion } = this.props;
285+
const { viewRegion, genomeConfig, tracks, onNewViewRegion, onSetSelected, selectedSet } = this.props;
284286
const config = node.getConfig();
285287
const { x, y, width, height } = node.getRect();
286288
const g3dtrack = TrackModel.deserialize(config.trackModel);
@@ -317,6 +319,8 @@ class AppLayout extends React.PureComponent {
317319
onToggleSync3d={this.toggleSync3d}
318320
onGetViewer3dAndNumFrames={this.getViewer3dAndNumFrames}
319321
imageInfo={this.state.imageInfo}
322+
onSetSelected={onSetSelected}
323+
selectedSet={selectedSet}
320324
/>
321325
);
322326
};

frontend/src/components/Nav.js

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import PropTypes from "prop-types";
33
import ReactModal from "react-modal";
44
import _ from "lodash";
55
import { connect } from "react-redux";
6-
import { RadioGroup, Radio } from "react-radio-group";
6+
// import { RadioGroup, Radio } from "react-radio-group";
77
import Button from "@material-ui/core/Button";
88
import { ArrowBack } from "@material-ui/icons";
99
import { IconButton } from "@material-ui/core";
1010
import { ActionCreators } from "../AppState";
1111
import DisplayedRegionModel from "../model/DisplayedRegionModel";
12-
import { getSpeciesInfo, allGenomes } from "../model/genomes/allGenomes";
12+
import { getSpeciesInfo } from "../model/genomes/allGenomes";
1313
import TrackRegionController from "./genomeNavigator/TrackRegionController";
1414
import RegionSetSelector from "./RegionSetSelector";
1515
import Geneplot from "./Geneplot/Geneplot";
@@ -77,8 +77,8 @@ class Nav extends React.Component {
7777
otherGenome: null,
7878
};
7979
this.debounced = _.debounce(this.props.onLegendWidthChange, 250);
80-
this.renderOtherGenomes = this.renderOtherGenomes.bind(this);
81-
this.handleOtherGenomeChange = this.handleOtherGenomeChange.bind(this);
80+
// this.renderOtherGenomes = this.renderOtherGenomes.bind(this);
81+
// this.handleOtherGenomeChange = this.handleOtherGenomeChange.bind(this);
8282
}
8383

8484
componentDidMount() {
@@ -121,32 +121,32 @@ class Nav extends React.Component {
121121
}
122122
};
123123

124-
handleOtherGenomeChange(value) {
125-
this.setState({ otherGenome: value });
126-
}
124+
// handleOtherGenomeChange(value) {
125+
// this.setState({ otherGenome: value });
126+
// }
127127

128-
renderOtherGenomes() {
129-
const genomeName = this.props.genomeConfig.genome.getName();
130-
const otherGenomes = allGenomes.map((g) => g.genome.getName()).filter((g) => g !== genomeName);
131-
const radios = otherGenomes.map((g) => {
132-
const { name } = getSpeciesInfo(g);
133-
return (
134-
<label key={g} className="otherGenome-label">
135-
<Radio value={g} /> <span className="capitalize">{name}</span> <span className="italic">{g}</span>
136-
</label>
137-
);
138-
});
139-
return (
140-
<RadioGroup
141-
name="otherGenome"
142-
selectedValue={this.state.otherGenome}
143-
onChange={this.handleOtherGenomeChange}
144-
className="otherGenome-container"
145-
>
146-
{radios}
147-
</RadioGroup>
148-
);
149-
}
128+
// renderOtherGenomes() {
129+
// const genomeName = this.props.genomeConfig.genome.getName();
130+
// const otherGenomes = allGenomes.map((g) => g.genome.getName()).filter((g) => g !== genomeName);
131+
// const radios = otherGenomes.map((g) => {
132+
// const { name } = getSpeciesInfo(g);
133+
// return (
134+
// <label key={g} className="otherGenome-label">
135+
// <Radio value={g} /> <span className="capitalize">{name}</span> <span className="italic">{g}</span>
136+
// </label>
137+
// );
138+
// });
139+
// return (
140+
// <RadioGroup
141+
// name="otherGenome"
142+
// selectedValue={this.state.otherGenome}
143+
// onChange={this.handleOtherGenomeChange}
144+
// className="otherGenome-container"
145+
// >
146+
// {radios}
147+
// </RadioGroup>
148+
// );
149+
// }
150150

151151
changeGenome = () => {
152152
this.props.onGenomeSelected(this.state.otherGenome);

frontend/src/components/trackContextMenu/HorizontalLineValueConfig.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ import NumberConfig from "./NumberConfig";
99
*/
1010
function HorizontalLineValueConfig(props) {
1111
return (
12-
<NumberConfig {...props} optionName="horizontalLineValue" label="Horizontal line value:" hasSetButton={true} />
12+
<NumberConfig
13+
{...props}
14+
optionName="horizontalLineValue"
15+
label="Horizontal line value:"
16+
hasSetButton={true}
17+
isFloat={true}
18+
/>
1319
);
1420
}
1521

frontend/src/components/trackVis/3dmol/HoverInfo.js

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
import React from "react";
22
import { notify } from "react-notify-toast";
3-
import ChromosomeInterval from "model/interval/ChromosomeInterval";
3+
import ChromosomeInterval from "../../../model/interval/ChromosomeInterval";
4+
import Feature from "../../../model/Feature";
5+
import RegionSet from "../../../model/RegionSet";
6+
import FlankingStrategy from "../../../model/FlankingStrategy";
47

5-
export const HoverInfo = ({ atom, resolution, x, y, onNewViewRegion, viewRegion, removeHover, addToLabel }) => {
8+
export const HoverInfo = ({
9+
atom,
10+
resolution,
11+
x,
12+
y,
13+
onNewViewRegion,
14+
viewRegion,
15+
removeHover,
16+
addToLabel,
17+
selectedSet,
18+
onSetSelected,
19+
genomeConfig,
20+
}) => {
621
if (!atom) return null;
722
const navContext = viewRegion.getNavigationContext();
823
const locus = new ChromosomeInterval(atom.chain, atom.properties.start, atom.properties.start + resolution);
@@ -16,6 +31,28 @@ export const HoverInfo = ({ atom, resolution, x, y, onNewViewRegion, viewRegion,
1631
}
1732
};
1833

34+
const addToRegionSetView = () => {
35+
const atomFeature = new Feature(undefined, locus);
36+
let newSet;
37+
if (selectedSet) {
38+
newSet = selectedSet.cloneAndAddFeature(atomFeature);
39+
} else {
40+
const currentChrInterval = viewRegion.getGenomeIntervals()[0];
41+
const currentFeature = new Feature(undefined, currentChrInterval);
42+
newSet = new RegionSet(
43+
"3D set",
44+
[currentFeature, atomFeature],
45+
genomeConfig.genome,
46+
new FlankingStrategy()
47+
);
48+
}
49+
onSetSelected(newSet);
50+
};
51+
52+
const closeSetView = () => {
53+
onSetSelected(null);
54+
};
55+
1956
const addAsShape = () => {
2057
addToLabel([locus], true);
2158
};
@@ -46,12 +83,22 @@ export const HoverInfo = ({ atom, resolution, x, y, onNewViewRegion, viewRegion,
4683
<button className="btn btn-sm btn-primary" onClick={jumpToAtom}>
4784
Browser region
4885
</button>
49-
<button className="btn btn-sm btn-success" onClick={addAsShape}>
50-
Label as shape
51-
</button>
52-
<button className="btn btn-sm btn-info" onClick={addAsArrow}>
53-
Label as arrow
54-
</button>
86+
<div style={{ display: "flex", gap: 5 }}>
87+
<button className="btn btn-sm btn-success" onClick={addToRegionSetView}>
88+
Add to set view
89+
</button>
90+
<button className="btn btn-sm btn-info" onClick={closeSetView}>
91+
Close set view
92+
</button>
93+
</div>
94+
<div style={{ display: "flex", gap: 5 }}>
95+
<button className="btn btn-sm btn-success" onClick={addAsShape}>
96+
Label as shape
97+
</button>
98+
<button className="btn btn-sm btn-info" onClick={addAsArrow}>
99+
Label as arrow
100+
</button>
101+
</div>
55102
<button className="btn btn-sm btn-seconday" onClick={removeHover}>
56103
Close
57104
</button>

frontend/src/components/trackVis/3dmol/ThreedmolContainer.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2728,7 +2728,8 @@ class ThreedmolContainer extends React.Component {
27282728
spinSpeed,
27292729
spinReverse,
27302730
} = this.state;
2731-
const { tracks, x, y, onNewViewRegion, viewRegion, sync3d } = this.props;
2731+
const { tracks, x, y, onNewViewRegion, viewRegion, sync3d, onSetSelected, selectedSet, genomeConfig } =
2732+
this.props;
27322733
const bwTracks = tracks.filter((track) => getTrackConfig(track).isBigwigTrack());
27332734
return (
27342735
<div id="threed-mol-container">
@@ -3595,6 +3596,9 @@ class ThreedmolContainer extends React.Component {
35953596
onNewViewRegion={onNewViewRegion}
35963597
removeHover={this.removeHover}
35973598
addToLabel={this.addAnchors3dToMyArrows}
3599+
selectedSet={selectedSet}
3600+
onSetSelected={onSetSelected}
3601+
genomeConfig={genomeConfig}
35983602
/>
35993603
<div
36003604
className="box1"

0 commit comments

Comments
 (0)