summaryrefslogtreecommitdiffstats
path: root/katapult/common/imagedisplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'katapult/common/imagedisplay.cpp')
-rw-r--r--katapult/common/imagedisplay.cpp453
1 files changed, 453 insertions, 0 deletions
diff --git a/katapult/common/imagedisplay.cpp b/katapult/common/imagedisplay.cpp
new file mode 100644
index 0000000..7832198
--- /dev/null
+++ b/katapult/common/imagedisplay.cpp
@@ -0,0 +1,453 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joe Ferris *
+ * jferris@optimistictech.com *
+ * *
+ * 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <imagedisplay.moc>
+
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <kwin.h>
+#include <kimageeffect.h>
+#include <kgenericfactory.h>
+#include <kconfig.h>
+#include <kfontcombo.h>
+#include <klocale.h>
+
+#include <qpainter.h>
+#include <qapplication.h>
+#include <qimage.h>
+#include <qbitmap.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qcursor.h>
+
+#include <status.h>
+
+#include "imagedisplay.h"
+#include "imagedisplaysettings.h"
+
+#define FADEINTERVAL 20
+#define FADECONST 2000
+
+ImageDisplay::ImageDisplay(QObject *, const char *name, const QStringList&)
+ : KatapultDisplay(name, WType_TopLevel | WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop | WNoAutoErase | WDestructiveClose)
+{
+ KWin::setType(winId(), NET::Dock);
+ setBackgroundMode(NoBackground);
+ setFocusPolicy(QWidget::StrongFocus);
+
+ singlebg = 0;
+ doublebg = 0;
+
+ singlesize[0] = 0;
+ singlesize[1] = 0;
+ doublesize[0] = 0;
+ doublesize[1] = 0;
+ padding = 0;
+ margin[0] = 0;
+ margin[1] = 0;
+ margin[2] = 0;
+ margin[3] = 0;
+ iconsize = 0;
+
+ bgSngl = 0;
+ bgDbl = 0;
+
+ fadeImg = 0;
+
+ alpha = 0;
+ fadeTimer = new QTimer(this);
+ connect(fadeTimer, SIGNAL(timeout()), this, SLOT(continueFade()));
+
+ desktopSize = qApp->desktop()->availableGeometry(QCursor::pos());
+
+ fadeTime = 250;
+ updateFadeStep();
+}
+
+ImageDisplay::~ImageDisplay()
+{
+ if(singlebg != 0)
+ delete singlebg;
+ if(doublebg != 0)
+ delete doublebg;
+ if(bgSngl != 0)
+ delete bgSngl;
+ if(bgDbl != 0)
+ delete bgDbl;
+ if(fadeImg != 0)
+ delete fadeImg;
+}
+
+void ImageDisplay::continueFade()
+{
+ if(fadeOut)
+ {
+ if(fadeStep == 0)
+ alpha = 0;
+ else
+ alpha -= fadeStep;
+ if(alpha <= 0)
+ {
+ alpha = 0;
+ fadeTimer->stop();
+ hide();
+ }
+ } else {
+ if(fadeStep == 0)
+ alpha = 100;
+ else
+ alpha += fadeStep;
+ if(alpha > 100)
+ {
+ alpha = 100;
+ fadeTimer->stop();
+ if(fadeImg != 0)
+ {
+ delete fadeImg;
+ fadeImg = 0;
+ }
+ }
+ }
+ update();
+}
+
+void ImageDisplay::showEvent(QShowEvent *)
+{
+ // set back the display-size, because if it wouldn't be done this could be a problem-source.
+ displaySize = 0;
+
+ if(bgSngl != 0)
+ delete bgSngl;
+ if(bgDbl != 0)
+ delete bgDbl;
+
+ bgSngl = new QPixmap(QPixmap::grabWindow(qt_xrootwin(), (desktopSize.width() - singlesize[0])/2 + desktopSize.left(), (desktopSize.height() - singlesize[1])/2 + desktopSize.top(), singlesize[0], singlesize[1]));
+ bgDbl = new QPixmap(QPixmap::grabWindow(qt_xrootwin(), (desktopSize.width() - doublesize[0])/2 + desktopSize.left(), (desktopSize.height() - doublesize[1])/2 + desktopSize.top(), doublesize[0], doublesize[1]));
+
+ if(fadeImg != 0)
+ delete fadeImg;
+
+ if(fadeTime <= 1) {
+ alpha = 100;
+ placeWindow(1);
+ } else {
+ fadeOut = false;
+ alpha = 0;
+ fadeImg = new QImage(getDisplay().convertToImage());
+ fadeTimer->start(FADEINTERVAL, FALSE);
+ }
+}
+
+void ImageDisplay::hide()
+{
+ if(alpha == 0)
+ {
+ if(fadeImg != 0)
+ {
+ delete fadeImg;
+ fadeImg = 0;
+ }
+ KatapultDisplay::hide();
+ } else {
+ if(fadeImg != 0)
+ delete fadeImg;
+ fadeImg = new QImage(getDisplay().convertToImage());
+ fadeOut = TRUE;
+ if(!fadeTimer->isActive())
+ fadeTimer->start(FADEINTERVAL, FALSE);
+ }
+}
+
+void ImageDisplay::drawText(QPixmap & pixmap, int x, int width, QString text, int hilight) const
+{
+ int fontSize = maxFontSize;
+ QFont font(fontFace, fontSize);
+ QFontMetrics metrics(font);
+
+ while(fontSize > minFontSize && metrics.width(text) > width) {
+ fontSize--;
+ font.setPointSize(fontSize);
+ metrics = QFontMetrics(font);
+ }
+
+ while(hilight > 1 && metrics.width(text) > width) {
+ text = text.remove(0, 1);
+ hilight--;
+ }
+
+ int useChars = text.length();
+
+ while(metrics.width(text, useChars) > width) {
+ useChars--;
+ }
+ text = text.left(useChars);
+
+ QString hilighted = text.left(hilight);
+ QString remaining = text.right(text.length() - hilighted.length());
+
+ x += (width-metrics.width(text))/2;
+
+ QPainter painter(&pixmap);
+ painter.setFont(font);
+
+ painter.setPen(colorGroup().color(QColorGroup::Link));
+ painter.drawText(x, singlesize[1]-offset[3], hilighted);
+ painter.setPen(QColor(255, 255, 255));
+ painter.drawText(x+metrics.width(hilighted), singlesize[1]-offset[3], remaining);
+}
+
+QPixmap ImageDisplay::getDisplay()
+{
+ if(status() & S_HasResults)
+ {
+ // show best match
+ QPixmap pixmap(*bgDbl);
+ QPainter painter(&pixmap);
+
+ painter.drawPixmap(0, 0, *doublebg);
+
+ QFontMetrics metrics = painter.fontMetrics();
+ QRect bounds;
+ QPixmap icon;
+
+ int itemSpace = (doublesize[0]-offset[0]-offset[2]-padding)/2;
+
+ const KatapultItem *_item = item();
+ if(_item != 0)
+ {
+ icon = _item->icon(iconsize);
+ painter.drawPixmap(offset[0]+(itemSpace-iconsize)/2, offset[1], icon);
+ drawText(pixmap, offset[0], itemSpace, _item->text(), selected());
+ }
+
+ const KatapultAction *_action = action();
+ if(_action != 0)
+ {
+ int x = offset[0]+itemSpace+padding+padding;
+ icon = _action->icon(iconsize);
+ painter.drawPixmap(x+(itemSpace-iconsize)/2, offset[1], icon);
+ drawText(pixmap, x, itemSpace, _action->text(), 0);
+ }
+ painter.end();
+
+ if(displaySize != 2)
+ {
+ placeWindow(2);
+ displaySize = 2;
+ }
+
+ return pixmap;
+ } else {
+ // show splash or error
+ QPixmap pixmap(*bgSngl);
+ QPainter painter(&pixmap);
+
+ painter.drawPixmap(0, 0, *singlebg);
+
+ QString label;
+ QPixmap icon;
+
+ if(status() & S_Active)
+ {
+ icon = KGlobal::iconLoader()->loadIcon("unknown", KIcon::NoGroup, 128);
+ if(query().isEmpty())
+ label = i18n("No items matched.");
+ else
+ label = query();
+ } else {
+ icon = KGlobal::iconLoader()->loadIcon("katapult", KIcon::NoGroup, 128);
+ if(query().isEmpty())
+ label = "Katapult";
+ else {
+ label = query();
+ painter.setPen(QColor(16, 48, 254));
+ }
+ }
+
+ painter.drawPixmap(offset[0]+(singlesize[0]-offset[0]-offset[2]-128)/2, offset[1], icon);
+
+ drawText(pixmap, offset[0], singlesize[0]-offset[0]-offset[2], label, 0);
+
+/* painter.drawText(offset[0], singlesize[1]-offset[3]-30, singlesize[0]-offset[0]-offset[2], 30,
+ Qt::AlignHCenter | Qt::AlignBottom | Qt::SingleLine, label);*/
+ painter.end();
+
+ if(displaySize != 1)
+ {
+ placeWindow(1);
+ displaySize = 1;
+ }
+
+ return pixmap;
+ }
+}
+
+void ImageDisplay::placeWindow(int size)
+{
+ if(size == 2) {
+ move((desktopSize.width() - doublesize[0])/2 + desktopSize.left(), (desktopSize.height() - doublesize[1])/2 + desktopSize.top());
+ resize(doublesize[0], doublesize[1]);
+ } else {
+ move((desktopSize.width() - singlesize[0])/2 + desktopSize.left(), (desktopSize.height() - singlesize[1])/2 + desktopSize.top());
+ resize(singlesize[0], singlesize[1]);
+ }
+}
+
+void ImageDisplay::paintEvent(QPaintEvent *)
+{
+ if(alpha == 0)
+ {
+ if(displaySize == 2)
+ bitBlt(this, 0, 0, bgDbl);
+ else
+ bitBlt(this, 0, 0, bgSngl);
+ } else if(fadeImg != 0) {
+ QImage buffer;
+ if(displaySize == 2)
+ buffer = bgDbl->convertToImage();
+ else
+ buffer = bgSngl->convertToImage();
+
+ KImageEffect::blend(*fadeImg, buffer, (float)alpha/100);
+ bitBlt(this, 0, 0, &buffer);
+ } else {
+ QPixmap pixmap = getDisplay();
+ bitBlt(this, 0, 0, &pixmap);
+ }
+}
+
+void ImageDisplay::setSingleBG(QPixmap *singlebg)
+{
+ this->singlebg = singlebg;
+}
+
+void ImageDisplay::setDoubleBG(QPixmap *doublebg)
+{
+ this->doublebg = doublebg;
+}
+
+void ImageDisplay::setSingleSize(int width, int height)
+{
+ singlesize[0] = width;
+ singlesize[1] = height;
+}
+
+void ImageDisplay::setDoubleSize(int width, int height)
+{
+ doublesize[0] = width;
+ doublesize[1] = height;
+}
+
+void ImageDisplay::setMargin(int left, int top, int right, int bottom)
+{
+ margin[0] = left;
+ margin[1] = top;
+ margin[2] = right;
+ margin[3] = bottom;
+ updateOffset();
+}
+
+void ImageDisplay::setPadding(int padding)
+{
+ this->padding = padding;
+ updateOffset();
+}
+
+void ImageDisplay::setIconSize(int iconsize)
+{
+ this->iconsize = iconsize;
+}
+
+void ImageDisplay::updateOffset()
+{
+ offset[0] = margin[0] + padding;
+ offset[1] = margin[1] + padding;
+ offset[2] = margin[2] + padding;
+ offset[3] = margin[3] + padding;
+}
+
+void ImageDisplay::readSettings(KConfigBase *config)
+{
+ fadeTime = config->readUnsignedNumEntry("FadeTime", 250);
+ updateFadeStep();
+// fadeStep = fadeTime/FADEINTERVAL;
+ QFont defaultFont = KGlobalSettings::generalFont();
+ fontFace = config->readEntry("FontFace", defaultFont.family());
+ minFontSize = config->readUnsignedNumEntry("MinFontSize", 7);
+ maxFontSize = config->readUnsignedNumEntry("MaxFontSize", 14);
+}
+
+void ImageDisplay::writeSettings(KConfigBase *config)
+{
+ config->writeEntry("FadeTime", fadeTime);
+ config->writeEntry("FontFace", fontFace);
+ config->writeEntry("MinFontSize", minFontSize);
+ config->writeEntry("MaxFontSize", maxFontSize);
+}
+
+QWidget * ImageDisplay::configure()
+{
+ ImageDisplaySettings *settings = new ImageDisplaySettings();
+
+ settings->fadeTime->setValue(fadeTime);
+ connect(settings->fadeTime, SIGNAL(valueChanged(int)), this, SLOT(setFadeOut(int)));
+
+ settings->displayFont->setCurrentFont(fontFace);
+ connect(settings->displayFont, SIGNAL(textChanged(const QString &)), this, SLOT(setFont(const QString &)));
+
+ settings->minFontSize->setValue(minFontSize);
+ connect(settings->minFontSize, SIGNAL(valueChanged(int)), this, SLOT(setMinFontSize(int)));
+
+ settings->maxFontSize->setValue(maxFontSize);
+ connect(settings->maxFontSize, SIGNAL(valueChanged(int)), this, SLOT(setMaxFontSize(int)));
+
+ return settings;
+}
+
+void ImageDisplay::setFont(const QString &font)
+{
+ fontFace = font;
+}
+
+void ImageDisplay::setMinFontSize(int size)
+{
+ minFontSize = size;
+}
+
+void ImageDisplay::setMaxFontSize(int size)
+{
+ maxFontSize = size;
+}
+
+void ImageDisplay::setFadeOut(int fadeTime)
+{
+ this->fadeTime = fadeTime;
+ updateFadeStep();
+}
+
+void ImageDisplay::updateFadeStep()
+{
+ if(fadeTime == 0)
+ fadeTime = 1;
+ fadeStep = FADECONST/fadeTime;
+ if(fadeStep > 100)
+ fadeStep = 100;
+}