/* * 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 { 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;