make Badge geometry follow parent widget's geometry

This commit is contained in:
laserpants 2016-06-18 00:35:13 +03:00
parent 976472048a
commit 5d0f4fd535
5 changed files with 151 additions and 8 deletions

View File

@ -1,13 +1,17 @@
#include "badge.h" #include "badge.h"
#include <QPainter> #include <QPainter>
#include <QIcon> #include <QIcon>
#include <QEvent>
#include <QDebug>
#include "badge_p.h" #include "badge_p.h"
#include "lib/style.h" #include "lib/style.h"
BadgePrivate::BadgePrivate(Badge *q) BadgePrivate::BadgePrivate(Badge *q)
: q_ptr(q), : q_ptr(q),
padding(10), padding(10),
useThemeColors(true) useThemeColors(true),
x(0),
y(0)
{ {
} }
@ -92,10 +96,61 @@ QColor Badge::backgroundColor() const
} }
} }
void Badge::setRelativePosition(const QPointF &pos)
{
setRelativePosition(pos.x(), pos.y());
}
void Badge::setRelativePosition(qreal x, qreal y)
{
Q_D(Badge);
d->x = x;
d->y = y;
update();
}
QPointF Badge::relativePosition() const
{
Q_D(const Badge);
return QPointF(d->x, d->y);
}
void Badge::setRelativeXPosition(qreal x)
{
Q_D(Badge);
d->x = x;
update();
}
qreal Badge::relativeXPosition() const
{
Q_D(const Badge);
return d->x;
}
void Badge::setRelativeYPosition(qreal y)
{
Q_D(Badge);
d->y = y;
update();
}
qreal Badge::relativeYPosition() const
{
Q_D(const Badge);
return d->y;
}
QSize Badge::sizeHint() const QSize Badge::sizeHint() const
{ {
const int s = getDiameter(); const int s = getDiameter();
return QSize(s, s); return QSize(s+4, s+4);
} }
void Badge::setIcon(const QIcon &icon) void Badge::setIcon(const QIcon &icon)
@ -122,6 +177,51 @@ void Badge::setText(const QString &text)
update(); update();
} }
bool Badge::event(QEvent *event)
{
switch (event->type())
{
case QEvent::ParentChange:
{
if (!parent())
break;
parent()->installEventFilter(this);
QWidget *widget;
if ((widget = parentWidget())) {
setGeometry(widget->rect());
}
break;
}
case QEvent::ParentAboutToChange:
{
if (!parent())
break;
parent()->removeEventFilter(this);
break;
}
default:
break;
}
return QWidget::event(event);
}
bool Badge::eventFilter(QObject *obj, QEvent *event)
{
QEvent::Type type = event->type();
if (QEvent::Move == type || QEvent::Resize == type)
{
QWidget *widget;
if ((widget = parentWidget())) {
setGeometry(widget->rect());
}
}
return QWidget::eventFilter(obj, event);
}
void Badge::paintEvent(QPaintEvent *event) void Badge::paintEvent(QPaintEvent *event)
{ {
Q_UNUSED(event) Q_UNUSED(event)
@ -131,6 +231,8 @@ void Badge::paintEvent(QPaintEvent *event)
QPainter painter(this); QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
painter.translate(d->x, d->y);
QBrush brush; QBrush brush;
brush.setStyle(Qt::SolidPattern); brush.setStyle(Qt::SolidPattern);
brush.setColor(backgroundColor()); brush.setColor(backgroundColor());

View File

@ -11,6 +11,7 @@ class Badge : public QWidget
Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor)
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor)
Q_PROPERTY(QPointF relativePosition WRITE setRelativePosition READ relativePosition)
public: public:
explicit Badge(QWidget *parent = 0); explicit Badge(QWidget *parent = 0);
@ -25,12 +26,24 @@ public:
void setBackgroundColor(const QColor &color); void setBackgroundColor(const QColor &color);
QColor backgroundColor() const; QColor backgroundColor() const;
void setRelativePosition(const QPointF &pos);
void setRelativePosition(qreal x, qreal y);
QPointF relativePosition() const;
void setRelativeXPosition(qreal x);
qreal relativeXPosition() const;
void setRelativeYPosition(qreal y);
qreal relativeYPosition() const;
QSize sizeHint() const Q_DECL_OVERRIDE; QSize sizeHint() const Q_DECL_OVERRIDE;
void setIcon(const QIcon &icon); void setIcon(const QIcon &icon);
void setText(const QString &text); void setText(const QString &text);
protected: protected:
bool event(QEvent *event) Q_DECL_OVERRIDE;
bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
int getDiameter() const; int getDiameter() const;

View File

@ -24,6 +24,8 @@ public:
bool useThemeColors; bool useThemeColors;
QColor textColor; QColor textColor;
QColor backgroundColor; QColor backgroundColor;
qreal x;
qreal y;
}; };
#endif // BADGE_P_H #endif // BADGE_P_H

View File

@ -12,6 +12,8 @@ MenuItem::MenuItem(QWidget *parent)
font.setPointSize(11); font.setPointSize(11);
font.setStyleName("Regular"); font.setStyleName("Regular");
setFont(font); setFont(font);
setShowHalo(false);
} }
MenuItem::MenuItem(const QString &text, QWidget *parent) MenuItem::MenuItem(const QString &text, QWidget *parent)
@ -22,6 +24,8 @@ MenuItem::MenuItem(const QString &text, QWidget *parent)
font.setPointSize(11); font.setPointSize(11);
font.setStyleName("Regular"); font.setStyleName("Regular");
setFont(font); setFont(font);
setShowHalo(false);
} }
MenuItem::~MenuItem() MenuItem::~MenuItem()
@ -46,11 +50,11 @@ Menu::Menu(QWidget *parent)
policy.setVerticalPolicy(QSizePolicy::Maximum); policy.setVerticalPolicy(QSizePolicy::Maximum);
setSizePolicy(policy); setSizePolicy(policy);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect; //QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(9); //effect->setBlurRadius(9);
effect->setOffset(QPoint(0, 0)); //effect->setOffset(QPoint(0, 0));
effect->setColor(QColor(0, 0, 0, 100)); //effect->setColor(QColor(0, 0, 0, 100));
setGraphicsEffect(effect); //setGraphicsEffect(effect);
} }
Menu::~Menu() Menu::~Menu()
@ -71,7 +75,6 @@ void Menu::addMenuItem(const QString &text)
void Menu::paintEvent(QPaintEvent *event) void Menu::paintEvent(QPaintEvent *event)
{ {
QPainter painter(this); QPainter painter(this);
painter.fillRect(rect(), Qt::white); painter.fillRect(rect(), Qt::white);
QWidget::paintEvent(event); QWidget::paintEvent(event);

View File

@ -3,6 +3,7 @@
#include <QIcon> #include <QIcon>
#include "avatarexamples.h" #include "avatarexamples.h"
#include "components/avatar.h" #include "components/avatar.h"
#include "components/badge.h"
#include "exampleview.h" #include "exampleview.h"
#include "frame.h" #include "frame.h"
@ -27,6 +28,28 @@ AvatarExamples::AvatarExamples(QWidget *parent)
layout->addWidget(frame); layout->addWidget(frame);
} }
{
Avatar *avatar = new Avatar;
Badge *badge = new Badge;
badge->setText("5");
badge->setRelativePosition(13, 13);
avatar->setLetter(QChar('M'));
ExampleView *view = new ExampleView;
view->setWidget(avatar);
//view->setWidget(badge);
badge->setParent(avatar);
Frame *frame = new Frame;
frame->setCodeSnippet(
"hello"
);
frame->setWidget(view);
layout->addWidget(frame);
}
{ {
Avatar *avatar = new Avatar; Avatar *avatar = new Avatar;