/* This file is part of KDDockWidgets. SPDX-FileCopyrightText: 2019 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 "ViewFactory.h" #include "Config.h" #include "Action_p.h" #include "core/Utils_p.h" #include "kddockwidgets/core/TabBar.h" #include "kddockwidgets/core/Stack.h" #include "kddockwidgets/core/FloatingWindow.h" #include "kddockwidgets/core/indicators/ClassicDropIndicatorOverlay.h" #include "kddockwidgets/core/indicators/NullDropIndicatorOverlay.h" #include "kddockwidgets/core/indicators/SegmentedDropIndicatorOverlay.h" #include "kddockwidgets/core/MainWindow.h" #include "kddockwidgets/core/views/ClassicIndicatorWindowViewInterface.h" #include "qtwidgets/views/ClassicIndicatorsWindow.h" #include "qtwidgets/views/SegmentedDropIndicatorOverlay.h" #include "qtwidgets/views/FloatingWindow.h" #include "qtwidgets/views/DockWidget.h" #include "qtwidgets/views/DropArea.h" #include "qtwidgets/views/Group.h" #include "qtwidgets/views/View.h" #include "qtwidgets/views/Separator.h" #include "qtwidgets/views/TitleBar.h" #include "qtwidgets/views/TabBar.h" #include "qtwidgets/views/SideBar.h" #include "qtwidgets/views/Stack.h" #include "qtwidgets/views/MainWindow.h" #include "qtwidgets/views/MDILayout.h" #include "qtwidgets/views/RubberBand.h" #include // clazy:excludeall=ctor-missing-parent-argument using namespace KDDockWidgets; using namespace KDDockWidgets::QtWidgets; ViewFactory::~ViewFactory() { } Core::View *ViewFactory::createDockWidget(const QString &uniqueName, DockWidgetOptions options, LayoutSaverOptions layoutSaverOptions, Qt::WindowFlags windowFlags) const { return new QtWidgets::DockWidget(uniqueName, options, layoutSaverOptions, windowFlags); } Core::View *ViewFactory::createGroup(Core::Group *controller, Core::View *parent = nullptr) const { return new QtWidgets::Group(controller, QtCommon::View_qt::asQWidget(parent)); } Core::View *ViewFactory::createTitleBar(Core::TitleBar *titleBar, Core::View *parent) const { return new QtWidgets::TitleBar(titleBar, parent); } Core::View *ViewFactory::createTabBar(Core::TabBar *tabBar, Core::View *parent) const { return new QtWidgets::TabBar(tabBar, QtCommon::View_qt::asQWidget(parent)); } Core::View *ViewFactory::createStack(Core::Stack *controller, Core::View *parent) const { return new QtWidgets::Stack(controller, QtCommon::View_qt::asQWidget(parent)); } Core::View *ViewFactory::createSeparator(Core::Separator *controller, Core::View *parent) const { return new QtWidgets::Separator(controller, parent); } Core::View *ViewFactory::createFloatingWindow(Core::FloatingWindow *controller, Core::MainWindow *parent, Qt::WindowFlags windowFlags) const { auto mainwindow = qobject_cast(QtCommon::View_qt::asQWidget(parent ? parent->view() : nullptr)); return new QtWidgets::FloatingWindow(controller, mainwindow, windowFlags); } Core::View *ViewFactory::createRubberBand(Core::View *parent) const { return new QtWidgets::RubberBand(QtCommon::View_qt::asQWidget(parent)); } Core::View *ViewFactory::createSideBar(Core::SideBar *controller, Core::View *parent) const { return new QtWidgets::SideBar(controller, QtCommon::View_qt::asQWidget(parent)); } QAbstractButton *ViewFactory::createTitleBarButton(QWidget *parent, TitleBarButtonType type) const { if (!parent) { qWarning() << Q_FUNC_INFO << "Parent not provided"; return nullptr; } auto button = new QtWidgets::Button(parent); button->setIcon(iconForButtonType(type, parent->devicePixelRatioF())); return button; } // iconForButtonType impl is the same for QtQuick and QtWidgets QIcon ViewFactory::iconForButtonType(TitleBarButtonType type, qreal dpr) const { auto key = std::make_pair(type, dpr); auto it = m_cachedIcons.constFind(key); if (it != m_cachedIcons.cend()) return *it; QString iconName; switch (type) { case TitleBarButtonType::AutoHide: iconName = QStringLiteral("auto-hide"); break; case TitleBarButtonType::UnautoHide: iconName = QStringLiteral("unauto-hide"); break; case TitleBarButtonType::Close: iconName = QStringLiteral("close"); break; case TitleBarButtonType::Minimize: iconName = QStringLiteral("min"); break; case TitleBarButtonType::Maximize: iconName = QStringLiteral("max"); break; case TitleBarButtonType::Normal: // We're using the same icon as dock/float iconName = QStringLiteral("dock-float"); break; case TitleBarButtonType::Float: iconName = QStringLiteral("dock-float"); break; case TitleBarButtonType::AllTitleBarButtonTypes: break; } if (iconName.isEmpty()) return {}; QIcon icon(QStringLiteral(":/img/%1.png").arg(iconName)); if (!scalingFactorIsSupported(dpr)) { m_cachedIcons.insert(key, icon); return icon; } // Not using Qt's sugar syntax, which doesn't support 1.5x anyway when we need it. // Simply add the high-res files and Qt will pick them when needed if (scalingFactorIsSupported(1.5)) icon.addFile(QStringLiteral(":/img/%1-1.5x.png").arg(iconName)); icon.addFile(QStringLiteral(":/img/%1-2x.png").arg(iconName)); m_cachedIcons.insert(key, icon); return icon; } Core::View *ViewFactory::createDropArea(Core::DropArea *controller, Core::View *parent) const { return new QtWidgets::DropArea(controller, parent); } Core::View *ViewFactory::createMDILayout(Core::MDILayout *controller, Core::View *parent) const { return new QtWidgets::MDILayout(controller, parent); } Core::View *ViewFactory::createSegmentedDropIndicatorOverlayView( Core::SegmentedDropIndicatorOverlay *controller, Core::View *parent) const { return new QtWidgets::SegmentedDropIndicatorOverlay(controller, QtCommon::View_qt::asQWidget(parent)); } Core::ClassicIndicatorWindowViewInterface *ViewFactory::createClassicIndicatorWindow( Core::ClassicDropIndicatorOverlay *classicIndicators, Core::View *parent) const { Q_UNUSED(parent); /// It's a real window, not parented to drop area return new QtWidgets::IndicatorWindow(classicIndicators); } void ViewFactory::clearIconCache() { m_cachedIcons.clear(); } KDDockWidgets::Core::Action *ViewFactory::createAction(Core::DockWidget *dw, const char *debugName) const { return new QtWidgets::Action(dw, debugName); }