18
19
30 return qSmartMinSize(
static_cast<QWidgetItem*>(
widgetItem));
38 return realSizeHint();
45 QSize s = wid->sizeHint().expandedTo(wid->minimumSizeHint());
46 if (wid->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
48 if (wid->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
50 s = s.boundedTo(wid->maximumSize())
51 .expandedTo(wid->minimumSize());
63
64
74 for (
int i = 0; i < toolBarItems.size(); ++i) {
79 QSize sh = item.sizeHint();
80 a += item.preferredSize > 0 ? item.preferredSize : pick(o, sh);
81 b = qMax(b, perp(o, sh));
94 for (
int i = 0; i < toolBarItems.size(); ++i) {
99 QSize ms = item.minimumSize();
101 b = qMax(b, perp(o, ms));
105 rpick(o, result) = a;
106 rperp(o, result) = b;
114 int min = pick(o, minimumSize());
115 int space = pick(o, rect.size());
116 int extra = qMax(0, space - min);
118 for (
int i = 0; i < toolBarItems.size(); ++i) {
123 if (QToolBarLayout *tblayout = qobject_cast<QToolBarLayout*>(item
.widgetItem->widget()->layout()))
124 tblayout->checkUsePopupMenu();
126 const int itemMin = pick(o, item.minimumSize());
128 item.size = item.preferredSize > 0 ? item.preferredSize : pick(o, item.sizeHint());
131 const int extraSpace = qMin(item
.size - itemMin, extra);
132 item
.size = itemMin + extraSpace;
141 for (
int i = 0; i < toolBarItems.size(); ++i) {
148 item.size = qMax(0, pick(o, rect.size()) - item.pos);
155 for (
int i = 0; i < toolBarItems.size(); ++i) {
156 if (!toolBarItems.at(i).skip())
163
164
170 case QInternal::LeftDock:
171 case QInternal::RightDock:
174 case QInternal::TopDock:
175 case QInternal::BottomDock:
187 for (
int i = 0; i < lines.size(); ++i) {
192 QSize hint = l.sizeHint();
193 a = qMax(a, pick(o, hint));
198 rpick(o, result) = a;
199 rperp(o, result) = b;
207 for (
int i = 0; i < lines.size(); ++i) {
212 QSize m = l.minimumSize();
213 a = qMax(a, pick(o, m));
218 rpick(o, result) = a;
219 rperp(o, result) = b;
230 bool reverse = dockPos == QInternal::RightDock || dockPos == QInternal::BottomDock;
232 int i = reverse ? lines.size() - 1 : 0;
234 if ((reverse && i < 0) || (!reverse && i == lines.size()))
239 if (o == Qt::Horizontal) {
240 l.rect.setLeft(rect.left());
241 l.rect.setRight(rect.right());
242 l.rect.setTop(b + rect.top());
243 b += l.sizeHint().height();
244 l.rect.setBottom(b - 1 + rect.top());
246 l.rect.setTop(rect.top());
247 l.rect.setBottom(rect.bottom());
248 l.rect.setLeft(b + rect.left());
249 b += l.sizeHint().width();
250 l.rect.setRight(b - 1 + rect.left());
256 i += reverse ? -1 : 1;
262 toolBar->setOrientation(o);
263 QLayoutItem *item =
new QWidgetItemV2(toolBar);
270 if (before ==
nullptr) {
272 lines.append(QToolBarAreaLayoutLine(o));
273 lines.last().toolBarItems.append(item);
277 for (
int j = 0; j < lines.size(); ++j) {
280 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
281 if (line.toolBarItems.at(k).widgetItem->widget() == before) {
282 line.toolBarItems.insert(k, item);
291 for (
int j = 0; j < lines.size(); ++j) {
294 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
299 line.toolBarItems.removeAt(k);
301 if (line.toolBarItems.isEmpty() && j < lines.size() - 1)
312 if (before ==
nullptr) {
313 if (!lines.isEmpty() && lines.constLast().toolBarItems.isEmpty())
315 lines.append(QToolBarAreaLayoutLine(o));
319 for (
int j = 0; j < lines.size(); ++j) {
322 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
323 if (line.toolBarItems.at(k).widgetItem->widget() == before) {
328 newLine.toolBarItems = line.toolBarItems.mid(k);
329 line.toolBarItems = line.toolBarItems.mid(0, k);
330 lines.insert(j + 1, newLine);
340 for (
int j = 0; j < lines.size(); ++j) {
343 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
344 if (line.toolBarItems.at(k).widgetItem->widget() == before) {
350 lines[j - 1].toolBarItems += lines[j].toolBarItems;
366 if (o == Qt::Vertical)
370 for (
int j = 0; j < lines.size(); ++j) {
373 int previousIndex = -1;
375 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
378 int newPos = current
.pos;
380 if (previousIndex >= 0) {
382 if (pos < current
.pos) {
383 newPos = qMax(pos, minPos);
386 int maxPos = pick(o, rect.size());
387 for(
int l = k; l < line.toolBarItems.size(); ++l) {
390 maxPos -= pick(o, item.minimumSize());
393 newPos = qMin(pos, maxPos);
397 int extra = newPos - current
.pos;
401 const int diff = pick(o, previous.sizeHint()) - (previous.size + extra);
402 if (qAbs(diff) < QApplication::startDragDistance()) {
408 current.extendSize(line.o, -extra);
411 previous.extendSize(line.o, extra);
416 for(
int l = previousIndex; l >=0; --l) {
419 const int minPreferredSize = pick(o, item.minimumSize());
420 const int margin = item
.size - minPreferredSize;
421 if (margin < extra) {
422 item.resize(line.o, minPreferredSize);
425 item.extendSize(line.o, -extra);
430 Q_ASSERT(extra == 0);
440 minPos += pick(o, current.minimumSize());
449 if (rect.contains(pos)) {
453 const int p = pick(o, pos - rect.topLeft());
455 for (
int j = 0; j < lines.size(); ++j) {
459 if (!line.rect.contains(pos))
463 for (; k < line.toolBarItems.size(); ++k) {
468 int size = qMin(item.size, pick(o, item.sizeHint()));
470 if (p > item
.pos + size)
472 if (p > item
.pos + size/2)
483 const int dist = distance(pos);
485 if (dist >= 0 && *minDistance > dist) {
489 result << lines.size() << 0;
499 Q_ASSERT(path.size() == 2);
500 int j = path.first();
501 if (j == lines.size())
502 lines.append(QToolBarAreaLayoutLine(o));
505 const int k = path.at(1);
512 for(
int p = k - 1 ; p >= 0; --p) {
516 int previousSizeHint = pick(line.o, previous.sizeHint());
517 int previousExtraSpace = previous
.size - previousSizeHint;
519 if (previousExtraSpace > 0) {
522 previous
.size = previousSizeHint;
524 gap_item.resize(o, previousExtraSpace);
531 line.toolBarItems.insert(k, gap_item);
544 Q_ASSERT(path.size() == 2);
551 QRect result = line.rect;
553 if (o == Qt::Horizontal) {
554 result.setLeft(item
.pos + line.rect.left());
555 result.setWidth(item
.size);
557 result.setTop(item
.pos + line.rect.top());
558 result.setHeight(item
.size);
567 case QInternal::LeftDock:
568 if (pos.y() > 0 && pos.y() < rect.bottom())
569 return pos.x() - rect.right();
571 case QInternal::RightDock:
572 if (pos.y() > 0 && pos.y() < rect.bottom())
573 return rect.left() - pos.x();
575 case QInternal::TopDock:
576 if (pos.x() > 0 && pos.x() < rect.right())
577 return pos.y() - rect.bottom();
579 case QInternal::BottomDock:
580 if (pos.x() > 0 && pos.x() < rect.right())
581 return rect.top() - pos.y();
584 case QInternal::DockCount:
591
592
596 for (
int i = 0; i < QInternal::DockCount; ++i) {
597 QInternal::DockPosition pos =
static_cast<QInternal::DockPosition>(i);
598 docks[i] = QToolBarAreaLayoutInfo(pos);
607 QSize left_hint = docks[QInternal::LeftDock].sizeHint();
608 QSize right_hint = docks[QInternal::RightDock].sizeHint();
609 QSize top_hint = docks[QInternal::TopDock].sizeHint();
610 QSize bottom_hint = docks[QInternal::BottomDock].sizeHint();
612 QRect center = rect.adjusted(left_hint.width(), top_hint.height(),
613 -right_hint.width(), -bottom_hint.height());
615 docks[QInternal::TopDock].rect = QRect(rect.left(), rect.top(),
616 rect.width(), top_hint.height());
617 docks[QInternal::LeftDock].rect = QRect(rect.left(), center.top(),
618 left_hint.width(), center.height());
619 docks[QInternal::RightDock].rect = QRect(center.right() + 1, center.top(),
620 right_hint.width(), center.height());
621 docks[QInternal::BottomDock].rect = QRect(rect.left(), center.bottom() + 1,
622 rect.width(), bottom_hint.height());
624 docks[QInternal::TopDock].fitLayout();
625 docks[QInternal::LeftDock].fitLayout();
626 docks[QInternal::RightDock].fitLayout();
627 docks[QInternal::BottomDock].fitLayout();
637 QSize result = centerMin;
639 QSize left_min = docks[QInternal::LeftDock].minimumSize();
640 QSize right_min = docks[QInternal::RightDock].minimumSize();
641 QSize top_min = docks[QInternal::TopDock].minimumSize();
642 QSize bottom_min = docks[QInternal::BottomDock].minimumSize();
644 result.setWidth(qMax(top_min.width(), result.width()));
645 result.setWidth(qMax(bottom_min.width(), result.width()));
646 result.setHeight(qMax(left_min.height(), result.height()));
647 result.setHeight(qMax(right_min.height(), result.height()));
649 result.rwidth() += left_min.width() + right_min.width();
650 result.rheight() += top_min.height() + bottom_min.height();
660 QSize result = centerHint;
662 QSize left_hint = docks[QInternal::LeftDock].sizeHint();
663 QSize right_hint = docks[QInternal::RightDock].sizeHint();
664 QSize top_hint = docks[QInternal::TopDock].sizeHint();
665 QSize bottom_hint = docks[QInternal::BottomDock].sizeHint();
667 result.setWidth(qMax(top_hint.width(), result.width()));
668 result.setWidth(qMax(bottom_hint.width(), result.width()));
669 result.setHeight(qMax(left_hint.height(), result.height()));
670 result.setHeight(qMax(right_hint.height(), result.height()));
672 result.rwidth() += left_hint.width() + right_hint.width();
673 result.rheight() += top_hint.height() + bottom_hint.height();
684 QSize left_hint = docks[QInternal::LeftDock].sizeHint();
685 QSize right_hint = docks[QInternal::RightDock].sizeHint();
686 QSize top_hint = docks[QInternal::TopDock].sizeHint();
687 QSize bottom_hint = docks[QInternal::BottomDock].sizeHint();
689 result.adjust(-left_hint.width()*coef, -top_hint.height()*coef,
690 right_hint.width()*coef, bottom_hint.height()*coef);
697 Q_ASSERT(x !=
nullptr);
699 for (
int i = 0; i < QInternal::DockCount; ++i) {
702 for (
int j = 0; j < dock.lines.size(); ++j) {
705 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
707 return line.toolBarItems.at(k).widgetItem;
717 Q_ASSERT(x !=
nullptr);
719 for (
int i = 0; i < QInternal::DockCount; ++i) {
722 for (
int j = 0; j < dock.lines.size(); ++j) {
725 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
726 if ((*x)++ == index) {
727 QLayoutItem *result = line.toolBarItems.takeAt(k).widgetItem;
728 if (line.toolBarItems.isEmpty())
729 dock.lines.removeAt(j);
741 for (
int i = 0; i < QInternal::DockCount; ++i) {
744 for (
int j = 0; j < dock.lines.size(); ++j) {
747 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
759 for (
int i = 0; i < QInternal::DockCount; ++i) {
762 for (
int j = 0; j < dock.lines.size(); ++j) {
765 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
766 if (line.toolBarItems.at(k).widgetItem->widget() == toolBar)
767 return static_cast<QInternal::DockPosition>(i);
772 return QInternal::DockCount;
777 QInternal::DockPosition pos = findToolBar(before);
778 if (pos == QInternal::DockCount)
781 return docks[pos].insertToolBar(before, toolBar);
786 QInternal::DockPosition pos = findToolBar(toolBar);
787 if (pos == QInternal::DockCount)
789 docks[pos].removeToolBar(toolBar);
794 return docks[pos].insertToolBar(
nullptr, toolBar);
799 QInternal::DockPosition pos = findToolBar(before);
800 if (pos == QInternal::DockCount)
802 docks[pos].insertToolBarBreak(before);
807 QInternal::DockPosition pos = findToolBar(before);
808 if (pos == QInternal::DockCount)
810 docks[pos].removeToolBarBreak(before);
815 docks[pos].insertToolBarBreak(
nullptr);
820 QInternal::DockPosition pos = findToolBar(toolbar);
821 if (pos == QInternal::DockCount)
823 docks[pos].moveToolBar(toolbar, p);
829 if (docks[pos].lines.isEmpty())
830 docks[pos].lines.append(QToolBarAreaLayoutLine(docks[pos].o));
831 docks[pos].lines.last().toolBarItems.append(item);
836 QInternal::DockPosition pos = findToolBar(before);
837 if (pos == QInternal::DockCount)
840 docks[pos].insertItem(before, item);
846 Q_ASSERT(layout !=
nullptr);
848 Qt::LayoutDirection dir =
mainWindow->layoutDirection();
850 for (
int i = 0; i < QInternal::DockCount; ++i) {
853 for (
int j = 0; j < dock.lines.size(); ++j) {
858 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
865 if (line.o == Qt::Horizontal) {
866 geo.setTop(line.rect.top());
867 geo.setBottom(line.rect.bottom());
868 geo.setLeft(line.rect.left() + item
.pos);
869 geo.setRight(line.rect.left() + item
.pos + item
.size - 1);
871 geo.setLeft(line.rect.left());
872 geo.setRight(line.rect.right());
873 geo.setTop(line.rect.top() + item
.pos);
874 geo.setBottom(line.rect.top() + item
.pos + item
.size - 1);
879 if (QToolBar *toolBar = qobject_cast<QToolBar*>(widget)) {
880 QToolBarLayout *tbl = qobject_cast<QToolBarLayout*>(toolBar->layout());
882 QPoint tr = geo.topRight();
883 QSize size = tbl->expandedSize(geo.size());
885 geo.moveTopRight(tr);
886 if (geo.bottom() > rect.bottom())
887 geo.moveBottom(rect.bottom());
888 if (geo.right() > rect.right())
889 geo.moveRight(rect.right());
897 if (visible && dock.o == Qt::Horizontal)
898 geo = QStyle::visualRect(dir, line.rect, geo);
900 layout->widgetAnimator.animate(widget, geo, animate);
908 for (
int i = 0; i < QInternal::DockCount; ++i) {
911 for (
int j = 0; j < dock.lines.size(); ++j) {
914 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
915 if (line.toolBarItems.at(k).widgetItem->widget() == toolBar)
916 return j > 0 && k == 0;
926 for (
int i = 0; i < QInternal::DockCount; ++i) {
929 for (
int j = 0; j < dock.lines.size(); ++j) {
932 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
933 if (line.toolBarItems.at(k).widgetItem->widget() == toolBar) {
934 if (line.toolBarItems.size() == 1)
935 option->positionWithinLine = QStyleOptionToolBar::OnlyOne;
937 option->positionWithinLine = QStyleOptionToolBar::Beginning;
938 else if (k == line.toolBarItems.size() - 1)
939 option->positionWithinLine = QStyleOptionToolBar::End;
941 option->positionWithinLine = QStyleOptionToolBar::Middle;
943 if (dock.lines.size() == 1)
944 option->positionOfLine = QStyleOptionToolBar::OnlyOne;
946 option->positionOfLine = QStyleOptionToolBar::Beginning;
947 else if (j == dock.lines.size() - 1)
948 option->positionOfLine = QStyleOptionToolBar::End;
950 option->positionOfLine = QStyleOptionToolBar::Middle;
965 for (
int i = 0; i < QInternal::DockCount; ++i) {
968 for (
int j = 0; j < dock.lines.size(); ++j) {
971 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
998 Qt::LayoutDirection dir =
mainWindow->layoutDirection();
999 int minDistance = 80;
1001 for (
int i = 0; i < QInternal::DockCount; ++i) {
1003 if (docks[i].o == Qt::Horizontal)
1004 p = QStyle::visualPos(dir, docks[i].rect, p);
1005 QList<
int> result = docks[i].gapIndex(p, &minDistance);
1006 if (!result.isEmpty()) {
1017 for (
int i = 0; i < QInternal::DockCount; ++i) {
1020 for (
int j = 0; j < dock.lines.size(); ++j) {
1023 for (
int k = 0; k < line.toolBarItems.size(); k++) {
1024 if (line.toolBarItems[k].gap) {
1026 result << i << j << k;
1032 return QList<
int>();
1037 Q_ASSERT(path.size() == 3);
1038 const int i = path.first();
1039 Q_ASSERT(i >= 0 && i < QInternal::DockCount);
1040 return docks[i].insertGap(path.mid(1), item);
1045 Q_ASSERT(path.size() == 3);
1048 line.toolBarItems.removeAt(path.at(2));
1049 if (line.toolBarItems.isEmpty())
1050 dock.lines.removeAt(path.at(1));
1055 for (
int i = 0; i < QInternal::DockCount; ++i) {
1058 for (
int j = 0; j < dock.lines.size(); ++j) {
1061 for (
int k = 0; k < line.toolBarItems.size(); k++) {
1062 if (line.toolBarItems[k].widgetItem == item) {
1063 line.toolBarItems.removeAt(k);
1064 if (line.toolBarItems.isEmpty())
1065 dock.lines.removeAt(j);
1075 for (
int i = 0; i < QInternal::DockCount; ++i)
1082 Q_ASSERT(path.size() == 3);
1084 if (path.at(0) < 0 || path.at(0) >= QInternal::DockCount)
1087 if (path.at(1) < 0 || path.at(1) >= info.lines.size())
1090 if (path.at(2) < 0 || path.at(2) >= line.toolBarItems.size())
1092 return &(line.toolBarItems[path.at(2)]);
1097 const int i = path.first();
1099 QRect r = docks[i].itemRect(path.mid(1));
1100 if (docks[i].o == Qt::Horizontal)
1101 r = QStyle::visualRect(mainWindow->layoutDirection(),
1109 if (Q_UNLIKELY(!item)) {
1110 qWarning() <<
"No item at" << path;
1113 Q_ASSERT(item
->gap);
1122 Q_ASSERT(path.size() == 3);
1129 if (item->size != pick(line.o, item->realSizeHint())) {
1132 int newExtraSpace = 0;
1135 for (
int i = path.at(2) - 1; i >= 0; --i) {
1140 for (
int j = path.at(2) + 1; j < line.toolBarItems.size(); ++j) {
1143 newExtraSpace = next.pos - previous.pos - pick(line.o, previous.sizeHint());
1144 previous.resize(line.o, next
.pos - previous
.pos);
1155 for (
int i = path.at(2) - 1; i >= 0; --i) {
1158 previous.resize(line.o, pick(line.o, previous.sizeHint()) + newExtraSpace);
1166 Q_ASSERT(!item
->gap);
1173 *floating = geom0 & 1;
1179 int x = (
int)(geom0 & 0x0000ffff) - 0x7FFF;
1180 int y = (
int)(geom1 & 0x0000ffff) - 0x7FFF;
1185 int w = geom0 & 0x0000ffff;
1186 int h = geom1 & 0x0000ffff;
1188 return QRect(x, y, w, h);
1191static void packRect(uint *geom0, uint *geom1,
const QRect &rect,
bool floating)
1202 *geom0 |= qMax(0, rect.width()) & 0x0000ffff;
1203 *geom1 |= qMax(0, rect.height()) & 0x0000ffff;
1208 *geom0 |= qMax(0, rect.x() + 0x7FFF) & 0x0000ffff;
1209 *geom1 |= qMax(0, rect.y() + 0x7FFF) & 0x0000ffff;
1221 stream << (uchar) ToolBarStateMarkerEx;
1224 for (
int i = 0; i < QInternal::DockCount; ++i)
1225 lineCount += docks[i].lines.size();
1227 stream << lineCount;
1229 for (
int i = 0; i < QInternal::DockCount; ++i) {
1232 for (
int j = 0; j < dock.lines.size(); ++j) {
1235 stream << i <<
int(line.toolBarItems.size());
1237 for (
int k = 0; k < line.toolBarItems.size(); ++k) {
1240 QString objectName = widget->objectName();
1241 if (Q_UNLIKELY(objectName.isEmpty())) {
1242 qWarning(
"QMainWindow::saveState(): 'objectName' not set for QToolBar %p '%s'",
1243 widget, widget->windowTitle().toLocal8Bit().constData());
1245 stream << objectName;
1249 uchar shownOrientation = (uchar)!widget->isHidden();
1250 if (QToolBar * tb= qobject_cast<QToolBar*>(widget)) {
1251 if (tb->orientation() == Qt::Vertical)
1252 shownOrientation |= 2;
1254 stream << shownOrientation;
1260 packRect(&geom0, &geom1, widget->geometry(), widget->isWindow());
1261 stream << geom0 << geom1;
1277 QList<QToolBar*> toolBars = _toolBars;
1281 for (
int j = 0; j < lines; ++j) {
1284 if (pos < 0 || pos >= QInternal::DockCount)
1290 const bool applyingLayout = !testing;
1293 for (
int k = 0; k < cnt; ++k) {
1297 stream >> objectName;
1300 item.pos = getInt(stream);
1301 item.size = getInt(stream);
1304
1305
1306
1307
1308
1309
1312 bool floating =
false;
1314 geom0 = getInt(stream);
1316 geom1 = getInt(stream);
1317 rect = unpackRect(geom0, geom1, &floating);
1320 QToolBar *toolBar =
nullptr;
1321 for (
int x = 0; x < toolBars.size(); ++x) {
1322 if (toolBars.at(x)->objectName() == objectName) {
1323 toolBar = toolBars.takeAt(x);
1327 if (toolBar ==
nullptr) {
1331 if (applyingLayout) {
1334 auto *toolBarPrivate = QWidgetPrivate::get(toolBar);
1335 toolBarPrivate->widgetItem =
nullptr;
1336 item.widgetItem =
new QWidgetItemV2(toolBar);
1337 toolBar->setOrientation(floating ? ((shown & 2) ? Qt::Vertical : Qt::Horizontal) : dock.o);
1338 toolBar->setVisible(shown & 1);
1339 toolBar->d_func()->setWindowState(floating,
false, rect);
1342 line.toolBarItems.append(item);
1346 if (applyingLayout) {
1347 dock.lines.append(line);
1352 return stream.status() == QDataStream::Ok;
1357 for (
int i = 0; i < QInternal::DockCount; ++i) {
1358 if (!docks[i].lines.isEmpty())
QMainWindowLayout * qt_mainwindow_layout(const QMainWindow *window)