aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2011-08-03 19:10:12 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2011-08-03 19:10:12 +0000
commit6cede000326f72c7fa18d5a84924fdc38e014cb1 (patch)
treeeeb86fc56ab2aecaadb6dbfa356938abb43feb81
parentf53f3338f8fedb2790966c3a879275f71004e7f5 (diff)
downloadqmmp-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.cpp72
-rw-r--r--src/plugins/Ui/skinned/dock.h10
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;
};