Add new files forgotton in last commit
This commit is contained in:
parent
94ca829e98
commit
c7531032d7
2 changed files with 193 additions and 0 deletions
152
src/basewindow.cpp
Normal file
152
src/basewindow.cpp
Normal file
|
@ -0,0 +1,152 @@
|
|||
/**
|
||||
* This file is a part of promoe, an XMMS2 Client
|
||||
*
|
||||
* Copyright (C) 2008 Thomas Frauendorfer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "basewindow.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidgetList>
|
||||
#include <QMouseEvent>
|
||||
#include <QPoint>
|
||||
|
||||
BaseWindow::BaseWindow (QWidget *parent) : QMainWindow (parent)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
BaseWindow::mousePressEvent (QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons () & Qt::LeftButton) {
|
||||
m_diff = event->pos ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BaseWindow::mouseReleaseEvent (QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons () & Qt::LeftButton) {
|
||||
m_diff = QPoint (0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BaseWindow::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
// Only move, if the left button is pressed
|
||||
if ((event->buttons () & Qt::LeftButton) && !m_diff.isNull ()) {
|
||||
move (snapWindow (event->globalPos() - m_diff));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QPoint
|
||||
BaseWindow::snapWindow(QPoint pos)
|
||||
{
|
||||
//TODO: make snapdistance configurable
|
||||
qint32 snapdistance = 10;
|
||||
|
||||
qint32 left = pos.x ();
|
||||
qint32 right = left + width ();
|
||||
qint32 top = pos.y ();
|
||||
qint32 bottom = top + height ();
|
||||
|
||||
qDebug ("top: %i, bottom: %i, left: %i, right: %i", top, bottom, left, right);
|
||||
QWidgetList widgets = qApp->topLevelWidgets ();
|
||||
QWidget *w;
|
||||
// snap to left or right edge
|
||||
bool snappedV = false;
|
||||
bool snappedH = false;
|
||||
foreach (w, widgets) {
|
||||
if (w == this) {
|
||||
continue;
|
||||
}
|
||||
if (!w->isVisible ()) {
|
||||
continue;
|
||||
}
|
||||
qint32 w_left = w->x ();
|
||||
qint32 w_right = w_left + w->width ();
|
||||
qint32 w_top = w->y ();
|
||||
qint32 w_bottom = w_top + w->height ();
|
||||
// test if we are anywhere near this widget
|
||||
if ((w_top > bottom + snapdistance) ||
|
||||
(w_bottom < top - snapdistance) ||
|
||||
(w_left > right + snapdistance) ||
|
||||
(w_right < left - snapdistance)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// test if this widget can snap left or right to another widget
|
||||
// and if it can, test if the tops or bottoms can also snap
|
||||
if (!snappedV && (qAbs (w_left - right) < snapdistance)) {
|
||||
pos.setX (w_left - width ());
|
||||
snappedV = true;
|
||||
if (snappedH) {
|
||||
break;
|
||||
}
|
||||
if (qAbs (w_bottom - bottom) < snapdistance) {
|
||||
pos.setY (w_bottom - height ());
|
||||
break;
|
||||
} else if (qAbs (w_top - top) < snapdistance) {
|
||||
pos.setY (w_top);
|
||||
break;
|
||||
}
|
||||
} else if (!snappedV && (qAbs (left - w_right) < snapdistance)) {
|
||||
pos.setX (w_right);
|
||||
snappedV = true;
|
||||
if (snappedH) {
|
||||
break;
|
||||
}
|
||||
if (qAbs (w_bottom - bottom) < snapdistance) {
|
||||
pos.setY (w_bottom - height ());
|
||||
break;
|
||||
} else if (qAbs (w_top - top) < snapdistance) {
|
||||
pos.setY (w_top);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// test if this widget can snap to top or bottom of another widget
|
||||
// and if it can, test if the left or right edges also can
|
||||
if (!snappedH && (qAbs (top - w_bottom) < snapdistance)) {
|
||||
pos.setY (w_bottom);
|
||||
snappedH = true;
|
||||
if (snappedV) {
|
||||
break;
|
||||
}
|
||||
if (qAbs (w_left - left) < snapdistance) {
|
||||
pos.setX (w_left);
|
||||
break;
|
||||
} else if (qAbs (w_right - right) < snapdistance) {
|
||||
pos.setX (w_right - width ());
|
||||
break;
|
||||
}
|
||||
} else if (!snappedH && (qAbs (w_top - bottom) < snapdistance)) {
|
||||
pos.setY (w_top - height ());
|
||||
snappedH = true;
|
||||
if (snappedV) {
|
||||
break;
|
||||
}
|
||||
if (qAbs (w_left - left) < snapdistance) {
|
||||
pos.setX (w_left);
|
||||
break;
|
||||
} else if (qAbs (w_right - right) < snapdistance) {
|
||||
pos.setX (w_right - width ());
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
41
src/basewindow.h
Normal file
41
src/basewindow.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
* This file is a part of promoe, an XMMS2 Client
|
||||
*
|
||||
* Copyright (C) 2008 Thomas Frauendorfer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __BASEWINDOW_H__
|
||||
#define __BASEWINDOW_H__
|
||||
|
||||
#include <QMainWindow>
|
||||
class QMouseEvent;
|
||||
class QPoint;
|
||||
|
||||
class BaseWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BaseWindow (QWidget *parent);
|
||||
|
||||
protected:
|
||||
void mousePressEvent (QMouseEvent *event);
|
||||
void mouseReleaseEvent (QMouseEvent *event);
|
||||
void mouseMoveEvent (QMouseEvent *event);
|
||||
|
||||
QPoint snapWindow (QPoint pos);
|
||||
|
||||
private:
|
||||
QPoint m_diff;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue