/* Scrolling song title for winamp Skin Copyright (C) 1999 Martin Vogt Copyright (C) 2001 Ryan Cumming 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. For more information look at the file COPYRIGHT in this package */ #include #include #include #include #include #include "waInfo.h" #include "waSkinModel.h" WaInfo::WaInfo() : WaWidget(_WA_MAPPING_INFO) { connect(WaSkinModel::instance(), TQT_SIGNAL(skinChanged()), this, TQT_SLOT(pixmapChange())); completePixmap = new TQPixmap(); TQSize size = tqsizeHint(); completePixmap->resize(size.width(), size.height()); xGrabbedPos = -1; timer = new TQTimer(this); connect(timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(timeEvent())); } WaInfo::~WaInfo() { delete completePixmap; } void WaInfo::timeEvent() { if ((xGrabbedPos == -1) && (xScrollDirection)) { xScrollPos += xScrollDirection; if (abs(xScrollPos) > completePixmap->width()) { xScrollPos = 0; } if (isVisible()) tqrepaint(false); } } void WaInfo::scrollerSetup() { xScrollPos = 0; xScrollDirection = 0; timer->stop(); TQSize size = tqsizeHint(); if (completePixmap->width() > size.width()) { xScrollDirection = 1; KConfig *config=KGlobal::config(); config->setGroup("Winskin"); int s = config->readNumEntry("ScrollDelay", 15); if (s!=0) timer->start(50-s); } } void WaInfo::paintEvent(TQPaintEvent *) { TQSize size = tqsizeHint(); if (completePixmap->width() <= size.width()) { bitBlt(this, 0, 0, completePixmap); return; } // pixmap widther than window: int xDrawWidth; int xRestWidth; xDrawWidth = completePixmap->width() - xScrollPos; if (xDrawWidth > size.width()) { xDrawWidth = size.width(); } bitBlt(this, 0, 0, completePixmap, xScrollPos, 0, xDrawWidth); if (xDrawWidth < size.width()) { xRestWidth = size.width() - xDrawWidth; bitBlt(this, xDrawWidth, 0, completePixmap, 0, 0, xRestWidth); } } void WaInfo::setText(TQString song) { if (_text != song) { _text = song; pixmapChange(); } } TQString WaInfo::text() const { return _text; } void WaInfo::pixmapChange() { int i; const char *infoString = _text.latin1(); int x = 0; int n=infoString ? strlen(infoString) : 0; TQSize size = tqsizeHint(); completePixmap->resize(TQMAX(n * _WA_TEXT_WIDTH, size.width()), _WA_TEXT_HEIGHT); for (i = 0; i < n; i++) { WaSkinModel::instance()->getText(infoString[i], TQT_TQPAINTDEVICE(completePixmap), x, 0); x += _WA_TEXT_WIDTH; } // if the size is now smaller than the with of this widget, we // fill the pixmap with spaces if (x < size.width()) { while (x < size.width()) { WaSkinModel::instance()->getText(' ', TQT_TQPAINTDEVICE(completePixmap), x, 0); x += _WA_TEXT_WIDTH; } } scrollerSetup(); update(); } void WaInfo::mousePressEvent (TQMouseEvent *e) { if (e->button() == Qt::LeftButton) xGrabbedPos = (e->x() + xScrollPos) % completePixmap->width(); } void WaInfo::mouseMoveEvent (TQMouseEvent * e) { xScrollPos = -e->x() + xGrabbedPos; if (xScrollPos < 0) xScrollPos = completePixmap->width() - (-xScrollPos % completePixmap->width()); else xScrollPos %= completePixmap->width(); update(); } void WaInfo::mouseReleaseEvent (TQMouseEvent *) { xGrabbedPos = -1; } #include "waInfo.moc"