1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-09 04:30:09 +00:00

Minor fixes to LassoComponent, ReferenceCountedArray, Plugin demo resizing. Added deselect method to FileBrowserComponent, made TreeViews update widths when scrolling sideways. Jucer development.

This commit is contained in:
Julian Storer 2010-04-29 10:46:26 +01:00
parent 49b47cc866
commit 636ed22863
30 changed files with 509 additions and 378 deletions

View file

@ -40,7 +40,7 @@ class TreeViewContentComponent : public Component,
public TooltipClient
{
public:
TreeViewContentComponent (TreeView* const owner_)
TreeViewContentComponent (TreeView& owner_)
: owner (owner_),
buttonUnderMouse (0),
isDragging (false)
@ -67,9 +67,9 @@ public:
// (if the open/close buttons are hidden, we'll treat clicks to the left of the item
// as selection clicks)
if (e.x < pos.getX() && owner->openCloseButtonsVisible)
if (e.x < pos.getX() && owner.openCloseButtonsVisible)
{
if (e.x >= pos.getX() - owner->getIndentSize())
if (e.x >= pos.getX() - owner.getIndentSize())
item->setOpen (! item->isOpen());
// (clicks to the left of an open/close button are ignored)
@ -77,7 +77,7 @@ public:
else
{
// mouse-down inside the body of the item..
if (! owner->isMultiSelectEnabled())
if (! owner.isMultiSelectEnabled())
item->setSelected (true, true);
else if (item->isSelected())
needSelectionOnMouseUp = ! e.mods.isPopupMenu();
@ -110,7 +110,7 @@ public:
Rectangle<int> pos;
TreeViewItem* const item = findItemAt (e.y, pos);
if (item != 0 && (e.x >= pos.getX() || ! owner->openCloseButtonsVisible))
if (item != 0 && (e.x >= pos.getX() || ! owner.openCloseButtonsVisible))
item->itemDoubleClicked (e.withNewPosition (e.getPosition() - pos.getPosition()));
}
}
@ -143,7 +143,7 @@ public:
dragImage->multiplyAllAlphas (0.6f);
Point<int> imageOffset (pos.getX() - e.x, pos.getY() - e.y);
dragContainer->startDragging (dragDescription, owner, dragImage, true, &imageOffset);
dragContainer->startDragging (dragDescription, &owner, dragImage, true, &imageOffset);
}
else
{
@ -166,25 +166,37 @@ public:
updateButtonUnderMouse (e);
}
void paint (Graphics& g);
TreeViewItem* findItemAt (int y, Rectangle<int>& itemPosition) const;
static bool isMouseDraggingInChildCompOf (Component* const comp)
void paint (Graphics& g)
{
for (int i = Desktop::getInstance().getNumMouseSources(); --i >= 0;)
if (owner.rootItem != 0)
{
MouseInputSource* source = Desktop::getInstance().getMouseSource(i);
owner.handleAsyncUpdate();
if (source->isDragging())
{
Component* const underMouse = source->getComponentUnderMouse();
if (! owner.rootItemVisible)
g.setOrigin (0, -owner.rootItem->itemHeight);
if (underMouse != 0 && (comp == underMouse || comp->isParentOf (underMouse)))
return true;
}
owner.rootItem->paintRecursively (g, getWidth());
}
}
TreeViewItem* findItemAt (int y, Rectangle<int>& itemPosition) const
{
if (owner.rootItem != 0)
{
owner.handleAsyncUpdate();
if (! owner.rootItemVisible)
y += owner.rootItem->itemHeight;
TreeViewItem* const ti = owner.rootItem->findItemRecursively (y);
if (ti != 0)
itemPosition = ti->getItemPosition (false);
return ti;
}
return false;
return 0;
}
void updateComponents()
@ -193,8 +205,8 @@ public:
const int visibleBottom = visibleTop + getParentHeight();
BigInteger itemsToKeep;
TreeViewItem* item = owner->rootItem;
int y = (item != 0 && !owner->rootItemVisible) ? -item->itemHeight : 0;
TreeViewItem* item = owner.rootItem;
int y = (item != 0 && ! owner.rootItemVisible) ? -item->itemHeight : 0;
while (item != 0 && y < visibleBottom)
{
@ -268,12 +280,12 @@ public:
{
TreeViewItem* newItem = 0;
if (owner->openCloseButtonsVisible)
if (owner.openCloseButtonsVisible)
{
Rectangle<int> pos;
TreeViewItem* item = findItemAt (e.y, pos);
if (item != 0 && e.x < pos.getX() && e.x >= pos.getX() - owner->getIndentSize())
if (item != 0 && e.x < pos.getX() && e.x >= pos.getX() - owner.getIndentSize())
{
newItem = item;
@ -300,14 +312,14 @@ public:
}
}
bool isMouseOverButton (TreeViewItem* item) const throw()
bool isMouseOverButton (TreeViewItem* const item) const throw()
{
return item == buttonUnderMouse;
}
void resized()
{
owner->itemsChanged();
owner.itemsChanged();
}
const String getTooltip()
@ -318,31 +330,27 @@ public:
if (item != 0)
return item->getTooltip();
return owner->getTooltip();
return owner.getTooltip();
}
//==============================================================================
juce_UseDebuggingNewOperator
private:
TreeView* const owner;
TreeView& owner;
Array <TreeViewItem*> rowComponentItems;
Array <int> rowComponentIds;
Array <Component*> rowComponents;
TreeViewItem* buttonUnderMouse;
bool isDragging, needSelectionOnMouseUp;
TreeViewContentComponent (const TreeViewContentComponent&);
TreeViewContentComponent& operator= (const TreeViewContentComponent&);
void selectBasedOnModifiers (TreeViewItem* const item, const ModifierKeys& modifiers)
{
TreeViewItem* firstSelected = 0;
if (modifiers.isShiftDown() && ((firstSelected = owner->getSelectedItem (0)) != 0))
if (modifiers.isShiftDown() && ((firstSelected = owner.getSelectedItem (0)) != 0))
{
TreeViewItem* const lastSelected = owner->getSelectedItem (owner->getNumSelectedItems() - 1);
TreeViewItem* const lastSelected = owner.getSelectedItem (owner.getNumSelectedItems() - 1);
jassert (lastSelected != 0);
int rowStart = firstSelected->getRowNumberInTree();
@ -357,13 +365,12 @@ private:
swapVariables (ourRow, otherEnd);
for (int i = ourRow; i <= otherEnd; ++i)
owner->getItemOnRow (i)->setSelected (true, false);
owner.getItemOnRow (i)->setSelected (true, false);
}
else
{
const bool cmd = modifiers.isCommandDown();
item->setSelected ((! cmd) || (! item->isSelected()), ! cmd);
const bool cmd = modifiers.isCommandDown();
item->setSelected ((! cmd) || ! item->isSelected(), ! cmd);
}
}
@ -375,33 +382,63 @@ private:
return false;
}
static bool isMouseDraggingInChildCompOf (Component* const comp)
{
for (int i = Desktop::getInstance().getNumMouseSources(); --i >= 0;)
{
MouseInputSource* const source = Desktop::getInstance().getMouseSource(i);
if (source->isDragging())
{
Component* const underMouse = source->getComponentUnderMouse();
if (underMouse != 0 && (comp == underMouse || comp->isParentOf (underMouse)))
return true;
}
}
return false;
}
TreeViewContentComponent (const TreeViewContentComponent&);
TreeViewContentComponent& operator= (const TreeViewContentComponent&);
};
//==============================================================================
class TreeView::TreeViewport : public Viewport
{
public:
TreeViewport() throw() {}
~TreeViewport() throw() {}
TreeViewport() throw() : lastX (-1) {}
~TreeViewport() throw() {}
void updateComponents()
void updateComponents (const bool triggerResize = false)
{
TreeViewContentComponent* const tvc = static_cast <TreeViewContentComponent*> (getViewedComponent());
if (tvc != 0)
tvc->updateComponents();
{
if (triggerResize)
tvc->resized();
else
tvc->updateComponents();
}
repaint();
}
void visibleAreaChanged (int, int, int, int)
void visibleAreaChanged (int x, int, int, int)
{
updateComponents();
const bool hasScrolledSideways = (x != lastX);
lastX = x;
updateComponents (hasScrolledSideways);
}
//==============================================================================
juce_UseDebuggingNewOperator
private:
int lastX;
TreeViewport (const TreeViewport&);
TreeViewport& operator= (const TreeViewport&);
};
@ -421,7 +458,7 @@ TreeView::TreeView (const String& componentName)
openCloseButtonsVisible (true)
{
addAndMakeVisible (viewport = new TreeViewport());
viewport->setViewedComponent (new TreeViewContentComponent (this));
viewport->setViewedComponent (new TreeViewContentComponent (*this));
viewport->setWantsKeyboardFocus (false);
setWantsKeyboardFocus (true);
}
@ -1054,40 +1091,6 @@ void TreeView::itemDropped (const String& sourceDescription, Component* sourceCo
handleDrop (StringArray(), sourceDescription, sourceComponent, x, y);
}
//==============================================================================
void TreeViewContentComponent::paint (Graphics& g)
{
if (owner->rootItem != 0)
{
owner->handleAsyncUpdate();
if (! owner->rootItemVisible)
g.setOrigin (0, -owner->rootItem->itemHeight);
owner->rootItem->paintRecursively (g, getWidth());
}
}
TreeViewItem* TreeViewContentComponent::findItemAt (int y, Rectangle<int>& itemPosition) const
{
if (owner->rootItem != 0)
{
owner->handleAsyncUpdate();
if (! owner->rootItemVisible)
y += owner->rootItem->itemHeight;
TreeViewItem* const ti = owner->rootItem->findItemRecursively (y);
if (ti != 0)
itemPosition = ti->getItemPosition (false);
return ti;
}
return 0;
}
//==============================================================================
enum TreeViewOpenness
{
@ -1309,7 +1312,6 @@ void TreeViewItem::itemDropped (const String& /*sourceDescription*/, Component*
const Rectangle<int> TreeViewItem::getItemPosition (const bool relativeToTreeViewTopLeft) const throw()
{
const int indentX = getIndentX();
int width = itemWidth;
if (ownerView != 0 && width < 0)
@ -1318,8 +1320,7 @@ const Rectangle<int> TreeViewItem::getItemPosition (const bool relativeToTreeVie
Rectangle<int> r (indentX, y, jmax (0, width), totalHeight);
if (relativeToTreeViewTopLeft)
r.setPosition (r.getX() - ownerView->viewport->getViewPositionX(),
r.getY() - ownerView->viewport->getViewPositionY());
r -= ownerView->viewport->getViewPosition();
return r;
}