001package com.ericlam.mc.eldgui.component.factory;
002
003import com.ericlam.mc.eldgui.component.ComponentFactory;
004import org.bukkit.Material;
005
006import java.util.List;
007import java.util.function.Consumer;
008import java.util.function.Function;
009
010/**
011 * 選擇器組件工廠
012 */
013public interface SelectionFactory extends ComponentFactory<SelectionFactory> {
014
015    /**
016     *
017     * @param title 標題
018     * @return this
019     */
020    SelectionFactory label(String title);
021
022    /**
023     * 設置禁用
024     * @return this
025     */
026    SelectionFactory disabled();
027
028    /**
029     *
030     * @param selections 選擇列表
031     * @param <T> 選擇元素的類型
032     * @return this
033     */
034    <T> SelectionSettings<T> selectable(List<T> selections);
035
036    /**
037     * 更細節的選擇列表,包括細分圖示和數字標記等
038     * @param type 選擇元素的類型
039     * @param selectionBuilder 選擇元素建造器
040     * @param <T> 選擇元素的類型
041     * @return this
042     */
043    <T> SelectionSettings<T> selectable(Class<T> type, Consumer<SelectionBuilder<T>> selectionBuilder);
044
045
046    /**
047     * 選擇器設定
048     * @param <T> 選擇元素類型
049     */
050    interface SelectionSettings<T> {
051
052        /**
053         * 定義每個選擇元素的文字顯示
054         * @param toText 選擇元素的文字顯示
055         * @return this
056         */
057        SelectionSettings<T> toDisplay(Function<T, String> toText);
058
059        /**
060         * 綁定組件與 Model 屬性
061         * @param field Model 屬性
062         * @param value 初始化數值
063         * @return this
064         */
065        SelectionSettings<T> bindInput(String field, T value);
066
067        /**
068         * 返回工廠設置
069         * @return 組件工廠
070         */
071        SelectionFactory then();
072
073    }
074
075    /**
076     * 選擇元素建造器
077     * @param <T> 選擇元素的類型
078     */
079    interface SelectionBuilder<T> {
080
081        /**
082         * 插入選擇元素
083         * @param element 選擇元素
084         * @return this
085         */
086        Selection<T> insert(T element);
087
088        /**
089         * 選擇元素設定
090         * @param <T> 選擇元素的類型
091         */
092        interface Selection<T> {
093
094            /**
095             * 該元素的數字標記
096             * @param amount 數字標記
097             * @return this
098             */
099            Selection<T> number(int amount);
100
101            /**
102             * 該元素的圖示
103             * @param icon 圖示
104             * @return this
105             */
106            Selection<T> icon(Material icon);
107
108            /**
109             * 遞交。只有遞交後才能真正加入到組件中
110             */
111            void submit();
112
113        }
114
115    }
116
117
118}