We need to highlight the items when the user moves his mouse over them, also for the “PlusMinusBoxes”.
I also modified the behavior so that the PlusMinusBoxes react at mouse down events instead of mouse up.
// juce_TreeView.h:276
virtual void paintItem (Graphics& g, int width, int height);
->
virtual void paintItem (Graphics& g, int width, int height, bool isMouseOver);
// juce_TreeView.h:348
void paintRecursively (Graphics& g, int width);
->
void paintRecursively (Graphics& g, int width, TreeViewItem* itemUnderMouse, bool isMouseOverPlusMinusBox);
// juce_TreeView.cpp:44
static const bool triggerPlusMinusBoxesOnMouseDown = true;
//==============================================================================
class TreeViewContentComponent : public Component
{
public:
TreeViewContentComponent (TreeView* const owner_)
: owner (owner_),
isDragging (false)
{
setRepaintsOnMouseActivity(true); // <-
}
// [...]
void mouseDown (const MouseEvent& e)
{
// [...]
MouseEvent e2 (e);
e2.x -= pos.getX();
e2.y -= pos.getY();
item->itemClicked (e2);
}
else if (item != 0 // <- from here
&& triggerPlusMinusBoxesOnMouseDown
&& e.x >= pos.getX() - owner->getIndentSize()
&& e.x < pos.getX())
{
item->setOpen (! item->isOpen());
}
}
// [...]
void mouseUp (const MouseEvent& e)
{
// [...]
if (needSelectionOnMouseUp)
{
selectBasedOnModifiers (item, e.mods);
}
else if (! triggerPlusMinusBoxesOnMouseDown // <-
&& e.mouseWasClicked())
{
if (e.x >= pos.getX() - owner->getIndentSize()
&& e.x < pos.getX())
{
item->setOpen (! item->isOpen());
}
}
// [...]
virtual void mouseMove(const MouseEvent& e)
{
repaint();
}
// juce_TreeView.cpp:677
void TreeViewContentComponent::paint (Graphics& g)
{
// [...]
if (! owner->rootItemVisible)
{
const int indentWidth = owner->getIndentSize();
g.setOrigin (-indentWidth, -owner->rootItem->itemHeight);
w += indentWidth;
}
TreeViewItem* itemUnderMouse = 0;
bool isMouseOverPlusMinusBox = false;
{
int x, y;
getMouseXYRelative(x, y);
Rectangle pos;
itemUnderMouse = findItemAt (y, pos);
if (itemUnderMouse != 0 && x >= pos.getX() - owner->getIndentSize()
&& x < pos.getX())
{
isMouseOverPlusMinusBox = true;
}
}
owner->rootItem->paintRecursively (g, w, itemUnderMouse, isMouseOverPlusMinusBox);
}
// [...]
void TreeViewItem::paintItem (Graphics&, int, int, bool)
{
}
// [...]
void TreeViewItem::paintRecursively (Graphics& g, int width, TreeViewItem* itemUnderMouse, bool isMouseOverPlusMinusBox)
{
jassert (ownerView != 0);
if (ownerView == 0)
return;
// [...]
if (mightContainSubItems())
{
ownerView->getLookAndFeel()
.drawTreeviewPlusMinusBox (g,
depth * indentWidth, 0,
indentWidth, itemHeight,
! isOpen(),
itemUnderMouse == this && isMouseOverPlusMinusBox); // <-
}
}
{
g.saveState();
g.setOrigin (indent, 0);
if (g.reduceClipRegion (0, 0, itemW, itemHeight))
paintItem (g, itemW, itemHeight, itemUnderMouse == this); // <-
g.restoreState();
}
// [...]
if (relY + ti->totalHeight >= clip.getY())
{
g.saveState();
g.setOrigin (0, relY);
if (g.reduceClipRegion (0, 0, width, ti->totalHeight))
ti->paintRecursively (g, width, itemUnderMouse, isMouseOverPlusMinusBox); // <-
// juce_LookAndFeel.h:270
virtual void drawTreeviewPlusMinusBox (Graphics& g, int x, int y, int w, int h, bool isPlus, bool isMouseOver);