diff --git a/examples/dockwidgets/CMakeLists.txt b/examples/dockwidgets/CMakeLists.txt index 0b17ed39..e0ea59d7 100644 --- a/examples/dockwidgets/CMakeLists.txt +++ b/examples/dockwidgets/CMakeLists.txt @@ -9,11 +9,14 @@ set(CMAKE_INCLUDE_CURRENT_DIRS ON) # if you want to look for a specific version for instance. find_package(KDDockWidgets REQUIRED) +qt5_add_resources(RESOURCES_SRC ${CMAKE_CURRENT_SOURCE_DIR}/resources.qrc) + add_executable(kddockwidgets_example main.cpp MyFrameworkWidgetFactory.cpp MyMainWindow.cpp MyWidget.cpp + ${RESOURCES_SRC} ) target_link_libraries(kddockwidgets_example diff --git a/examples/dockwidgets/MyMainWindow.cpp b/examples/dockwidgets/MyMainWindow.cpp index 6445baa6..80fe16e7 100644 --- a/examples/dockwidgets/MyMainWindow.cpp +++ b/examples/dockwidgets/MyMainWindow.cpp @@ -31,13 +31,22 @@ #include #include -KDDockWidgets::DockWidget::Options s_dockWidgetOptions = KDDockWidgets::DockWidget::Option_None; +#include +#include static MyWidget *newMyWidget() { - static int count = 0; - count++; - return new MyWidget(); + const int randomNumber = rand() % 100 + 1; + + if (randomNumber < 66) { + if (randomNumber < 33) { + return new MyWidget1(); + } else { + return new MyWidget2(); + } + } else { + return new MyWidget3(); + } } MyMainWindow::MyMainWindow(KDDockWidgets::MainWindowOptions options, QWidget *parent) @@ -45,6 +54,8 @@ MyMainWindow::MyMainWindow(KDDockWidgets::MainWindowOptions options, QWidget *pa { // qApp->installEventFilter(this); + srand(time(nullptr)); + auto menubar = menuBar(); auto fileMenu = new QMenu(QStringLiteral("File")); m_toggleMenu = new QMenu(QStringLiteral("Toggle")); @@ -52,19 +63,18 @@ MyMainWindow::MyMainWindow(KDDockWidgets::MainWindowOptions options, QWidget *pa menubar->addMenu(m_toggleMenu); QAction *newAction = fileMenu->addAction(QStringLiteral("New DockWidget")); - static int count = 0; - count++; + connect(newAction, &QAction::triggered, this, [] { + static int count = 0; + count++; auto w = newMyWidget(); w->setGeometry(100, 100, 400, 400); - auto dock = new KDDockWidgets::DockWidget(QStringLiteral("dock %1").arg(count)); + auto dock = new KDDockWidgets::DockWidget(QStringLiteral("new dock %1").arg(count)); dock->setWidget(w); dock->resize(400, 400); dock->show(); }); - // newAction = fileMenu->addAction("Change MainWindow indicator style"); - auto saveLayoutAction = fileMenu->addAction(QStringLiteral("Save Layout")); connect(saveLayoutAction, &QAction::triggered, this, [] { KDDockWidgets::LayoutSaver saver; @@ -78,29 +88,37 @@ MyMainWindow::MyMainWindow(KDDockWidgets::MainWindowOptions options, QWidget *pa saver.restoreFromDisk(); }); - auto example = newMyWidget(); - auto dock = new KDDockWidgets::DockWidget(QStringLiteral("foo"), s_dockWidgetOptions); - dock->setIcon(QIcon::fromTheme(QStringLiteral("mail-message"))); - dock->setWidget(example); - dock->setTitle(QStringLiteral("foo")); - example->winId(); // for testing native widgets too - dock->resize(400, 400); - dock->show(); - m_toggleMenu->addAction(dock->toggleAction()); + struct Descriptor { + KDDockWidgets::Location location; + int relativeTo; + }; - example = newMyWidget(); - example->setGeometry(100, 100, 400, 400); - dock = new KDDockWidgets::DockWidget(QStringLiteral("bar"), s_dockWidgetOptions); - dock->setWidget(example); - dock->resize(400, 400); - dock->show(); - m_toggleMenu->addAction(dock->toggleAction()); + const QVector docksToCreate = { + { KDDockWidgets::Location_OnTop, -1 }, + { KDDockWidgets::Location_OnRight, 0 }, + { KDDockWidgets::Location_OnLeft, -1 }, + { KDDockWidgets::Location_OnBottom, -1 }, + }; - auto textEdit = new QTextEdit(); - textEdit->setText(QStringLiteral("Hello, this is the central document.")); - dock = new KDDockWidgets::DockWidget(QStringLiteral("doc 0"), s_dockWidgetOptions); - dock->setWidget(textEdit); - m_toggleMenu->addAction(dock->toggleAction()); - if (options & KDDockWidgets::MainWindowOption_HasCentralFrame) - addDockWidgetAsTab(dock); + int count = 0; + KDDockWidgets::DockWidget::List createdDockWidgets; + for (Descriptor desc : docksToCreate) { + count++; + auto dock = new KDDockWidgets::DockWidget(QStringLiteral("DockWidget #%1").arg(count)); + createdDockWidgets << dock; + + if (count == 1) + dock->setIcon(QIcon::fromTheme(QStringLiteral("mail-message"))); + auto myWidget = newMyWidget(); + dock->setWidget(myWidget); + dock->setTitle(QStringLiteral("DockWidget #%1").arg(count)); + dock->resize(400, 400); + dock->show(); + m_toggleMenu->addAction(dock->toggleAction()); + + KDDockWidgets::DockWidgetBase *relativeTo = desc.relativeTo == -1 ? nullptr + : createdDockWidgets.at(desc.relativeTo); + + addDockWidget(dock, desc.location, relativeTo); + } } diff --git a/examples/dockwidgets/MyWidget.cpp b/examples/dockwidgets/MyWidget.cpp index 41bb3fbd..35da53ea 100644 --- a/examples/dockwidgets/MyWidget.cpp +++ b/examples/dockwidgets/MyWidget.cpp @@ -20,39 +20,80 @@ #include "MyWidget.h" -#include -#include -#include -#include +#include +#include +#include -MyWidget::MyWidget(QWidget *parent) +MyWidget::MyWidget(const QString &backgroundFile, const QString &logoFile, QWidget *parent) : QWidget(parent) + , m_background(QImage(backgroundFile)) + , m_logo(QImage(logoFile)) { - auto l = new QVBoxLayout(this); - - auto box = new QGroupBox(); - auto l2 = new QVBoxLayout(box); - auto radio1 = new QRadioButton(QStringLiteral("foo"), box); - auto radio2 = new QRadioButton(QStringLiteral("bar"), box); - auto radio3 = new QRadioButton(QStringLiteral("baz"), box); - l2->addWidget(radio1); - l2->addWidget(radio2); - l2->addWidget(radio3); - - l->addWidget(box); - auto button = new QPushButton(QStringLiteral("Test")); - l->addWidget(button); - l->addWidget(new QPushButton(QStringLiteral("Test"))); - l->addStretch(); - - connect(button, &QPushButton::clicked, button, [this] { - // To test if moving windows work on Wayland - QPoint pos = window()->pos(); - window()->move(pos + QPoint(30, 30)); - }); + if (!backgroundFile.isEmpty() && m_background.isNull()) + qWarning() << "Invalid image for background file" << backgroundFile; + if (!logoFile.isEmpty() && m_logo.isNull()) + qWarning() << "Invalid image for logo file" << logoFile; } MyWidget::~MyWidget() { } + +void MyWidget::drawLogo(QPainter &p) +{ + if (m_logo.isNull()) + return; + + const qreal ratio = m_logo.width() / (m_logo.height() * 1.0); + + const int height = size().height() - 100; + const int width = int(height * ratio); + QRect targetLogoRect(0,0, width, height); + targetLogoRect.moveCenter(rect().center()); + p.drawImage(targetLogoRect, m_logo, m_logo.rect()); +} + +MyWidget1::MyWidget1(MyWidget::QWidget *parent) + : MyWidget(QStringLiteral(":/assets/triangles.png"), QStringLiteral(":/assets/KDAB_bubble_white.png"), parent) +{ +} + +void MyWidget1::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), QColor(0xCC, 0xCC, 0xCC)); + p.drawImage(m_background.rect(), m_background, m_background.rect()); + + drawLogo(p); +} + +MyWidget2::MyWidget2(MyWidget::QWidget *parent) + : MyWidget(QString(), QStringLiteral(":/assets/KDAB_bubble_blue.png"), parent) + , m_triangle(QImage(QStringLiteral(":/assets/tri.png"))) +{ +} + +void MyWidget2::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), Qt::white); + + //.drawImage(rect(), m_triangle, m_triangle.rect()); + + drawLogo(p); +} + +MyWidget3::MyWidget3(MyWidget::QWidget *parent) + : MyWidget(QStringLiteral(":/assets/base.png"), QStringLiteral(":/assets/KDAB_bubble_fulcolor.png"), parent) +{ +} + +void MyWidget3::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), QColor(0xD5, 0xD5, 0xD5)); + + p.drawImage(m_background.rect(), m_background, m_background.rect()); + drawLogo(p); +} diff --git a/examples/dockwidgets/MyWidget.h b/examples/dockwidgets/MyWidget.h index 896c50f1..244c31e1 100644 --- a/examples/dockwidgets/MyWidget.h +++ b/examples/dockwidgets/MyWidget.h @@ -23,12 +23,44 @@ #include +class QPainter; + class MyWidget : public QWidget { Q_OBJECT public: - explicit MyWidget(QWidget *parent = nullptr); + explicit MyWidget(const QString &backgroundFile, const QString &logoFile, QWidget *parent = nullptr); ~MyWidget(); +protected: + void drawLogo(QPainter &); + QImage m_background; + QImage m_logo; }; +class MyWidget1 : public MyWidget +{ +public: + explicit MyWidget1(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; +}; + +class MyWidget2 : public MyWidget +{ +public: + explicit MyWidget2(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; + QImage m_triangle; +}; + +class MyWidget3 : public MyWidget +{ +public: + explicit MyWidget3(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; +}; + + #endif diff --git a/examples/dockwidgets/assets/KDAB_bubble_blue.png b/examples/dockwidgets/assets/KDAB_bubble_blue.png new file mode 100644 index 00000000..2ae8f331 Binary files /dev/null and b/examples/dockwidgets/assets/KDAB_bubble_blue.png differ diff --git a/examples/dockwidgets/assets/KDAB_bubble_fulcolor.png b/examples/dockwidgets/assets/KDAB_bubble_fulcolor.png new file mode 100644 index 00000000..2a71105e Binary files /dev/null and b/examples/dockwidgets/assets/KDAB_bubble_fulcolor.png differ diff --git a/examples/dockwidgets/assets/KDAB_bubble_white.png b/examples/dockwidgets/assets/KDAB_bubble_white.png new file mode 100644 index 00000000..13bb678d Binary files /dev/null and b/examples/dockwidgets/assets/KDAB_bubble_white.png differ diff --git a/examples/dockwidgets/assets/base.png b/examples/dockwidgets/assets/base.png new file mode 100644 index 00000000..e46e8205 Binary files /dev/null and b/examples/dockwidgets/assets/base.png differ diff --git a/examples/dockwidgets/assets/tri.png b/examples/dockwidgets/assets/tri.png new file mode 100644 index 00000000..78cd8dc9 Binary files /dev/null and b/examples/dockwidgets/assets/tri.png differ diff --git a/examples/dockwidgets/assets/triangles.png b/examples/dockwidgets/assets/triangles.png new file mode 100644 index 00000000..3c34cb8b Binary files /dev/null and b/examples/dockwidgets/assets/triangles.png differ diff --git a/examples/dockwidgets/resources.qrc b/examples/dockwidgets/resources.qrc new file mode 100644 index 00000000..3c038389 --- /dev/null +++ b/examples/dockwidgets/resources.qrc @@ -0,0 +1,10 @@ + + + assets/base.png + assets/KDAB_bubble_blue.png + assets/KDAB_bubble_fulcolor.png + assets/KDAB_bubble_white.png + assets/triangles.png + assets/tri.png + +