You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
6.7 KiB
292 lines
6.7 KiB
14 years ago
|
|
||
|
#include <QtGui>
|
||
|
#include <QPainterPath>
|
||
|
|
||
|
#include "UBFloatingPalette.h"
|
||
|
|
||
|
#include "frameworks/UBPlatformUtils.h"
|
||
|
|
||
|
#include "core/UBSettings.h"
|
||
|
|
||
|
|
||
|
UBFloatingPalette::UBFloatingPalette(Qt::Corner position, QWidget *parent)
|
||
|
: QWidget(parent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint)
|
||
|
, mIsMoving(false)
|
||
|
, mCustomPosition(false)
|
||
|
, mCanBeMinimized(false)
|
||
|
, mMinimizedLocation(eMinimizedLocation_None)
|
||
|
, mDefaultPosition(position)
|
||
|
{
|
||
|
setCursor(Qt::ArrowCursor);
|
||
|
|
||
|
if (parent)
|
||
|
{
|
||
|
setAttribute(Qt::WA_NoMousePropagation);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// standalone window
|
||
|
setAttribute(Qt::WA_TranslucentBackground);
|
||
|
UBPlatformUtils::disableShadow(this);
|
||
|
}
|
||
|
|
||
|
mBackgroundBrush = QBrush(UBSettings::paletteColor);
|
||
|
mbGrip = true;
|
||
|
}
|
||
|
|
||
|
|
||
|
void UBFloatingPalette::setBackgroundBrush(const QBrush& brush)
|
||
|
{
|
||
|
if (mBackgroundBrush != brush)
|
||
|
{
|
||
|
mBackgroundBrush = brush;
|
||
|
update();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void UBFloatingPalette::setCustomPosition(bool pFlag)
|
||
|
{
|
||
|
mCustomPosition = pFlag;
|
||
|
|
||
|
if (pFlag)
|
||
|
removeAllAssociatedPalette();
|
||
|
|
||
|
}
|
||
|
|
||
|
int UBFloatingPalette::radius()
|
||
|
{
|
||
|
return 10;
|
||
|
}
|
||
|
|
||
|
|
||
|
int UBFloatingPalette::border()
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void UBFloatingPalette::enterEvent(QEvent *event)
|
||
|
{
|
||
|
Q_UNUSED(event);
|
||
|
emit mouseEntered();
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::mousePressEvent(QMouseEvent *event)
|
||
|
{
|
||
|
if (event->button() == Qt::LeftButton)
|
||
|
{
|
||
|
mIsMoving = true;
|
||
|
mDragPosition = event->globalPos() - frameGeometry().topLeft();
|
||
|
event->accept();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
QWidget::mousePressEvent(event);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::mouseMoveEvent(QMouseEvent *event)
|
||
|
{
|
||
|
if (mIsMoving)
|
||
|
{
|
||
|
moveInsideParent(event->globalPos() - mDragPosition);
|
||
|
event->accept();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
QWidget::mouseMoveEvent(event);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::mouseReleaseEvent(QMouseEvent *event)
|
||
|
{
|
||
|
if (mIsMoving)
|
||
|
{
|
||
|
mIsMoving = false;
|
||
|
setCustomPosition(true);
|
||
|
event->accept();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
QWidget::mouseReleaseEvent(event);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::moveInsideParent(const QPoint &position)
|
||
|
{
|
||
|
QWidget *parent = parentWidget();
|
||
|
|
||
|
if (parent)
|
||
|
{
|
||
|
int margin = UBSettings::boardMargin - border();
|
||
|
qreal newX = qMax(margin, qMin(parent->width() - width() - margin, position.x()));
|
||
|
qreal newY = qMax(margin, qMin(parent->height() - height() - margin, position.y()));
|
||
|
|
||
|
if (!mCustomPosition && !mIsMoving)
|
||
|
{
|
||
|
if (mDefaultPosition == Qt::TopLeftCorner || mDefaultPosition == Qt::BottomLeftCorner)
|
||
|
{
|
||
|
newX = margin;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
newX = qMax(margin, parent->width() - width() - margin);
|
||
|
}
|
||
|
}
|
||
|
move(newX, newY);
|
||
|
minimizePalette(QPoint(newX, newY));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
move(position);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::addAssociatedPalette(UBFloatingPalette* pOtherPalette)
|
||
|
{
|
||
|
mAssociatedPalette.append(pOtherPalette);
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::removeAssociatedPalette(UBFloatingPalette* pOtherPalette)
|
||
|
{
|
||
|
mAssociatedPalette.removeOne(pOtherPalette);
|
||
|
}
|
||
|
|
||
|
QSize UBFloatingPalette::preferredSize()
|
||
|
{
|
||
|
QSize palettePreferredSize = sizeHint();
|
||
|
|
||
|
if (palettePreferredSize.width() == 0)
|
||
|
{
|
||
|
palettePreferredSize = childrenRect().size();
|
||
|
}
|
||
|
|
||
|
return palettePreferredSize;
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::adjustSizeAndPosition(bool pUp)
|
||
|
{
|
||
|
QSize newPreferredSize = preferredSize();
|
||
|
|
||
|
foreach (UBFloatingPalette* palette, mAssociatedPalette)
|
||
|
{
|
||
|
QSize palettePreferredSize = palette->preferredSize();
|
||
|
newPreferredSize.setWidth(newPreferredSize.expandedTo(palettePreferredSize).width());
|
||
|
}
|
||
|
QSize previousSize = size();
|
||
|
int biggerHeight = preferredSize().height() - previousSize.height();
|
||
|
if ((pUp && (biggerHeight > 0))
|
||
|
|| (!pUp && (biggerHeight < 0)))
|
||
|
{
|
||
|
move(pos().x(), pos().y() - biggerHeight);
|
||
|
}
|
||
|
|
||
|
if (newPreferredSize != size())
|
||
|
{
|
||
|
resize(newPreferredSize);
|
||
|
moveInsideParent(pos());
|
||
|
foreach(UBFloatingPalette* palette, mAssociatedPalette)
|
||
|
{
|
||
|
palette->move(pos().x(), palette->pos().y());
|
||
|
palette->resize(newPreferredSize.width(), palette->size().height());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::removeAllAssociatedPalette()
|
||
|
{
|
||
|
foreach (UBFloatingPalette* palette, mAssociatedPalette)
|
||
|
{
|
||
|
palette->removeAssociatedPalette(this);
|
||
|
removeAssociatedPalette(palette);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::showEvent(QShowEvent *)
|
||
|
{
|
||
|
moveInsideParent(pos());
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::paintEvent(QPaintEvent *)
|
||
|
{
|
||
|
QPainter painter(this);
|
||
|
painter.setRenderHint(QPainter::Antialiasing);
|
||
|
painter.setPen(Qt::NoPen);
|
||
|
painter.setBrush(mBackgroundBrush);
|
||
|
|
||
|
if(mbGrip)
|
||
|
{
|
||
|
painter.setBrush(QBrush(QColor(170, 170 ,170)));
|
||
|
QPainterPath borderPath;
|
||
|
borderPath.addRoundedRect(0, 0, width(), height(), radius(), radius());
|
||
|
borderPath.addRoundedRect(border(), border(), width() - 2 * border(), height() - 2 * border(), radius(), radius());
|
||
|
painter.drawPath(borderPath);
|
||
|
painter.setBrush(mBackgroundBrush);
|
||
|
painter.drawRoundedRect(border(), border(), width() - 2 * border(), height() - 2 * border(), radius(), radius());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
painter.drawRoundedRect(border(), border(), width() - 2 * border(), height() - 2 * border(), radius(), radius());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int UBFloatingPalette::gripSize()
|
||
|
{
|
||
|
return 5;
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::minimizePalette(const QPoint& pos)
|
||
|
{
|
||
|
if(!mCanBeMinimized)
|
||
|
{
|
||
|
// If this floating palette cannot be minimized, we exit this method.
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
QSize parentSize = parentWidget()->size();
|
||
|
if(mMinimizedLocation == eMinimizedLocation_None)
|
||
|
{
|
||
|
// Verify if we have to minimize this palette
|
||
|
if(pos.x() == 5)
|
||
|
{
|
||
|
mMinimizedLocation = eMinimizedLocation_Left;
|
||
|
}
|
||
|
// else if(pos.y() == 5)
|
||
|
// {
|
||
|
// mMinimizedLocation = eMinimizedLocation_Top;
|
||
|
// }
|
||
|
else if(pos.x() == parentSize.width() - width() - 5)
|
||
|
{
|
||
|
mMinimizedLocation = eMinimizedLocation_Right;
|
||
|
}
|
||
|
// else if(pos.y() == parentSize.height() - height() - 5)
|
||
|
// {
|
||
|
// mMinimizedLocation = eMinimizedLocation_Bottom;
|
||
|
// }
|
||
|
|
||
|
// Minimize the Palette
|
||
|
if(mMinimizedLocation != eMinimizedLocation_None)
|
||
|
{
|
||
|
emit minimizeStart(mMinimizedLocation);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Restore the palette
|
||
|
if(pos.x() > 5 &&
|
||
|
pos.y() > 5 &&
|
||
|
pos.x() < parentSize.width() - width() - 5 &&
|
||
|
pos.y() < parentSize.height() - height() - 5)
|
||
|
{
|
||
|
mMinimizedLocation = eMinimizedLocation_None;
|
||
|
emit maximizeStart();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void UBFloatingPalette::setMinimizePermission(bool permission)
|
||
|
{
|
||
|
mCanBeMinimized = permission;
|
||
|
}
|