Skip to content

Commit

Permalink
add Folder system to sort and manage profiles
Browse files Browse the repository at this point in the history
  • Loading branch information
kuzuanpa committed May 17, 2024
1 parent 2a0e185 commit 533e3fa
Show file tree
Hide file tree
Showing 7 changed files with 248 additions and 110 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Thinker is currently in development, and the list of features to be implemented

[ ]Detect the object pointed to by the mouse

[x]Folder-like thinking profiles management

Thinker提供了一个强大的帮助gui,允许通过json创建任意的方块/方块实体/来自GeckoLib的方块模型 和 文字/图片等,可以让整合包作者制作直观而简洁易懂的帮助页面

Expand All @@ -25,5 +26,6 @@ Thinker目前仍处于开发中,仍待实现的功能列表:

[ ]检测鼠标指向的物体

[x]文件夹式的沉思情景管理


25 changes: 6 additions & 19 deletions src/main/java/cn/kuzuanpa/thinker/client/ThinkingGuiMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,21 +101,6 @@ public void initGui() {
buttonList.add(new ThinkingProfileList(3,0,0,displayHeight).addToList(buttonsHaveAnime));
buttonList.add(new thinkerImage(4,65,0,0,32,16,16,"textures/gui/think/base.png", l10n("thinker.list.fold")).addToList(buttonsHaveAnime));
buttonList.add(new thinkerImage(5,-16,0,16,32,16,16,"textures/gui/think/base.png",l10n("thinker.list.unfold")).addToList(buttonsHaveAnime));
//ArrayList<IdummyWorldThinkerObject> blocks=new ArrayList<>();
////blocks.put(new BlockPosition(4,2,4),new dummyWorldBlock(Blocks.chest,new DummyBlockAnimeOutlineGlowth(1000,20000,new BlockPosition(4,2,4),-1,4)));
////blocks.put(new BlockPosition(5,2,5),new dummyWorldBlock(Blocks.chest,new DummyBlockAnimeRotateSteadily()));
//blocks.add(new dummyWorldBlock( new BlockPosition(0,2,0), Blocks.dark_oak_stairs,new DummyWorldGraphicAnimeRotateSteadily()).setRenderAllFace(true));
//blocks.add(new dummyWorldBlock( new BlockPosition(0,3,0), Blocks.daylight_detector,new DummyWorldGraphicAnimeRotateSteadily()));
//blocks.add(new dummyWorldBlock( new BlockPosition(1,2,0), Blocks.double_wooden_slab));
//blocks.add(new dummyWorldBlock( new BlockPosition(3,2,0), Blocks.fence));
//blocks.add(new dummyWorldBlock( new BlockPosition(1,1,0), Blocks.acacia_stairs).setRenderAllFace(true));
//blocks.add(new dummyWorldBlock( new BlockPosition(0,2,5), Blocks.diamond_block));
//blocks.add(new dummyWorldBlock( new BlockPosition(0,2,4), Blocks.diamond_block));
//blocks.add(new dummyWorldBlock( new BlockPosition(2,2,0), Blocks.stained_glass));
//blocks.add(new dummyWorldBlock( new BlockPosition(2,2,1), MultiTileEntityRegistry.getRegistry("gt.multitileentity").getItem(10005), new DummyWorldGraphicAnimeMoveLinear(0,10000,1,1,1)));
//blocks.add(new dummyWorldBlock( new BlockPosition(2,3,1), MultiTileEntityRegistry.getRegistry("ktfru.multitileentity").getItem(31001), new DummyWorldGraphicAnimeMoveLinear(0,10000,1,1,1)));
//blocks.add(new dummyWorldBlock( new BlockPosition(2,4,1), MultiTileEntityRegistry.getRegistry("ktfru.multitileentity").getItem(31001), new DummyWorldGraphicAnimeMoveLinear(0,10000,1,1,1)));
//blocks.add(new dummyWorldGeckoModel( new BlockPosition(2,5,1), "botarium.geo.json","ideas/botarium.png","botarium.animation.json"));
profileHandler.clearAllProfile();

try {
Expand Down Expand Up @@ -163,13 +148,13 @@ protected boolean onButtonPressed(GuiButton button) {
if(button.id==2) this.mc.displayGuiScreen(new ThinkerSettingsGui());
if(button.id==3) {
int mouseY=this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
if(Mouse.isInsideWindow())for (int i : profileHandler.displayProfileIDMap.keySet())if(mouseY>=YOffset+i*(16+ configHandler.themeSelectorProfileGap.get()) && mouseY<=YOffset+16+i*(16+ configHandler.themeSelectorProfileGap.get())){
if(!Objects.equals(selectedProfileID, displayProfileIDMap.get(i))){
onProfileChanged(displayProfileIDMap.get(i));
if(Mouse.isInsideWindow()){
String newID=((ThinkingProfileList) button).onMouseClick(mouseY);
if(!Objects.equals(selectedProfileID, newID)&&profileHandler.getProfile(newID)!=null){
onProfileChanged(newID);
if(configHandler.themeSelectorAutoFold.get())foldThemeSelector(false);
((DummyWorldButton)buttonList.get(1)).clickOnOtherButton=false;
}
break;
}
}
if(button.id==4&&!themeSelectorFolded) foldThemeSelector(false);
Expand All @@ -182,6 +167,8 @@ public void foldThemeSelector(boolean immediately){
((ThinkerButtonBase)buttonList.get(4)).addAnime(new animeMoveLinear((int) (System.currentTimeMillis()-initTime)-(immediately?10:0), (int) (System.currentTimeMillis()-initTime+ (immediately?0:configHandler.getConfiguredAnimeTime(500))),-80,0));
((ThinkerButtonBase)buttonList.get(5)).addAnime(new animeMoveLinear((int) (System.currentTimeMillis()-initTime)-(immediately?10:0), (int) (System.currentTimeMillis()-initTime+ (immediately?0:configHandler.getConfiguredAnimeTime(200))),16,0));
themeSelectorFolded=true;
unfoldedDirs.clear();

}
public void unfoldThemeSelector(){
((ThinkerButtonBase)buttonList.get(3)).addAnime(new animeMoveLinear((int) (System.currentTimeMillis()-initTime), (int) (System.currentTimeMillis()-initTime+ configHandler.getConfiguredAnimeTime(500)),80,0));
Expand Down
213 changes: 146 additions & 67 deletions src/main/java/cn/kuzuanpa/thinker/client/handler/profileHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ public class profileHandler {
public static thinkingProfile selectedProfile;
public static float oldWheel=0F,YOffset=0;
private static final HashMap<String,thinkingProfile> profileMap =new HashMap<>();
public static Map<Integer,String> displayProfileIDMap = new HashMap<>();
public static int profileLayer=1;
public static LinkedHashMap<String,Object> rootDir=new LinkedHashMap<>();
public static ArrayList<String> unfoldedDirs =new ArrayList<>();
public static void handleMouseWheel(){
oldWheel+=Mouse.getEventDWheel();
}
Expand All @@ -58,88 +59,166 @@ public static void tick(){
public static void onProfileChanged(String profileID){
selectedProfile= profileMap.get(profileID);
}
public static void addProfile(thinkingProfile profile){ profileMap.put(profile.id,profile); refreshDisplayIDMap();}
public static void addProfiles(List<thinkingProfile> profiles){profiles.forEach(profile->profileMap.put(profile.id,profile));refreshDisplayIDMap();}
public static void addProfile(thinkingProfile profile){ profileMap.put(profile.id,profile);}
public static void addProfiles(List<thinkingProfile> profiles){profiles.forEach(profile->profileMap.put(profile.id,profile));}
public static void clearAllProfile(){profileMap.clear();}
public static void removeProfile(String id){profileMap.remove(id);}
public static HashMap<String,thinkingProfile> getProfileMap(){return profileMap;}

public static void refreshDisplayIDMap(){
AtomicInteger i = new AtomicInteger(0);
profileMap.forEach((k, v)->displayProfileIDMap.put(i.getAndIncrement(),k));
}

public static thinkingProfile getProfile(String id){return profileMap.get(id);}
public static boolean isItemHaveProfile(String itemId){return profileMap.values().stream().anyMatch(v-> v.bindItemId.equals(itemId));}
public static thinkingProfile getProfileFromItem(String itemId){return profileMap.values().stream().filter(v->v.bindItemId.equalsIgnoreCase(itemId)).findFirst().orElse(null);}
public static class thinkingProfile{
public thinkingProfile(String id, ThinkerButtonBase... buttons){this(id,null,0,0,0,0,buttons);}
public thinkingProfile(String id, IIcon icon, ThinkerButtonBase... buttons){this(id,icon,1,1,1,1,buttons);}
public thinkingProfile(String id, IIcon icon,int iconRGBA, ThinkerButtonBase... buttons){this(id,icon,(float)(iconRGBA >> 16 & 255) / 255.0F,(iconRGBA >> 8 & 255) / 255.0F,(iconRGBA & 255) /255.0F,(float)(iconRGBA >> 24 & 255),buttons);}
public thinkingProfile(String id, IIcon icon,short[] iconRGBA, ThinkerButtonBase... buttons){this(id,icon,(float)iconRGBA[0] / 255.0F,(float)iconRGBA[1] / 255.0F,(float)iconRGBA[2] /255.0F,(float)iconRGBA[3] / 255.0F,buttons);}
public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, ThinkerButtonBase... buttons){
this.id=id;
this.disableDummyWorldRend=true;
this.icon=icon;
this.iconR=iconR;
this.iconG=iconG;
this.iconB=iconB;
this.iconA=iconA;
public static void buildDirTree(){
rootDir.clear();
profileMap.forEach((id,profile)->{
if (profile.dir==null)rootDir.put(id,profile);
else rootDir.putAll(sortMap(walkDirTree(profile.dir, profile.id,rootDir)));
});
rootDir=sortMap(rootDir);
}

public static LinkedHashMap<String,Object> sortMap(LinkedHashMap<String,Object> map){
LinkedHashMap<String,Object> profiles = new LinkedHashMap<>();
LinkedHashMap<String,Object> dirs = new LinkedHashMap<>();
map.forEach((k,v)->{
if(v instanceof thinkingProfile)profiles.put(k,v);
if(v instanceof LinkedHashMap) {
dirs.put(k,sortMap((LinkedHashMap<String,Object>) v));
}
});
LinkedHashMap<String,Object> mapReturn = new LinkedHashMap<>();

mapReturn.putAll(dirs);
mapReturn.putAll(profiles);

return mapReturn;
}
public static LinkedHashMap<String, Object> walkDirTree(String[] input, String profileID,LinkedHashMap<String,Object> upperDir){

LinkedHashMap<String,Object> result = new LinkedHashMap<>();
if(input.length>0&&upperDir.get(input[0]) instanceof LinkedHashMap){
//currentDir already exist
((LinkedHashMap<String, Object>)upperDir.get(input[0])).putAll(walkDirTree(Arrays.copyOfRange(input, 1, input.length), profileID,(LinkedHashMap<String, Object>)upperDir.get(input[0])));
}else {
//no more dir, return profile
if(input.length==0||input[0].equals(""))result.put(profileID,profileMap.get(profileID));
//current Dir not exist, create new one
else result.put(input[0],walkDirTree(Arrays.copyOfRange(input, 1, input.length), profileID,result));
}
return result;
}
public static class thinkingProfile {
public thinkingProfile(String id, ThinkerButtonBase... buttons) {
this(id, null, 0, 0, 0, 0, buttons);
}

public thinkingProfile(String id, IIcon icon, ThinkerButtonBase... buttons) {
this(id, icon, 1, 1, 1, 1, buttons);
}

public thinkingProfile(String id, IIcon icon, int iconRGBA, ThinkerButtonBase... buttons) {
this(id, icon, (float) (iconRGBA >> 16 & 255) / 255.0F, (iconRGBA >> 8 & 255) / 255.0F, (iconRGBA & 255) / 255.0F, (float) (iconRGBA >> 24 & 255), buttons);
}

public thinkingProfile(String id, IIcon icon, short[] iconRGBA, ThinkerButtonBase... buttons) {
this(id, icon, (float) iconRGBA[0] / 255.0F, (float) iconRGBA[1] / 255.0F, (float) iconRGBA[2] / 255.0F, (float) iconRGBA[3] / 255.0F, buttons);
}

public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, ThinkerButtonBase... buttons) {
this.id = id;
this.disableDummyWorldRend = true;
this.icon = icon;
this.iconR = iconR;
this.iconG = iconG;
this.iconB = iconB;
this.iconA = iconA;
Collections.addAll(this.buttons, buttons);
}

public thinkingProfile(String id, List<ThinkerButtonBase> buttons){this(id,null,0,0,0,0,buttons);}
public thinkingProfile(String id, IIcon icon, List<ThinkerButtonBase> buttons){this(id,icon,1,1,1,1,buttons);}
public thinkingProfile(String id, IIcon icon,int iconRGBA, List<ThinkerButtonBase> buttons){this(id,icon,(float)(iconRGBA >> 16 & 255) / 255.0F,(iconRGBA >> 8 & 255) / 255.0F,(iconRGBA & 255) /255.0F,(float)(iconRGBA >> 24 & 255),buttons);}
public thinkingProfile(String id, IIcon icon,short[] iconRGBA, List<ThinkerButtonBase> buttons){this(id,icon,(float)iconRGBA[0] / 255.0F,(float)iconRGBA[1] / 255.0F,(float)iconRGBA[2] /255.0F,(float)iconRGBA[3] / 255.0F,buttons);}
public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, List<ThinkerButtonBase> buttons){
this.id=id;
this.disableDummyWorldRend=true;
this.icon=icon;
this.iconR=iconR;
this.iconG=iconG;
this.iconB=iconB;
this.iconA=iconA;
this.buttons= (ArrayList<ThinkerButtonBase>) buttons;
}

public thinkingProfile(String id, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons){this(id,null,0,0,0,0,dummyWorldThinkerObjects,buttons);}
public thinkingProfile(String id, IIcon icon, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons){this(id,icon,1,1,1,1,dummyWorldThinkerObjects,buttons);}
public thinkingProfile(String id, IIcon icon, int iconRGBA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons){this(id,icon,(float)(iconRGBA >> 16 & 255) / 255.0F,(iconRGBA >> 8 & 255) / 255.0F,(iconRGBA & 255) /255.0F,(float)(iconRGBA >> 24 & 255),dummyWorldThinkerObjects,buttons);}
public thinkingProfile(String id, IIcon icon, short[] iconRGBA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons){this(id,icon,(float)iconRGBA[0] / 255.0F,(float)iconRGBA[1] / 255.0F,(float)iconRGBA[2] /255.0F,(float)iconRGBA[3] / 255.0F,dummyWorldThinkerObjects,buttons);}
public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons){
this.id=id;
this.disableDummyWorldRend=false;
this.icon=icon;
this.iconR=iconR;
this.iconG=iconG;
this.iconB=iconB;
this.iconA=iconA;
this.dummyWorldThinkerObjects=dummyWorldThinkerObjects;
public thinkingProfile(String id, List<ThinkerButtonBase> buttons) {
this(id, null, 0, 0, 0, 0, buttons);
}

public thinkingProfile(String id, IIcon icon, List<ThinkerButtonBase> buttons) {
this(id, icon, 1, 1, 1, 1, buttons);
}

public thinkingProfile(String id, IIcon icon, int iconRGBA, List<ThinkerButtonBase> buttons) {
this(id, icon, (float) (iconRGBA >> 16 & 255) / 255.0F, (iconRGBA >> 8 & 255) / 255.0F, (iconRGBA & 255) / 255.0F, (float) (iconRGBA >> 24 & 255), buttons);
}

public thinkingProfile(String id, IIcon icon, short[] iconRGBA, List<ThinkerButtonBase> buttons) {
this(id, icon, (float) iconRGBA[0] / 255.0F, (float) iconRGBA[1] / 255.0F, (float) iconRGBA[2] / 255.0F, (float) iconRGBA[3] / 255.0F, buttons);
}

public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, List<ThinkerButtonBase> buttons) {
this.id = id;
this.disableDummyWorldRend = true;
this.icon = icon;
this.iconR = iconR;
this.iconG = iconG;
this.iconB = iconB;
this.iconA = iconA;
this.buttons.addAll(buttons);
}

public thinkingProfile(String id, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons) {
this(id, null, 0, 0, 0, 0, dummyWorldThinkerObjects, buttons);
}

public thinkingProfile(String id, IIcon icon, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons) {
this(id, icon, 1, 1, 1, 1, dummyWorldThinkerObjects, buttons);
}

public thinkingProfile(String id, IIcon icon, int iconRGBA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons) {
this(id, icon, (float) (iconRGBA >> 16 & 255) / 255.0F, (iconRGBA >> 8 & 255) / 255.0F, (iconRGBA & 255) / 255.0F, (float) (iconRGBA >> 24 & 255), dummyWorldThinkerObjects, buttons);
}

public thinkingProfile(String id, IIcon icon, short[] iconRGBA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons) {
this(id, icon, (float) iconRGBA[0] / 255.0F, (float) iconRGBA[1] / 255.0F, (float) iconRGBA[2] / 255.0F, (float) iconRGBA[3] / 255.0F, dummyWorldThinkerObjects, buttons);
}

public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, List<IdummyWorldThinkerObject> dummyWorldThinkerObjects, ThinkerButtonBase... buttons) {
this.id = id;
this.disableDummyWorldRend = false;
this.icon = icon;
this.iconR = iconR;
this.iconG = iconG;
this.iconB = iconB;
this.iconA = iconA;
this.dummyWorldThinkerObjects.addAll(dummyWorldThinkerObjects);
Collections.addAll(this.buttons, buttons);
}

public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, ArrayList<IdummyWorldThinkerObject> dummyWorldThinkerObjects, List<ThinkerButtonBase> buttons){
this.id=id;
this.disableDummyWorldRend=false;
this.icon=icon;
this.iconR=iconR;
this.iconG=iconG;
this.iconB=iconB;
this.iconA=iconA;
this.dummyWorldThinkerObjects=dummyWorldThinkerObjects;
this.buttons= (ArrayList<ThinkerButtonBase>) buttons;
}
public boolean disableDummyWorldRend=false;
public IIcon icon;
public float iconR,iconG,iconB,iconA;
public List<IdummyWorldThinkerObject> dummyWorldThinkerObjects = new ArrayList<>();
public ArrayList<ThinkerButtonBase> buttons = new ArrayList<>();
public String id;
public thinkingProfile(String id, IIcon icon, float iconR, float iconG, float iconB, float iconA, ArrayList<IdummyWorldThinkerObject> dummyWorldThinkerObjects, List<ThinkerButtonBase> buttons) {
this.id = id;
this.disableDummyWorldRend = false;
this.icon = icon;
this.iconR = iconR;
this.iconG = iconG;
this.iconB = iconB;
this.iconA = iconA;
this.dummyWorldThinkerObjects.addAll(dummyWorldThinkerObjects);
this.buttons.addAll(buttons);
}

public final boolean disableDummyWorldRend;
public final IIcon icon;
public final float iconR, iconG, iconB, iconA;
public final List<IdummyWorldThinkerObject> dummyWorldThinkerObjects = new ArrayList<>();
public final ArrayList<ThinkerButtonBase> buttons = new ArrayList<>();
public final String id;
public String[] dir;
public String bindItemId = "";
public thinkingProfile setBindItemId(String unlocalizedName){

public thinkingProfile setBindItemId(String unlocalizedName) {
bindItemId = unlocalizedName;
return this;
}

public thinkingProfile setDir(String[] dir) {
this.dir = dir;
return this;
}
}
}
Loading

0 comments on commit 533e3fa

Please sign in to comment.