/* 
 *
 * $Id: sourceheader 380067 2005-01-19 13:03:46Z trueg $
 * Copyright (C) 2005 Sebastian Trueg <trueg@k3b.org>
 *
 * This file is part of the K3b project.
 * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
 *
 * Based on the effects in popupMessage.cpp 
 * Copyright (C) 2005 by Max Howell <max.howell@methylblue.com>
 *               2005 by Seb Ruiz <me@sebruiz.net>
 *
 * Dissolve Mask (c) Kicker Authors kickertip.cpp, 2005/08/17
 *
 * 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; either version 2 of the License, or
 * (at your option) any later version.
 * See the file "COPYING" for the exact licensing terms.
 */

#include "k3bwidgetshoweffect.h"

#include <tqpainter.h>
#include <tqwidget.h>


K3bWidgetShowEffect::K3bWidgetShowEffect( TQWidget* widget, Effect e )
  : TQObject( widget ),
    m_effect( e ),
    m_widget( widget ),
    m_dissolveSize( 0 ),
    m_dissolveDelta( -1 ),
    m_offset( 0 ),
    m_deleteSelf( false ),
    m_bEffectOnly( false )
{
}


K3bWidgetShowEffect::~K3bWidgetShowEffect()
{
}


void K3bWidgetShowEffect::hide( bool effectOnly )
{
  m_bEffectOnly = effectOnly;
  m_bShow = false;
  m_offset = m_widget->height();
  killTimer( m_timerId );
  m_timerId = startTimer( 6 );
}


void K3bWidgetShowEffect::show( bool effectOnly )
{
  m_bShow = true;
  m_offset = 0;
  m_dissolveSize = 24;
  m_dissolveDelta = -1;

  m_widget->polish();

  if( m_effect == Dissolve ) {
    // necessary to create the mask
    m_mask.resize( m_widget->width(), m_widget->height() );
    // make the mask empty and hence will not show widget with show() called below
    dissolveMask();
    m_timerId = startTimer( 1000 / 30 );
  }
  else {
    m_widget->move( 0, m_widget->parentWidget()->height() );
    m_timerId = startTimer( 6 );
  }
  
  if( !effectOnly )
    m_widget->show();
}


void K3bWidgetShowEffect::timerEvent( TQTimerEvent* )
{
  switch( m_effect ) {
  case Slide:
    slideMask();
    break;
    
  case Dissolve:
    dissolveMask();
    break;
  }
}


void K3bWidgetShowEffect::dissolveMask()
{
  if( m_bShow ) {
    m_widget->repaint( false );
    TQPainter maskPainter(&m_mask);

    m_mask.fill(TQt::black);

    maskPainter.setBrush(TQt::white);
    maskPainter.setPen(TQt::white);
    maskPainter.drawRect( m_mask.rect() );
    
    m_dissolveSize += m_dissolveDelta;

    if( m_dissolveSize > 0 ) {
      maskPainter.setRasterOp( TQt::EraseROP );

      int x, y, s;
      const int size = 16;

      for( y = 0; y < m_widget->height() + size; y += size ) {
	x = m_widget->width();
	s = m_dissolveSize * x / 128;

	for( ; x > size; x -= size, s -= 2 ) {
	  if( s < 0 )
	    break;

	  maskPainter.drawEllipse(x - s / 2, y - s / 2, s, s);
	}
      }
    }
    else if( m_dissolveSize < 0 ) {
      m_dissolveDelta = 1;
      killTimer( m_timerId );

      emit widgetShown( m_widget );

      if( m_deleteSelf )
	deleteLater();
    }

    m_widget->setMask( m_mask );
  }

  else {
    // just hide it for now
    emit widgetHidden( m_widget );
    if( !m_bEffectOnly )
      m_widget->hide();

    if( m_deleteSelf )
      deleteLater();
  }
}


void K3bWidgetShowEffect::slideMask()
{
  if( m_bShow ) {
    m_widget->move( 0, m_widget->parentWidget()->height() - m_offset );
    
    m_offset++;
    if( m_offset > m_widget->height() ) {
      killTimer( m_timerId );

      emit widgetShown( m_widget );
      
      if( m_deleteSelf )
	deleteLater();
    }
  }
  else {
    m_offset--;
    m_widget->move( 0, m_widget->parentWidget()->height() - m_offset );
    
    if( m_offset < 0 ) {
      // finally hide the widget
      emit widgetHidden( m_widget );
      if( !m_bEffectOnly )
	m_widget->hide();

      if( m_deleteSelf )
	deleteLater();
    }
  }
}



K3bWidgetShowEffect* K3bWidgetShowEffect::showWidget( TQWidget* w, Effect m )
{
  K3bWidgetShowEffect* e = new K3bWidgetShowEffect( w, m );
  e->m_deleteSelf = true;
  e->show();
  return e;
}


K3bWidgetShowEffect* K3bWidgetShowEffect::hideWidget( TQWidget* w, Effect m )
{
  K3bWidgetShowEffect* e = new K3bWidgetShowEffect( w, m );
  e->m_deleteSelf = true;
  e->hide();
  return e;
}

#include "k3bwidgetshoweffect.moc"