Move lots of methods from MultiSplitter to its base class

This commit is contained in:
Sergio Martins
2021-02-09 15:38:30 +00:00
parent 83aa64928d
commit ba38e3c1aa
4 changed files with 159 additions and 160 deletions

View File

@@ -138,3 +138,96 @@ void LayoutWidget::setLayoutSize(QSize size)
resize(size);
}
}
const Layouting::Item::List LayoutWidget::items() const
{
return m_rootItem->items_recursive();
}
bool LayoutWidget::containsItem(const Layouting::Item *item) const
{
return m_rootItem->contains_recursive(item);
}
bool LayoutWidget::containsFrame(const Frame *frame) const
{
return itemForFrame(frame) != nullptr;
}
int LayoutWidget::count() const
{
return m_rootItem->count_recursive();
}
int LayoutWidget::visibleCount() const
{
return m_rootItem->visibleCount_recursive();
}
int LayoutWidget::placeholderCount() const
{
return count() - visibleCount();
}
Layouting::Item *LayoutWidget::itemForFrame(const Frame *frame) const
{
if (!frame)
return nullptr;
return m_rootItem->itemForWidget(frame);
}
DockWidgetBase::List LayoutWidget::dockWidgets() const
{
DockWidgetBase::List dockWidgets;
const Frame::List frames = this->frames();
for (Frame *frame : frames)
dockWidgets << frame->dockWidgets();
return dockWidgets;
}
Frame::List LayoutWidget::framesFrom(QWidgetOrQuick *frameOrMultiSplitter) const
{
if (auto frame = qobject_cast<Frame *>(frameOrMultiSplitter))
return { frame };
if (auto msw = qobject_cast<MultiSplitter *>(frameOrMultiSplitter))
return msw->frames();
return {};
}
Frame::List LayoutWidget::frames() const
{
const Layouting::Item::List items = m_rootItem->items_recursive();
Frame::List result;
result.reserve(items.size());
for (Layouting::Item *item : items) {
if (auto f = static_cast<Frame *>(item->guestAsQObject()))
result.push_back(f);
}
return result;
}
void LayoutWidget::removeItem(Layouting::Item *item)
{
if (!item) {
qWarning() << Q_FUNC_INFO << "nullptr item";
return;
}
item->parentContainer()->removeItem(item);
}
void LayoutWidget::updateSizeConstraints()
{
const QSize newMinSize = m_rootItem->minSize();
qCDebug(sizing) << Q_FUNC_INFO << "Updating size constraints from" << minimumSize() << "to"
<< newMinSize;
setLayoutMinimumSize(newMinSize);
}

View File

@@ -120,6 +120,65 @@ public:
/// @brief restores the dockwidget @p dw to its previous position
void restorePlaceholder(DockWidgetBase *dw, Layouting::Item *, int tabIndex);
/**
* @brief The list of items in this layout.
*/
const QVector<Layouting::Item *> items() const;
/**
* @brief Returns true if this layout contains the specified item.
*/
bool containsItem(const Layouting::Item *) const;
/**
* @brief Returns true if this layout contains the specified frame.
*/
bool containsFrame(const Frame *) const;
/**
* @brief Returns the number of Item objects in this layout.
* This includes non-visible (placeholder) Items too.
* @sa visibleCount
*/
int count() const;
/**
* @brief Returns the number of visible Items in this layout.
* Which is @ref count minus @ref placeholderCount
* @sa count
*/
int visibleCount() const;
/**
* @brief Returns the number of placeholder items in this layout.
* This is the same as @ref count minus @ref visibleCount
* @sa count, visibleCount
*/
int placeholderCount() const;
/**
* @brief returns the Item that holds @p frame in this layout
*/
Layouting::Item *itemForFrame(const Frame *frame) const;
/**
* @brief Returns this list of Frame objects contained in this layout
*/
QList<Frame *> frames() const;
/// @brief Returns the list of dock widgets contained in this layout
QVector<DockWidgetBase *> dockWidgets() const;
/**
* @brief Removes an item from this MultiSplitter.
*/
void removeItem(Layouting::Item *item);
/**
* @brief Updates the min size of this layout.
*/
void updateSizeConstraints();
protected:
bool m_inResizeEvent = false;
@@ -141,6 +200,13 @@ protected:
*/
void unrefOldPlaceholders(const QList<Frame *> &framesBeingAdded) const;
/**
* @brief returns the frames contained in @p frameOrMultiSplitter
* If frameOrMultiSplitter is a Frame, it returns a list of 1 element, with that frame
* If frameOrMultiSplitter is a MultiSplitter then it returns a list of all frames it contains
*/
QList<Frame *> framesFrom(QWidgetOrQuick *frameOrMultiSplitter) const;
Q_SIGNALS:
void visibleWidgetCountChanged(int count);

View File

@@ -204,55 +204,11 @@ void MultiSplitter::addMultiSplitter(MultiSplitter *sourceMultiSplitter, Locatio
addWidget(sourceMultiSplitter, location, relativeTo, option);
}
void MultiSplitter::removeItem(Layouting::Item *item)
{
if (!item) {
qWarning() << Q_FUNC_INFO << "nullptr item";
return;
}
item->parentContainer()->removeItem(item);
}
bool MultiSplitter::containsItem(const Layouting::Item *item) const
{
return m_rootItem->contains_recursive(item);
}
bool MultiSplitter::containsFrame(const Frame *frame) const
{
return itemForFrame(frame) != nullptr;
}
int MultiSplitter::count() const
{
return m_rootItem->count_recursive();
}
int MultiSplitter::visibleCount() const
{
return m_rootItem->visibleCount_recursive();
}
int MultiSplitter::placeholderCount() const
{
return count() - visibleCount();
}
QVector<Layouting::Separator*> MultiSplitter::separators() const
{
return m_rootItem->separators_recursive();
}
void MultiSplitter::updateSizeConstraints()
{
const QSize newMinSize = m_rootItem->minSize();
qCDebug(sizing) << Q_FUNC_INFO << "Updating size constraints from" << minimumSize()
<< "to" << newMinSize;
setLayoutMinimumSize(newMinSize);
}
int MultiSplitter::availableLengthForOrientation(Qt::Orientation orientation) const
{
if (orientation == Qt::Vertical)
@@ -266,50 +222,6 @@ QSize MultiSplitter::availableSize() const
return m_rootItem->availableSize();
}
Layouting::Item *MultiSplitter::itemForFrame(const Frame *frame) const
{
if (!frame)
return nullptr;
return m_rootItem->itemForWidget(frame);
}
DockWidgetBase::List MultiSplitter::dockWidgets() const
{
DockWidgetBase::List dockWidgets;
const Frame::List frames = this->frames();
for (Frame *frame : frames)
dockWidgets << frame->dockWidgets();
return dockWidgets;
}
Frame::List MultiSplitter::framesFrom(QWidgetOrQuick *frameOrMultiSplitter) const
{
if (auto frame = qobject_cast<Frame*>(frameOrMultiSplitter))
return { frame };
if (auto msw = qobject_cast<MultiSplitter*>(frameOrMultiSplitter))
return msw->frames();
return {};
}
Frame::List MultiSplitter::frames() const
{
const Layouting::Item::List items = m_rootItem->items_recursive();
Frame::List result;
result.reserve(items.size());
for (Layouting::Item *item : items) {
if (auto f = static_cast<Frame*>(item->guestAsQObject()))
result.push_back(f);
}
return result;
}
void MultiSplitter::layoutEqually()
{
layoutEqually(m_rootItem);
@@ -330,11 +242,6 @@ void MultiSplitter::setRootItem(Layouting::ItemBoxContainer *root)
m_rootItem = root;
}
const Layouting::Item::List MultiSplitter::items() const
{
return m_rootItem->items_recursive();
}
Layouting::ItemBoxContainer *MultiSplitter::rootItem() const
{
return m_rootItem;

View File

@@ -69,48 +69,6 @@ public:
Frame *relativeTo = nullptr,
InitialOption option = DefaultSizeMode::Fair);
/**
* @brief Removes an item from this MultiSplitter.
*/
void removeItem(Layouting::Item *item);
/**
* @brief Returns true if this layout contains the specified item.
*/
bool containsItem(const Layouting::Item *) const;
/**
* @brief Returns true if this layout contains the specified frame.
*/
bool containsFrame(const Frame *) const;
/**
* @brief Returns the number of Item objects in this layout.
* This includes non-visible (placeholder) Items too.
* @sa visibleCount
*/
int count() const;
/**
* @brief Returns the number of visible Items in this layout.
* Which is @ref count minus @ref placeholderCount
* @sa count
*/
int visibleCount() const;
/**
* @brief Returns the number of placeholder items in this layout.
* This is the same as @ref count minus @ref visibleCount
* @sa count, visibleCount
*/
int placeholderCount() const;
/**
* @brief The list of items in this layout.
*/
const QVector<Layouting::Item *> items() const;
/**
* Called by the indicators, so they draw the drop rubber band at the correct place.
* The rect for the rubberband when dropping a widget at the specified location.
@@ -126,24 +84,6 @@ public:
///@brief returns the list of separators
QVector<Layouting::Separator*> separators() const;
/**
* @brief Updates the min size of this layout.
*/
void updateSizeConstraints();
/**
* @brief returns the Item that holds @p frame in this layout
*/
Layouting::Item *itemForFrame(const Frame *frame) const;
/**
* @brief Returns this list of Frame objects contained in this layout
*/
QList<Frame*> frames() const;
/// @brief Returns the list of dock widgets contained in this layout
QVector<DockWidgetBase*> dockWidgets() const;
/// @brief See docs for MainWindowBase::layoutEqually()
void layoutEqually();
@@ -156,13 +96,6 @@ protected:
private:
friend class ::TestDocks;
/**
* @brief returns the frames contained in @p frameOrMultiSplitter
* If frameOrMultiSplitter is a Frame, it returns a list of 1 element, with that frame
* If frameOrMultiSplitter is a MultiSplitter then it returns a list of all frames it contains
*/
QList<Frame*> framesFrom(QWidgetOrQuick *frameOrMultiSplitter) const;
Layouting::ItemBoxContainer *rootItem() const;
// For debug/hardening