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}