summaryrefslogtreecommitdiffstats
path: root/twin-styles/glow/glowbutton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'twin-styles/glow/glowbutton.cpp')
-rw-r--r--twin-styles/glow/glowbutton.cpp339
1 files changed, 339 insertions, 0 deletions
diff --git a/twin-styles/glow/glowbutton.cpp b/twin-styles/glow/glowbutton.cpp
new file mode 100644
index 00000000..87079c2e
--- /dev/null
+++ b/twin-styles/glow/glowbutton.cpp
@@ -0,0 +1,339 @@
+/***************************************************************************
+ glowbutton.cpp - description
+ -------------------
+ begin : Thu Sep 6 2001
+ copyright : (C) 2001 by Henning Burchardt
+ email : h_burchardt@gmx.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 <math.h>
+#include <iostream>
+#include <vector>
+#include <tqmap.h>
+#include <tqpixmap.h>
+#include <tqpixmapcache.h>
+#include <tqbitmap.h>
+#include <tqpainter.h>
+#include <tqimage.h>
+#include <tqtimer.h>
+#include <tqtooltip.h>
+#include <kdecoration.h>
+#include <kiconeffect.h>
+#include "glowbutton.h"
+
+namespace Glow
+{
+
+//-----------------------------------------------------------------------------
+// PixmapCache
+//-----------------------------------------------------------------------------
+
+TQMap<TQString, const TQPixmap*> PixmapCache::m_pixmapMap;
+
+const TQPixmap* PixmapCache::find(const TQString& key)
+{
+ TQMap<TQString, const TQPixmap*>::const_iterator it =
+ m_pixmapMap.find(key);
+ if( it != m_pixmapMap.end() )
+ return *it;
+ else
+ return 0;
+}
+
+void PixmapCache::insert(const TQString& key, const TQPixmap *pixmap)
+{
+ m_pixmapMap[key] = pixmap;
+}
+
+void PixmapCache::erase(const TQString& key)
+{
+ TQMap<TQString, const TQPixmap*>::iterator it =
+ m_pixmapMap.find(key);
+ if (it != m_pixmapMap.end())
+ {
+ delete *it;
+ m_pixmapMap.erase(it);
+ }
+}
+
+void PixmapCache::clear()
+{
+ // delete all pixmaps in the cache
+ TQMap<TQString, const TQPixmap*>::const_iterator it
+ = m_pixmapMap.begin();
+ for(; it != m_pixmapMap.end(); ++it)
+ delete *it;
+ m_pixmapMap.clear();
+}
+
+//-----------------------------------------------------------------------------
+// GlowButton
+//-----------------------------------------------------------------------------
+
+GlowButton::GlowButton(TQWidget *parent, const char *name,
+ const TQString& tip, const int realizeBtns)
+ : TQButton(parent, name)
+{
+ m_realizeButtons = realizeBtns;
+
+ _steps = 0;
+ m_updateTime = 50;
+ m_pixmapName = TQString();
+
+ m_timer = new TQTimer(this);
+ connect(m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotTimeout()));
+ m_pos = 0;
+ m_timertqStatus = Stop;
+
+ setTipText (tip);
+ setCursor(arrowCursor);
+}
+
+GlowButton::~GlowButton()
+{
+}
+
+void GlowButton::setTipText( const TQString& tip )
+{
+ if (KDecoration::options()->showTooltips())
+ {
+ TQToolTip::remove( this );
+ TQToolTip::add( this, tip );
+ }
+}
+
+TQString GlowButton::getPixmapName() const
+{
+ return m_pixmapName;
+}
+
+TQt::ButtonState GlowButton::lastButton() const
+{
+ return _last_button;
+}
+
+void GlowButton::setPixmapName(const TQString& pixmapName)
+{
+ m_pixmapName = pixmapName;
+
+ const TQPixmap *pixmap = PixmapCache::find(pixmapName);
+ if( ! pixmap )
+ return;
+
+ // set steps
+ _steps = pixmap->height()/pixmap->width() - 1;
+
+ tqrepaint(false);
+}
+
+void GlowButton::paintEvent( TQPaintEvent *e )
+{
+ TQWidget::paintEvent(e);
+ const TQPixmap *pixmap = PixmapCache::find(m_pixmapName);
+ if( pixmap != 0 )
+ {
+ int pos = m_pos>=0?m_pos:-m_pos;
+ TQPainter p;
+ TQPixmap pm (pixmap->size());
+ p.begin(&pm);
+ const TQPixmap * bg_pixmap = PixmapCache::find(
+ TQString::number(parentWidget()->winId()));
+ p.drawPixmap (0, 0, *bg_pixmap, x(), y(), width(), height());
+ p.drawPixmap (0, 0, *pixmap, 0, pos*height(), width(), height());
+ p.end();
+ p.begin(this);
+ p.drawPixmap (0, 0, pm);
+ p.end();
+ }
+}
+
+void GlowButton::enterEvent( TQEvent *e )
+{
+ if( m_pos<0 )
+ m_pos=-m_pos;
+ m_timertqStatus = Run;
+ if( ! m_timer->isActive() )
+ m_timer->start(m_updateTime);
+ TQButton::enterEvent(e);
+}
+
+void GlowButton::leaveEvent( TQEvent *e )
+{
+ m_timertqStatus = Stop;
+ if( ! m_timer->isActive() )
+ m_timer->start(m_updateTime);
+ TQButton::leaveEvent(e);
+}
+
+void GlowButton::mousePressEvent( TQMouseEvent *e )
+{
+ _last_button = e->button();
+ if( m_timer->isActive() )
+ m_timer->stop();
+ m_pos = _steps;
+ tqrepaint(false);
+ // without pretending LeftButton, clicking on the button with MidButton
+ // or RightButton would cause unwanted titlebar action
+ TQMouseEvent me (e->type(), e->pos(), e->globalPos(),
+ (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state());
+ TQButton::mousePressEvent(&me);
+}
+
+void GlowButton::mouseReleaseEvent( TQMouseEvent *e )
+{
+ _last_button = e->button();
+ TQPoint p = mapToParent(mapFromGlobal(e->globalPos()));
+ if( ! m_timer->isActive() ) {
+ m_timer->start(m_updateTime);
+ }
+ if( ! tqgeometry().contains(p) ) {
+ m_timertqStatus = Stop;
+ }
+ TQMouseEvent me (e->type(), e->pos(), e->globalPos(),
+ (e->button()&m_realizeButtons)?Qt::LeftButton:Qt::NoButton, e->state());
+ TQButton::mouseReleaseEvent(&me);
+}
+
+void GlowButton::slotTimeout()
+{
+ tqrepaint(false);
+
+ if( m_pos>=_steps-1 ) {
+ m_pos = -m_pos;
+ }
+ if( m_timertqStatus==Stop ) {
+ if( m_pos==0 ) {
+ m_timer->stop();
+ return;
+ } else if( m_pos>0 ) {
+ m_pos = -m_pos;
+ }
+ }
+
+ m_pos++;
+}
+
+//-----------------------------------------------------------------------------
+// GlowButtonFactory
+//-----------------------------------------------------------------------------
+
+GlowButtonFactory::GlowButtonFactory()
+{
+ _steps = 20;
+}
+
+int GlowButtonFactory::getSteps()
+{
+ return _steps;
+}
+
+void GlowButtonFactory::setSteps(int steps)
+{
+ _steps = steps;
+}
+
+TQPixmap * GlowButtonFactory::createGlowButtonPixmap(
+ const TQImage & bg_image,
+ const TQImage & fg_image,
+ const TQImage & glow_image,
+ const TQColor & color,
+ const TQColor & glow_color)
+{
+ if (bg_image.size() != fg_image.size()
+ || fg_image.size() != glow_image.size()) {
+ std::cerr << "Image size error" << std::endl;
+ return new TQPixmap();
+ }
+
+ TQImage colorized_bg_image = bg_image.copy();
+ KIconEffect::colorize (colorized_bg_image, color, 1.0);
+
+ int w = colorized_bg_image.width();
+ int h = colorized_bg_image.height();
+
+ TQImage image (w, (_steps+1)*h, 32);
+ image.setAlphaBuffer (true);
+ for (int i=0; i<_steps+1; ++i) {
+ for (int y=0; y<h; ++y) {
+ uint * src1_line = (uint*) colorized_bg_image.scanLine (y);
+ uint * src2_line = (uint*) fg_image.scanLine (y);
+ uint * dst_line = (uint*) image.scanLine (i*h+y);
+ for (int x=0; x<w; ++x) {
+ int r = tqRed (*(src1_line+x));
+ int g = tqGreen (*(src1_line+x));
+ int b = tqBlue (*(src1_line+x));
+ int a = TQMAX (tqAlpha(*(src1_line+x)),tqGray(*(src2_line+x)));
+ *(dst_line+x) = tqRgba (r, g, b, a);
+ }
+ }
+ }
+ TQPixmap * pixmap = new TQPixmap (image);
+ TQPainter painter (pixmap);
+
+ bool dark = (tqGray(color.rgb()) <= 127);
+ TQImage fg_img (w, h, 32);
+ fg_img.setAlphaBuffer (true);
+ for (int y=0; y<h; ++y) {
+ uint * src_line = (uint*) fg_image.scanLine (y);
+ uint * dst_line = (uint*) fg_img.scanLine (y);
+ for (int x=0; x<w; ++x) {
+ int alpha = tqGray (*(src_line+x));
+ if (dark)
+ *(dst_line+x) = tqRgba (255, 255, 255, alpha);
+ else
+ *(dst_line+x) = tqRgba (0, 0, 0, alpha);
+ }
+ }
+
+ int r = glow_color.red();
+ int g = glow_color.green();
+ int b = glow_color.blue();
+ TQImage glow_img (w, h, 32);
+ glow_img.setAlphaBuffer (true);
+ for (int i=0; i<_steps; ++i) {
+ painter.drawImage (0, i*h, fg_img);
+ for (int y=0; y<h; ++y) {
+ uint * src_line = (uint*) glow_image.scanLine(y);
+ uint * dst_line = (uint*) glow_img.scanLine(y);
+ for (int x=0; x<w; ++x) {
+ int alpha =
+ (int) (tqGray (*(src_line+x)) * ((double) i/_steps));
+ *(dst_line+x) = tqRgba (r, g, b, alpha);
+ }
+ }
+ painter.drawImage (0, i*h, glow_img);
+ }
+ painter.drawImage (0, _steps*h, fg_img);
+ for (int y=0; y<h; ++y) {
+ uint * src_line = (uint*) glow_image.scanLine (y);
+ uint * dst_line = (uint*) glow_img.scanLine (y);
+ for (int x=0; x<w; ++x) {
+ int alpha = tqGray (*(src_line+x));
+ *(dst_line+x) = tqRgba (r, g, b, alpha);
+ }
+ }
+ painter.drawImage (0, _steps*h, glow_img);
+
+ return pixmap;
+}
+
+GlowButton* GlowButtonFactory::createGlowButton(
+ TQWidget *parent, const char* name, const TQString& tip, const int realizeBtns)
+{
+ GlowButton *glowButton = new GlowButton(parent, name, tip, realizeBtns);
+ return glowButton;
+}
+
+}
+
+#include "glowbutton.moc"
+