Jump to content
Schatten

ListBox multiple item selection issues

Recommended Posts

Hey!

I have an issue related to ListBox multiple item selection. I've set style property of my list box:

style = LB_TEXTURES + LB_MULTI;

To use these constants I've included this file:

#include "\a3\3den\UI\resincl.inc"

Despite that I can't select multiple items with either Shift or Ctrl.
Another issue is that if the first item is selected, lbSelection command returns an empty array. This is probably a bug.
Can anyone check these issues on their PCs?

Share this post


Link to post
Share on other sites

Selection/Multi selection via Ctrl or Shift works fine for me, just used import RscListBoxMulti to get the definition for my control.

Even tried import RscListBox and #include "\a3\3den\UI\resincl.inc" and changing the style property to style = LB_TEXTURES + LB_MULTI; and everything worked ok.

 

The only thing I did notice is if using lbSelection inside onLBSelChanged, lbSelection returned the previous info (ie it was not updated in time), making the same selection again provided the correct information. Should probably be flagged as a bug as the selection should have already happened. Created ticket.

 

Spoiler

#include "\a3\3den\UI\resincl.inc"
import RscListBox;
//import RscListBoxMulti;

class testLB {
	idd = 10000;

	class controls {

		class myLB : RscListBox {
			idc = 100;
			x = 0;
			y = 0;
			w = 1;
			h = 1;
			style = LB_TEXTURES + LB_MULTI;
			class items {

				class item0 {
					text = "0";
				};
				class item1 {
					text = "1";
				};
				class item2 {
					text = "2";
				};
			};

			onLBSelChanged = " \
				params[ '_ctrl', '_index' ]; \
				hint format[ 'index: %1, item: %2', _index, _ctrl lbText _index ]; \
				systemChat format[ 'Selection: %1', lbSelection _ctrl ]; \
			";
		};
	};
};

 

 

  • Like 1

Share this post


Link to post
Share on other sites

Thanks, @Larrow!
The problem was that I was updating the list box content in a loop. I've moved the list box populating code outside of the loop and now everything works fine, both multi selection and lbSelection command.

Share this post


Link to post
Share on other sites
On 8/28/2022 at 8:56 AM, killzone_kid said:

but there are more

Can you elaborate @killzone_kid ?

Share this post


Link to post
Share on other sites

Cool 👍, I already noticed the changes in Wiki to onLBSelChanged for accessing lbSelection info.

Are there any other problems we should consider when using these controls that you know about? Always nice to have this sort of info available.

Share this post


Link to post
Share on other sites

lbselection for non LB_MULTI was bugged. There are minor fixes several of them including crash so wait until dev. Some will make it into hotfix some to 2.12. If you know of any bugs -> ticket  + tag me

 

Share this post


Link to post
Share on other sites

Also, despite BIKI, you can't use lbSetSelected command to deselect all items in LB_MULTI list box -- I had to use lbSetCurSel instead. So either BIKI has wrong info or lbSetSelected is bugged.

Share this post


Link to post
Share on other sites
19 hours ago, Schatten said:

Also, despite BIKI, you can't use lbSetSelected command to deselect all items in LB_MULTI list box -- I had to use lbSetCurSel instead. So either BIKI has wrong info or lbSetSelected is bugged.

could you point to where it says wrong? can you give example what code doesnt do what you expect?

 

Share this post


Link to post
Share on other sites
On 8/31/2022 at 11:39 AM, killzone_kid said:

could you point to where it says wrong? can you give example what code doesnt do what you expect?

Sure.

I have such dialog:

Spoiler

jRGnjoRg_o.jpg

and want to delete list box items and deselect all of them after unloading cargo items.

According to BIKI:

Quote

To deselect all entries, use -1: _ctrl lbSetCurSel -1; For listbox of style LB_MULTI use lbSetSelected instead.

My list box has LB_MULTI style, so let's use lbSetSelected:

private _netIds = (lbSelection _control) apply { _control lbData _x };

{
    for "_i" from 0 to ((lbSize _control) - 1) do {
        if ((_control lbData _i) == _x) exitWith {
            _control lbDelete _i;
        };
    };
} forEach _netIds;

_control lbSetSelected [-1, true];

The result is here:

Spoiler

x7aCZfin_o.jpg

Now let's see the result of using lbSetCurSel:

Spoiler

wpDb4sYY_o.jpg

 

Share this post


Link to post
Share on other sites
1 hour ago, Schatten said:

lbSetSelected [-1, true]

where did you get this code from?

Share this post


Link to post
Share on other sites
31 minutes ago, killzone_kid said:

where did you get this code from?

I assumed that if to deselect all list box items in regular list box you should use

_control lbSetCurSel -1;

then to do the same for LB_MULTI list box, you should use lbSetSelected with appropriate changes.

Share this post


Link to post
Share on other sites

 

5 hours ago, Schatten said:

I assumed that if to deselect all list box items in regular list box you should use


_control lbSetCurSel -1;

then to do the same for LB_MULTI list box

7 hours ago, Schatten said:

_control lbSetSelected [-1, true];

 

No you have to specify each row individually.

Quote

Sets the selection state of the given row of the given listbox of style LB_MULTI. The command has to be called for every row which is needed to be selected

for "_row" from 0 to lbSize _ctrl -1 do {
	_ctrl lbSetSelected[ _row, false ];
};

TBH it would be handy to have an alternate syntax for this command that excepts an array of rows to change. TICKET @killzone_kid

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×