feeles-ide
Version:
The hackable and serializable IDE to make learning material
338 lines (281 loc) • 12.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _typestyle = require("typestyle");
var _csx = require("csx");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _CardWindow = _interopRequireDefault(require("../CardWindow"));
var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
var _Menu = _interopRequireDefault(require("@material-ui/core/Menu"));
var _MenuItem = _interopRequireDefault(require("@material-ui/core/MenuItem"));
var _Refresh = _interopRequireDefault(require("@material-ui/icons/Refresh"));
var _Fullscreen = _interopRequireDefault(require("@material-ui/icons/Fullscreen"));
var _Settings = _interopRequireDefault(require("@material-ui/icons/Settings"));
var _OpenInBrowser = _interopRequireDefault(require("@material-ui/icons/OpenInBrowser"));
var _Devices = _interopRequireDefault(require("@material-ui/icons/Devices"));
var _PhotoCamera = _interopRequireDefault(require("@material-ui/icons/PhotoCamera"));
var _CardFloatingBar = _interopRequireDefault(require("../CardFloatingBar"));
var _Monitor = _interopRequireDefault(require("./Monitor"));
var _ResolveProgress = _interopRequireDefault(require("./ResolveProgress"));
var frameSizes = [[480, 320], [640, 480], [720, 480], [800, 600], [1024, 768], [1136, 640], [1280, 720], [1280, 800], [1920, 1080]];
var by = 'x';
var getContainerStyle = function getContainerStyle(frameWidth, frameHeight) {
return {
paddingTop: (0, _csx.percent)(frameHeight / frameWidth * 100)
};
};
var cn = {
flexible: (0, _typestyle.style)({
position: 'relative',
width: '100%'
}),
popout: (0, _typestyle.style)({
height: 8
}),
fullScreen: (0, _typestyle.style)({
zIndex: 2000 // フルスクリーン時, CardFloatingBar より手前に来るように
}),
parent: (0, _typestyle.style)({
position: 'absolute',
width: '100%',
height: '100%',
top: 0,
left: 0
}),
blank: (0, _typestyle.style)({
flex: 1
})
};
var MonitorCard =
/*#__PURE__*/
function (_PureComponent) {
(0, _inherits2.default)(MonitorCard, _PureComponent);
function MonitorCard() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, MonitorCard);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(MonitorCard)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", {
frameWidth: 300,
frameHeight: 150,
containerStyle: getContainerStyle(300, 150),
processing: false,
statusLabel: null,
anchorEl: null
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "setStatusLabel", function (_ref) {
var data = _ref.data;
var value = data.value;
if (typeof value !== 'string') throw new TypeError("Cannot make statusLabel ".concat(value));
_this.setState({
statusLabel: value
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleScreenShot",
/*#__PURE__*/
(0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee() {
var request;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!_this.state.processing) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
_this.setState({
processing: true
}); // Monitor にスクリーンショットを撮るようリクエスト
request = {
query: 'capture',
type: 'image/jpeg',
requestedBy: 'user-action' // ユーザーがリクエストしたことを表す
};
_context.next = 6;
return _this.props.globalEvent.emitAsync('postMessage', request);
case 6:
// capture がおわったら, processing state を元に戻す
_this.setState({
processing: false
});
case 7:
case "end":
return _context.stop();
}
}
}, _callee, this);
})));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleSettings", function (event) {
_this.setState({
anchorEl: event.currentTarget
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleClose", function () {
_this.setState({
anchorEl: null
});
});
return _this;
}
(0, _createClass2.default)(MonitorCard, [{
key: "componentDidMount",
value: function componentDidMount() {
try {
var frame = this.props.cardProps.MonitorCard.frame;
if (frame && Array.isArray(frame.size)) {
var _frame$size = (0, _slicedToArray2.default)(frame.size, 2),
frameWidth = _frame$size[0],
frameHeight = _frame$size[1];
this.changeSize(frameWidth, frameHeight);
}
} catch (e) {// continue regardless of error
}
this.props.globalEvent.on('message.statusLabel', this.setStatusLabel);
}
}, {
key: "changeSize",
value: function changeSize(frameWidth, frameHeight) {
this.setState({
frameWidth: frameWidth,
frameHeight: frameHeight,
containerStyle: getContainerStyle(frameWidth, frameHeight)
});
}
}, {
key: "renderMenuItem",
value: function renderMenuItem(_ref3) {
var _this2 = this;
var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
w = _ref4[0],
h = _ref4[1];
var value = w + by + h;
return _react.default.createElement(_MenuItem.default, {
key: value,
onClick: function onClick() {
return _this2.changeSize(w, h);
}
}, value);
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var sizeValue = this.state.frameWidth + by + this.state.frameHeight;
var _this$props = this.props,
localization = _this$props.localization,
showAll = _this$props.showAll,
loadConfig = _this$props.loadConfig;
var feelesrc = loadConfig('feelesrc');
return _react.default.createElement(_CardWindow.default, (0, _extends2.default)({}, this.props.cardPropsBag, {
flexBasis: this.props.isExpandingEditorCard ? '25%' : '50%'
}), _react.default.createElement(_CardFloatingBar.default, null, _react.default.createElement("span", null, this.props.localization.monitorCard.title), _react.default.createElement("div", {
className: cn.blank
}), _react.default.createElement("span", null, this.state.statusLabel), _react.default.createElement(_IconButton.default, {
disabled: true
}, _react.default.createElement(_ResolveProgress.default, {
size: 24,
globalEvent: this.props.globalEvent
})), _react.default.createElement(_IconButton.default, {
color: "primary",
disabled: feelesrc.disableReloadButton,
onClick: function onClick() {
return _this3.props.setLocation();
}
}, _react.default.createElement(_Refresh.default, null)), _react.default.createElement(_IconButton.default, {
disabled: feelesrc.disableFullScreenButton,
onClick: function onClick() {
return _this3.props.toggleFullScreen();
}
}, _react.default.createElement(_Fullscreen.default, null)), showAll ? _react.default.createElement(_IconButton.default, {
tooltip: "screenshot",
disabled: this.state.processing,
onClick: this.handleScreenShot
}, _react.default.createElement(_PhotoCamera.default, null)) : null, showAll ? _react.default.createElement(_IconButton.default, {
tooltip: "settings",
onClick: this.handleSettings
}, _react.default.createElement(_Settings.default, null)) : null), _react.default.createElement("div", {
className: (0, _typestyle.classes)(cn.flexible, this.props.isPopout && cn.popout, this.props.isFullScreen && cn.fullScreen),
style: this.props.isPopout ? undefined : this.state.containerStyle
}, _react.default.createElement("div", {
className: cn.parent
}, _react.default.createElement(_Monitor.default, {
files: this.props.files,
isPopout: this.props.isPopout,
isFullScreen: this.props.isFullScreen,
reboot: this.props.reboot,
href: this.props.href,
togglePopout: this.props.togglePopout,
toggleFullScreen: this.props.toggleFullScreen,
localization: this.props.localization,
getConfig: this.props.getConfig,
addFile: this.props.addFile,
findFile: this.props.findFile,
putFile: this.props.putFile,
saveAs: this.props.saveAs,
setLocation: this.props.setLocation,
frameWidth: this.state.frameWidth,
frameHeight: this.state.frameHeight,
globalEvent: this.props.globalEvent
}))), _react.default.createElement(_Menu.default, {
anchorEl: this.state.anchorEl,
open: !!this.state.anchorEl,
onClose: this.handleClose
}, _react.default.createElement(_MenuItem.default, {
leftIcon: _react.default.createElement(_Devices.default, null),
menuItems: frameSizes.map(this.renderMenuItem, this)
}, sizeValue), _react.default.createElement(_MenuItem.default, {
leftIcon: _react.default.createElement(_OpenInBrowser.default, null),
onClick: function onClick() {
return _this3.props.togglePopout();
}
}, localization.monitorCard.popout)));
}
}]);
return MonitorCard;
}(_react.PureComponent);
exports.default = MonitorCard;
(0, _defineProperty2.default)(MonitorCard, "propTypes", {
cardPropsBag: _propTypes.default.object.isRequired,
setLocation: _propTypes.default.func.isRequired,
isPopout: _propTypes.default.bool.isRequired,
togglePopout: _propTypes.default.func.isRequired,
toggleFullScreen: _propTypes.default.func.isRequired,
files: _propTypes.default.array.isRequired,
cardProps: _propTypes.default.object.isRequired,
isFullScreen: _propTypes.default.bool.isRequired,
reboot: _propTypes.default.bool.isRequired,
href: _propTypes.default.string.isRequired,
showAll: _propTypes.default.bool.isRequired,
localization: _propTypes.default.object.isRequired,
getConfig: _propTypes.default.func.isRequired,
loadConfig: _propTypes.default.func.isRequired,
addFile: _propTypes.default.func.isRequired,
findFile: _propTypes.default.func.isRequired,
putFile: _propTypes.default.func.isRequired,
saveAs: _propTypes.default.func.isRequired,
globalEvent: _propTypes.default.object.isRequired,
isExpandingEditorCard: _propTypes.default.bool.isRequired
});