Jump to content

[1.7.10] How to Drag-and-Drop an element in GuiScrollingList?


Abastro

Recommended Posts

I have several questions on it.

1. Is it possible to drag-and-drop the element in GuiScrollingList? Is there any limit prohibiting the dragging?

2. Please give any tutorials or instruction for checking if it is dragging, or when it got dropped.

3. Is there any easy ways for this purpose? If any, please let me know; I'm looking forward at it.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Honestly, I have no clue how to do this. I have tried before but could never understand how the scrolling works. I would suggest finding a mod the implements some of what you want and decompiling it or, finding their github. :)

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Link to comment
Share on other sites

I can honestly say that there is no such implementation in normal source (forge+mc).

 

As to how to make it - 1st thing would be to understand how ScrollingList works, then your best option would to be make new class that would consist of 2 scrolling lists. Then you will need to, inside mouseClicked get the index clicked in one list (there is parent-child relation) and save that index to some temporary element. In your drawScreen you would need to draw this temporary element in place of mouse (also save x and y offset of element). mouseClicked has int event - you can use that to check when element is being hold and dropped, when dropped you can check if it was dropped inside same/other scrolling list and put it in index closest to separator between 2 existing indexes (if such are there). Obviously this will require you to understand how thay are being moved via scroll.

 

This is NOT very hard, it just requires shitload of reading and understanding mechanism to most basic state.

 

Structure:

MyGuiScreen (main screen)

---MyDoubleList extends Gui (and you will need to call methods inside from parent GuiScreen above)

---//MyDoubleList will containt:

------GuiScrollingList (first)

------GuiScrollingList (second)

------ElementHeld (the element that can be put into GuiScrollingList)

 

MyGuiScren calls renders/actions of MyDoubleList and MyDoubleList operates between 2 scrolling lists and element held. ElementHeld is ofc type that can be put inside those lists so it has some method that can be called from drawSlot(). You will call that method on drawScreen and draw it on mouse (with x/y offset saved), instead on one of lists. If Element is dropped not-in-one-of-lists then you can put it back to one you pulled it from.

 

I have somewhat expertise in those Guis, so to fully understand what I mean you need to 1st understand guis.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

I can honestly say that there is no such implementation in normal source (forge+mc).

 

As to how to make it - 1st thing would be to understand how ScrollingList works, then your best option would to be make new class that would consist of 2 scrolling lists. Then you will need to, inside mouseClicked get the index clicked in one list (there is parent-child relation) and save that index to some temporary element. In your drawScreen you would need to draw this temporary element in place of mouse (also save x and y offset of element). mouseClicked has int event - you can use that to check when element is being hold and dropped, when dropped you can check if it was dropped inside same/other scrolling list and put it in index closest to separator between 2 existing indexes (if such are there). Obviously this will require you to understand how thay are being moved via scroll.

 

This is NOT very hard, it just requires shitload of reading and understanding mechanism to most basic state.

 

Structure:

MyGuiScreen (main screen)

---MyDoubleList extends Gui (and you will need to call methods inside from parent GuiScreen above)

---//MyDoubleList will containt:

------GuiScrollingList (first)

------GuiScrollingList (second)

------ElementHeld (the element that can be put into GuiScrollingList)

 

MyGuiScren calls renders/actions of MyDoubleList and MyDoubleList operates between 2 scrolling lists and element held. ElementHeld is ofc type that can be put inside those lists so it has some method that can be called from drawSlot(). You will call that method on drawScreen and draw it on mouse (with x/y offset saved), instead on one of lists. If Element is dropped not-in-one-of-lists then you can put it back to one you pulled it from.

 

I have somewhat expertise in those Guis, so to fully understand what I mean you need to 1st understand guis.

 

Thanks, but what I want was drag-and-drop on one list, to move position.

anyway I got some understanding on how to do it. I was just too lazy...  ;| (+ I have only 2 hours per day u.u)

 

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Wait, I found a vital limit..

There is a field which represents how much the list was scrolled: GuiScrollingList#scrollDistance.

I should access to the field to find the position the element will be.

But it is private, so there is no way to access the field without reflection.

So, how can I solve this problem? Is there any breakthrough?

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

No, no, no, no...

 

Just copy that code and make mod-owned gui class. (MyGuiScrollingList). Who cares about ClassLoader (meaning amout of loaded classes) anyway?

 

You are better off making new one - gives you lot more power over handling stuff, that you are going to need to make universal drag-drop-scroll list.

 

Why would anyone make that field private... cmon forge :c

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Access Transformers

What.. I don't want to reflection AS WELL AS AT(ASM)!

 

 

No, no, no, no...

 

Just copy that code and make mod-owned gui class. (MyGuiScrollingList). Who cares about ClassLoader (meaning amout of loaded classes) anyway?

 

You are better off making new one - gives you lot more power over handling stuff, that you are going to need to make universal drag-drop-scroll list.

 

Why would anyone make that field private... cmon forge :c

 

I didn't really want to copy the code... but if I should, I'd do it.

+ Would making a PR which simply changes the field to public be acceptable?

+ Actually I solved that. There is a method named GuiScrollingList#func_27256_c(int x, int y).

  It checks that a specific position is in the list, so I can get what I want by some trick.! (like putting y-slotheight/2)

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Using reflection is just fine. You won't get a PR in with just this change, Reflection is the way to go.

Hm. Thanks, so the those PRs are not acceptable.

& I'll not use reflection to do this, since there is another way. (..actually I doubt that you read my thread, but nevermind)

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

I did read your thread...

Yes, there are other ways, you could copy-pasta the whole thing (ugly) use an AccessTransformer (hacky, overkill, doesn't work as well as most people think) or just use custom ASM code instead of an AccessTransformer (even more ugly).

In my opinion Reflection is just fine to use in this situation.

Oh, that sounds interesting. So I'd use Refelction in similar situation, when it is necessary. Thanks.

+ What I mean by 'another way', it means that there is normal way, which is just 'calling normal method'.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.