From ba5a092ad7287baf2033caeab9042b01fd6ced24 Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 6 Apr 2014 15:30:30 +0200 Subject: [PATCH] Frameless dialog position/size fixes Fixed frameless dialog size and position on main window resize and move --- interface/src/Menu.cpp | 4 +- interface/src/ui/FramelessDialog.cpp | 93 ++++++++++++++++++++++++---- interface/src/ui/FramelessDialog.h | 12 ++-- 3 files changed, 90 insertions(+), 19 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 859b3250be..9615238b36 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -717,9 +717,9 @@ void Menu::loginForCurrentDomain() { void Menu::editPreferences() { if (!_preferencesDialog) { - Application::getInstance()->getWindow()->addDockWidget(Qt::LeftDockWidgetArea, _preferencesDialog = new PreferencesDialog()); + _preferencesDialog = new PreferencesDialog(Application::getInstance()->getWindow()); + _preferencesDialog->show(); } else { - Application::getInstance()->getWindow()->removeDockWidget(_preferencesDialog); _preferencesDialog->close(); } } diff --git a/interface/src/ui/FramelessDialog.cpp b/interface/src/ui/FramelessDialog.cpp index 40388b2f5f..14f7e57f3b 100644 --- a/interface/src/ui/FramelessDialog.cpp +++ b/interface/src/ui/FramelessDialog.cpp @@ -6,26 +6,65 @@ // // -#include -#include -#include -#include -#include - #include "Application.h" #include "FramelessDialog.h" +const int RESIZE_HANDLE_WIDTH = 7; + FramelessDialog::FramelessDialog(QWidget *parent, Qt::WindowFlags flags) : - QDockWidget(parent, flags) { +QDialog(parent, flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint) { setAttribute(Qt::WA_DeleteOnClose); - // set as floating - setFeatures(QDockWidget::DockWidgetFloatable); + // handle rezize and move events + parentWidget()->installEventFilter(this); - // remove titlebar - setTitleBarWidget(new QWidget()); + // handle minimize, restore and focus events + Application::getInstance()->installEventFilter(this); +} - setAllowedAreas(Qt::LeftDockWidgetArea); +bool FramelessDialog::eventFilter(QObject* sender, QEvent* event) { + switch (event->type()) { + case QEvent::Move: + + if (sender == parentWidget()) { + // move to upper left corner on app move + move(parentWidget()->geometry().topLeft()); + } + break; + + case QEvent::Resize: + if (sender == parentWidget()) { + // keep full app height on resizing the app + setFixedHeight(parentWidget()->size().height()); + } + break; + + case QEvent::WindowStateChange: + if (parentWidget()->isMinimized()) { + setHidden(true); + } else { + setHidden(false); + } + break; + + case QEvent::ApplicationDeactivate: + // hide on minimize and focus lost + setHidden(true); + break; + + case QEvent::ApplicationActivate: + setHidden(false); + break; + + default: + break; + } + + return false; +} + +FramelessDialog::~FramelessDialog() { + deleteLater(); } void FramelessDialog::setStyleSheetFile(const QString& fileName) { @@ -36,3 +75,33 @@ void FramelessDialog::setStyleSheetFile(const QString& fileName) { setStyleSheet(globalStyleSheet.readAll() + styleSheet.readAll()); } } + +void FramelessDialog::showEvent(QShowEvent* event) { + // move to upper left corner + move(parentWidget()->geometry().topLeft()); + + // keep full app height + setFixedHeight(parentWidget()->size().height()); + + // resize parrent if width is smaller than this dialog + if (parentWidget()->size().width() < size().width()) { + parentWidget()->resize(size().width(), parentWidget()->size().height()); + } +} +void FramelessDialog::mousePressEvent(QMouseEvent* mouseEvent) { + if (abs(mouseEvent->pos().x() - size().width()) < RESIZE_HANDLE_WIDTH && mouseEvent->button() == Qt::LeftButton) { + _isResizing = true; + QApplication::setOverrideCursor(Qt::SizeHorCursor); + } +} + +void FramelessDialog::mouseReleaseEvent(QMouseEvent* mouseEvent) { + QApplication::restoreOverrideCursor(); + _isResizing = false; +} + +void FramelessDialog::mouseMoveEvent(QMouseEvent* mouseEvent) { + if (_isResizing) { + resize(mouseEvent->pos().x(), size().height()); + } +} diff --git a/interface/src/ui/FramelessDialog.h b/interface/src/ui/FramelessDialog.h index 5c55f3de25..f13219a688 100644 --- a/interface/src/ui/FramelessDialog.h +++ b/interface/src/ui/FramelessDialog.h @@ -9,27 +9,29 @@ #ifndef __hifi__FramelessDialog__ #define __hifi__FramelessDialog__ -#include +#include #include #include #include #include #include -class FramelessDialog : public QDockWidget { +class FramelessDialog : public QDialog { Q_OBJECT public: FramelessDialog(QWidget* parent = 0, Qt::WindowFlags flags = 0); + ~FramelessDialog(); void setStyleSheetFile(const QString& fileName); protected: - /* virtual void mouseMoveEvent(QMouseEvent* mouseEvent); virtual void mousePressEvent(QMouseEvent* mouseEvent); virtual void mouseReleaseEvent(QMouseEvent* mouseEvent); - */ - + virtual void showEvent(QShowEvent* event); + + bool eventFilter(QObject* sender, QEvent* event); + private: bool _isResizing;