2026-04-06 00:20:51 -05:00

213 lines
6.8 KiB
C++

/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> 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 <QToolButton>
// 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<QMainWindow *>(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);
}