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.
237 lines
6.1 KiB
237 lines
6.1 KiB
//Author: Max Howell <max.howell@methylblue.com>, (C) 2004
|
|
//Copyright: See COPYING file that comes with this distribution
|
|
|
|
#include "Config.h"
|
|
#include "debug.h"
|
|
#include "fileTree.h"
|
|
#include <kcursor.h>
|
|
#include <kiconeffect.h> //MyRadialMap::mousePressEvent()
|
|
#include <kiconloader.h>
|
|
#include <klocale.h>
|
|
#include <tqlabel.h>
|
|
#include <tqlayout.h>
|
|
#include <tqtextstream.h>
|
|
#include <tqvbox.h>
|
|
#include "radialMap/radialMap.h"
|
|
#include "radialMap/widget.h"
|
|
#include "summaryWidget.h"
|
|
#include "summaryWidget.moc"
|
|
|
|
|
|
static Filelight::MapScheme oldScheme;
|
|
|
|
|
|
struct Disk
|
|
{
|
|
TQString device;
|
|
TQString type;
|
|
TQString mount;
|
|
TQString icon;
|
|
|
|
int size;
|
|
int used;
|
|
int free; //NOTE used+avail != size (clustersize!)
|
|
|
|
void guessIconName();
|
|
};
|
|
|
|
|
|
struct DiskList : TQValueList<Disk>
|
|
{
|
|
DiskList();
|
|
};
|
|
|
|
|
|
class MyRadialMap : public RadialMap::Widget
|
|
{
|
|
public:
|
|
MyRadialMap( TQWidget *tqparent )
|
|
: RadialMap::Widget( tqparent )
|
|
{}
|
|
|
|
virtual void setCursor( const TQCursor &c )
|
|
{
|
|
if( focusSegment() && focusSegment()->file()->name() == "Used" )
|
|
RadialMap::Widget::setCursor( c );
|
|
else
|
|
unsetCursor();
|
|
}
|
|
|
|
virtual void mousePressEvent( TQMouseEvent *e )
|
|
{
|
|
const RadialMap::Segment *segment = focusSegment();
|
|
|
|
//we will allow right clicks to the center circle
|
|
if( segment == rootSegment() )
|
|
RadialMap::Widget::mousePressEvent( e );
|
|
|
|
//and clicks to the used segment
|
|
else if( segment && segment->file()->name() == "Used" ) {
|
|
const TQRect rect( e->x() - 20, e->y() - 20, 40, 40 );
|
|
KIconEffect::visualActivate( this, rect );
|
|
emit activated( url() );
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
|
|
SummaryWidget::SummaryWidget( TQWidget *tqparent, const char *name )
|
|
: TQWidget( tqparent, name )
|
|
{
|
|
tqApp->setOverrideCursor( KCursor::waitCursor() );
|
|
|
|
setPaletteBackgroundColor( TQt::white );
|
|
(new TQGridLayout( this, 1, 2 ))->setAutoAdd( true );
|
|
|
|
createDiskMaps();
|
|
|
|
tqApp->restoreOverrideCursor();
|
|
}
|
|
|
|
SummaryWidget::~SummaryWidget()
|
|
{
|
|
Config::scheme = oldScheme;
|
|
}
|
|
|
|
void
|
|
SummaryWidget::createDiskMaps()
|
|
{
|
|
DiskList disks;
|
|
|
|
const TQCString free = i18n( "Free" ).local8Bit();
|
|
const TQCString used = i18n( "Used" ).local8Bit();
|
|
|
|
KIconLoader loader;
|
|
|
|
oldScheme = Config::scheme;
|
|
Config::scheme = (Filelight::MapScheme)2000;
|
|
|
|
for (DiskList::ConstIterator it = disks.begin(), end = disks.end(); it != end; ++it)
|
|
{
|
|
Disk const &disk = *it;
|
|
|
|
if (disk.free == 0 && disk.used == 0)
|
|
continue;
|
|
|
|
TQWidget *box = new TQVBox( this );
|
|
RadialMap::Widget *map = new MyRadialMap( box );
|
|
|
|
TQString text; TQTextOStream( &text )
|
|
<< "<img src='" << loader.iconPath( disk.icon, KIcon::Toolbar ) << "'>"
|
|
<< " " << disk.mount << " "
|
|
<< "<i>(" << disk.device << ")</i>";
|
|
|
|
TQLabel *label = new TQLabel( text, box );
|
|
label->tqsetAlignment( TQt::AlignCenter );
|
|
label->tqsetSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Maximum );
|
|
|
|
box->show(); // will show its tqchildren too
|
|
|
|
Directory *tree = new Directory( disk.mount.local8Bit() );
|
|
tree->append( free, disk.free );
|
|
tree->append( used, disk.used );
|
|
|
|
map->create( tree ); //must be done when visible
|
|
|
|
connect( map, TQT_SIGNAL(activated( const KURL& )), TQT_SIGNAL(activated( const KURL& )) );
|
|
}
|
|
}
|
|
|
|
|
|
#if defined(_OS_LINUX_)
|
|
#define DF_ARGS "-kT"
|
|
#else
|
|
#define DF_ARGS "-k"
|
|
#define NO_FS_TYPE
|
|
#endif
|
|
|
|
|
|
DiskList::DiskList()
|
|
{
|
|
//FIXME bug prone
|
|
setenv( "LANG", "en_US", 1 );
|
|
setenv( "LC_ALL", "en_US", 1 );
|
|
setenv( "LC_MESSAGES", "en_US", 1 );
|
|
setenv( "LC_TYPE", "en_US", 1 );
|
|
setenv( "LANGUAGE", "en_US", 1 );
|
|
|
|
char buffer[4096];
|
|
FILE *df = popen( "env LC_ALL=POSIX df " DF_ARGS, "r" );
|
|
int const N = fread( (void*)buffer, sizeof(char), 4096, df );
|
|
buffer[ N ] = '\0';
|
|
pclose( df );
|
|
|
|
TQString output = TQString::fromLocal8Bit( buffer );
|
|
TQTextStream t( &output, IO_ReadOnly );
|
|
TQString const BLANK( TQChar(' ') );
|
|
|
|
while (!t.atEnd()) {
|
|
TQString s = t.readLine();
|
|
s = s.simplifyWhiteSpace();
|
|
|
|
if (s.isEmpty())
|
|
continue;
|
|
|
|
if (s.find( BLANK ) < 0) // devicename was too long, rest in next line
|
|
if (!t.eof()) { // just appends the next line
|
|
TQString v = t.readLine();
|
|
s = s.append( v.latin1() );
|
|
s = s.simplifyWhiteSpace();
|
|
}
|
|
|
|
Disk disk;
|
|
disk.device = s.left( s.find( BLANK ) );
|
|
s = s.remove( 0, s.find( BLANK ) + 1 );
|
|
|
|
#ifndef NO_FS_TYPE
|
|
disk.type = s.left( s.find( BLANK ) );
|
|
s = s.remove( 0, s.find( BLANK ) + 1 );
|
|
#endif
|
|
|
|
int n = s.find( BLANK );
|
|
disk.size = s.left( n ).toInt();
|
|
s = s.remove( 0, n + 1 );
|
|
|
|
n = s.find( BLANK );
|
|
disk.used = s.left( n ).toInt();
|
|
s = s.remove( 0, n + 1 );
|
|
|
|
n = s.find( BLANK );
|
|
disk.free = s.left( n ).toInt();
|
|
s = s.remove( 0, n + 1 );
|
|
|
|
s = s.remove( 0, s.find( BLANK ) + 1 ); // delete the capacity 94%
|
|
disk.mount = s;
|
|
|
|
disk.guessIconName();
|
|
|
|
*this += disk;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
Disk::guessIconName()
|
|
{
|
|
if( mount.contains( "cdrom", false ) ) icon = "cdrom";
|
|
else if( device.contains( "cdrom", false ) ) icon = "cdrom";
|
|
else if( mount.contains( "writer", false ) ) icon = "cdwriter";
|
|
else if( device.contains( "writer", false ) ) icon = "cdwriter";
|
|
else if( mount.contains( "mo", false ) ) icon = "mo";
|
|
else if( device.contains( "mo", false ) ) icon = "mo";
|
|
else if( device.contains( "fd", false ) ) {
|
|
if( device.contains( "360", false ) ) icon = "5floppy";
|
|
if( device.contains( "1200", false ) ) icon = "5floppy";
|
|
else
|
|
icon = "3floppy";
|
|
}
|
|
else if( mount.contains( "floppy", false ) ) icon = "3floppy";
|
|
else if( mount.contains( "zip", false ) ) icon = "zip";
|
|
else if( type.contains( "nfs", false ) ) icon = "nfs";
|
|
else
|
|
icon = "hdd";
|
|
|
|
icon += /*mounted() ? */"_mount"/* : "_unmount"*/;
|
|
}
|