From b8b7804fcc229e9c34e18dc3ec6dfafd2e3485b0 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Fri, 1 Jul 2011 18:54:41 +0000 Subject: moved skinned ui to separate plugin git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2252 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Ui/skinned/dock.cpp | 266 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 src/plugins/Ui/skinned/dock.cpp (limited to 'src/plugins/Ui/skinned/dock.cpp') diff --git a/src/plugins/Ui/skinned/dock.cpp b/src/plugins/Ui/skinned/dock.cpp new file mode 100644 index 000000000..a4e5d52d2 --- /dev/null +++ b/src/plugins/Ui/skinned/dock.cpp @@ -0,0 +1,266 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include + +#include "dock.h" + + +Dock *Dock::m_instance = 0; + +Dock *Dock::instance() +{ + if (!m_instance) + m_instance = new Dock(); + return m_instance; +} + +Dock::Dock (QObject *parent) + : QObject (parent) +{ + m_instance = this; + m_mainWidget = 0; +} + +Dock::~Dock() +{ + m_instance = 0; +} + +void Dock::setMainWidget (QWidget *widget) +{ + m_mainWidget = widget; + m_widgetList.prepend (widget); + m_dockedList.prepend (false); +} + + +QPoint Dock::snap (QPoint npos, QWidget* mv, QWidget* st) +{ + int nx = npos.x() - st->x(); + int ny = abs (npos.y() - st->y() + mv->height()); + + if (abs (nx) < 13 && ny < 13) //above + npos.rx() = st->x(); + if (ny < 13 && nx > -mv->width() && nx < st->width()) + npos.ry() = st->y() - mv->height(); + nx = abs (npos.x() + mv->width() - st->x() - st->width()); + if (nx < 13 && ny < 13) + npos.rx() = st->x() + st->width() - mv->width(); + + /***********/ + nx = npos.x() - st->x(); + ny = abs (npos.y() - st->y() - st->height()); + + if (abs (nx) < 13 && ny < 13) //near + npos.rx() = st->x(); + if (ny < 13 && nx > -mv->width() && nx < st->width()) + npos.ry() = st->y() + st->height(); + nx = abs (npos.x() + mv->width() - st->x() - st->width()); + if (nx < 13 && ny < 13) + npos.rx() = st->x() + st->width() - mv->width(); + /**************/ + nx = abs (npos.x() - st->x() + mv->width()); + ny = npos.y() - st->y(); + + if (nx < 13 && abs (ny) < 13) //left + npos.ry() = st->y(); + if (nx < 13 && ny > -mv->height() && ny < st->height()) + npos.rx() = st->x() - mv->width(); + + ny = abs (npos.y() + mv->height() - st->y() - st->height()); + if (nx < 13 && ny < 13) + npos.ry() = st->y() + st->height() - mv->height(); + /*****************/ + nx = abs (npos.x() - st->x() - st->width()); + ny = npos.y() - st->y(); + + if (nx < 13 && abs (ny) < 13) //right + npos.ry() = st->y(); + if (nx < 13 && ny > -mv->height() && ny < st->height()) + npos.rx() = st->x() + st->width(); + + ny = abs (npos.y() + mv->height() - st->y() - st->height()); + if (nx < 13 && ny < 13) + npos.ry() = st->y() + st->height() - mv->height(); + + return (npos); +} + +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()); + if (mv == m_mainWidget) + { + + for (int i = 1; iisVisible()) + npos = snap (npos, mv, m_widgetList.at (i)); + + } + else + { + QPoint pos = QPoint (npos.x() + x_list.at (i), + npos.y() + y_list.at (i)); + for (int j = 1; jisVisible()) + { + 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)); + } + } + } + } + mv->move (npos); + for (int i = 1; imove(npos.x() + x_list.at (i), + npos.y() + y_list.at (i)); + } + } + else + { + for (int i = 0; iisVisible()) + { + npos = snap (npos, mv, m_widgetList.at (i)); + } + } + mv->move (npos); + } +} + +void Dock::calculateDistances() +{ + x_list.clear(); + y_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()); + } + else + { + x_list.prepend (0); + y_list.prepend (0); + } + } +} + +void Dock::updateDock() +{ + QWidget *mv = m_widgetList.at (0); + for (int j = 1; jx() - st->x(); + int ny = abs (mv->y() - st->y() + mv->height()); + if (ny < 2 && nx > -mv->width() && nx < st->width()) //above + return true; + + /***********/ + nx = mv->x() - st->x(); + ny = abs (mv->y() - st->y() - st->height()); + if (ny < 2 && nx > -mv->width() && nx < st->width()) //near + return true; + + /**************/ + nx = abs (mv->x() - st->x() + mv->width()); + ny = mv->y() - st->y(); + if (nx < 2 && ny > -mv->height() && ny < st->height()) //left + return true; + + /*****************/ + nx = abs (mv->x() - st->x() - st->width()); + ny = mv->y() - st->y(); + if (nx < 2 && ny > -mv->height() && ny < st->height()) //right + return true; + return false; +} + +void Dock::addActions (QList actions) +{ + m_actions << actions; + for (int i = 0; iaddActions (actions); +} + +bool Dock::isUnder(QWidget* upper, QWidget* nether, int dy) +{ + int nx = upper->x() - nether->x(); + return abs (upper->y() + upper->height() -dy - nether->y()) < 2 && + nx > -upper->width() && nx < nether->width(); +} + +void Dock::align(QWidget* w, int dy) +{ + for (int i = 0; imove(m_widgetList.at(i)->x(), m_widgetList.at(i)->y()+dy); + align(m_widgetList.at(i), dy); + } + } +} -- cgit v1.2.3-13-gbd6f