/* ====================================================================
 * Copyright (c) 2003-2006, Martin Hauner
 *                          http://subcommander.tigris.org
 *
 * Subcommander is licensed as described in the file doc/COPYING, which
 * you should have received as part of this distribution.
 * ====================================================================
 */

// sc
#include "ColorSettingsWidget.h"
#include "sublib/ExternButton.h"

// qt
#include <qlayout.h>
#include <qlistview.h>
#include <qlabel.h>
#include <qcolor.h>
#include <qcolordialog.h>

// sys
#include <assert.h>


/////////////////////////////////////////////////////////////////////


class ColorLvi : public QListViewItem
{
  typedef QListViewItem super;

public:
  ColorLvi( QListView* parent, const Color& color )
    : super(parent,color._name), _color(color)
  {
  }

  virtual ~ColorLvi()
  {
  }

  void paintCell( QPainter* p, const QColorGroup& cg, int column, int width, int alignment )
  {
    if( column == 0 )
    {
      super::paintCell(p,cg,column,width,alignment);
    }
    else
    {
      QColorGroup g(cg);
      g.setColor( QColorGroup::Base, _color._color );
      super::paintCell(p,g,column,width,alignment);
    }
  }

  const Color& getColor()
  {
    return _color;
  }

  void setColor( const Color& c )
  {
    _color = c;
  }

private:
  Color _color;
};


/////////////////////////////////////////////////////////////////////

ColorSettingsWidget::ColorSettingsWidget( QWidget *parent )
: super(parent,0)
{
  QVBoxLayout* vl = new QVBoxLayout(this);
  vl->setSpacing(5);
  {
    _clist = new QListView(this);
    _clist->addColumn( "color type" );
    _clist->addColumn( "color" );
    _clist->setColumnWidthMode( 0, QListView::Maximum );
    //_clist->setColumnAlignment( 0, Qt::AlignHCenter );
    _clist->setResizeMode( QListView::LastColumn );
    _clist->setItemMargin( 2 );
    vl->addWidget(_clist);
    _clist->adjustColumn(0);

    connect( _clist, SIGNAL(doubleClicked( QListViewItem*, const QPoint&, int )),
      SLOT(doubleClicked( QListViewItem*, const QPoint&, int )) );

    connect( _clist, SIGNAL(clicked(QListViewItem*)), SLOT(clicked(QListViewItem*)) );

    _desc = new QLabel(this);
    vl->addWidget(_desc);
  }
}

ColorSettingsWidget::~ColorSettingsWidget()
{
}

void ColorSettingsWidget::doubleClicked( QListViewItem* lvi, const QPoint&, int )
{
  ColorLvi* clvi  = dynamic_cast<ColorLvi*>(lvi);
  Color     color = clvi->getColor();
  QColor  choosen = QColorDialog::getColor( color._color, this );

  if( choosen.isValid() && choosen != color._color )
  {
    color._color = choosen;
    clvi->setColor(color);
    clvi->repaint();
    emit modified();
  }
}

void ColorSettingsWidget::clicked( QListViewItem* lvi )
{
  ColorLvi* clvi  = dynamic_cast<ColorLvi*>(lvi);
  if( ! clvi )
  {
    return;
  }

  _desc->setText( clvi->getColor()._desc );
}


void ColorSettingsWidget::setColors( const Colors& colors )
{
  _clist->clear();

  for( Colors::const_iterator it = colors.begin(); it != colors.end(); it++ )
  {
    const Color& c = *it;
    new ColorLvi( _clist, c );
  }
}

void ColorSettingsWidget::getColors( Colors& colors )
{
  QListViewItemIterator it( _clist );
  while( it.current() )
  {
    ColorLvi* lvi = dynamic_cast<ColorLvi*>(it.current());

    colors.push_back( lvi->getColor() );

    ++it;
  }
}


syntax highlighted by Code2HTML, v. 0.9.1