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 LegendModel, {LegendOption} from './LegendModel'; | |
| import { | |
| mergeLayoutParam, | |
| getLayoutParams | |
| } from '../../util/layout'; | |
| import { ZRColor, LabelOption } from '../../util/types'; | |
| import Model from '../../model/Model'; | |
| import GlobalModel from '../../model/Global'; | |
| import { inheritDefaultOption } from '../../util/component'; | |
| export interface ScrollableLegendOption extends LegendOption { | |
| scrollDataIndex?: number | |
| /** | |
| * Gap between each page button | |
| */ | |
| pageButtonItemGap?: number | |
| /** | |
| * Gap between page buttons group and legend items. | |
| */ | |
| pageButtonGap?: number | |
| pageButtonPosition?: 'start' | 'end' | |
| pageFormatter?: string | ((param: {current: number, total: number}) => string) | |
| pageIcons?: { | |
| horizontal?: string[] | |
| vertical?: string[] | |
| } | |
| pageIconColor?: ZRColor | |
| pageIconInactiveColor?: ZRColor | |
| pageIconSize?: number | |
| pageTextStyle?: LabelOption | |
| animationDurationUpdate?: number | |
| } | |
| class ScrollableLegendModel extends LegendModel<ScrollableLegendOption> { | |
| static type = 'legend.scroll' as const; | |
| type = ScrollableLegendModel.type; | |
| /** | |
| * @param {number} scrollDataIndex | |
| */ | |
| setScrollDataIndex(scrollDataIndex: number) { | |
| this.option.scrollDataIndex = scrollDataIndex; | |
| } | |
| init( | |
| option: ScrollableLegendOption, | |
| parentModel: Model, | |
| ecModel: GlobalModel | |
| ) { | |
| const inputPositionParams = getLayoutParams(option); | |
| super.init(option, parentModel, ecModel); | |
| mergeAndNormalizeLayoutParams(this, option, inputPositionParams); | |
| } | |
| /** | |
| * @override | |
| */ | |
| mergeOption(option: ScrollableLegendOption, ecModel: GlobalModel) { | |
| super.mergeOption(option, ecModel); | |
| mergeAndNormalizeLayoutParams(this, this.option, option); | |
| } | |
| static defaultOption: ScrollableLegendOption = inheritDefaultOption(LegendModel.defaultOption, { | |
| scrollDataIndex: 0, | |
| pageButtonItemGap: 5, | |
| pageButtonGap: null, | |
| pageButtonPosition: 'end', // 'start' or 'end' | |
| pageFormatter: '{current}/{total}', // If null/undefined, do not show page. | |
| pageIcons: { | |
| horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], | |
| vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] | |
| }, | |
| pageIconColor: '#2f4554', | |
| pageIconInactiveColor: '#aaa', | |
| pageIconSize: 15, // Can be [10, 3], which represents [width, height] | |
| pageTextStyle: { | |
| color: '#333' | |
| }, | |
| animationDurationUpdate: 800 | |
| }); | |
| }; | |
| // Do not `ignoreSize` to enable setting {left: 10, right: 10}. | |
| function mergeAndNormalizeLayoutParams( | |
| legendModel: ScrollableLegendModel, | |
| target: ScrollableLegendOption, | |
| raw: ScrollableLegendOption | |
| ) { | |
| const orient = legendModel.getOrient(); | |
| const ignoreSize = [1, 1]; | |
| ignoreSize[orient.index] = 0; | |
| mergeLayoutParam(target, raw, { | |
| type: 'box', ignoreSize: !!ignoreSize | |
| }); | |
| } | |
| export default ScrollableLegendModel; |