LassoComponent doesn't call SelectedItemSet<>::itemSelected()


#1

I'm using a LassoComponent<> and LassoSource<> to select and deselect components in a visual editor. The SelectedItemSet<> I'm providing has the virtuals itemSelected() and itemDeselected() overridden, but neither of them is called when I add something to the lasso selection.

If I use a ChangeListener, a change is broadcasted (so I'm sure the selection actually takes place).

Am I doing something wrong? I'd say this could be considered buggy behaviour.


#2

Looking at SelectedItemSet, it clearly does call those functions all over the place whenever anything changes. Maybe you've not overidden the method correctly or something else is wrong?


#3

I'm overriding the methods using c++11's override and final keywords, so I'm certain I'm using the correct functions.

Upon further inspection, you're not calling those functions in the copy assignment operator in SelectedItemSet<>:

void dragLasso (const MouseEvent& e)
{
    if (source != nullptr)
    {
        setBounds (Rectangle<int> (dragStartPos, e.getPosition()));
        setVisible (true);
        Array<SelectableItemType> itemsInLasso;
        source->findLassoItemsInArea (itemsInLasso, getBounds());
        if (e.mods.isShiftDown())
        {
            itemsInLasso.removeValuesIn (originalSelection); //  to avoid duplicates
            itemsInLasso.addArray (originalSelection);
        }
        else if (e.mods.isCommandDown() || e.mods.isAltDown())
        {
            Array<SelectableItemType> originalMinusNew (originalSelection);
            originalMinusNew.removeValuesIn (itemsInLasso);
            itemsInLasso.removeValuesIn (originalSelection);
            itemsInLasso.addArray (originalMinusNew);
        }
        source->getLassoSelection() = SelectedItemSet<SelectableItemType> (itemsInLasso);
    }
}

findLassoItemsInArea() is called (breakpoint), but then if I step further and get to the last line, it simply replaces the SelectedItemSet<> I provide using getLassoSelection() with a new one. Thát copy assignment operator doesn't call itemSelected() or itemDeselected(), but just the changebroadcaster callback.


#4

Hmm, ok, thanks - we'll take a look at that..


#5

ok.. give it a shot now!


#6

I can see the change on GitHub. Shouldn't *e = other.selectedItems.begin() be .end()? Otherwise it never enters the for-loop.


if (selectedItems != other.selectedItems)
{
    changed();
    for (int i = selectedItems.size(); --i >= 0;)
        if (! other.isSelected (selectedItems.getReference (i)))
            itemDeselected (selectedItems.remove (i));
    for (SelectableItemType* i = other.selectedItems.begin(), *e = other.selectedItems.begin(); i != e; ++i)
    {
        if (! isSelected (*i))
        {
            selectedItems.add (*i);
            itemSelected (*i);
        }
    }
}

Changed to .end() locally and works like a charm ;)


#7

Damn. Yes, of course. Fixed now, many thanks!


#8

No prob, you're welcome!