/*
    This file is part of the TDE games library
    Copyright (C) 2001,2002,2003 Nicolas Hadacek (hadacek@kde.org)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License version 2 as published by the Free Software Foundation.

    This library 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef __KGAMELCD_H
#define __KGAMELCD_H

#include <tqlcdnumber.h>
#include <tqvaluevector.h>
#include <kdemacros.h>

class TQLabel;
class TQTimer;

//-----------------------------------------------------------------------------
/**
 * This class is a visually enhanced @ref TQLCDNumber:
 * <ul>
 * <li> It can show an additional string before the integer being
 * displayed.</li>
 * <li> Its foreground and background colors can easily be modified. </li>
 * <li> It can be highlighted for a short time. </li>
 * </ul>
 *
 * @since 3.2
 */
class KDE_EXPORT KGameLCD : public TQLCDNumber
{
    Q_OBJECT
  
public:
    KGameLCD(uint nbDigits, TQWidget *parent = 0, const char *name = 0);

    ~KGameLCD();

    /**
     * Set the default background color.
     */
    void setDefaultBackgroundColor(const TQColor &color);

    /**
     * Set the default foreground color.
     */
    void setDefaultColor(const TQColor &color);

    /**
     * Set highlight color.
     */
    void setHighlightColor(const TQColor &color);

    /**
     * Set the string that will be displayed before the integer number to be
     * displayed. By default this string is null.
     */
    void setLeadingString(const TQString &s);

    /**
     * Set the highlight duration in milliseconds. The default value is
     * 800 milliseconds.
     */
    void setHighlightTime(uint time);

    /**
     * Reset the foreground color to the default one.
     */
    void resetColor();

    /**
     * Set the foreground color.
     */
    void setColor(const TQColor &color);

public slots:
    /**
     * Highlight the LCD with the TQColorGourp::HighlightedText color
     * for a small time (setHighlightTime).
     */
    void highlight();

    /**
     * Display the given integer with the (optionnal) leading string.
     *
     * Note: we cannot use display(int) since TQLCDNumber::display is
     * not virtual... And you cannot use TQLCDNumber::intValue() to retrieve
     * the given value.
     */
    void displayInt(int value);

private slots:
    void timeout() { highlight(false); }

private:
    TQColor   _fgColor, _hlColor;
    TQString  _lead;
    uint     _htime;
    TQTimer  *_timer;

    class KGameLCDPrivate;
    KGameLCDPrivate *d;

    void highlight(bool light);

};

//-----------------------------------------------------------------------------
/**
 * This class is a digital clock widget. It has a maximum duration of
 * 3599 seconds (one hour) and it gets updated every second.
 *
 * @since 3.2
 */
class KDE_EXPORT KGameLCDClock : public KGameLCD
{
    Q_OBJECT
  
public:
    KGameLCDClock(TQWidget *parent = 0, const char *name = 0);

    ~KGameLCDClock();

    /**
     * @return the total number of seconds elapsed.
     */
    uint seconds() const;

    /**
     * @return the time as a string to be displayed: "mm:ss".
     */
    TQString pretty() const;

    /**
     * Set the time.
     */
    void setTime(uint seconds);

    /**
     * Set the time (format should be "mm:ss").
     */
    void setTime(const TQString &s);

public slots:
    /**
     * Stop the clock and reset it to zero.
     */
    virtual void reset();

    /**
     * Stop the clock but do not reset it to zero.
     */
	virtual void stop();

    /**
     * Start the clock from the current time.
     */
	virtual void start();

protected slots:
    virtual void timeoutClock();

private:
    TQTimer *_timerClock;
	uint    _sec, _min;

    class KGameLCDClockPrivate;
    KGameLCDClockPrivate *d;

	void showTime();
};

//-----------------------------------------------------------------------------
/**
 * This widget holds a list of @ref TQLCDNumber arranged in a vertical layout.
 * It also shows a label at the top of the list.
 *
 * @since 3.2
 */
class KDE_EXPORT KGameLCDList : public TQWidget
{
    Q_OBJECT
  
public:
    /**
     * Constructor.
     *
     * @param title is the content of the top label.
     * @param parent passed to the TQWidget constructor
     * @param name passed to the TQWidget constructor
     */
    KGameLCDList(const TQString &title,
                 TQWidget *parent = 0, const char *name = 0);
    KGameLCDList(TQWidget *parent = 0, const char *name = 0);

    ~KGameLCDList();

    /**
     * Append a TQLCDNumber at the bottom of the list.
     * The TQLCDNumber should have the KGameLCDList as parent.
     */
    void append(TQLCDNumber *lcd);
    
    /**
     * Append a TQLCDNumber at the bottom of the list.
     * The TQLCDNumber should have the KGameLCDList as parent.
     */
    void append(const TQString &leading, TQLCDNumber *lcd);

    /**
     * Delete all @ref TQLCDNumber and clear the list.
     */
    void clear();

    /**
     * @return the title label.
     */
    TQLabel *title() const { return _title; }

    /**
     * @return the TQLCDNumber at index @param i
     */
    TQLCDNumber *lcd(uint i) const { return _lcds[i]; }
    
    /**
     * @return the number of TQLCDNumber in the list.
     */
    uint size() const { return _lcds.size(); }

private:
    TQLabel *_title;
    TQValueVector<TQLCDNumber *> _lcds;

    class KGameLCDListPrivate;
    KGameLCDListPrivate *d;

    void init(const TQString &title);
};

#endif