/*
* License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
*/
import React from 'react';
import {take,race,call} from 'redux-saga/effects';
import {has,get} from 'lodash';
import {MouseState} from '../visualize/VisMouseSync.js';
import ImagePlotCntlr, {visRoot, ExpandType} from '../visualize/ImagePlotCntlr.js';
import {primePlot} from '../visualize/PlotViewUtil.js';
import {dispatchAddSaga} from '../core/MasterSaga.js';
import {DefaultApiReadout} from '../visualize/ui/DefaultApiReadout.jsx';
import {reduxFlux} from '../core/ReduxFlux.js';
import {PopupMouseReadoutFull} from '../visualize/ui/PopupMouseReadout.jsx';
import DialogRootContainer from '../ui/DialogRootContainer.jsx';
import {PopupPanel, LayoutType} from '../ui/PopupPanel.jsx';
import {dispatchShowDialog,dispatchHideDialog, isDialogVisible} from '../core/ComponentCntlr.js';
import {readoutRoot,isAutoReadIsLocked, isLockByClick} from '../visualize/MouseReadoutCntlr.js';
import {mouseUpdatePromise} from '../visualize/VisMouseSync.js';
import {RangeValues} from '../visualize/RangeValues.js';
import {lastMouseImageReadout} from '../visualize/VisMouseSync';
const API_READOUT= 'apiReadout';
// NOTE
// NOTE
//----------------------------------------------------------------
// Anything that is exported here becomes part of the lowlevel API
// It should have a jsdoc
//----------------------------------------------------------------
// NOTE
// NOTE
/**
* @public
*
*/
export {RangeValues} from '../visualize/RangeValues.js';
export {WPConst, WebPlotRequest, findInvalidWPRKeys, confirmPlotRequest} from '../visualize/WebPlotRequest.js';
export {RequestType} from '../visualize/RequestType';
export {ExpandType, visRoot} from '../visualize/ImagePlotCntlr.js';
export {CysConverter} from '../visualize/CsysConverter.js';
export {CCUtil} from '../visualize/CsysConverter.js';
export {startCoverageWatcher} from '../visualize/saga/CoverageWatcher.js';
export {startDataProductsWatcher} from '../visualize/saga/DataProductsWatcher.js';
export {getSelectedRegion} from '../drawingLayers/RegionPlot.js';
export {extensionAdd, extensionRemove} from '../core/ExternalAccessUtils.js';
export {makeWorldPt, makeScreenPt, makeImagePt, parsePt} from '../visualize/Point.js';
export {IMAGE, NewPlotMode} from '../visualize/MultiViewCntlr';
/**
* Get plot object with the given plot id, when plotId is not included, active plot is returned.
* @param {string} [plotId] the plotId, optional
* @returns {WebPlot}
* @function getPrimePlot
* @public
* @memberof firefly.util.image
*
*/
export function getPrimePlot(plotId) {
return primePlot(visRoot(), plotId);
}
var isInit= false;
/**
* Set a defaults object on for a draw layer type.
* The following draw layers are supported: 'ACTIVE_TARGET_TYPE', 'CATALOG_TYPE'
* @param {string} drawLayerTypeId
* @param {DrawingDef} defaults
* @public
* @function setDrawLayerDefaults
* @memberof firefly.util.image
*
* @example
* firefly.util.image.setDrawLayerDefaults('ACTIVE_TARGET_TYPE', {symbol:'x', color:'pink', size:15});
* or
* firefly util.image.setDrawLayerDefaults('CATALOG_TYPE', {symbol:'cross', color:'red'});
*
* @see DrawingDef
* @see DrawSymbol
*/
export function setDrawLayerDefaults(drawLayerTypeId, defaults) {
reduxFlux.setDrawLayerDefaults(drawLayerTypeId, defaults);
}
/**
* @summary initialize the auto readout. Must be call once at the begging to get the popup readout running.
* @param {object} ReadoutComponent - either a PopupMouseReadoutMinimal or PopupMouseReadoutFull
* @param {object} props - a list of the properties
* @public
* @function initAutoReadout
* @memberof firefly.util.image
*/
export function initAutoReadout(ReadoutComponent= DefaultApiReadout,
props={MouseReadoutComponent:PopupMouseReadoutFull, showThumb:true,showMag:true } ){
if (isInit) return;
dispatchAddSaga(autoReadoutVisibility, {ReadoutComponent,props});
isInit= true;
}
/**
*
* @param stretchType the type of stretch may be 'Percent', 'Absolute', 'Sigma'
* @param lowerValue lower value of stretch, based on stretchType
* @param upperValue upper value of stretch, based on stretchType
* @param algorithm the stretch algorithm to use, may be 'Linear', 'Log', 'LogLog', 'Equal', 'Squared', 'Sqrt'
* @public
* @function serializeSimpleRangeValues
* @memberof firefly.util.image
*/
export function serializeSimpleRangeValues(stretchType,lowerValue,upperValue,algorithm) {
const rv= RangeValues.makeSimple(stretchType,lowerValue,upperValue,algorithm);
return rv.toJSON();
}
//========== Private ================================
//========== Private ================================
//========== Private ================================
//========== Private ================================
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
function *autoReadoutVisibility({ReadoutComponent,props}) {
let inDialog= false;
let showing;
let mouseState;
// var action;
let doYield= true;
let winner;
while (true) {
// if (doYield) action= yield take([MOUSE_STATE_CHANGE, ImagePlotCntlr.CHANGE_EXPANDED_MODE]);
if (doYield) {
winner = yield race({
expandedChange: take([ImagePlotCntlr.CHANGE_EXPANDED_MODE]),
mouse: call(mouseUpdatePromise)
});
}
doYield= true;
if (winner.mouse) {
mouseState = winner.mouse.mouseState;
}
if (visRoot().expandedMode!==ExpandType.COLLAPSE) {
hideReadout();
continue;
}
if (!mouseState) continue;
showing= isDialogVisible(API_READOUT);
if (mouseState!==MouseState.EXIT && !showing) {
showReadout(ReadoutComponent,props, (inD) => {
inDialog= inD;
});
}
else if (mouseState===MouseState.EXIT && showing) {
winner = yield race({
expandedChange: take([ImagePlotCntlr.CHANGE_EXPANDED_MODE]),
mouse: call(mouseUpdatePromise),
timer: call(delay, 3000)
});
if ((has(winner,'timer')) && !inDialog && !isLockByClick(readoutRoot()) && !isAutoReadIsLocked(readoutRoot())) {
hideReadout();
}
else {
doYield= false;
}
}
}
}
function showReadout(DefaultApiReadout, props={}, mouseInDialog) {
const title= get(lastMouseImageReadout(),'readoutItems.title.value','');
const popup= (
<PopupPanel title={title} layoutPosition={LayoutType.TOP_RIGHT} mouseInDialog={mouseInDialog} >
<DefaultApiReadout {...props} />
</PopupPanel>
);
DialogRootContainer.defineDialog(API_READOUT, popup);
dispatchShowDialog(API_READOUT);
}
function hideReadout() {
if (isDialogVisible(API_READOUT)) dispatchHideDialog(API_READOUT);
}