You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kbfx/src/kbfxbutton.cpp

418 lines
11 KiB

/*
* Copyright (C) 2006
* Siraj Razick <siraj@kdemail.net>
* PhobosK <phobosk@mail.kbfx.net>
* see Also AUTHORS
*
* This program 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 program 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 General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
#include "kbfxbutton.h"
bool KbfxButton::m_sizeHeight = TRUE;
int KbfxButton::m_size = 0;
KbfxButton::KbfxButton ( TQWidget * parent, const char *name) :
TQLabel ( parent,name,TQt::WStaticContents | TQt::WNoAutoErase |TQt::WPaintDesktop )
{
setLineWidth ( 0 );
setScaledContents ( false );
setAcceptDrops ( true );
m_dcopClient = new DCOPClient ();
m_dcopClient->attach ();
m_fadeTime = ConfigInit().m_fadeTime;
/* Init normal size first */
m_kicker_auto_adjust = TRUE;
loadSkins();
m_kicker_auto_adjust = ConfigInit().m_ToolBarResize;
m_toggle = false;
TQTimer * timer = new TQTimer ( this,"Update Timer" );
connect ( timer,TQT_SIGNAL ( timeout() ),this,TQT_SLOT ( update() ) );
timer->start ( 25,false );
fade_timer = new TQTimer ( this,"Fade Timer" );
connect ( fade_timer,TQT_SIGNAL ( timeout() ),this,TQT_SLOT ( fade() ) );
}
KbfxButton::~KbfxButton()
{
}
void KbfxButton::loadSkins()
{
TQImage _tmpHover, _tmpPressed, _tmpNormal;
_tmpHover = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxHoverButtonPath ) ) ?
TQImage ( ConfigInit ().m_KbfxHoverButtonPath )
: TQImage ( ConfigInit ().m_KbfxHoverButtonPathDefault );
_tmpPressed = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxPressedButtonPath ) ) ?
TQImage ( ConfigInit ().m_KbfxPressedButtonPath )
: TQImage ( ConfigInit ().m_KbfxPressedButtonPathDefault );
_tmpNormal = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxNormalButtonPath ) ) ?
TQImage ( ConfigInit ().m_KbfxNormalButtonPath )
: TQImage ( ConfigInit ().m_KbfxNormalButtonPathDefault );
TQSize _sizeNormal = _tmpNormal.size();
_tmpHover = _tmpHover.smoothScale ( _sizeNormal, TQ_ScaleFree );
_tmpPressed = _tmpPressed.smoothScale ( _sizeNormal, TQ_ScaleFree );
if ( !m_kicker_auto_adjust )
{
if ( m_sizeHeight )
{
_tmpHover = _tmpHover.smoothScale ( _tmpHover.width(), m_size, TQ_ScaleMin );
_tmpPressed = _tmpPressed.smoothScale ( _tmpPressed.width(), m_size, TQ_ScaleMin );
_tmpNormal = _tmpNormal.smoothScale ( _tmpNormal.width(), m_size, TQ_ScaleMin );
}
else
{
_tmpHover = _tmpHover.smoothScale ( m_size, _tmpHover.height(), TQ_ScaleMin );
_tmpPressed = _tmpPressed.smoothScale ( m_size, _tmpPressed.height(), TQ_ScaleMin );
_tmpNormal = _tmpNormal.smoothScale ( m_size, _tmpNormal.height(), TQ_ScaleMin );
}
}
m_over_skin = TQPixmap ( _tmpHover );
m_normal_skin = TQPixmap ( _tmpNormal );
m_pressed_skin = TQPixmap ( _tmpPressed );
m_current_skin = m_normal_skin;
this->resize ( m_current_skin.width(),m_current_skin.height() );
this->repaint();
}
TQCString KbfxButton::findPanel()
{
TQCString m_AppletPanel = TQCString ("kicker");
QCStringList objects=m_dcopClient->remoteObjects("kicker");
for( QCStringList::ConstIterator it = objects.begin();
it != objects.end();
++it)
{
if ( (*it).contains ( "Panel" ) > 0 )
{
DCOPRef _dcop_obj ( "kicker", (*it) );
TQStringList _dcop_obj_applets =_dcop_obj.call ( "listApplets()" );
for ( TQStringList::Iterator _it = _dcop_obj_applets.begin();
_it != _dcop_obj_applets.end();
_it++ )
{
if ( ( *_it ).contains ( "kbfx" ) )
{
m_AppletPanel = (*it);
break;
}
}
}
}
kdDebug () << "KBFX resides on panel: " << m_AppletPanel << endl;
return m_AppletPanel;
}
void KbfxButton::readjust( bool _how )
{
/* _how = TRUE is for height, _how = FALSE is for width readjust */
TQCString _panel = findPanel();
int _tmp_size;
if ( _how )
{
_tmp_size = this->height ();
kdDebug () << "Readjusting " << _panel << " to height: " << _tmp_size << endl;
}
else
{
_tmp_size = this->width ();
kdDebug () << "Readjusting " << _panel << " to width: " << _tmp_size << endl;
}
TQByteArray data;
TQDataStream arg ( data, IO_WriteOnly );
arg << _tmp_size ;
if ( !m_dcopClient->send ( "kicker", _panel, "setPanelSize(int)", data ) )
kdWarning ()
<< "Could not send DCOP command to:"
<< _panel
<< endl;
}
void KbfxButton::enterEvent ( TQEvent * e )
{
e = e;
if ( m_toggle == true )
{
// m_current_skin = m_pressed_skin; // no fade code
m_fadePix = m_pressed_skin;
}
else
{
// m_current_skin = m_over_skin; // no fade code
m_fadePix = m_over_skin;
emit showToolTip ();
}
fade();
}
void KbfxButton::fade ( )
{
if ( m_fadeTime == 0 )
{
m_current_skin = m_fadePix;
}
else
{
TQImage _final = m_fadePix.convertToImage ();
TQImage _current = m_current_skin.convertToImage ();
if ( !fade_timer->isActive ())
{
m_opacity = 0;
fade_timer->start( m_fadeTime, false);
}
if ( m_opacity > 0.9 )
fade_timer->stop();
m_opacity += 0.1;
KImageEffect::blend ( _final, _current, m_opacity);
m_current_skin = TQPixmap ( _current );
}
this->resize ( m_current_skin.size() );
this->update();
}
void KbfxButton::leaveEvent ( TQEvent * e )
{
e = e;
if ( m_toggle )
{
// m_current_skin = m_pressed_skin; // no fade code
m_fadePix = m_pressed_skin;
}
else
{
// m_current_skin = m_normal_skin; // no fade code
m_fadePix = m_normal_skin;
}
fade();
emit leave ();
}
void KbfxButton::toggle()
{
if (this->hasMouse() ) {
m_fadePix = m_over_skin;
}else {
m_fadePix = m_normal_skin;
m_toggle = false;
}
fade();
}
void KbfxButton::toggleKMenu()
{
// m_current_skin = m_normal_skin;
m_fadePix = m_normal_skin;
fade();
m_toggle = false;
}
void KbfxButton::mousePressEvent ( TQMouseEvent * e )
{
e->accept();
if ( e->button() == Qt::LeftButton )
{
if ( m_toggle == false )
{
// m_current_skin = m_pressed_skin; // no fade code
m_toggle = true;
m_fadePix = m_pressed_skin;
fade();
emit pressed();
}
else
{
// m_current_skin = m_normal_skin; // no fade code
m_toggle = false;
if (hasMouse() ) {
m_fadePix = m_over_skin;
}else {
m_fadePix = m_normal_skin;
}
fade();
emit hideMenu();
}
emit clicked ();
}
if ( e->button() == Qt::RightButton )
{
m_fadePix = m_normal_skin;
fade();
m_toggle = false;
TQPopupMenu *popup = new TQPopupMenu();
popup->insertItem ( SmallIcon ( "remove" ), i18n ( "Remove KBFX from Pannel" ),
this, TQT_SLOT ( selfDeleter() ) );
popup->insertItem ( SmallIcon ( "reload" ),i18n ( "Reload KBFX" ),
this, TQT_SLOT ( reloadConfig() ) );
popup->insertSeparator();
popup->insertItem ( SmallIcon ( "kbfxconfigapp" ), i18n ( "Configure KBFX" ),
this, TQT_SLOT ( openConfigDialog() ) );
popup->insertItem ( SmallIcon ( "kmenuedit" ),i18n ( "Edit Applications Menu" ),
this, TQT_SLOT ( openKmenuEdit() ) );
popup->exec ( e->globalPos() );
delete popup;
}
}
void KbfxButton::reloadConfig()
{
/*
DCOPRef m_kickerkbfxDevelnterface ( "kicker","KBFXInterface" );
m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" );
m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" );
*/
DCOPRef m_kickerPanel("kicker", findPanel());
m_kickerPanel.call("restart()");
}
void KbfxButton::selfDeleter()
{
DCOPRef m_kickerPanel ( "kicker", findPanel() );
TQStringList returnTQStringList =m_kickerPanel.call ( "listApplets()" );
int _myIndex = 0;
TQStringList::Iterator it;
for ( it = returnTQStringList.begin();it != returnTQStringList.end();it++ )
{
if ( ( *it ).contains ( "kbfx" ) )
{
break;
}
else
_myIndex++;
}
m_kickerPanel.call ( "removeApplet(int)", _myIndex );
}
void KbfxButton::openKmenuEdit()
{
#ifdef HAVE_MANDRAKE
KRun::runCommand ( "menudrake" );
#else
KRun::runCommand ( "kmenuedit" );
#endif
}
void KbfxButton::openConfigDialog()
{
KRun::runCommand ( "kbfxconfigapp" );
}
void KbfxButton::paintEvent ( TQPaintEvent * pe )
{
TQPainter p;
if ( !m_current_skin.isNull () )
{
TQRect r = TQRect ( pe->rect().x(),pe->rect().y(),m_current_skin.width(),m_current_skin.height() );
m_buffer = new TQPixmap();
m_buffer->resize ( r.size() );
m_buffer->fill ( this, r.topLeft() );
p.begin ( m_buffer,this );
p.translate ( -r.x(), -r.y() );
p.drawPixmap ( r,m_current_skin );
p.end ();
bitBlt ( this, r.x(), r.y(),m_buffer, 0, 0,m_current_skin.width(), m_current_skin.height() );
delete m_buffer;
}
}
void KbfxButton::dragEnterEvent ( TQDragEnterEvent * e )
{
e->accept ( TQUriDrag::canDecode ( e ) );
kdDebug() << "Accepting KBFX button drag..." << endl;
}
void KbfxButton::dropEvent ( TQDropEvent * e )
{
TQStringList filelist;
TQString _hover, _normal, _pressed, _tmp;
TQImage _hover_pix, _normal_pix, _pressed_pix;
TQUriDrag::decodeLocalFiles ( e, filelist );
for ( TQStringList::Iterator it = filelist.begin(); it != filelist.end(); ++it )
{
_tmp = ( *it );
kdDebug() << "KBFX button dropped file: " << _tmp << endl;
if ( _tmp.contains ( "hover", FALSE ) > 0 )
{
_hover = _tmp;
_hover_pix = TQImage ( _tmp );
}
if ( _tmp.contains ( "normal", FALSE ) > 0 )
{
_normal = _tmp;
_normal_pix = TQImage ( _tmp );
}
if ( _tmp.contains ( "pressed", FALSE ) > 0 )
{
_pressed = _tmp;
_pressed_pix = TQImage ( _tmp );
}
}
kdDebug() << "KBFX button hover: " << _hover << endl
<< "KBFX button normal: " << _normal << endl
<< "KBFX button pressed: " << _pressed << endl;
if ( _hover_pix.isNull () ||
_normal_pix.isNull () ||
_pressed_pix.isNull () )
{
KMessageBox::error ( 0,
tr2i18n ( "Invalid images were dropped!"
"\nCannot set the KBFX button to use these images!" ),
tr2i18n ( "Error setting KBFX button images" ) );
return;
}
ConfigInit ().m_KbfxNormalButtonPath = _normal;
ConfigInit ().m_KbfxHoverButtonPath = _hover;
ConfigInit ().m_KbfxPressedButtonPath = _pressed;
ConfigInit().writeThemerc ( ConfigInit().m_SpinxThemeName );
/* Init normal size first */
m_kicker_auto_adjust = TRUE;
loadSkins();
m_kicker_auto_adjust = ConfigInit().m_ToolBarResize;
}
#include "kbfxbutton.moc"