41
43
#include <kapplication.h>
42
44
#include <kcomponentdata.h>
43
45
#include <kglobal.h>
46
#include <kglobalsettings.h>
44
47
#include <kiconeffect.h>
45
48
#include <kstandarddirs.h>
49
#include <kiconloader.h>
50
static QImage s_dpopupmenu_sidePixmap;
51
static QColor s_dpopupmenu_sidePixmapColor;
53
71
DPopupMenu::DPopupMenu(QWidget* parent)
72
: KMenu(parent), d(new DPopupMenuPriv)
56
// Must be initialized so that we know the size on first invocation
57
if (s_dpopupmenu_sidePixmap.isNull())
60
setContentsMargins(sidePixmapWidth(), 0, 0, 0);
74
d->fontAppName = KGlobalSettings::generalFont();
75
d->fontVersion = KGlobalSettings::generalFont();
77
d->fontAppName.setBold(true);
78
d->fontAppName.setPixelSize(13);
79
d->fontVersion.setBold(false);
80
d->fontVersion.setPixelSize(11);
82
// has to be an odd number to get the text centered
83
d->gradientWidth = d->fontAppName.pixelSize() + 2;
85
setContentsMargins(d->gradientWidth, 0, 0, 0);
63
88
DPopupMenu::~DPopupMenu()
67
int DPopupMenu::sidePixmapWidth() const
69
return s_dpopupmenu_sidePixmap.width();
72
void DPopupMenu::generateSidePixmap()
74
const QColor newColor = calcPixmapColor();
76
if (newColor != s_dpopupmenu_sidePixmapColor)
78
s_dpopupmenu_sidePixmapColor = newColor;
80
if (KGlobal::mainComponent().aboutData()->appName() == QString("digikam"))
81
s_dpopupmenu_sidePixmap.load(KStandardDirs::locate("data","digikam/data/menusidepix-digikam.png"));
83
s_dpopupmenu_sidePixmap.load(KStandardDirs::locate("data","showfoto/data/menusidepix-showfoto.png"));
85
KIconEffect::colorize(s_dpopupmenu_sidePixmap, newColor, 1.0);
89
QRect DPopupMenu::sideImageRect() const
93
void DPopupMenu::renderSidebarGradient(QPainter *p)
95
p->setRenderHint(QPainter::QPainter::TextAntialiasing);
91
98
int frameWidth = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this);
92
return QStyle::visualRect(layoutDirection(), rect(),
93
QRect(frameWidth, frameWidth,
94
s_dpopupmenu_sidePixmap.width(),
95
height() - 2*frameWidth));
99
QRect drawRect = QStyle::visualRect(layoutDirection(), rect(),
100
QRect(frameWidth, frameWidth,
101
d->gradientWidth, height() - 2*frameWidth));
102
p->setClipRect(drawRect);
104
// ----------------------------------------
107
QLinearGradient linearGrad;
108
linearGrad.setCoordinateMode(QGradient::ObjectBoundingMode);
109
linearGrad.setStart(0.0, 0.0);
110
linearGrad.setFinalStop(0.0, 1.0);
111
linearGrad.setColorAt(0, QColor(255, 255, 255, 25));
112
linearGrad.setColorAt(1, QColor(98, 98, 98));
114
// FIXME: this doesn't seem to work in 0.10.x versions, so I disable it for now
115
// linearGrad.setColorAt(1, calcPixmapColor());
117
p->fillRect(drawRect, QBrush(linearGrad));
119
// ----------------------------------------
122
p->translate(drawRect.bottomLeft());
125
// ----------------------------------------
127
const int spacing = 8;
128
const int margin = 4;
131
QFontMetrics fontMt(d->fontAppName);
132
QFontMetrics fontMt2(d->fontVersion);
134
if (KGlobal::mainComponent().aboutData()->appName() == QString("digikam"))
136
appIcon = SmallIcon("digikam", d->fontAppName.pixelSize());
137
appName = QString("digiKam");
141
appIcon = SmallIcon("showfoto", d->fontAppName.pixelSize());
142
appName = QString("showFoto");
145
QRect fontRect = QRect(appIcon.width() + spacing, 1, fontMt.width(appName), drawRect.width());
146
int shift = fontMt.ascent() - fontMt2.ascent();
148
// ----------------------------------------
149
// draw application icon.
151
p->drawPixmap(margin, 1, appIcon);
153
// ----------------------------------------
156
p->setFont(d->fontAppName);
157
p->drawText(fontRect, Qt::AlignLeft|Qt::AlignVCenter, appName);
159
// ----------------------------------------
160
// draw version string.
162
fontRect.moveLeft(fontRect.right() + spacing);
163
fontRect.setY(shift);
164
p->setFont(d->fontVersion);
165
p->drawText(fontRect, Qt::AlignLeft|Qt::AlignVCenter, QString(digikam_version_short));
98
168
QColor DPopupMenu::calcPixmapColor()
137
void DPopupMenu::setMinimumSize(const QSize & s)
207
void DPopupMenu::setMinimumSize(const QSize& s)
139
KMenu::setMinimumSize(s.width() + s_dpopupmenu_sidePixmap.width(), s.height());
209
KMenu::setMinimumSize(s.width() + d->gradientWidth, s.height());
142
void DPopupMenu::setMaximumSize(const QSize & s)
212
void DPopupMenu::setMaximumSize(const QSize& s)
144
KMenu::setMaximumSize(s.width() + s_dpopupmenu_sidePixmap.width(), s.height());
214
KMenu::setMaximumSize(s.width() + d->gradientWidth, s.height());
147
217
void DPopupMenu::setMinimumSize(int w, int h)
149
KMenu::setMinimumSize(w + s_dpopupmenu_sidePixmap.width(), h);
219
KMenu::setMinimumSize(w + d->gradientWidth, h);
152
222
void DPopupMenu::setMaximumSize(int w, int h)
154
KMenu::setMaximumSize(w + s_dpopupmenu_sidePixmap.width(), h);
224
KMenu::setMaximumSize(w + d->gradientWidth, h);
157
227
void DPopupMenu::paintEvent(QPaintEvent* e)