diff --git a/scribus/ui/smcolorbutton.cpp b/scribus/ui/smcolorbutton.cpp index a675be7ac..46638bd06 100644 --- a/scribus/ui/smcolorbutton.cpp +++ b/scribus/ui/smcolorbutton.cpp @@ -6,7 +6,7 @@ SMColorButton::SMColorButton(QWidget *parent) : FormWidget(parent) { colorButton = new ColorButton(this); - colorButton->setMenuContextType(ColorButton::Floating); + colorButton->setMenuContextType(ColorButton::Sticky); addWidget( colorButton ); parentButton = new QToolButton(this); diff --git a/scribus/ui/widgets/color_button.cpp b/scribus/ui/widgets/color_button.cpp index 1b7403df2..27917d7d9 100644 --- a/scribus/ui/widgets/color_button.cpp +++ b/scribus/ui/widgets/color_button.cpp @@ -49,7 +49,10 @@ void ColorButton::setMenuContextType(MenuContextType type) switch (m_contextType) { case MenuContextType::None: + setMenu(nullptr); + disconnect(this, &QToolButton::pressed, this, &ColorButton::toggleFloatingContext); break; + case MenuContextType::Sticky: case MenuContextType::Floating: setPopupMode(QToolButton::InstantPopup); setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); @@ -653,6 +656,11 @@ void ColorButton::toggleFloatingContext() connect(colorPicker, &ColorPicker::patternChanged, this, &ColorButton::updatePattern, Qt::UniqueConnection); connect(colorPicker, &ColorPicker::colorListChanged, this, &ColorButton::updateFloatingContext, Qt::UniqueConnection); + if (m_contextType == MenuContextType::Floating) + floatingWidget->setIsMovable(true); + else if (m_contextType == MenuContextType::Sticky) + floatingWidget->setIsMovable(false); + floatingWidget->show(this); } diff --git a/scribus/ui/widgets/color_button.h b/scribus/ui/widgets/color_button.h index cc0e2041c..fdbe6a4d5 100644 --- a/scribus/ui/widgets/color_button.h +++ b/scribus/ui/widgets/color_button.h @@ -27,7 +27,8 @@ public: { None = 0, Floating = 1, - List = 2 + Sticky = 2, + List = 3 }; enum InfoType diff --git a/scribus/ui/widgets/floatingwindow.cpp b/scribus/ui/widgets/floatingwindow.cpp index 2808413ee..59373c9d8 100644 --- a/scribus/ui/widgets/floatingwindow.cpp +++ b/scribus/ui/widgets/floatingwindow.cpp @@ -24,13 +24,15 @@ FloatingWindow::FloatingWindow(QWidget *child, QWidget *parent) buttonClose->setFixedSize(16, 16); buttonClose->setAutoRaise(true); - QHBoxLayout *layoutHeader = new QHBoxLayout(); + m_header = new QWidget(); + + QHBoxLayout *layoutHeader = new QHBoxLayout(m_header); layoutHeader->addWidget(m_handle); layoutHeader->addWidget(buttonClose); layoutHeader->setContentsMargins(8, 8, 8, 8); m_layout = new QVBoxLayout(); - m_layout->addLayout(layoutHeader); + m_layout->addWidget(m_header); m_layout->addWidget(m_child); m_layout->setSpacing(0); m_layout->setContentsMargins(1, 1, 1, 1); @@ -52,6 +54,19 @@ QWidget *FloatingWindow::reference() return m_reference; } +void FloatingWindow::setIsMovable(bool movable) +{ + m_isMovable = movable; + + m_header->setVisible(m_isMovable); + + if(m_isMovable) + setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); + else + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); + +} + void FloatingWindow::iconSetChange() { IconManager &iconManager = IconManager::instance(); @@ -64,7 +79,7 @@ bool FloatingWindow::eventFilter(QObject *obj, QEvent *event) if (!wdg) return QWidget::eventFilter(obj, event); - if (m_handle && (m_handle == wdg)) + if (m_handle && (m_handle == wdg) && m_isMovable) { switch (event->type()) { @@ -102,6 +117,22 @@ void FloatingWindow::hideEvent(QHideEvent *event) QWidget::hideEvent(event); } +void FloatingWindow::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); + + this->raise(); + this->activateWindow(); +} + +bool FloatingWindow::event(QEvent *event) +{ + if (!m_isMovable && event->type() == QEvent::WindowDeactivate) + hide(); + + return QWidget::event(event); +} + QSize FloatingWindow::screenSize() const { QList screens = QGuiApplication::screens(); @@ -187,9 +218,8 @@ void FloatingWindow::calculatePosition() void FloatingWindow::show(QWidget *reference) { m_reference = reference; - calculatePosition(); + calculatePosition(); QWidget::show(); - QWidget::activateWindow(); } void FloatingWindow::updateSize() diff --git a/scribus/ui/widgets/floatingwindow.h b/scribus/ui/widgets/floatingwindow.h index 8f542c255..453bdec75 100644 --- a/scribus/ui/widgets/floatingwindow.h +++ b/scribus/ui/widgets/floatingwindow.h @@ -15,6 +15,9 @@ public: QWidget *child(); QWidget *reference(); + void setIsMovable(bool movable); + bool isMovable() { return m_isMovable; }; + public slots: void iconSetChange(); @@ -22,15 +25,19 @@ protected: bool eventFilter(QObject *obj, QEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void hideEvent(QHideEvent *event) override; + void showEvent(QShowEvent *event) override; + bool event(QEvent *event) override; private: QWidget * m_child { nullptr }; QWidget * m_reference { nullptr }; QWidget * m_handle { nullptr }; + QWidget * m_header { nullptr }; QVBoxLayout * m_layout { nullptr }; QToolButton* buttonClose { nullptr }; QPoint m_mousePos; + bool m_isMovable {true}; /*! * \brief Screen size of all screens