/* This file is part of the TDE libraries
   Copyright (C) 1996 Martynas Kunigelis

   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.
*/
/*****************************************************************************
*                                                                            *
*  KGameProgress -- progress indicator widget for TDE by Martynas Kunigelis  *
*                                                                            *
*****************************************************************************/

#ifndef _KPROGRES_H
#define _KPROGRES_H "$Id$"

#include <tqframe.h>
#include <tqrangecontrol.h>
#include <kdemacros.h>
/**
 * @short A progress indicator widget.
 *
 * KGameProgress is derived from TQFrame and TQRangeControl, so
 * you can use all the methods from those classes. The only difference
 * is that setValue() is now made a slot, so you can connect
 * stuff to it.
 *
 * None of the constructors take line step and page step as arguments,
 * so by default they're set to 1 and 10 respectively.
 *
 * The Blocked style ignores the textEnabled() setting and displays
 * no text, since it looks truly ugly (and for other reasons). Signal
 * percentageChanged() is emitted whenever the value changes so you
 * can set up a different widget to display the current percentage complete
 * and connect the signal to it.
 *
 * @author Martynas Kunigelis
 * @version $Id$
 */
class KDE_EXPORT KGameProgress : public TQFrame, public TQRangeControl
{
  Q_OBJECT
  
  TQ_ENUMS( BarStyle )
  TQ_PROPERTY( int value READ value WRITE setValue)
  TQ_PROPERTY( BarStyle barStyle READ barStyle WRITE setBarStyle )
  TQ_PROPERTY( TQColor barColor READ barColor WRITE setBarColor )
  TQ_PROPERTY( TQPixmap barPixmap READ barPixmap WRITE setBarPixmap )
  TQ_PROPERTY( Orientation orientation READ orientation WRITE setOrientation )
  TQ_PROPERTY( bool textEnabled READ textEnabled WRITE setTextEnabled )

public:
  /**
   * Possible values for bar style.
   *
   * @p Solid means one continuous progress bar, @p Blocked means a
   * progress bar made up of several blocks.
   */
  enum BarStyle { Solid, Blocked };

  /**
   * Construct a horizontal progress bar.
   */
  KGameProgress(TQWidget *parent=0, const char *name=0);

  /**
   * Construct a progress bar with orientation @p orient.
   */
  KGameProgress(Orientation orient, TQWidget *parent=0, const char *name=0);

  /**
   * Construct a progress bar with minimum, maximum and initial values.
   */
  KGameProgress(int minValue, int maxValue, int value, Orientation,
                TQWidget *parent=0, const char *name=0);

  /**
   * Destruct the progress bar.
   */
  ~KGameProgress();

  /**
   * Set the progress bar style.
   *
   * Allowed values are @p Solid and @p Blocked.
   */
  void setBarStyle(BarStyle style);

  /**
   * Set the color of the progress bar.
   */
  void setBarColor(const TQColor &);

  /**
   * Set a pixmap to be shown in the progress bar.
   */
  void setBarPixmap(const TQPixmap &);

  /**
   * Set the orientation of the progress bar.
   *
   * Allowed values are @pQt::Horizontal and @pQt::Vertical.
   */
  void setOrientation(Orientation);

  /**
   * If this is set to @p true, the progress text will be displayed.
   *
   */
  void setTextEnabled(bool);

  /**
   * Retrieve the bar style.
   *
   * @see setBarStyle()
   */
  BarStyle barStyle() const;

  /**
   * Retrieve the bar color.
   * @see setBarColor()
   */
  const TQColor &barColor() const;

  /**
   * Retrieve the bar pixmap.
   *
   * @see setBarPixmap()
   */
  const TQPixmap *barPixmap() const;

  /**
   * Retrive the current status
   *
   * @see setValue()
   */
  int value() const { return TQRangeControl::value(); }
  /**
   * Retrive the orientation of the progress bar.
   *
   * @see setOrientation()
   */
  Orientation orientation() const;

  /**
   * Returns @p true if progress text will be displayed,
   * @p false otherwise.
   *
   * @see setFormat()
   */
  bool textEnabled() const;

  /**
   */
  virtual TQSize sizeHint() const;

  /**
   */
  virtual TQSize minimumSizeHint() const;

  /**
   */
  virtual TQSizePolicy sizePolicy() const;

  /**
   * Retrieve the current format for printing status text.
   * @see setFormat()
   */
  TQString format() const;

public slots:

  /**
   * Set the format of the text to use to display status.
   *
   * The default format is "%p%" (which looks like "42%".)
   *
   * @param format %p is replaced by percentage done, %v is replaced by actual
   * value, %m is replaced by the maximum value.
   */
  void setFormat(const TQString & format);

  /**
   * Set the current value of the progress bar to @p value.
   *
   * This must be a number in the range 0..100.
   */
  void setValue(int value);

  /**
   * Advance the progress bar by @p prog.
   *
   * This method is
   * provided for convenience and is equivalent with
   * setValue(value()+prog).
   */
  void advance(int prog);

signals:
  /**
   * Emitted when the state of the progress bar changes.
   */
  void percentageChanged(int);

protected:
  /**
   */
  void valueChange();
  /**
   */
  void rangeChange();
  /**
   */
  void styleChange( TQStyle& );
  /**
   */
  void paletteChange( const TQPalette & );
  /**
   */
  void drawContents( TQPainter * );

private slots:
  void paletteChange();

private:
  TQPixmap  *bar_pixmap;
  bool      use_supplied_bar_color;
  TQColor    bar_color;
  TQColor    bar_text_color;
  TQColor    text_color;
  TQRect     fr;
  BarStyle  bar_style;
  Orientation orient;
  bool      text_enabled;
  TQString   format_;
  void      initialize();
  int       recalcValue(int);
  void      drawText(TQPainter *);
  void      adjustStyle();

  class KGameProgressPrivate;
  KGameProgressPrivate *d;
};


#endif
