diff options
Diffstat (limited to 'kmag/kmagselrect.cpp')
-rw-r--r-- | kmag/kmagselrect.cpp | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/kmag/kmagselrect.cpp b/kmag/kmagselrect.cpp new file mode 100644 index 0000000..4347d96 --- /dev/null +++ b/kmag/kmagselrect.cpp @@ -0,0 +1,385 @@ +/*************************************************************************** + kmagselrect.cpp - description + ------------------- + begin : Mon Feb 12 23:45:41 EST 2001 + copyright : (C) 2001-2003 by Sarang Lakare + email : sarang#users.sf.net + copyright : (C) 2003-2004 by Olaf Schmidt + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "kmagselrect.h" +#include "kmagselrect.moc" + +#include <qapplication.h> +#include <qcursor.h> +#include <qdesktopwidget.h> +#include <qpixmap.h> +#include <qbitmap.h> + +#include <kapplication.h> +#include <klocale.h> + +static uchar line_bits[] = {0x2d, 0x96, 0x4b, 0xa5, 0xd2, 0x69, 0xb4, 0x5a}; + +static QColor titleColor = QColor (0,0,128); +static QColor titleBtnColor = QColor (255,255,0); +static QColor textColor = QColor (255,255,255); + +static int frameSize = 10; +static int titleSize = 24; + +void setTitleColors (QColor title, QColor text, QColor titleBtn) +{ + titleColor = title; + titleBtnColor = titleBtn; + textColor = text; +} + +void setFrameSize (int size) +{ + frameSize = size; +} + +void setTitleSize (int size) +{ + titleSize = size; +} + +QColor getTitleColor () +{ + return titleColor; +} + +QColor getTitleBtnColor () +{ + return titleBtnColor; +} + +QColor getTextColor () +{ + return textColor; +} + +int getFrameSize () +{ + return frameSize; +} + +int getTitleSize () +{ + if (titleSize > frameSize) + return titleSize; + else + return frameSize; +} + +//-------------------------------------------------------------------------- +// Construction +//-------------------------------------------------------------------------- + +KMagSelRect::KMagSelRect(QWidget *parent) : + QRect() +{ + init(parent); +} + +KMagSelRect::KMagSelRect(const QPoint &topLeft, const QPoint &bottomRight, + QWidget *parent) : +QRect(topLeft, bottomRight) +{ + init(parent); +} + +KMagSelRect::KMagSelRect(const QPoint &topLeft, const QSize &size, + QWidget *parent) : +QRect(topLeft, size) +{ + init(parent); +} + +KMagSelRect::KMagSelRect(int left, int top, int width, int height, + QWidget *parent) : +QRect(left, top, width, height) +{ + init(parent); +} + +void KMagSelRect::init(QWidget *parent) +{ + // Make sure parent is the window itself, not a widget within the window + if (parent != 0) + while (parent->parentWidget (true) != 0) + parent=parent->parentWidget (true); + + selectionwindow = 0; + selWindowParent = parent; + + m_alwaysVisible = false; +} + +KMagSelRect::~KMagSelRect() +{ +} + +//-------------------------------------------------------------------------- +// +//-------------------------------------------------------------------------- + +WId KMagSelRect::winId() +{ + if (selectionwindow) + return selectionwindow->winId(); + else + return 0; +} + +bool KMagSelRect::visible() +{ + return (selectionwindow != 0); +} + +void KMagSelRect::alwaysVisible(bool visible) +{ + m_alwaysVisible = visible; +} + + +//-------------------------------------------------------------------------- +// Slots +//-------------------------------------------------------------------------- + +void KMagSelRect::show() +{ + if (selectionwindow == 0) { + selectionwindow = new KMagSelWin (selWindowParent, "selectionwindow"); + connect (selectionwindow, SIGNAL (resized ()), this, SLOT (selWinResized ())); + + update(); + selectionwindow->show(); + selWindowParent->setActiveWindow(); + } +} + +void KMagSelRect::hide() +{ + if(m_alwaysVisible) + return; + if (selectionwindow != 0) { + selectionwindow->hide(); + delete selectionwindow; + selectionwindow = 0; + } +} + +void KMagSelRect::update() +{ + // make sure the selection window does not go outside of the display + if (height() > QApplication::desktop()->geometry().height()) + setHeight (QApplication::desktop()->geometry().height()); + if (width() > QApplication::desktop()->geometry().width()) + setWidth (QApplication::desktop()->geometry().width()); + + if (top() < 0) + moveTop (0); + if (left() < 0) + moveLeft (0); + if (bottom() > QApplication::desktop()->geometry().bottom()) + moveBottom (QApplication::desktop()->geometry().bottom()); + if (right() > QApplication::desktop()->geometry().right()) + moveRight (QApplication::desktop()->geometry().right()); + + if (selectionwindow != 0) + selectionwindow->setSelRect (QRect (topLeft(), bottomRight())); +} + +void KMagSelRect::selWinResized() +{ + if (selectionwindow != 0) + { + QRect newRect = selectionwindow->getSelRect(); + setRect (newRect.x(), newRect.y(), newRect.width(), newRect.height()); + } +} + +//-------------------------------------------------------------------------- +// KMagSelWin +//-------------------------------------------------------------------------- + +KMagSelWin::KMagSelWin ( QWidget * parent, const char * name, WFlags ) : + QWidget (parent, name, WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop | WType_TopLevel | WX11BypassWM) +{ + QBitmap line (8, 8, line_bits, true); + setPaletteBackgroundPixmap (line); + setBackgroundOrigin (QWidget::WindowOrigin); + + titleBar = new KMagSelWinCorner (this, "titlebar"); + titleBar->setPaletteBackgroundColor (getTitleColor ()); + titleBar->setPaletteForegroundColor (getTextColor ()); + titleBar->setText(i18n("Selection Window")+" - "+i18n("KMagnifier")); + connect (titleBar, SIGNAL (startResizing ()), this, SLOT (startResizing ())); + connect (titleBar, SIGNAL (resized (QPoint)), this, SLOT (titleMoved (QPoint))); + + topLeftCorner = new KMagSelWinCorner (this, "topleft"); + topLeftCorner->setCursor (Qt::SizeFDiagCursor); + topLeftCorner->setPaletteBackgroundColor (getTitleBtnColor ()); + connect (topLeftCorner, SIGNAL (startResizing ()), this, SLOT (startResizing ())); + connect (topLeftCorner, SIGNAL (resized (QPoint)), this, SLOT (topLeftResized (QPoint))); + + topRightCorner = new KMagSelWinCorner (this, "topright"); + topRightCorner->setCursor (Qt::SizeBDiagCursor); + topRightCorner->setPaletteBackgroundColor (getTitleBtnColor ()); + connect (topRightCorner, SIGNAL (startResizing ()), this, SLOT (startResizing ())); + connect (topRightCorner, SIGNAL (resized (QPoint)), this, SLOT (topRightResized (QPoint))); + + bottomLeftCorner = new KMagSelWinCorner (this, "bottomleft"); + bottomLeftCorner->setCursor (Qt::SizeBDiagCursor); + bottomLeftCorner->setPaletteBackgroundColor (getTitleBtnColor ()); + connect (bottomLeftCorner, SIGNAL (startResizing ()), this, SLOT (startResizing ())); + connect (bottomLeftCorner, SIGNAL (resized (QPoint)), this, SLOT (bottomLeftResized (QPoint))); + + bottomRightCorner = new KMagSelWinCorner (this, "bottomright"); + bottomRightCorner->setCursor (Qt::SizeFDiagCursor); + bottomRightCorner->setPaletteBackgroundColor (getTitleBtnColor ()); + connect (bottomRightCorner, SIGNAL (startResizing ()), this, SLOT (startResizing ())); + connect (bottomRightCorner, SIGNAL (resized (QPoint)), this, SLOT (bottomRightResized (QPoint))); +} + +KMagSelWin::~KMagSelWin() +{ + delete titleBar; + delete topLeftCorner; + delete topRightCorner; + delete bottomLeftCorner; + delete bottomRightCorner; +} + +void KMagSelWin::setSelRect (QRect selRect) +{ + selRect = selRect.normalize(); + + if (selRect.left() < 0) + selRect.setLeft (0); + if (selRect.top() < 0) + selRect.setTop (0); + if (selRect.right() > QApplication::desktop()->width()) + selRect.setRight (QApplication::desktop()->width()); + if (selRect.bottom() > QApplication::desktop()->height()) + selRect.setBottom (QApplication::desktop()->height()); + + setGeometry ( + selRect.left() - getFrameSize(), + selRect.top() - getTitleSize() - 2, + selRect.width() + getFrameSize() + getFrameSize(), + selRect.height() + getFrameSize() + getTitleSize()+2); + + int w = getFrameSize(); + if (selRect.width() < w+w) + w = static_cast<int>(selRect.width()/2); + + int h = getFrameSize(); + if (selRect.height() < h+h) + h = static_cast<int>(selRect.height()/2); + + setMask (QRegion (QRect (0, 0, width(), height ())) + - QRegion (QRect (getFrameSize(), getTitleSize()+2, selRect.width(), selRect.height())) + - QRegion (QRect (0, 0, getFrameSize()+w, getTitleSize()+2-getFrameSize())) + - QRegion (QRect (width()-getFrameSize()-w, 0, getFrameSize()+w, getTitleSize()+2-getFrameSize())) + - QRegion (QRect (0, getTitleSize()+2+h, getFrameSize()-2, selRect.height()-h-h)) + - QRegion (QRect (width()-getFrameSize()+2, getTitleSize()+2+h, getFrameSize()-2, selRect.height()-h-h)) + - QRegion (QRect (getFrameSize()+w, height()-getFrameSize()+2, selRect.width()-w-w, getFrameSize()-2))); + + titleBar->setGeometry (getFrameSize()+w, 0, selRect.width()-h-h, getTitleSize()); + topLeftCorner->setGeometry (0, getTitleSize()+2-getFrameSize(), getFrameSize()+w, getFrameSize()+h); + topRightCorner->setGeometry (width()-getFrameSize()-w, getTitleSize()+2-getFrameSize(), getFrameSize()+w, getFrameSize()+h); + bottomLeftCorner->setGeometry (0, height()-getFrameSize()-h, getFrameSize()+w, getFrameSize()+h); + bottomRightCorner->setGeometry (width()-getFrameSize()-w, height()-getFrameSize()-h, getFrameSize()+w, getFrameSize()+h); +} + +QRect KMagSelWin::getSelRect () +{ + return QRect ( + x() + getFrameSize(), + y() + getTitleSize()+2, + width() - getFrameSize() - getFrameSize(), + height() - getFrameSize() - getTitleSize()-2); +} + +void KMagSelWin::startResizing () +{ + oldSelRect = getSelRect(); +} + +void KMagSelWin::titleMoved ( QPoint offset ) +{ + QRect selRect = oldSelRect; + selRect.moveBy (offset.x(), offset.y()); + setSelRect (selRect); + emit resized (); +} + +void KMagSelWin::topLeftResized ( QPoint offset ) +{ + setSelRect (QRect(oldSelRect.topLeft() + offset, oldSelRect.bottomRight ())); + emit resized(); +} + +void KMagSelWin::topRightResized ( QPoint offset ) +{ + setSelRect (QRect(oldSelRect.topRight() + offset, oldSelRect.bottomLeft ())); + emit resized(); +} + +void KMagSelWin::bottomLeftResized ( QPoint offset ) +{ + setSelRect (QRect(oldSelRect.bottomLeft() + offset, oldSelRect.topRight ())); + emit resized(); +} + +void KMagSelWin::bottomRightResized ( QPoint offset ) +{ + setSelRect (QRect(oldSelRect.bottomRight() + offset, oldSelRect.topLeft())); + emit resized(); +} + + +//-------------------------------------------------------------------------- +// KMagSelWinCorner +//-------------------------------------------------------------------------- + +KMagSelWinCorner::KMagSelWinCorner ( QWidget * parent, const char * name, WFlags f ) : + QLabel (parent, name, f) +{ + setFrameStyle (QFrame::WinPanel | QFrame::Raised); + setLineWidth (1); +} + +KMagSelWinCorner::~KMagSelWinCorner() +{ +} + +void KMagSelWinCorner::mousePressEvent ( QMouseEvent * e ) +{ + oldPos = e->globalPos (); + emit startResizing (); +} + +void KMagSelWinCorner::mouseReleaseEvent ( QMouseEvent * e ) +{ + setFrameShadow (QFrame::Raised); + emit resized (e->globalPos () - oldPos); +} + +void KMagSelWinCorner::mouseMoveEvent ( QMouseEvent * e ) +{ + emit resized (e->globalPos () - oldPos); +} |