Spaces:
Running
Running
/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
import * as zrUtil from 'zrender/src/core/util'; | |
import * as visualSolution from '../../visual/visualSolution'; | |
import Model from '../../model/Model'; | |
import { ComponentOption, ZRColor, VisualOptionFixed } from '../../util/types'; | |
import ComponentModel from '../../model/Component'; | |
import BrushTargetManager from '../helper/BrushTargetManager'; | |
import { | |
BrushCoverCreatorConfig, BrushMode, BrushCoverConfig, BrushDimensionMinMax, | |
BrushAreaRange, BrushTypeUncertain, BrushType | |
} from '../helper/BrushController'; | |
import { ModelFinderObject } from '../../util/model'; | |
const DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; | |
/** | |
* The input to define brush areas. | |
* (1) Can be created by user when calling dispatchAction. | |
* (2) Can be created by `BrushController` | |
* for brush behavior. area params are picked from `cover.__brushOptoin`. | |
* In `BrushController`, "covers" are create or updated for each "area". | |
*/ | |
export interface BrushAreaParam extends ModelFinderObject { | |
brushType: BrushCoverConfig['brushType']; | |
id?: BrushCoverConfig['id']; | |
range?: BrushCoverConfig['range']; | |
// `ModelFinderObject` and `panelId` are used to match "coord sys target" | |
// for this area. See `BrushTargetManager['setInputRanges']`. | |
// If panelId specified, use it to match panel firstly. | |
// If not specified, use `ModelFinderObject` to match panel, | |
// and then assign the panelId to the area. | |
// If finally no panel matched, panelId keep null/undefined, | |
// means global area. | |
// PENDING: this feature should better belong to BrushController | |
// rather than brush component? | |
panelId?: BrushCoverConfig['panelId']; | |
// Range in local coordinates of certain coordinate system. | |
// When dispatchAction, if the area is the global area, | |
// `range` is the input. if the area is not the global area, | |
// `coordRange` is the input, and then convert to `range`. | |
coordRange?: BrushAreaRange; | |
// coord ranges, used in multiple cartesian in one grid. | |
// Only for output to users. | |
coordRanges?: BrushAreaRange[]; | |
__rangeOffset?: { | |
offset: BrushDimensionMinMax[] | BrushDimensionMinMax, | |
xyMinMax: BrushDimensionMinMax[] | |
} | |
} | |
/** | |
* Generated by `brushModel.setAreas`, which merges | |
* `area: BrushAreaParam` and `brushModel.option: BrushOption`. | |
* See `generateBrushOption`. | |
*/ | |
export interface BrushAreaParamInternal extends BrushAreaParam { | |
brushMode: BrushMode; | |
brushStyle: BrushCoverConfig['brushStyle']; | |
transformable: BrushCoverConfig['transformable']; | |
removeOnClick: BrushCoverConfig['removeOnClick']; | |
z: BrushCoverConfig['z']; | |
__rangeOffset?: { | |
offset: BrushDimensionMinMax | BrushDimensionMinMax[]; | |
xyMinMax: BrushDimensionMinMax[] | |
}; | |
} | |
export type BrushToolboxIconType = BrushType | 'keep' | 'clear'; | |
export interface BrushOption extends ComponentOption, ModelFinderObject { | |
mainType?: 'brush'; | |
// Default value see preprocessor. | |
toolbox?: BrushToolboxIconType[]; | |
// Series indices array, broadcast using dataIndex. | |
// or 'all', which means all series. 'none'/null/undefined means no series. | |
brushLink?: number[] | 'all' | 'none'; | |
// Throttle in brushSelected event. 'fixRate' or 'debounce'. | |
// If null, no throttle. Valid only in the first brush component | |
throttleType?: 'fixRate' | 'debounce'; | |
// Unit: ms, 0 means every event will be triggered. | |
throttleDelay?: number; | |
inBrush?: VisualOptionFixed; | |
outOfBrush?: VisualOptionFixed; | |
// --- Current painting brush options --- | |
// Default type of brush | |
brushType?: BrushTypeUncertain; | |
brushStyle?: { | |
borderWidth?: number; | |
color?: ZRColor; | |
borderColor?: ZRColor; | |
}; | |
transformable?: boolean; | |
brushMode?: BrushMode; | |
removeOnClick?: boolean; | |
} | |
class BrushModel extends ComponentModel<BrushOption> { | |
static type = 'brush' as const; | |
type = BrushModel.type; | |
static dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; | |
static defaultOption: BrushOption = { | |
seriesIndex: 'all', | |
brushType: 'rect', | |
brushMode: 'single', | |
transformable: true, | |
brushStyle: { | |
borderWidth: 1, | |
color: 'rgba(210,219,238,0.3)', | |
borderColor: '#D2DBEE' | |
}, | |
throttleType: 'fixRate', | |
throttleDelay: 0, | |
removeOnClick: true, | |
z: 10000 | |
}; | |
/** | |
* @readOnly | |
*/ | |
areas: BrushAreaParamInternal[] = []; | |
/** | |
* Current activated brush type. | |
* If null, brush is inactived. | |
* see module:echarts/component/helper/BrushController | |
* @readOnly | |
*/ | |
brushType: BrushTypeUncertain; | |
/** | |
* Current brush painting area settings. | |
* @readOnly | |
*/ | |
brushOption: BrushCoverCreatorConfig = {} as BrushCoverCreatorConfig; | |
// Inject | |
brushTargetManager: BrushTargetManager; | |
optionUpdated(newOption: BrushOption, isInit: boolean): void { | |
const thisOption = this.option; | |
!isInit && visualSolution.replaceVisualOption( | |
thisOption, newOption, ['inBrush', 'outOfBrush'] | |
); | |
const inBrush = thisOption.inBrush = thisOption.inBrush || {}; | |
// Always give default visual, consider setOption at the second time. | |
thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR}; | |
if (!inBrush.hasOwnProperty('liftZ')) { | |
// Bigger than the highlight z lift, otherwise it will | |
// be effected by the highlight z when brush. | |
inBrush.liftZ = 5; | |
} | |
} | |
/** | |
* If `areas` is null/undefined, range state remain. | |
*/ | |
setAreas(areas?: BrushAreaParam[]): void { | |
if (__DEV__) { | |
zrUtil.assert(zrUtil.isArray(areas)); | |
zrUtil.each(areas, function (area) { | |
zrUtil.assert(area.brushType, 'Illegal areas'); | |
}); | |
} | |
// If areas is null/undefined, range state remain. | |
// This helps user to dispatchAction({type: 'brush'}) with no areas | |
// set but just want to get the current brush select info from a `brush` event. | |
if (!areas) { | |
return; | |
} | |
this.areas = zrUtil.map(areas, function (area) { | |
return generateBrushOption(this.option, area); | |
}, this); | |
} | |
/** | |
* Set the current painting brush option. | |
*/ | |
setBrushOption(brushOption: BrushCoverCreatorConfig): void { | |
this.brushOption = generateBrushOption(this.option, brushOption); | |
this.brushType = this.brushOption.brushType; | |
} | |
} | |
function generateBrushOption( | |
option: BrushOption, brushOption: BrushAreaParam | |
): BrushAreaParamInternal; | |
function generateBrushOption( | |
option: BrushOption, brushOption: BrushCoverCreatorConfig | |
): BrushCoverCreatorConfig; | |
function generateBrushOption( | |
option: BrushOption, brushOption: BrushAreaParam | BrushCoverCreatorConfig | |
): BrushAreaParamInternal | BrushCoverCreatorConfig { | |
return zrUtil.merge( | |
{ | |
brushType: option.brushType, | |
brushMode: option.brushMode, | |
transformable: option.transformable, | |
brushStyle: new Model(option.brushStyle).getItemStyle(), | |
removeOnClick: option.removeOnClick, | |
z: option.z | |
}, | |
brushOption, | |
true | |
); | |
} | |
export default BrushModel; |