/* This file is part of KDDockWidgets. SPDX-FileCopyrightText: 2020 Klarälvdalens Datakonsult AB, a KDAB Group company Author: Sérgio Martins SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only Contact KDAB at for commercial licensing options. */ #include "View.h" #include "../Window_p.h" #include "core/View_p.h" #include "core/layouting/Item_p.h" #include "ViewWrapper_p.h" #include #include #include #include #include using namespace KDDockWidgets; using namespace KDDockWidgets::QtWidgets; // clazy:excludeall=missing-qobject-macro template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags windowFlags) : QWidget(parent, windowFlags) , View_qt(controller, type, this) { } template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags) : QTabBar(parent) , View_qt(controller, type, this) { } template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags) : QTabWidget(parent) , View_qt(controller, type, this) { } template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags) : QMainWindow(parent) , View_qt(controller, type, this) { } template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags) : QRubberBand(QRubberBand::Rectangle, parent) , View_qt(controller, type, this) { } template<> View::View(Core::Controller *controller, Core::ViewType type, QWidget *parent, Qt::WindowFlags) : QLineEdit(parent) , View_qt(controller, type, this) { } template std::shared_ptr View::window() const { if (QWidget *root = QWidget::window()) { if (root->window()) { return std::shared_ptr(new Window(root)); } } return {}; } template void View::setMaximumSize(QSize sz) { if (sz != QWidget::maximumSize()) { T::setMaximumSize(sz); d->emitLayoutInvalidated(); } } template bool View::event(QEvent *e) { if (e->type() == QEvent::LayoutRequest) d->emitLayoutInvalidated(); return T::event(e); } template void View::closeEvent(QCloseEvent *ev) { d->requestClose(ev); } template void View::setMinimumSize(QSize sz) { if (sz != QWidget::minimumSize()) { QWidget::setMinimumSize(sz); d->emitLayoutInvalidated(); } } template std::shared_ptr View::childViewAt(QPoint localPos) const { if (QWidget *child = QWidget::childAt(localPos)) return ViewWrapper::create(child); return {}; } template std::shared_ptr View::rootView() const { if (auto w = QWidget::window()) { return ViewWrapper::create(w); } return {}; } template std::shared_ptr View::parentView() const { if (QWidget *p = QWidget::parentWidget()) { return ViewWrapper::create(p); } return {}; } template std::shared_ptr View::asWrapper() { return ViewWrapper::create(this); } /* static */ template QVector> View::childViewsFor(const QWidget *parent) { QVector> result; const QObjectList &children = parent->children(); result.reserve(children.size()); for (QObject *child : children) { if (auto widget = qobject_cast(child)) { result.push_back(ViewWrapper::create(widget)); } } return result; } namespace KDDockWidgets::QtWidgets { template class View; template class View; template class View; template class View; template class View; template class View; QSize boundedMaxSize(QSize min, QSize max) { // Max should be bigger than min, but not bigger than the hardcoded max max = max.boundedTo(Core::Item::hardcodedMaximumSize); // 0 interpreted as not having max if (max.width() <= 0) max.setWidth(Core::Item::hardcodedMaximumSize.width()); if (max.height() <= 0) max.setHeight(Core::Item::hardcodedMaximumSize.height()); max = max.expandedTo(min); return max; } }