diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-08-03 19:10:12 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-08-03 19:10:12 +0000 |
| commit | 6cede000326f72c7fa18d5a84924fdc38e014cb1 (patch) | |
| tree | eeb86fc56ab2aecaadb6dbfa356938abb43feb81 | |
| parent | f53f3338f8fedb2790966c3a879275f71004e7f5 (diff) | |
| download | qmmp-6cede000326f72c7fa18d5a84924fdc38e014cb1.tar.gz qmmp-6cede000326f72c7fa18d5a84924fdc38e014cb1.tar.bz2 qmmp-6cede000326f72c7fa18d5a84924fdc38e014cb1.zip | |
dock windows on the sides of the desktop
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2290 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/Ui/skinned/dock.cpp | 72 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/dock.h | 10 |
2 files changed, 49 insertions, 33 deletions
diff --git a/src/plugins/Ui/skinned/dock.cpp b/src/plugins/Ui/skinned/dock.cpp index a4e5d52d2..089fdf378 100644 --- a/src/plugins/Ui/skinned/dock.cpp +++ b/src/plugins/Ui/skinned/dock.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Ilya Kotov * + * Copyright (C) 2006-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -21,10 +21,8 @@ #include <QAction> #include <QDesktopWidget> #include <QApplication> - #include "dock.h" - Dock *Dock::m_instance = 0; Dock *Dock::instance() @@ -53,6 +51,28 @@ void Dock::setMainWidget (QWidget *widget) m_dockedList.prepend (false); } +QPoint Dock::snapDesktop(QPoint npos, QWidget* mv) +{ + QRect desktopRect = QApplication::desktop()->availableGeometry(mv); + int nx = abs (npos.x() - desktopRect.x()); //left-top + int ny = abs (npos.y() - desktopRect.y()); + + if(nx < 13) + npos.rx() = desktopRect.x(); + if(ny < 13) + npos.ry() = desktopRect.y(); + + nx = abs (npos.x() + mv->width() - desktopRect.width() - desktopRect.x()); //right-bottom + ny = abs (npos.y() + mv->height() - desktopRect.height() - desktopRect.y()); + + if(nx < 13) + npos.rx() = desktopRect.width() - mv->width() + desktopRect.x(); + if(ny < 13) + npos.ry() = desktopRect.height() - mv->height() + desktopRect.y(); + + return npos; +} + QPoint Dock::snap (QPoint npos, QWidget* mv, QWidget* st) { @@ -111,16 +131,15 @@ void Dock::addWidget (QWidget *widget) m_widgetList.append (widget); m_dockedList.append (false); widget->addActions(m_actions); - } void Dock::move (QWidget* mv, QPoint npos) { - QRect DesktopRect = QApplication::desktop()->availableGeometry(m_mainWidget); - if(npos.y() < DesktopRect.y()) - npos.setY(DesktopRect.y()); - if(npos.x() < DesktopRect.x()) - npos.setX(DesktopRect.x()); + QRect desktopRect = QApplication::desktop()->availableGeometry(m_mainWidget); + + if(npos.y() < desktopRect.y()) + npos.setY(desktopRect.y()); + if (mv == m_mainWidget) { @@ -130,30 +149,32 @@ void Dock::move (QWidget* mv, QPoint npos) { if (m_widgetList.at (i)->isVisible()) npos = snap (npos, mv, m_widgetList.at (i)); - } else { - QPoint pos = QPoint (npos.x() + x_list.at (i), - npos.y() + y_list.at (i)); + QPoint pos = npos + m_delta_list.at(i); for (int j = 1; j<m_widgetList.size(); ++j) { if (!m_dockedList.at (j) && m_widgetList.at (j)->isVisible()) { pos = snap (pos, m_widgetList.at (i), m_widgetList.at (j)); - npos = QPoint (pos.x() - x_list.at (i), - pos.y() - y_list.at (i)); + npos = pos - m_delta_list.at(i); } } } } - mv->move (npos); + npos = snapDesktop(npos, mv); for (int i = 1; i<m_widgetList.size(); ++i) { if (m_dockedList.at (i)) - m_widgetList.at (i)->move(npos.x() + x_list.at (i), - npos.y() + y_list.at (i)); + { + QPoint pos = npos + m_delta_list.at(i); + pos = snapDesktop(pos, m_widgetList.at(i)); + m_widgetList.at (i)->move(pos); + npos = pos - m_delta_list.at(i); + } } + mv->move (npos); } else { @@ -163,6 +184,7 @@ void Dock::move (QWidget* mv, QPoint npos) if (mv != m_widgetList.at (i) && !m_dockedList.at (i) && m_widgetList.at (i)->isVisible()) { npos = snap (npos, mv, m_widgetList.at (i)); + npos = snapDesktop(npos, mv); } } mv->move (npos); @@ -171,20 +193,13 @@ void Dock::move (QWidget* mv, QPoint npos) void Dock::calculateDistances() { - x_list.clear(); - y_list.clear(); + m_delta_list.clear(); foreach (QWidget *w, m_widgetList) { - if (w!=m_mainWidget) - { - x_list.append (- m_mainWidget->x() + w->x()); - y_list.append (- m_mainWidget->y() + w->y()); - } + if (w == m_mainWidget) + m_delta_list.append(QPoint(0,0)); else - { - x_list.prepend (0); - y_list.prepend (0); - } + m_delta_list.append(w->pos() - m_mainWidget->pos()); } } @@ -209,7 +224,6 @@ void Dock::updateDock() } } } - } bool Dock::isDocked (QWidget* mv, QWidget* st) diff --git a/src/plugins/Ui/skinned/dock.h b/src/plugins/Ui/skinned/dock.h index e843ed142..a88da9f54 100644 --- a/src/plugins/Ui/skinned/dock.h +++ b/src/plugins/Ui/skinned/dock.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -42,19 +42,21 @@ public: void move(QWidget*, QPoint); void calculateDistances(); void updateDock(); - QPoint snap(QPoint, QWidget*, QWidget*); void addActions(QList<QAction *> actions); void align(QWidget*, int dy); private: + QPoint snapDesktop(QPoint, QWidget*); + QPoint snap(QPoint, QWidget*, QWidget*); bool isDocked(QWidget*, QWidget*); bool isUnder(QWidget*, QWidget*, int); static Dock *m_instance; QWidget *m_mainWidget; QList <QWidget *> m_widgetList; QList <bool> m_dockedList; - QList <int> x_list; - QList <int> y_list; + /*QList <int> x_list; + QList <int> y_list;*/ + QList <QPoint> m_delta_list; QList <QAction *> m_actions; }; |
