📄 qdockarealayout.cpp
字号:
child.subinfo = 0; tmp->item_list.clear(); delete tmp; } }}void QDockAreaLayoutInfo::remove(QList<int> path){ Q_ASSERT(!path.isEmpty()); if (path.count() > 1) { int index = path.takeFirst(); QDockAreaLayoutItem &item = item_list[index]; Q_ASSERT(item.subinfo != 0); item.subinfo->remove(path); unnest(index); } else { int index = path.first(); item_list.removeAt(index); }}QLayoutItem *QDockAreaLayoutInfo::plug(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); if (index < 0) index = -index - 1; if (!path.isEmpty()) { const QDockAreaLayoutItem &item = item_list.at(index); Q_ASSERT(item.subinfo != 0); return item.subinfo->plug(path); } QDockAreaLayoutItem &item = item_list[index]; Q_ASSERT(item.widgetItem != 0); Q_ASSERT(item.gap); item.gap = false; QRect result;#ifndef QT_NO_TABBAR if (tabbed) { } else#endif { int prev = this->prev(index); int next = this->next(index); if (prev != -1 && !item_list.at(prev).gap) { item.pos += sep; item.size -= sep; } if (next != -1 && !item_list.at(next).gap) item.size -= sep; QPoint pos; rpick(o, pos) = item.pos; rperp(o, pos) = perp(o, rect.topLeft()); QSize s; rpick(o, s) = item.size; rperp(o, s) = perp(o, rect.size()); result = QRect(pos, s); } return item.widgetItem;}QLayoutItem *QDockAreaLayoutInfo::unplug(QList<int> path){ Q_ASSERT(!path.isEmpty()); if (path.count() > 1) { int index = path.takeFirst(); const QDockAreaLayoutItem &item = item_list.at(index); Q_ASSERT(item.subinfo != 0); return item.subinfo->unplug(path); } int index = path.first(); QDockAreaLayoutItem &item = item_list[index]; int prev = this->prev(index); int next = this->next(index); Q_ASSERT(!item.gap); item.gap = true;#ifndef QT_NO_TABBAR if (tabbed) { } else#endif { if (prev != -1 && !item_list.at(prev).gap) { item.pos -= sep; item.size += sep; } if (next != -1 && !item_list.at(next).gap) item.size += sep; } return item.widgetItem;}#ifndef QT_NO_TABBARquintptr QDockAreaLayoutInfo::currentTabId() const{ if (!tabbed || tabBar == 0) return 0; int index = tabBar->currentIndex(); if (index == -1) return 0; return qvariant_cast<quintptr>(tabBar->tabData(index));}void QDockAreaLayoutInfo::setCurrentTab(QWidget *widget){ setCurrentTabId(reinterpret_cast<quintptr>(widget));}void QDockAreaLayoutInfo::setCurrentTabId(quintptr id){ if (!tabbed || tabBar == 0) return; for (int i = 0; i < tabBar->count(); ++i) { if (qvariant_cast<quintptr>(tabBar->tabData(i)) == id) { tabBar->setCurrentIndex(i); return; } }}#endif // QT_NO_TABBARstatic QRect dockedGeometry(QWidget *widget){ int titleHeight = 0; QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(widget->layout()); if(layout != 0 && layout->nativeWindowDeco()) titleHeight = layout->titleHeight(); QRect result = widget->geometry(); result.adjust(0, -titleHeight, 0, 0); return result;}bool QDockAreaLayoutInfo::insertGap(QList<int> path, QLayoutItem *dockWidgetItem){ Q_ASSERT(!path.isEmpty()); bool insert_tabbed = false; int index = path.takeFirst(); if (index < 0) { insert_tabbed = true; index = -index - 1; }// dump(qDebug() << "insertGap() before:" << index << tabIndex, *this, QString()); if (!path.isEmpty()) { QDockAreaLayoutItem &item = item_list[index]; if (item.subinfo == 0#ifndef QT_NO_TABBAR || item.subinfo->tabbed && !insert_tabbed#endif ) { // this is not yet a nested layout - make it QDockAreaLayoutInfo *subinfo = item.subinfo; QLayoutItem *widgetItem = item.widgetItem; QRect r = subinfo == 0 ? dockedGeometry(widgetItem->widget()) : subinfo->rect; Qt::Orientation opposite = o == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal;#ifdef QT_NO_TABBAR const int tabBarShape = 0;#endif QDockAreaLayoutInfo *new_info = new QDockAreaLayoutInfo(sep, dockPos, opposite, tabBarShape, mainWindow); item.subinfo = new_info; item.widgetItem = 0; QDockAreaLayoutItem new_item = widgetItem == 0 ? QDockAreaLayoutItem(subinfo) : QDockAreaLayoutItem(widgetItem); new_item.size = pick(opposite, r.size()); new_item.pos = pick(opposite, r.topLeft()); new_info->item_list.append(new_item);#ifndef QT_NO_TABBAR if (insert_tabbed) { new_info->tabbed = true; }#endif } bool result = item.subinfo->insertGap(path, dockWidgetItem); return result; } // create the gap item QDockAreaLayoutItem gap_item; gap_item.gap = true; gap_item.widgetItem = dockWidgetItem; // so minimumSize(), maximumSize() and // sizeHint() will work#ifndef QT_NO_TABBAR if (!tabbed)#endif { int prev = this->prev(index); int next = this->next(index - 1); // find out how much space we have in the layout int space = 0; if (isEmpty()) { // I am an empty dock area, therefore I am a top-level dock area. switch (dockPos) { case QInternal::LeftDock: case QInternal::RightDock: if (o == Qt::Vertical) { // the "size" is the height of the dock area (remember we are empty) space = pick(Qt::Vertical, rect.size()); } else { space = pick(Qt::Horizontal, dockWidgetItem->widget()->size()); } break; case QInternal::TopDock: case QInternal::BottomDock: default: if (o == Qt::Horizontal) { // the "size" is width of the dock area space = pick(Qt::Horizontal, rect.size()); } else { space = pick(Qt::Vertical, dockWidgetItem->widget()->size()); } break; } } else { for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip()) continue; Q_ASSERT(!item.gap); space += item.size - pick(o, item.minimumSize()); } } // find the actual size of the gap int gap_size = 0; int sep_size = 0; if (isEmpty()) { gap_size = space; sep_size = 0; } else { QRect r = dockedGeometry(dockWidgetItem->widget()); gap_size = pick(o, r.size()); if (prev != -1 && !item_list.at(prev).gap) sep_size += sep; if (next != -1 && !item_list.at(next).gap) sep_size += sep; } if (gap_size + sep_size > space) gap_size = pick(o, gap_item.minimumSize()); gap_item.size = gap_size + sep_size; } // finally, insert the gap item_list.insert(index, gap_item);// dump(qDebug() << "insertGap() after:" << index << tabIndex, *this, QString()); return true;}QDockAreaLayoutInfo *QDockAreaLayoutInfo::info(QWidget *widget){ for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip()) continue;#ifndef QT_NO_TABBAR if (tabbed && widget == tabBar) return this;#endif if (item.widgetItem != 0 && item.widgetItem->widget() == widget) return this; if (item.subinfo != 0) { if (QDockAreaLayoutInfo *result = item.subinfo->info(widget)) return result; } } return 0;}QDockAreaLayoutInfo *QDockAreaLayoutInfo::info(QList<int> path){ int index = path.takeFirst(); if (index < 0) index = -index - 1; if (index >= item_list.count()) return this; if (path.isEmpty() || item_list.at(index).subinfo == 0) return this; return item_list.at(index).subinfo->info(path);}QRect QDockAreaLayoutInfo::itemRect(int index) const{ const QDockAreaLayoutItem &item = item_list.at(index); if (item.skip()) return QRect(); QRect result;#ifndef QT_NO_TABBAR if (tabbed) { if (tabId(item) == currentTabId()) result = tabContentRect(); } else#endif { QPoint pos; rpick(o, pos) = item.pos; rperp(o, pos) = perp(o, rect.topLeft()); QSize s; rpick(o, s) = item.size; rperp(o, s) = perp(o, rect.size()); result = QRect(pos, s); } return result;}QRect QDockAreaLayoutInfo::itemRect(QList<int> path) const{ Q_ASSERT(!path.isEmpty()); if (path.count() > 1) { const QDockAreaLayoutItem &item = item_list.at(path.takeFirst()); Q_ASSERT(item.subinfo != 0); return item.subinfo->itemRect(path); } return itemRect(path.first());}QRect QDockAreaLayoutInfo::separatorRect(int index) const{#ifndef QT_NO_TABBAR if (tabbed) return QRect();#endif const QDockAreaLayoutItem &item = item_list.at(index); if (item.skip()) return QRect(); QPoint pos = rect.topLeft(); rpick(o, pos) = item.pos + item.size; QSize s = rect.size(); rpick(o, s) = sep; return QRect(pos, s);}QRect QDockAreaLayoutInfo::separatorRect(QList<int> path) const{ Q_ASSERT(!path.isEmpty()); if (path.count() > 1) { const QDockAreaLayoutItem &item = item_list.at(path.takeFirst()); Q_ASSERT(item.subinfo != 0); return item.subinfo->separatorRect(path); } return separatorRect(path.first());}QList<int> QDockAreaLayoutInfo::findSeparator(const QPoint &_pos) const{#ifndef QT_NO_TABBAR if (tabbed) return QList<int>();#endif int pos = pick(o, _pos); for (int i = 0; i < item_list.size(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip() || item.gap) continue; if (item.pos + item.size > pos) { if (item.subinfo != 0) { QList<int> result = item.subinfo->findSeparator(_pos); if (!result.isEmpty()) { result.prepend(i); return result; } else { return QList<int>(); } } } int next = this->next(i); if (next == -1 || item_list.at(next).gap) continue; if (pos > item.pos + item.size && item.pos + item.size + sep > pos) { QList<int> result; result.append(i); return result; } } return QList<int>();}QList<int> QDockAreaLayoutInfo::indexOf(QWidget *widget) const{ for (int i = 0; i < item_list.size(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.subinfo != 0) { QList<int> result = item.subinfo->indexOf(widget); if (!result.isEmpty()) { result.prepend(i); return result; } continue; } if (!item.gap && item.widgetItem->widget() == widget) { QList<int> result; result << i; return result; } } return QList<int>();}QMainWindowLayout *QDockAreaLayoutInfo::mainWindowLayout() const{ QMainWindowLayout *result = qobject_cast<QMainWindowLayout*>(mainWindow->layout()); Q_ASSERT(result != 0); return result;}void QDockAreaLayoutInfo::apply(bool animate){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -