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:
parent
49b47cc866
commit
636ed22863
30 changed files with 509 additions and 378 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue