summaryrefslogtreecommitdiffstats
path: root/smb4k/listview/smb4kshareslistviewitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'smb4k/listview/smb4kshareslistviewitem.cpp')
-rw-r--r--smb4k/listview/smb4kshareslistviewitem.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/smb4k/listview/smb4kshareslistviewitem.cpp b/smb4k/listview/smb4kshareslistviewitem.cpp
new file mode 100644
index 0000000..327f9fb
--- /dev/null
+++ b/smb4k/listview/smb4kshareslistviewitem.cpp
@@ -0,0 +1,353 @@
+/***************************************************************************
+ 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 *
+ ***************************************************************************/
+
+// Qt includes
+#include <qpixmap.h>
+#include <qcolor.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 )
+: KListViewItem( parent ), m_share( *share ), m_mountpoint( mountpoint ),
+ m_initial_setup( true )
+{
+ setDropEnabled( true );
+ setDragEnabled( true );
+
+ m_loader = new KIconLoader();
+
+ 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() )
+ {
+ QPixmap pix;
+
+ int icon_state = m_share.isForeign() ? KIcon::DisabledState : KIcon::DefaultState;
+
+ if ( m_share.isBroken() )
+ {
+ QImage over = m_loader->loadIcon( "button_cancel", KIcon::Small,
+ 0, icon_state, 0L, false ).convertToImage();
+ QImage src = m_loader->loadIcon( "hdd_mount", KIcon::Small,
+ 0, icon_state, 0L, false ).convertToImage();
+
+ QImage over_desk = m_loader->loadIcon( "button_cancel", KIcon::Desktop,
+ 0, icon_state, 0L, false ).convertToImage();
+ QImage src_desk = m_loader->loadIcon( "hdd_mount", KIcon::Desktop,
+ 0, icon_state, 0L, false ).convertToImage();
+
+ KIconEffect e;
+ e.semiTransparent( over );
+ e.overlay( src, over );
+ e.semiTransparent( over_desk );
+ e.overlay( src_desk, over_desk );
+
+ pix = QPixmap( src );
+ m_desktop_pixmap = QPixmap( src_desk );
+ }
+ else
+ {
+ pix = m_loader->loadIcon( "hdd_mount", KIcon::Small,
+ 0, icon_state, 0L, false );
+
+ m_desktop_pixmap = m_loader->loadIcon( "hdd_mount", KIcon::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
+
+ QString 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 = QString( "%1" ).arg( tmp_used, 0, 'f', 1 );
+ }
+ else
+ {
+ used_dim = "kB";
+ double tmp_used = shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace();
+ used = QString( "%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 = QString( "%1" ).arg( tmp_free, 0, 'f', 1 );
+ }
+ else
+ {
+ free_dim = "kB";
+ free = QString( "%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 = QString( "%1" ).arg( tmp_total, 0, 'f', 1 );
+ }
+ else
+ {
+ total_dim = "kB";
+ total = QString( "%1" ).arg( shareObject()->totalDiskSpace(), 0, 'f', 1 );
+ }
+
+ setText( Free, QString( "%1 %2" ).arg( free, free_dim ) );
+ setText( Used, QString( "%1 %2" ).arg( used, used_dim ) );
+ setText( Total, QString( "%1 %2" ).arg( total, total_dim ) );
+ }
+ else
+ {
+ setText( Item, (m_mountpoint ? m_share.path() : m_share.name()) );
+
+ setText( Owner, QString::compare( m_share.filesystem(), "smbfs" ) == 0 ?
+ QString( "%1 - %2" ).arg( m_share.user() ).arg( m_share.group() ) :
+ QString::null );
+#ifndef __FreeBSD__
+ setText( Login, QString::compare( m_share.filesystem(), "cifs" ) == 0 ?
+ m_share.cifsLogin() :
+ QString::null );
+#endif
+ setText( FileSystem, m_share.filesystem().upper() );
+
+ QString 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 = QString( "%1" ).arg( tmp_used, 0, 'f', 1 );
+ }
+ else
+ {
+ used_dim = "kB";
+ double tmp_used = shareObject()->totalDiskSpace() - shareObject()->freeDiskSpace();
+ used = QString( "%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 = QString( "%1" ).arg( tmp_free, 0, 'f', 1 );
+ }
+ else
+ {
+ free_dim = "kB";
+ free = QString( "%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 = QString( "%1" ).arg( tmp_total, 0, 'f', 1 );
+ }
+ else
+ {
+ total_dim = "kB";
+ total = QString( "%1" ).arg( shareObject()->totalDiskSpace(), 0, 'f', 1 );
+ }
+
+ setText( Free, QString( "%1 %2" ).arg( free, free_dim ) );
+ setText( Used, QString( "%1 %2" ).arg( used, used_dim ) );
+ setText( Total, QString( "%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( QPainter *p, const QColorGroup &cg, int col, int width, int align )
+{
+ // Set the color of the item text:
+ QColorGroup colorgrp( cg );
+
+ if ( m_share.isForeign() )
+ {
+ colorgrp.setColor( QColorGroup::Text, Qt::gray );
+ }
+
+ if ( col != Usage )
+ {
+ KListViewItem::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() ? Qt::red : Qt::red.light( 175 ) );
+ p->fillRect( percent+1, 1, width-percent-2, height()-2, !m_share.isForeign() ? Qt::green : Qt::green.light( 175 ) );
+
+ p->setPen( !m_share.isForeign() ? colorgrp.foreground() : Qt::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, Qt::AlignCenter, QString( "%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() : Qt::gray );
+ p->drawRect( 1, 1, width-2, height()-2 );
+ }
+}
+
+
+bool Smb4KSharesListViewItem::acceptDrop( const QMimeSource *source ) const
+{
+ if ( source->provides( "text/plain" ) )
+ {
+ return true;
+ }
+
+ return false;
+}