From b653e838d0e4175e52adb8c604a6af6ea479cead Mon Sep 17 00:00:00 2001 From: jules Date: Thu, 10 Aug 2017 11:13:01 +0100 Subject: [PATCH] Tweaked the order in which properties are set when TreeViewItems are added, and did some internal modernisation of the TreeView classes --- .../juce_gui_basics/widgets/juce_TreeView.cpp | 367 ++++++++---------- .../juce_gui_basics/widgets/juce_TreeView.h | 25 +- 2 files changed, 179 insertions(+), 213 deletions(-) diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.cpp b/modules/juce_gui_basics/widgets/juce_TreeView.cpp index 3266af6a98..d4a24d59dd 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.cpp +++ b/modules/juce_gui_basics/widgets/juce_TreeView.cpp @@ -29,11 +29,7 @@ class TreeView::ContentComponent : public Component, public AsyncUpdater { public: - ContentComponent (TreeView& tree) - : owner (tree), - buttonUnderMouse (nullptr), - isDragging (false), - needSelectionOnMouseUp (false) + ContentComponent (TreeView& tree) : owner (tree) { } @@ -45,7 +41,7 @@ public: needSelectionOnMouseUp = false; Rectangle pos; - if (TreeViewItem* const item = findItemAt (e.y, pos)) + if (auto* item = findItemAt (e.y, pos)) { if (isEnabled()) { @@ -82,7 +78,8 @@ public: if (needSelectionOnMouseUp && e.mouseWasClicked() && isEnabled()) { Rectangle pos; - if (TreeViewItem* const item = findItemAt (e.y, pos)) + + if (auto* item = findItemAt (e.y, pos)) selectBasedOnModifiers (item, e.mods); } } @@ -92,7 +89,8 @@ public: if (e.getNumberOfClicks() != 3 && isEnabled()) // ignore triple clicks { Rectangle pos; - if (TreeViewItem* const item = findItemAt (e.y, pos)) + + if (auto* item = findItemAt (e.y, pos)) if (e.x >= pos.getX() || ! owner.openCloseButtonsVisible) item->itemDoubleClicked (e.withNewPosition (e.position - pos.getPosition().toFloat())); } @@ -106,30 +104,31 @@ public: || e.mods.isPopupMenu())) { isDragging = true; - Rectangle pos; - TreeViewItem* const item = findItemAt (e.getMouseDownY(), pos); - if (item != nullptr && e.getMouseDownX() >= pos.getX()) + if (auto* item = findItemAt (e.getMouseDownY(), pos)) { - const var dragDescription (item->getDragSourceDescription()); - - if (! (dragDescription.isVoid() || (dragDescription.isString() && dragDescription.toString().isEmpty()))) + if (e.getMouseDownX() >= pos.getX()) { - if (DragAndDropContainer* const dragContainer = DragAndDropContainer::findParentDragContainerFor (this)) - { - pos.setSize (pos.getWidth(), item->itemHeight); - Image dragImage (Component::createComponentSnapshot (pos, true)); - dragImage.multiplyAllAlphas (0.6f); + auto dragDescription = item->getDragSourceDescription(); - Point imageOffset (pos.getPosition() - e.getPosition()); - dragContainer->startDragging (dragDescription, &owner, dragImage, true, &imageOffset); - } - else + if (! (dragDescription.isVoid() || (dragDescription.isString() && dragDescription.toString().isEmpty()))) { - // to be able to do a drag-and-drop operation, the treeview needs to - // be inside a component which is also a DragAndDropContainer. - jassertfalse; + if (auto* dragContainer = DragAndDropContainer::findParentDragContainerFor (this)) + { + pos.setSize (pos.getWidth(), item->itemHeight); + Image dragImage (Component::createComponentSnapshot (pos, true)); + dragImage.multiplyAllAlphas (0.6f); + + auto imageOffset = pos.getPosition() - e.getPosition(); + dragContainer->startDragging (dragDescription, &owner, dragImage, true, &imageOffset); + } + else + { + // to be able to do a drag-and-drop operation, the treeview needs to + // be inside a component which is also a DragAndDropContainer. + jassertfalse; + } } } } @@ -161,7 +160,7 @@ public: if (! owner.rootItemVisible) y += owner.rootItem->itemHeight; - if (TreeViewItem* const ti = owner.rootItem->findItemRecursively (y)) + if (auto* ti = owner.rootItem->findItemRecursively (y)) { itemPosition = ti->getItemPosition (false); return ti; @@ -173,14 +172,14 @@ public: void updateComponents() { - const int visibleTop = -getY(); - const int visibleBottom = visibleTop + getParentHeight(); + auto visibleTop = -getY(); + auto visibleBottom = visibleTop + getParentHeight(); - for (int i = items.size(); --i >= 0;) - items.getUnchecked(i)->shouldKeep = false; + for (auto* i : items) + i->shouldKeep = false; { - TreeViewItem* item = owner.rootItem; + auto* item = owner.rootItem; int y = (item != nullptr && ! owner.rootItemVisible) ? -item->itemHeight : 0; while (item != nullptr && y < visibleBottom) @@ -189,11 +188,11 @@ public: if (y >= visibleTop) { - if (RowItem* const ri = findItem (item->uid)) + if (auto* ri = findItem (item->uid)) { ri->shouldKeep = true; } - else if (Component* const comp = item->createItemComponent()) + else if (auto* comp = item->createItemComponent()) { items.add (new RowItem (item, comp, item->uid)); addAndMakeVisible (comp); @@ -206,14 +205,14 @@ public: for (int i = items.size(); --i >= 0;) { - RowItem* const ri = items.getUnchecked(i); + auto* ri = items.getUnchecked(i); bool keep = false; if (isParentOf (ri->component)) { if (ri->shouldKeep) { - Rectangle pos (ri->item->getItemPosition (false)); + auto pos = ri->item->getItemPosition (false); pos.setSize (pos.getWidth(), ri->item->itemHeight); if (pos.getBottom() >= visibleTop && pos.getY() < visibleBottom) @@ -235,7 +234,7 @@ public: } } - bool isMouseOverButton (TreeViewItem* const item) const noexcept + bool isMouseOverButton (TreeViewItem* item) const noexcept { return item == buttonUnderMouse; } @@ -248,7 +247,8 @@ public: String getTooltip() override { Rectangle pos; - if (TreeViewItem* const item = findItemAt (getMouseXYRelative().y, pos)) + + if (auto* item = findItemAt (getMouseXYRelative().y, pos)) return item->getTooltip(); return owner.getTooltip(); @@ -260,8 +260,8 @@ private: struct RowItem { - RowItem (TreeViewItem* const it, Component* const c, const int itemUID) - : component (c), item (it), uid (itemUID), shouldKeep (true) + RowItem (TreeViewItem* it, Component* c, int itemUID) + : component (c), item (it), uid (itemUID) { } @@ -273,13 +273,12 @@ private: WeakReference component; TreeViewItem* item; int uid; - bool shouldKeep; + bool shouldKeep = true; }; - OwnedArray items; - - TreeViewItem* buttonUnderMouse; - bool isDragging, needSelectionOnMouseUp; + OwnedArray items; + TreeViewItem* buttonUnderMouse = nullptr; + bool isDragging = false, needSelectionOnMouseUp = false; void selectBasedOnModifiers (TreeViewItem* const item, const ModifierKeys modifiers) { @@ -287,16 +286,17 @@ private: if (modifiers.isShiftDown() && ((firstSelected = owner.getSelectedItem (0)) != nullptr)) { - TreeViewItem* const lastSelected = owner.getSelectedItem (owner.getNumSelectedItems() - 1); + auto* lastSelected = owner.getSelectedItem (owner.getNumSelectedItems() - 1); jassert (lastSelected != nullptr); - int rowStart = firstSelected->getRowNumberInTree(); - int rowEnd = lastSelected->getRowNumberInTree(); + auto rowStart = firstSelected->getRowNumberInTree(); + auto rowEnd = lastSelected->getRowNumberInTree(); + if (rowStart > rowEnd) std::swap (rowStart, rowEnd); - int ourRow = item->getRowNumberInTree(); - int otherEnd = ourRow < rowEnd ? rowStart : rowEnd; + auto ourRow = item->getRowNumberInTree(); + auto otherEnd = ourRow < rowEnd ? rowStart : rowEnd; if (ourRow > otherEnd) std::swap (ourRow, otherEnd); @@ -313,8 +313,8 @@ private: bool containsItem (TreeViewItem* const item) const noexcept { - for (int i = items.size(); --i >= 0;) - if (items.getUnchecked(i)->item == item) + for (auto* i : items) + if (i->item == item) return true; return false; @@ -322,12 +322,9 @@ private: RowItem* findItem (const int uid) const noexcept { - for (int i = items.size(); --i >= 0;) - { - RowItem* const ri = items.getUnchecked(i); - if (ri->uid == uid) - return ri; - } + for (auto* i : items) + if (i->uid == uid) + return i; return nullptr; } @@ -339,14 +336,16 @@ private: if (owner.openCloseButtonsVisible) { Rectangle pos; - TreeViewItem* item = findItemAt (e.y, pos); - if (item != nullptr && e.x < pos.getX() && e.x >= pos.getX() - owner.getIndentSize()) + if (auto* item = findItemAt (e.y, pos)) { - newItem = item; + if (e.x < pos.getX() && e.x >= pos.getX() - owner.getIndentSize()) + { + newItem = item; - if (! newItem->mightContainSubItems()) - newItem = nullptr; + if (! newItem->mightContainSubItems()) + newItem = nullptr; + } } } @@ -362,7 +361,7 @@ private: { if (buttonUnderMouse != nullptr && containsItem (buttonUnderMouse)) { - const Rectangle r (buttonUnderMouse->getItemPosition (false)); + auto r = buttonUnderMouse->getItemPosition (false); repaint (0, r.getY(), r.getX(), buttonUnderMouse->getItemHeight()); } } @@ -390,11 +389,11 @@ private: class TreeView::TreeViewport : public Viewport { public: - TreeViewport() noexcept : lastX (-1) {} + TreeViewport() noexcept {} void updateComponents (const bool triggerResize) { - if (ContentComponent* const tvc = getContentComp()) + if (auto* tvc = getContentComp()) { if (triggerResize) tvc->resized(); @@ -419,14 +418,15 @@ public: bool keyPressed (const KeyPress& key) override { - Component* const tree = getParentComponent(); + if (auto* tree = getParentComponent()) + if (tree->keyPressed (key)) + return true; - return (tree != nullptr && tree->keyPressed (key)) - || Viewport::keyPressed (key); + return Viewport::keyPressed (key); } private: - int lastX; + int lastX = -1; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TreeViewport) }; @@ -435,14 +435,7 @@ private: //============================================================================== TreeView::TreeView (const String& name) : Component (name), - viewport (new TreeViewport()), - rootItem (nullptr), - indentSize (-1), - defaultOpenness (false), - needsRecalculating (true), - rootItemVisible (true), - multiSelectEnabled (false), - openCloseButtonsVisible (true) + viewport (new TreeViewport()) { addAndMakeVisible (viewport); viewport->setViewedComponent (new ContentComponent (*this)); @@ -568,7 +561,7 @@ int TreeView::getNumSelectedItems (int maximumDepthToSearchTo) const noexcept TreeViewItem* TreeView::getSelectedItem (const int index) const noexcept { - return rootItem != nullptr ? rootItem->getSelectedItemWithIndex (index) : 0; + return rootItem != nullptr ? rootItem->getSelectedItemWithIndex (index) : nullptr; } int TreeView::getNumRowsInTree() const @@ -589,7 +582,7 @@ TreeViewItem* TreeView::getItemOnRow (int index) const TreeViewItem* TreeView::getItemAt (int y) const noexcept { - ContentComponent* const tc = viewport->getContentComp(); + auto tc = viewport->getContentComp(); Rectangle pos; return tc->findItemAt (tc->getLocalPoint (this, Point (0, y)).y, pos); } @@ -608,7 +601,7 @@ static void addAllSelectedItemIds (TreeViewItem* item, XmlElement& parent) if (item->isSelected()) parent.createNewChildElement ("SELECTED")->setAttribute ("id", item->getItemIdentifierString()); - const int numSubItems = item->getNumSubItems(); + auto numSubItems = item->getNumSubItems(); for (int i = 0; i < numSubItems; ++i) addAllSelectedItemIds (item->getSubItem(i), parent); @@ -652,10 +645,8 @@ void TreeView::restoreOpennessState (const XmlElement& newState, const bool rest clearSelectedItems(); forEachXmlChildElementWithTagName (newState, e, "SELECTED") - { - if (TreeViewItem* const item = rootItem->findItemFromIdentifierString (e->getStringAttribute ("id"))) + if (auto* item = rootItem->findItemFromIdentifierString (e->getStringAttribute ("id"))) item->setSelected (true, false); - } } } } @@ -681,26 +672,26 @@ void TreeView::enablementChanged() void TreeView::moveSelectedRow (const int delta) { - const int numRowsInTree = getNumRowsInTree(); + auto numRowsInTree = getNumRowsInTree(); if (numRowsInTree > 0) { int rowSelected = 0; - if (TreeViewItem* const firstSelected = getSelectedItem (0)) + if (auto* firstSelected = getSelectedItem (0)) rowSelected = firstSelected->getRowNumberInTree(); rowSelected = jlimit (0, numRowsInTree - 1, rowSelected + delta); for (;;) { - if (TreeViewItem* const item = getItemOnRow (rowSelected)) + if (auto* item = getItemOnRow (rowSelected)) { if (! item->canBeSelected()) { // if the row we want to highlight doesn't allow it, try skipping // to the next item.. - const int nextRowToTry = jlimit (0, numRowsInTree - 1, rowSelected + (delta < 0 ? -1 : 1)); + auto nextRowToTry = jlimit (0, numRowsInTree - 1, rowSelected + (delta < 0 ? -1 : 1)); if (rowSelected != nextRowToTry) { @@ -728,8 +719,8 @@ void TreeView::scrollToKeepItemVisible (TreeViewItem* item) item = item->getDeepestOpenParentItem(); - const int y = item->y; - const int viewTop = viewport->getViewPositionY(); + auto y = item->y; + auto viewTop = viewport->getViewPositionY(); if (y < viewTop) { @@ -745,7 +736,7 @@ void TreeView::scrollToKeepItemVisible (TreeViewItem* item) bool TreeView::toggleOpenSelectedItem() { - if (TreeViewItem* const firstSelected = getSelectedItem (0)) + if (auto* firstSelected = getSelectedItem (0)) { if (firstSelected->mightContainSubItems()) { @@ -759,7 +750,7 @@ bool TreeView::toggleOpenSelectedItem() void TreeView::moveOutOfSelectedItem() { - if (TreeViewItem* const firstSelected = getSelectedItem (0)) + if (auto* firstSelected = getSelectedItem (0)) { if (firstSelected->isOpen()) { @@ -767,7 +758,7 @@ void TreeView::moveOutOfSelectedItem() } else { - TreeViewItem* parent = firstSelected->parentItem; + auto* parent = firstSelected->parentItem; if ((! rootItemVisible) && parent == rootItem) parent = nullptr; @@ -783,7 +774,7 @@ void TreeView::moveOutOfSelectedItem() void TreeView::moveIntoSelectedItem() { - if (TreeViewItem* const firstSelected = getSelectedItem (0)) + if (auto* firstSelected = getSelectedItem (0)) { if (firstSelected->isOpen() || ! firstSelected->mightContainSubItems()) moveSelectedRow (1); @@ -794,11 +785,11 @@ void TreeView::moveIntoSelectedItem() void TreeView::moveByPages (int numPages) { - if (TreeViewItem* currentItem = getSelectedItem (0)) + if (auto* currentItem = getSelectedItem (0)) { - const Rectangle pos (currentItem->getItemPosition (false)); - const int targetY = pos.getY() + numPages * (getHeight() - pos.getHeight()); - int currentRow = currentItem->getRowNumberInTree(); + auto pos = currentItem->getItemPosition (false); + auto targetY = pos.getY() + numPages * (getHeight() - pos.getHeight()); + auto currentRow = currentItem->getRowNumberInTree(); for (;;) { @@ -808,11 +799,13 @@ void TreeView::moveByPages (int numPages) if (currentItem == nullptr) break; - const int y = currentItem->getItemPosition (false).getY(); + auto y = currentItem->getItemPosition (false).getY(); + if ((numPages < 0 && y <= targetY) || (numPages > 0 && y >= targetY)) break; - const int newRow = currentItem->getRowNumberInTree(); + auto newRow = currentItem->getRowNumberInTree(); + if (newRow == currentRow) break; @@ -878,14 +871,13 @@ struct TreeView::InsertPoint InsertPoint (TreeView& view, const StringArray& files, const DragAndDropTarget::SourceDetails& dragSourceDetails) : pos (dragSourceDetails.localPosition), - item (view.getItemAt (dragSourceDetails.localPosition.y)), - insertIndex (0) + item (view.getItemAt (dragSourceDetails.localPosition.y)) { if (item != nullptr) { - Rectangle itemPos (item->getItemPosition (true)); + auto itemPos = item->getItemPosition (true); insertIndex = item->getIndexInParent(); - const int oldY = pos.y; + auto oldY = pos.y; pos.y = itemPos.getY(); if (item->getNumSubItems() == 0 || ! item->isOpen()) @@ -926,7 +918,7 @@ struct TreeView::InsertPoint pos.x = itemPos.getX(); item = item->getParentItem(); } - else if (TreeViewItem* root = view.getRootItem()) + else if (auto* root = view.getRootItem()) { // If they're dragging beyond the bottom of the list, then insert at the end of the root item.. item = root; @@ -938,7 +930,7 @@ struct TreeView::InsertPoint Point pos; TreeViewItem* item; - int insertIndex; + int insertIndex = 0; }; //============================================================================== @@ -946,7 +938,6 @@ class TreeView::InsertPointHighlight : public Component { public: InsertPointHighlight() - : lastItem (nullptr), lastIndex (0) { setSize (100, 12); setAlwaysOnTop (true); @@ -957,7 +948,7 @@ public: { lastItem = insertPos.item; lastIndex = insertPos.insertIndex; - const int offset = getHeight() / 2; + auto offset = getHeight() / 2; setBounds (insertPos.pos.x - offset, insertPos.pos.y - offset, width - (insertPos.pos.x - offset), getHeight()); } @@ -965,7 +956,7 @@ public: void paint (Graphics& g) override { Path p; - const float h = (float) getHeight(); + auto h = (float) getHeight(); p.addEllipse (2.0f, 2.0f, h - 4.0f, h - 4.0f); p.startNewSubPath (h - 2.0f, h / 2.0f); p.lineTo ((float) getWidth(), h / 2.0f); @@ -974,8 +965,8 @@ public: g.strokePath (p, PathStrokeType (2.0f)); } - TreeViewItem* lastItem; - int lastIndex; + TreeViewItem* lastItem = nullptr; + int lastIndex = 0; private: JUCE_DECLARE_NON_COPYABLE (InsertPointHighlight) @@ -993,9 +984,8 @@ public: void setTargetPosition (TreeViewItem* const item) noexcept { - Rectangle r (item->getItemPosition (true)); - r.setHeight (item->getItemHeight()); - setBounds (r); + setBounds (item->getItemPosition (true) + .withHeight (item->getItemHeight())); } void paint (Graphics& g) override @@ -1092,7 +1082,7 @@ void TreeView::fileDragEnter (const StringArray& files, int x, int y) void TreeView::fileDragMove (const StringArray& files, int x, int y) { - handleDrag (files, SourceDetails (String(), this, Point (x, y))); + handleDrag (files, SourceDetails ({}, this, { x, y })); } void TreeView::fileDragExit (const StringArray&) @@ -1102,7 +1092,7 @@ void TreeView::fileDragExit (const StringArray&) void TreeView::filesDropped (const StringArray& files, int x, int y) { - handleDrop (files, SourceDetails (String(), this, Point (x, y))); + handleDrop (files, SourceDetails ({}, this, { x, y })); } bool TreeView::isInterestedInDragSource (const SourceDetails& /*dragSourceDetails*/) @@ -1132,14 +1122,7 @@ void TreeView::itemDropped (const SourceDetails& dragSourceDetails) //============================================================================== TreeViewItem::TreeViewItem() - : ownerView (nullptr), - parentItem (nullptr), - y (0), - itemHeight (0), - totalHeight (0), - itemWidth (0), - totalWidth (0), - selected (false), + : selected (false), redrawNeeded (true), drawLinesInside (false), drawLinesSet (false), @@ -1171,7 +1154,7 @@ int TreeViewItem::getNumSubItems() const noexcept TreeViewItem* TreeViewItem::getSubItem (const int index) const noexcept { - return subItems [index]; + return subItems[index]; } void TreeViewItem::clearSubItems() @@ -1180,7 +1163,7 @@ void TreeViewItem::clearSubItems() { const ScopedLock sl (ownerView->nodeAlterationLock); - if (subItems.size() > 0) + if (! subItems.isEmpty()) { removeAllSubItemsFromList(); treeHasChanged(); @@ -1202,13 +1185,14 @@ void TreeViewItem::addSubItem (TreeViewItem* const newItem, const int insertPosi { if (newItem != nullptr) { - newItem->parentItem = this; + newItem->parentItem = nullptr; newItem->setOwnerView (ownerView); newItem->y = 0; newItem->itemHeight = newItem->getItemHeight(); newItem->totalHeight = 0; newItem->itemWidth = newItem->getItemWidth(); newItem->totalWidth = 0; + newItem->parentItem = this; if (ownerView != nullptr) { @@ -1246,7 +1230,7 @@ void TreeViewItem::removeSubItem (int index, bool deleteItem) bool TreeViewItem::removeSubItemFromList (int index, bool deleteItem) { - if (TreeViewItem* child = subItems [index]) + if (auto* child = subItems[index]) { child->parentItem = nullptr; subItems.remove (index, deleteItem); @@ -1294,8 +1278,8 @@ bool TreeViewItem::isFullyOpen() const noexcept if (! isOpen()) return false; - for (int i = 0; i < subItems.size(); ++i) - if (! subItems.getUnchecked(i)->isFullyOpen()) + for (auto* i : subItems) + if (! i->isFullyOpen()) return false; return true; @@ -1316,8 +1300,8 @@ void TreeViewItem::deselectAllRecursively (TreeViewItem* itemToIgnore) if (this != itemToIgnore) setSelected (false, false); - for (int i = 0; i < subItems.size(); ++i) - subItems.getUnchecked(i)->deselectAllRecursively (itemToIgnore); + for (auto* i : subItems) + i->deselectAllRecursively (itemToIgnore); } void TreeViewItem::setSelected (const bool shouldBeSelected, @@ -1333,6 +1317,7 @@ void TreeViewItem::setSelected (const bool shouldBeSelected, if (shouldBeSelected != selected) { selected = shouldBeSelected; + if (ownerView != nullptr) ownerView->repaint(); @@ -1411,8 +1396,8 @@ void TreeViewItem::itemDropped (const DragAndDropTarget::SourceDetails& /*dragSo Rectangle TreeViewItem::getItemPosition (const bool relativeToTreeViewTopLeft) const noexcept { - const int indentX = getIndentX(); - int width = itemWidth; + auto indentX = getIndentX(); + auto width = itemWidth; if (ownerView != nullptr && width < 0) width = ownerView->viewport->getViewWidth() - indentX; @@ -1434,11 +1419,7 @@ void TreeViewItem::treeHasChanged() const noexcept void TreeViewItem::repaintItem() const { if (ownerView != nullptr && areAllParentsOpen()) - { - Rectangle r (getItemPosition (true)); - r.setLeft (0); - ownerView->viewport->repaint (r); - } + ownerView->viewport->repaint (getItemPosition (true).withLeft (0)); } bool TreeViewItem::areAllParentsOpen() const noexcept @@ -1459,14 +1440,12 @@ void TreeViewItem::updatePositions (int newY) { newY += totalHeight; - for (int i = 0; i < subItems.size(); ++i) + for (auto* i : subItems) { - TreeViewItem* const ti = subItems.getUnchecked(i); - - ti->updatePositions (newY); - newY += ti->totalHeight; - totalHeight += ti->totalHeight; - totalWidth = jmax (totalWidth, ti->totalWidth); + i->updatePositions (newY); + newY += i->totalHeight; + totalHeight += i->totalHeight; + totalWidth = jmax (totalWidth, i->totalWidth); } } } @@ -1491,11 +1470,10 @@ void TreeViewItem::setOwnerView (TreeView* const newOwner) noexcept { ownerView = newOwner; - for (int i = subItems.size(); --i >= 0;) + for (auto* i : subItems) { - TreeViewItem* subItem = subItems.getUnchecked(i); - subItem->setOwnerView (newOwner); - subItem->ownerViewChanged (newOwner); + i->setOwnerView (newOwner); + i->ownerViewChanged (newOwner); } } @@ -1506,7 +1484,7 @@ int TreeViewItem::getIndentX() const noexcept if (! ownerView->openCloseButtonsVisible) --x; - for (TreeViewItem* p = parentItem; p != nullptr; p = p->parentItem) + for (auto* p = parentItem; p != nullptr; p = p->parentItem) ++x; return x * ownerView->getIndentSize(); @@ -1529,7 +1507,7 @@ namespace TreeViewHelpers jassert (item != nullptr); int depth = rootIsVisible ? 0 : -1; - for (const TreeViewItem* p = item->getParentItem(); p != nullptr; p = p->getParentItem()) + for (auto* p = item->getParentItem(); p != nullptr; p = p->getParentItem()) ++depth; return depth; @@ -1545,11 +1523,12 @@ bool TreeViewItem::areLinesDrawn() const void TreeViewItem::paintRecursively (Graphics& g, int width) { jassert (ownerView != nullptr); + if (ownerView == nullptr) return; - const int indent = getIndentX(); - const int itemW = (itemWidth < 0 || drawsInRightMargin) ? width - indent : itemWidth; + auto indent = getIndentX(); + auto itemW = (itemWidth < 0 || drawsInRightMargin) ? width - indent : itemWidth; { Graphics::ScopedSaveState ss (g); @@ -1568,13 +1547,13 @@ void TreeViewItem::paintRecursively (Graphics& g, int width) } } - const float halfH = itemHeight * 0.5f; - const int indentWidth = ownerView->getIndentSize(); - const int depth = TreeViewHelpers::calculateDepth (this, ownerView->rootItemVisible); + auto halfH = itemHeight * 0.5f; + auto indentWidth = ownerView->getIndentSize(); + auto depth = TreeViewHelpers::calculateDepth (this, ownerView->rootItemVisible); if (depth >= 0 && ownerView->openCloseButtonsVisible) { - float x = (depth + 0.5f) * indentWidth; + auto x = (depth + 0.5f) * indentWidth; const bool parentLinesDrawn = parentItem != nullptr && parentItem->areLinesDrawn(); @@ -1585,7 +1564,7 @@ void TreeViewItem::paintRecursively (Graphics& g, int width) paintHorizontalConnectingLine (g, Line (x, halfH, x + indentWidth / 2, halfH)); { - TreeViewItem* p = parentItem; + auto* p = parentItem; int d = depth; while (p != nullptr && --d >= 0) @@ -1611,13 +1590,11 @@ void TreeViewItem::paintRecursively (Graphics& g, int width) if (isOpen()) { - const Rectangle clip (g.getClipBounds()); + auto clip = g.getClipBounds(); - for (int i = 0; i < subItems.size(); ++i) + for (auto* ti : subItems) { - TreeViewItem* const ti = subItems.getUnchecked(i); - - const int relY = ti->y - y; + auto relY = ti->y - y; if (relY >= clip.getBottom()) break; @@ -1658,10 +1635,8 @@ int TreeViewItem::getNumRows() const noexcept int num = 1; if (isOpen()) - { - for (int i = subItems.size(); --i >= 0;) - num += subItems.getUnchecked(i)->getNumRows(); - } + for (auto* i : subItems) + num += i->getNumRows(); return num; } @@ -1675,17 +1650,15 @@ TreeViewItem* TreeViewItem::getItemOnRow (int index) noexcept { --index; - for (int i = 0; i < subItems.size(); ++i) + for (auto* i : subItems) { - TreeViewItem* const item = subItems.getUnchecked(i); - if (index == 0) - return item; + return i; - const int numRows = item->getNumRows(); + auto numRows = i->getNumRows(); if (numRows > index) - return item->getItemOnRow (index); + return i->getItemOnRow (index); index -= numRows; } @@ -1698,7 +1671,7 @@ TreeViewItem* TreeViewItem::findItemRecursively (int targetY) noexcept { if (isPositiveAndBelow (targetY, totalHeight)) { - const int h = itemHeight; + auto h = itemHeight; if (targetY < h) return this; @@ -1707,14 +1680,12 @@ TreeViewItem* TreeViewItem::findItemRecursively (int targetY) noexcept { targetY -= h; - for (int i = 0; i < subItems.size(); ++i) + for (auto* i : subItems) { - TreeViewItem* const ti = subItems.getUnchecked(i); + if (targetY < i->totalHeight) + return i->findItemRecursively (targetY); - if (targetY < ti->totalHeight) - return ti->findItemRecursively (targetY); - - targetY -= ti->totalHeight; + targetY -= i->totalHeight; } } } @@ -1727,8 +1698,8 @@ int TreeViewItem::countSelectedItemsRecursively (int depth) const noexcept int total = isSelected() ? 1 : 0; if (depth != 0) - for (int i = subItems.size(); --i >= 0;) - total += subItems.getUnchecked(i)->countSelectedItemsRecursively (depth - 1); + for (auto* i : subItems) + total += i->countSelectedItemsRecursively (depth - 1); return total; } @@ -1745,14 +1716,12 @@ TreeViewItem* TreeViewItem::getSelectedItemWithIndex (int index) noexcept if (index >= 0) { - for (int i = 0; i < subItems.size(); ++i) + for (auto* i : subItems) { - TreeViewItem* const item = subItems.getUnchecked(i); - - if (TreeViewItem* const found = item->getSelectedItemWithIndex (index)) + if (auto* found = i->getSelectedItemWithIndex (index)) return found; - index -= item->countSelectedItemsRecursively (-1); + index -= i->countSelectedItemsRecursively (-1); } } @@ -1792,8 +1761,8 @@ void TreeViewItem::setLinesDrawnForSubItems (const bool drawLines) noexcept TreeViewItem* TreeViewItem::getNextVisibleItem (const bool recurse) const noexcept { - if (recurse && isOpen() && subItems.size() > 0) - return subItems [0]; + if (recurse && isOpen() && ! subItems.isEmpty()) + return subItems.getFirst(); if (parentItem != nullptr) { @@ -1825,20 +1794,20 @@ String TreeViewItem::getItemIdentifierString() const TreeViewItem* TreeViewItem::findItemFromIdentifierString (const String& identifierString) { - const String thisId ("/" + escapeSlashesInTreeViewItemName (getUniqueName())); + auto thisId = "/" + escapeSlashesInTreeViewItemName (getUniqueName()); if (thisId == identifierString) return this; if (identifierString.startsWith (thisId + "/")) { - const String remainingPath (identifierString.substring (thisId.length())); + auto remainingPath = identifierString.substring (thisId.length()); const bool wasOpen = isOpen(); setOpen (true); - for (int i = subItems.size(); --i >= 0;) - if (TreeViewItem* item = subItems.getUnchecked(i)->findItemFromIdentifierString (remainingPath)) + for (auto* i : subItems) + if (auto* item = i->findItemFromIdentifierString (remainingPath)) return item; setOpen (wasOpen); @@ -1862,11 +1831,11 @@ void TreeViewItem::restoreOpennessState (const XmlElement& e) forEachXmlChildElement (e, n) { - const String id (n->getStringAttribute ("id")); + auto id = n->getStringAttribute ("id"); for (int i = 0; i < items.size(); ++i) { - TreeViewItem* const ti = items.getUnchecked(i); + auto* ti = items.getUnchecked(i); if (ti->getUniqueName() == id) { @@ -1878,8 +1847,8 @@ void TreeViewItem::restoreOpennessState (const XmlElement& e) } // for any items that weren't mentioned in the XML, reset them to default: - for (int i = 0; i < items.size(); ++i) - items.getUnchecked(i)->restoreToDefaultOpenness(); + for (auto* i : items) + i->restoreToDefaultOpenness(); } } @@ -1890,7 +1859,7 @@ XmlElement* TreeViewItem::getOpennessState() const XmlElement* TreeViewItem::getOpennessState (const bool canReturnNull) const { - const String name (getUniqueName()); + auto name = getUniqueName(); if (name.isNotEmpty()) { diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.h b/modules/juce_gui_basics/widgets/juce_TreeView.h index 5bba62aca3..e2f407c9c5 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.h +++ b/modules/juce_gui_basics/widgets/juce_TreeView.h @@ -55,15 +55,12 @@ public: //============================================================================== /** Returns the number of sub-items that have been added to this item. - Note that this doesn't mean much if the node isn't open. - @see getSubItem, mightContainSubItems, addSubItem */ int getNumSubItems() const noexcept; /** Returns one of the item's sub-items. - Remember that the object returned might get deleted at any time when its parent item is closed or refreshed, depending on the nature of the items you're using. @@ -370,7 +367,7 @@ public: @see itemDoubleClicked */ - virtual void itemClicked (const MouseEvent& e); + virtual void itemClicked (const MouseEvent&); /** Called when the user double-clicks on this item. @@ -386,7 +383,7 @@ public: @see itemClicked */ - virtual void itemDoubleClicked (const MouseEvent& e); + virtual void itemDoubleClicked (const MouseEvent&); /** Called when the item is selected or deselected. @@ -569,7 +566,7 @@ public: class OpennessRestorer { public: - OpennessRestorer (TreeViewItem& treeViewItem); + OpennessRestorer (TreeViewItem&); ~OpennessRestorer(); private: @@ -581,11 +578,11 @@ public: private: //============================================================================== - TreeView* ownerView; - TreeViewItem* parentItem; + TreeView* ownerView = nullptr; + TreeViewItem* parentItem = nullptr; OwnedArray subItems; - int y, itemHeight, totalHeight, itemWidth, totalWidth; - int uid; + int y = 0, itemHeight = 0, totalHeight = 0, itemWidth = 0, totalWidth = 0; + int uid = 0; bool selected : 1; bool redrawNeeded : 1; bool drawLinesInside : 1; @@ -910,12 +907,12 @@ private: ScopedPointer viewport; CriticalSection nodeAlterationLock; - TreeViewItem* rootItem; + TreeViewItem* rootItem = nullptr; ScopedPointer dragInsertPointHighlight; ScopedPointer dragTargetGroupHighlight; - int indentSize; - bool defaultOpenness, needsRecalculating, rootItemVisible; - bool multiSelectEnabled, openCloseButtonsVisible; + int indentSize = -1; + bool defaultOpenness = false, needsRecalculating = true, rootItemVisible = true; + bool multiSelectEnabled = false, openCloseButtonsVisible = true; void itemsChanged() noexcept; void recalculateIfNeeded();