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.
smb4k/smb4k/listview/smb4kshareslistviewitem.cpp

354 lines
11 KiB

/***************************************************************************
smb4kshareslistviewitem - The shares list view item class of Smb4K.
-------------------
begin : Sa Jun 30 2007
copyright : (C) 2007 by Alexander Reinholdt
email : dustpuppy@users.berlios.de
***************************************************************************/
/***************************************************************************
* 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. *
* *
* 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 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 *
***************************************************************************/
// TQt includes
#include <tqpixmap.h>
#include <tqcolor.h>
// KDE includes
#include <kiconeffect.h>
#include <kdebug.h>
// application specific includes
#include "smb4kshareslistviewitem.h"
#include "smb4kshareslistview.h"
Smb4KSharesListViewItem::Smb4KSharesListViewItem( Smb4KShare *share, bool mountpoint,
Smb4KSharesListView *parent )
: TDEListViewItem( parent ), m_share( *share ), m_mountpoint( mountpoint ),
m_initial_setup( true )
{
setDropEnabled( true );
setDragEnabled( true );
m_loader = new TDEIconLoader();
setupItem( m_share, m_mountpoint );
}
Smb4KSharesListViewItem::~Smb4KSharesListViewItem()
{
// Do not touch the Smb4KShare object!
delete m_loader;
}
void Smb4KSharesListViewItem::setupItem( const Smb4KShare &share, bool mountpoint )
{
// Only do something here if either the item hasn't been set up
// yet, or share and mountpoint changed, respectively.
if ( m_initial_setup || !m_share.equals( share ) || m_mountpoint != mountpoint )
{
if ( m_initial_setup || m_share.isBroken() != share.isBroken() )
{
TQPixmap pix;
int icon_state = m_share.isForeign() ? TDEIcon::DisabledState : TDEIcon::DefaultState;
if ( m_share.isBroken() )
{
TQImage over = m_loader->loadIcon( "button_cancel", TDEIcon::Small,
0, icon_state, 0L, false ).convertToImage();
TQImage src = m_loader->loadIcon( "drive-harddisk-mounted", TDEIcon::Small,
0, icon_state, 0L, false ).convertToImage();
TQImage over_desk = m_loader->loadIcon( "button_cancel", TDEIcon::Desktop,
0, icon_state, 0L, false ).convertToImage();
TQImage src_desk = m_loader->loadIcon( "drive-harddisk-mounted", TDEIcon::Desktop,
0, icon_state, 0L, false ).convertToImage();
TDEIconEffect e;
e.semiTransparent( over );
e.overlay( src, over );
e.semiTransparent( over_desk );
e.overlay( src_desk, over_desk );
pix = TQPixmap( src );
m_desktop_pixmap = TQPixmap( src_desk );
}
else
{
pix = m_loader->loadIcon( "drive-harddisk-mounted", TDEIcon::Small,
0, icon_state, 0L, false );
m_desktop_pixmap = m_loader->loadIcon( "drive-harddisk-mounted", TDEIcon::Desktop,
0, icon_state, 0L, false );
}
setPixmap( Item, pix );
}
else
{
// Do nothing
}
if ( !m_initial_setup )
{
if ( m_mountpoint != mountpoint )
{
setText( Item, (m_mountpoint ? m_share.path() : m_share.name()) );
}
// The file system, owner and login won't change
TQString total, free, used, total_dim, free_dim, used_dim;
if ( shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace() > 1024 )
{
double tmp_used = (shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace()) / 1024;
used_dim = "MB";
if ( tmp_used >= 1024 )
{
tmp_used = tmp_used / 1024;
used_dim = "GB";
}
used = TQString( "%1" ).arg( tmp_used, 0, 'f', 1 );
}
else
{
used_dim = "kB";
double tmp_used = shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace();
used = TQString( "%1" ).arg( tmp_used, 0, 'f', 1 );
}
if ( shareObject()->freeDiskSpace() >= 1024 )
{
double tmp_free = shareObject()->freeDiskSpace() / 1024;
free_dim = "MB";
if ( tmp_free >= 1024 )
{
tmp_free = tmp_free / 1024;
free_dim = "GB";
}
free = TQString( "%1" ).arg( tmp_free, 0, 'f', 1 );
}
else
{
free_dim = "kB";
free = TQString( "%1" ).arg( shareObject()->freeDiskSpace(), 0, 'f', 1 );
}
if ( shareObject()->totalDiskSpace() >= 1024 )
{
double tmp_total = shareObject()->totalDiskSpace() / 1024;
total_dim = "MB";
if ( tmp_total >= 1024 )
{
tmp_total = tmp_total / 1024;
total_dim = "GB";
}
total = TQString( "%1" ).arg( tmp_total, 0, 'f', 1 );
}
else
{
total_dim = "kB";
total = TQString( "%1" ).arg( shareObject()->totalDiskSpace(), 0, 'f', 1 );
}
setText( Free, TQString( "%1 %2" ).arg( free, free_dim ) );
setText( Used, TQString( "%1 %2" ).arg( used, used_dim ) );
setText( Total, TQString( "%1 %2" ).arg( total, total_dim ) );
}
else
{
setText( Item, (m_mountpoint ? m_share.path() : m_share.name()) );
setText( Owner, TQString::compare( m_share.filesystem(), "smbfs" ) == 0 ?
TQString( "%1 - %2" ).arg( m_share.user() ).arg( m_share.group() ) :
TQString() );
#ifndef __FreeBSD__
setText( Login, TQString::compare( m_share.filesystem(), "cifs" ) == 0 ?
m_share.cifsLogin() :
TQString() );
#endif
setText( FileSystem, m_share.filesystem().upper() );
TQString total, free, used, total_dim, free_dim, used_dim;
if ( shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace() > 1024 )
{
double tmp_used = (shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace()) / 1024;
used_dim = "MB";
if ( tmp_used >= 1024 )
{
tmp_used = tmp_used / 1024;
used_dim = "GB";
}
used = TQString( "%1" ).arg( tmp_used, 0, 'f', 1 );
}
else
{
used_dim = "kB";
double tmp_used = shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace();
used = TQString( "%1" ).arg( tmp_used, 0, 'f', 1 );
}
if ( shareObject()->freeDiskSpace() >= 1024 )
{
double tmp_free = shareObject()->freeDiskSpace() / 1024;
free_dim = "MB";
if ( tmp_free >= 1024 )
{
tmp_free = tmp_free / 1024;
free_dim = "GB";
}
free = TQString( "%1" ).arg( tmp_free, 0, 'f', 1 );
}
else
{
free_dim = "kB";
free = TQString( "%1" ).arg( shareObject()->freeDiskSpace(), 0, 'f', 1 );
}
if ( shareObject()->totalDiskSpace() >= 1024 )
{
double tmp_total = shareObject()->totalDiskSpace() / 1024;
total_dim = "MB";
if ( tmp_total >= 1024 )
{
tmp_total = tmp_total / 1024;
total_dim = "GB";
}
total = TQString( "%1" ).arg( tmp_total, 0, 'f', 1 );
}
else
{
total_dim = "kB";
total = TQString( "%1" ).arg( shareObject()->totalDiskSpace(), 0, 'f', 1 );
}
setText( Free, TQString( "%1 %2" ).arg( free, free_dim ) );
setText( Used, TQString( "%1 %2" ).arg( used, used_dim ) );
setText( Total, TQString( "%1 %2" ).arg( total, total_dim ) );
}
m_initial_setup = false;
m_share = share;
m_mountpoint = mountpoint;
}
else
{
// Do nothing
}
}
bool Smb4KSharesListViewItem::sameShareObject( Smb4KShare *share )
{
return m_share.equals( *share );
}
void Smb4KSharesListViewItem::replaceShareObject( Smb4KShare *share )
{
setupItem( *share, m_mountpoint );
}
void Smb4KSharesListViewItem::paintCell( TQPainter *p, const TQColorGroup &cg, int col, int width, int align )
{
// Set the color of the item text:
TQColorGroup colorgrp( cg );
if ( m_share.isForeign() )
{
colorgrp.setColor( TQColorGroup::Text, TQt::gray );
}
if ( col != Usage )
{
TDEListViewItem::paintCell( p, colorgrp, col, width, align );
return;
}
// Draw the usage:
// This code was inspired by KAudioCreator.
p->setPen( colorgrp.base() );
p->drawRect( 0, 0, width, height() );
if ( isSelected() )
{
p->fillRect( 1, 1, width-2, height()-2, colorgrp.highlight() );
}
else
{
p->fillRect( 1, 1, width-2, height()-2, colorgrp.base() );
}
if ( !m_share.isBroken() )
{
int percent = (int)(((double)(width-2)) * (m_share.percentage()/100));
p->fillRect( 1, 1, percent, height()-2, !m_share.isForeign() ? TQt::red : TQColor(TQt::red.light( 175 )) );
p->fillRect( percent+1, 1, width-percent-2, height()-2, !m_share.isForeign() ? TQt::green : TQColor(TQt::green.light( 175 )) );
p->setPen( !m_share.isForeign() ? colorgrp.foreground() : TQt::gray );
p->drawRect( 1, 1, width-2, height()-2 );
// Show the text:
p->setPen( colorgrp.text() );
// if ( isSelected() )
// {
// p->setPen( colorgrp.highlightedText() );
// }
p->drawText( 0, 0, width-1, height()-1, TQt::AlignCenter, TQString( "%1 \%" ).arg( m_share.percentage(), 0, 'f', 1 ) );
}
else
{
p->fillRect( 1, 1, width-2, height()-2, colorgrp.base() );
p->setPen( !m_share.isForeign() ? colorgrp.foreground() : TQt::gray );
p->drawRect( 1, 1, width-2, height()-2 );
}
}
bool Smb4KSharesListViewItem::acceptDrop( const TQMimeSource *source ) const
{
if ( source->provides( "text/plain" ) )
{
return true;
}
return false;
}