diff options
Diffstat (limited to 'libksirtet/common/misc_ui.cpp')
-rw-r--r-- | libksirtet/common/misc_ui.cpp | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/libksirtet/common/misc_ui.cpp b/libksirtet/common/misc_ui.cpp new file mode 100644 index 00000000..45cfb440 --- /dev/null +++ b/libksirtet/common/misc_ui.cpp @@ -0,0 +1,194 @@ +#include "misc_ui.h" +#include "misc_ui.moc" + +#include <qpainter.h> + +#include "base/piece.h" +#include "base/board.h" +#include "base/baseprefs.h" +#include "base/kzoommainwindow.h" +#include "factory.h" + +const uint GIFT_SHOWER_TIMEOUT = 800; +const uint GIFT_POOL_TIMEOUT = 2000; + +const uint SHADOW_HEIGHT = 10; + +const uint GI_WIDTH = 15; +const uint GI_HEIGHT = 11; +const uint ARROW_HEIGHT = 3; +const uint ARROW_WIDTH = 7; + +const uint LED_WIDTH = 15; +const uint LED_HEIGHT = 15; +const uint LED_SPACING = 5; + +/*****************************************************************************/ +ShowNextPiece::ShowNextPiece(BaseBoard *board, QWidget *parent) + : FixedCanvasView(parent, "show_next_piece") +{ + setCanvas(board->next()); + setFrameStyle(QFrame::Panel | QFrame::Sunken); + KZoomMainWindow::addWidget(this); +} + +/*****************************************************************************/ +Shadow::Shadow(BaseBoard *board, QWidget *parent) + : QWidget(parent, "shadow"), _xOffset(board->frameWidth()), + _board(board), _show(false) +{ + KZoomMainWindow::addWidget(this); + connect(board, SIGNAL(updatePieceConfigSignal()), SLOT(update())); +} + +QSize Shadow::sizeHint() const +{ + return QSize(_xOffset + _board->matrix().width() * BasePrefs::blockSize(), + SHADOW_HEIGHT); +} + +QSizePolicy Shadow::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +} + +void Shadow::setDisplay(bool show) +{ + _show = show; + update(); +} + +void Shadow::paintEvent(QPaintEvent *) +{ + if ( !_show ) return; + + const Piece *piece = _board->currentPiece(); + uint pf = piece->min().first + _board->currentPos().first; + uint pl = pf + piece->size().first - 1; + + QPainter p(this); + p.setBrush(black); + p.setPen(black); + for (uint i=pf; i<=pl; i++) { + QRect r(_xOffset + i * BasePrefs::blockSize() + 1 , 0, + BasePrefs::blockSize() - 2, SHADOW_HEIGHT); + p.drawRect(r); + } +} + + +/*****************************************************************************/ +class Led : public QWidget +{ + public: + Led(const QColor &c, QWidget *parent) + : QWidget(parent), col(c), _on(FALSE) {} + + QSizePolicy sizePolicy() const + { return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); } + QSize sizeHint() const { return QSize(LED_WIDTH, LED_HEIGHT); } + + void on() { if (!_on) { _on = TRUE; repaint(); } } + void off() { if (_on) {_on = FALSE; repaint(); } } + void setColor(const QColor &c) { if (c!=col) { col = c; repaint(); } } + + protected: + void paintEvent(QPaintEvent *) { + QPainter p(this); + p.setBrush((_on ? col.light() : col.dark())); + p.setPen(black); + p.drawEllipse(0, 0, width(), height()); + } + + private: + QColor col; + bool _on; +}; + +GiftPool::GiftPool(QWidget *parent) + : QHBox(parent, "gift_pool"), nb(0), ready(false) +{ + setSpacing(LED_SPACING); + leds.resize(cfactory->cbi.nbGiftLeds); + for (uint i=0; i<leds.size(); i++) + leds.insert(i, new Led(yellow, this)); +} + +QSize GiftPool::sizeHint() const +{ + QSize s = (leds.size() ? leds[0]->sizeHint() : QSize()); + return QSize((s.width()+LED_SPACING)*leds.size()-LED_SPACING, s.height()); +} + +QSizePolicy GiftPool::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +} + +void GiftPool::put(uint n) +{ + if ( n==0 ) return; + if ( nb==0 && !ready ) + QTimer::singleShot(cfactory->cbi.giftPoolTimeout, + this, SLOT(timeout())); + uint e = QMIN(nb+n, leds.size()); + for (uint i=nb; i<e; i++) leds[i]->on(); + uint f = QMIN(nb+n-e, leds.size()); + for (uint i=0; i<f; i++) leds[i]->setColor(red); + nb += n; +} + +uint GiftPool::take() +{ + Q_ASSERT(ready); + for (uint i=0; i<leds.size(); i++) { + leds[i]->setColor(yellow); + leds[i]->off(); + } + uint max = cfactory->cbi.maxGiftsToSend; + if ( nb>max ) { + uint p = nb - max; + nb = 0; + put(p); + return max; + } else { + ready = false; + uint t = nb; + nb = 0; + return t; + } +} + +void GiftPool::reset() +{ + killTimers(); + ready = false; + nb = 0; + for (uint i=0; i<leds.size(); i++) { + leds[i]->setColor(yellow); + leds[i]->off(); + } +} + +//----------------------------------------------------------------------------- +PlayerProgress::PlayerProgress(BaseBoard *board, QWidget *parent, + const char *name) + : KGameProgress(0, board->matrix().height(), 0, KGameProgress::Vertical, + parent, name), _board(board) +{ + setBackgroundColor(lightGray); + setTextEnabled(false); + setBarColor(blue); + KZoomMainWindow::addWidget(this); +} + +QSize PlayerProgress::sizeHint() const +{ + return QSize(10, _board->matrix().height() * BasePrefs::blockSize()) + + 2 * QSize(frameWidth(), frameWidth()); +} + +QSizePolicy PlayerProgress::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +} |