ohif-viewer/src/connectedComponents/ToolbarRow.js

150 lines
4.3 KiB
JavaScript
Raw Normal View History

2019-05-30 06:46:45 +02:00
import './ToolbarRow.css';
2019-05-30 05:47:26 +02:00
2019-05-30 06:46:45 +02:00
import React, { Component } from 'react';
import { RoundedButtonGroup, ToolbarButton } from 'react-viewerbase';
import { commandsManager, extensionManager } from './../App.js';
2019-05-30 05:47:26 +02:00
2019-05-30 06:46:45 +02:00
import ConnectedLayoutButton from './ConnectedLayoutButton';
import ConnectedPluginSwitch from './ConnectedPluginSwitch.js';
2019-06-12 22:09:35 +02:00
import { MODULE_TYPES } from 'ohif-core';
2019-05-30 06:46:45 +02:00
import PropTypes from 'prop-types';
2018-12-18 14:15:55 +01:00
class ToolbarRow extends Component {
static propTypes = {
leftSidebarOpen: PropTypes.bool.isRequired,
rightSidebarOpen: PropTypes.bool.isRequired,
setLeftSidebarOpen: PropTypes.func,
setRightSidebarOpen: PropTypes.func,
2019-05-01 19:10:44 +02:00
pluginId: PropTypes.string,
2019-05-30 06:46:45 +02:00
};
2018-12-19 14:53:03 +01:00
static defaultProps = {
leftSidebarOpen: false,
2019-05-01 19:10:44 +02:00
rightSidebarOpen: false,
2019-05-30 06:46:45 +02:00
};
constructor(props) {
super(props);
const toolbarModules = extensionManager.modules[MODULE_TYPES.TOOLBAR];
const toolbarButtonDefinitions = toolbarModules[0].module.definitions;
// TODO:
// ToolbarSection for Each ToolbarButton
// Render buttons
// On click, depending on Type, pass props to registered command in commands manager?
// If it's a tool that can be active... Mark it as active?
// - Tools that are on/off?
// - Tools that can be bound to multiple buttons?
// Normal ToolbarButtons...
// Maybe filtered by the active context(s)?
// Buttons can handle their own clicks. No reason for the container to do it?
// Just how high do we need to hoist this state?
// Why ToolbarRow instead of just Toolbar? Do we have any others?
this.state = {
toolbarButtons: toolbarButtonDefinitions,
activeButtons: [],
};
}
onLeftSidebarValueChanged = value => {
2019-05-30 06:46:45 +02:00
this.props.setLeftSidebarOpen(!!value);
};
2018-12-19 14:53:03 +01:00
onRightSidebarValueChanged = value => {
2019-05-30 06:46:45 +02:00
this.props.setRightSidebarOpen(!!value);
};
2018-12-19 14:53:03 +01:00
render() {
const leftSidebarToggle = [
{
value: 'studies',
2019-05-30 05:47:26 +02:00
icon: 'th-large',
2019-05-01 19:10:44 +02:00
bottomLabel: 'Series',
},
2019-05-30 06:46:45 +02:00
];
const rightSidebarToggle = [
{
value: 'measurements',
2019-05-30 05:47:26 +02:00
icon: 'list',
2019-05-01 19:10:44 +02:00
bottomLabel: 'Measurements',
},
2019-05-30 06:46:45 +02:00
];
2018-12-19 14:53:03 +01:00
const leftSidebarValue = this.props.leftSidebarOpen
? leftSidebarToggle[0].value
2019-05-30 06:46:45 +02:00
: null;
const rightSidebarValue = this.props.rightSidebarOpen
? rightSidebarToggle[0].value
2019-05-30 06:46:45 +02:00
: null;
//const getButtonComponents = _getButtonComponents.bind(this);
const buttonComponents = _getButtonComponents.call(
this,
this.state.toolbarButtons,
this.state.activeButtons
2019-06-13 15:51:19 +02:00
);
return (
<div className="ToolbarRow">
<div className="pull-left m-t-1 p-y-1" style={{ padding: '10px' }}>
<RoundedButtonGroup
options={leftSidebarToggle}
value={leftSidebarValue}
onValueChanged={this.onLeftSidebarValueChanged}
/>
</div>
{buttonComponents}
<ConnectedLayoutButton />
<ConnectedPluginSwitch />
<div className="pull-right m-t-1 rm-x-1" style={{ marginLeft: 'auto' }}>
<RoundedButtonGroup
options={rightSidebarToggle}
value={rightSidebarValue}
onValueChanged={this.onRightSidebarValueChanged}
/>
</div>
</div>
2019-05-30 06:46:45 +02:00
);
}
2018-12-18 14:15:55 +01:00
}
/**
* Determine which extension buttons should be showing, if they're
* active, and what their onClick behavior should be.
*/
function _getButtonComponents(toolbarButtons, activeButtons) {
return toolbarButtons.map((button, index) => {
// TODO: If `button.buttons`, use `ExpandedToolMenu`
// I don't believe any extensions currently leverage this
return (
<ToolbarButton
key={button.id}
label={button.label}
icon={button.icon}
onClick={(evt, props) => {
if (button.commandName) {
const options = Object.assign({ evt }, button.commandOptions);
commandsManager.runCommand(button.commandName, options);
}
// TODO: Use Types ENUM
// TODO: We can update this to be a `getter` on the extension to query
// For the active tools after we apply our updates?
if (button.type === 'setToolActive') {
this.setState({
activeButtons: [button.id],
});
}
}}
2019-06-16 20:07:13 +02:00
isActive={activeButtons.includes(button.id)}
/>
);
});
}
2019-05-30 06:46:45 +02:00
export default ToolbarRow;