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; |