📄 filebrowser.cpp
字号:
#else //#### revise set perms under WINNT?#endif return success;}void FileView::cut(){ int err; // ##### a better inmplementation might be to rename the CUT file // ##### to ".QPE-FILEBROWSER-MOVING" rather than copying it. QString cmd, dest, basename, cd = "/tmp/qpemoving"; endRenaming(); QStringList newflist; newflist.clear(); cmd = "rm -rf " + cd; system ( (const char *) cmd ); cmd = "mkdir " + cd; system( (const char *) cmd );// get the names of the files to cut FileItem * item; if((item = (FileItem *) firstChild()) == 0) return; flist.clear(); while( item ){ if( item->isSelected() /*&& !item->isDir()*/ ){ flist += item->getFilePath(); } item = (FileItem *) item->nextSibling(); }// move these files into a tmp dir for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) { basename = (*it).mid((*it).findRev("/") + 1, (*it).length()); dest = cd + "/" + basename; newflist += dest; cmd = "/bin/mv -f \"" + (*it) +"\" " + "\"" + dest + "\""; err = system( (const char *) cmd ); if ( err != 0 ) { QMessageBox::warning( this, tr("Cut file"), tr("Cut failed!"), tr("OK") ); break; } else { updateDir(); QListViewItem * im = firstChild(); basename = dest.mid( dest.findRev("/") + 1, dest.length() ); while( im ){ if( im->text(0) == basename ){ setCurrentItem( im ); ensureItemVisible( im ); break; } im = im->nextSibling(); } } } // update the filelist to point to tmp dir so paste works nicely flist = newflist;}void FileView::del(){ FileItem * i; QStringList fl; QString cmd; int err; if((i = (FileItem *) firstChild()) == 0) return; while( i ){ if( i->isSelected() ){ fl += i->getFilePath(); } i = (FileItem *) i->nextSibling(); } if( fl.count() < 1 ) return; if( QMessageBox::warning( this, tr("Delete"), tr("Are you sure?"), tr("Yes"), tr("No") ) == 0) { // // Dependant upon the "rm" command - will probably have to be replaced // for ( QStringList::Iterator it = fl.begin(); it != fl.end(); ++it ) { cmd = "/bin/rm -rf \"" + (*it) + "\""; err = system( (const char *) cmd ); if ( err != 0 ) { QMessageBox::warning( this, tr("Delete"), tr("Delete failed!"), tr("OK") ); break; } } updateDir(); }}void FileView::newFolder(){ int t = 1; FileItem * i; QString nd = currentDir + "/NewFolder"; endRenaming(); while( QFile( nd ).exists() ){ nd.sprintf( "%s/NewFolder (%d)", (const char *) currentDir, t++ ); } QDir d; if(d.mkdir( nd) == FALSE){ QMessageBox::warning( this, tr( "New folder" ), tr( "Folder creation failed!" ), tr( "OK" ) ); return; } updateDir(); if((i = (FileItem *) firstChild()) == 0) return; while( i ){ if( i->isDir() && ( i->getFilePath() == nd ) ){ setCurrentItem( i ); rename(); break; } i = (FileItem *) i->nextSibling(); }}void FileView::viewAsText(){ FileItem * i = (FileItem *) currentItem(); Config cfg(Service::appConfig("View/text/plain"),Config::File); cfg.setGroup("Standard"); const char* msg = "setDocument(QString)"; if ( cfg.readNumEntry("Version") > 100 ) msg = "viewFile(QString)"; QCopEnvelope e(Service::channel("View/text/*"), msg); e << i->getFilePath();}void FileView::itemClicked( QListViewItem * i){ FileItem * t = (FileItem *) i; if( t == NULL ) return; if( t->isDir() ){ setDir( t->getFilePath() ); }}void FileView::itemDblClicked( QListViewItem * i){ FileItem * t = (FileItem *) i; if(t == NULL) return; if(t->launch() == -1){ QMessageBox::warning( this, tr( "Launch Application" ), tr( "Launch failed!" ), tr( "OK" ) ); }}void FileView::parentDir(){ endRenaming(); setDir( currentDir + "./.." );}void FileView::lastDir(){ endRenaming(); if( dirHistory.count() == 0 ) return; QString newDir = dirHistory.last(); dirHistory.remove( dirHistory.last() ); generateDir( newDir );}void FileView::contentsMousePressEvent( QMouseEvent * e ){ QListView::contentsMousePressEvent( e ); menuTimer.start( 750, TRUE );}void FileView::contentsMouseReleaseEvent( QMouseEvent * e ){ QListView::contentsMouseReleaseEvent( e ); menuTimer.stop();}void FileView::cancelMenuTimer(){ if( menuTimer.isActive() ) menuTimer.stop();}void FileView::addToDocuments(){ FileItem * i = (FileItem *) currentItem(); DocLnk f; QString n = i->text(0); n.replace(QRegExp("\\..*"),""); f.setName( n ); f.setFile( i->getFilePath() ); f.writeLink();}void FileView::run(){ FileItem * i = (FileItem *) currentItem(); i->launch();}void FileView::showFileMenu(){ FileItem * i = (FileItem *) currentItem(); if ( !i ) return; QPopupMenu * m = new QPopupMenu( this ); MimeType mt(i->getFilePath()); const AppLnk* app = mt.application(); // Opening .desktop files is too ambiguous - disabled. // If the user *really* wants to touch those files, and take // responsibility for whatever mess they make, they can use Terminal. if ( !i->isDir() && i->getFilePath().right(8) != ".desktop" ) { m->insertItem( tr( "Add to Documents" ), this, SLOT( addToDocuments() ) ); m->insertSeparator(); if ( app ) m->insertItem( app->pixmap(), tr("Open in %1","eg. text editor").arg(app->name()), this, SLOT( run() ) ); else if( i->isExecutable() ) m->insertItem( Resource::loadIconSet( i->text( 0 ) ), tr( "Run" ), this, SLOT( run() ) ); m->insertItem( Resource::loadIconSet( "txt" ), tr( "View as text" ), this, SLOT( viewAsText() ) ); m->insertSeparator(); } m->insertItem( tr( "Rename" ), this, SLOT( rename() ) ); m->insertItem( Resource::loadIconSet("cut"), tr( "Cut" ), this, SLOT( cut() ) ); m->insertItem( Resource::loadIconSet("copy"), tr( "Copy" ), this, SLOT( copy() ) ); m->insertItem( Resource::loadIconSet("paste"), tr( "Paste" ), this, SLOT( paste() ) ); m->insertItem( tr( "Delete" ), this, SLOT( del() ) ); m->insertSeparator(); m->insertItem( tr( "Select all" ), this, SLOT( selectAll() ) ); m->insertItem( tr( "Deselect all" ), this, SLOT( deselectAll() ) ); m->popup( QCursor::pos() );}//// Load and scale the pixmaps that we load manually, according to the// iconsize that Applnk tells us. We trust the size returned by AppLnk,// as it's the same size that MimeTypeData uses.//void FileView::scaleIcons(void){ int iconsize = AppLnk::smallIconSize(); QImage img; pmLockedFolder = new QPixmap(); pmFolder = new QPixmap(); pmLocked = new QPixmap(); pmLibrary = new QPixmap(); pmUnknown = new QPixmap(); img = Resource::loadImage("lockedfolder").smoothScale(iconsize, iconsize); pmLockedFolder->convertFromImage(img); img = Resource::loadImage("folder").smoothScale(iconsize, iconsize); pmFolder->convertFromImage(img); img = Resource::loadImage("locked").smoothScale(iconsize, iconsize); pmLocked->convertFromImage(img); img = Resource::loadImage("library").smoothScale(iconsize, iconsize); pmLibrary->convertFromImage(img); img = Resource::loadImage("UnknownDocument-14"). smoothScale(iconsize, iconsize); pmUnknown->convertFromImage(img);}//// FileBrowser//FileBrowser::FileBrowser( QWidget * parent, const char * name, WFlags f ) : QMainWindow( parent, name, f ){ init( QDir::current().canonicalPath() );}FileBrowser::FileBrowser( const QString & dir, QWidget * parent, const char * name, WFlags f ) : QMainWindow( parent, name, f ){ init( dir );}void FileBrowser::init(const QString & dir){ setCaption( tr("File Manager") ); setIcon( Resource::loadPixmap( "FileBrowser" ) ); setBackgroundMode( PaletteButton ); fileView = new FileView( dir, this ); fileView->setAllColumnsShowFocus( TRUE ); setCentralWidget( fileView ); setToolBarsMovable( FALSE ); QPEToolBar* toolBar = new QPEToolBar( this ); toolBar->setHorizontalStretchable( TRUE ); QPEMenuBar* menuBar = new QPEMenuBar( toolBar ); dirMenu = new QPopupMenu( this ); menuBar->insertItem( tr( "Dir" ), dirMenu ); sortMenu = new QPopupMenu( this ); menuBar->insertItem( tr( "Sort" ), sortMenu ); sortMenu->insertItem( tr( "by Name "), this, SLOT( sortName() ) ); sortMenu->insertItem( tr( "by Size "), this, SLOT( sortSize() ) ); sortMenu->insertItem( tr( "by Date "), this, SLOT( sortDate() ) ); sortMenu->insertItem( tr( "by Type "), this, SLOT( sortType() ) ); sortMenu->insertSeparator(); sortMenu->insertItem( tr( "Ascending" ), this, SLOT( updateSorting() ) ); sortMenu->setItemChecked( sortMenu->idAt( 5 ), TRUE ); sortMenu->setItemChecked( sortMenu->idAt( 0 ), TRUE ); toolBar = new QPEToolBar( this ); lastAction = new QAction( tr("Previous dir"), Resource::loadIconSet( "back" ), QString::null, 0, this, 0 ); connect( lastAction, SIGNAL( activated() ), fileView, SLOT( lastDir() ) ); lastAction->addTo( toolBar ); lastAction->setEnabled( FALSE ); lastAction->setWhatsThis( tr("Changes location to the previous directory") ); upAction = new QAction( tr("Parent dir"), Resource::loadIconSet( "up" ), QString::null, 0, this, 0 ); connect( upAction, SIGNAL( activated() ), fileView, SLOT( parentDir() ) ); upAction->addTo( toolBar ); upAction->setWhatsThis( tr("Changes location to the parent directory") ); QAction *a = new QAction( tr("New folder"), Resource::loadIconSet( "newfolder" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), fileView, SLOT( newFolder() ) ); a->addTo( toolBar ); a->setWhatsThis( tr("Creates a new folder") ); a = new QAction( tr("Cut"), Resource::loadIconSet( "cut" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), fileView, SLOT( cut() ) ); a->addTo( toolBar ); a->setWhatsThis( tr("Deletes the selected item") ); a = new QAction( tr("Copy"), Resource::loadIconSet( "copy" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), fileView, SLOT( copy() ) ); a->addTo( toolBar ); a->setWhatsThis( tr("Copies the selected item") ); pasteAction = new QAction( tr("Paste"), Resource::loadIconSet( "paste" ), QString::null, 0, this, 0 ); connect( pasteAction, SIGNAL( activated() ), fileView, SLOT( paste() ) ); pasteAction->addTo( toolBar ); pasteAction->setWhatsThis( tr("Paste the contents of the last copy or cut operation") ); connect( fileView, SIGNAL( dirChanged() ), SLOT( updateDirMenu() ) ); updateDirMenu();#ifndef QT_NO_COP QCopChannel* pcmciaChannel = new QCopChannel( "QPE/Card", this ); connect( pcmciaChannel, SIGNAL(received(const QCString &, const QByteArray &)), this, SLOT(pcmciaMessage( const QCString &, const QByteArray &)) );#endif}void FileBrowser::pcmciaMessage( const QCString &msg, const QByteArray &){ if ( msg == "mtabChanged()" ) { // ## Only really needed if current dir is on a card fileView->updateDir(); }}void FileBrowser::dirSelected( int id ){ int i = 0, j; QString dir; // Bulid target dir from menu while( (j = dirMenu->idAt( i )) != id ){ dir += dirMenu->text( j ).stripWhiteSpace(); if( dirMenu->text( j ) != "/" ) dir += "/"; i++; } dir += dirMenu->text( dirMenu->idAt( i ) ).stripWhiteSpace(); fileView->setDir( dir );}void FileBrowser::updateDirMenu(){ QString spc, cd = fileView->cd(); QStringList l = QStringList::split( "/", cd ); int i = 0; dirMenu->clear(); dirMenu->insertItem( tr( "/" ), this, SLOT( dirSelected(int) ) ); for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) { spc.fill( ' ', i++); dirMenu->insertItem( spc + (*it), this, SLOT( dirSelected(int) ) ); } dirMenu->setItemChecked( dirMenu->idAt( l.count() ), TRUE ); lastAction->setEnabled( fileView->history().count() != 0 ); upAction->setEnabled( cd != "/" );}void FileBrowser::sortName(){ fileView->setSorting( 0, sortMenu->isItemChecked( sortMenu->idAt( 5 ) ) ); fileView->sort(); sortMenu->setItemChecked( sortMenu->idAt( 0 ), TRUE ); sortMenu->setItemChecked( sortMenu->idAt( 1 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 2 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 3 ), FALSE );}void FileBrowser::sortSize(){ fileView->setSorting( 1, sortMenu->isItemChecked( sortMenu->idAt( 5 ) ) ); fileView->sort(); sortMenu->setItemChecked( sortMenu->idAt( 0 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 1 ), TRUE ); sortMenu->setItemChecked( sortMenu->idAt( 2 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 3 ), FALSE );}void FileBrowser::sortDate(){ fileView->setSorting( 2, sortMenu->isItemChecked( sortMenu->idAt( 5 ) ) ); fileView->sort(); sortMenu->setItemChecked( sortMenu->idAt( 0 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 1 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 2 ), TRUE ); sortMenu->setItemChecked( sortMenu->idAt( 3 ), FALSE );}void FileBrowser::sortType(){ fileView->setSorting( 3, sortMenu->isItemChecked( sortMenu->idAt( 5 ) ) ); fileView->sort(); sortMenu->setItemChecked( sortMenu->idAt( 0 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 1 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 2 ), FALSE ); sortMenu->setItemChecked( sortMenu->idAt( 3 ), TRUE );}void FileBrowser::updateSorting(){ sortMenu->setItemChecked( sortMenu->idAt( 5 ), !sortMenu->isItemChecked( sortMenu->idAt( 5 ) ) ); if ( sortMenu->isItemChecked( sortMenu->idAt( 0 ) ) ) sortName(); else if ( sortMenu->isItemChecked( sortMenu->idAt( 1 ) ) ) sortSize(); else if ( sortMenu->isItemChecked( sortMenu->idAt( 2 ) ) ) sortDate(); else sortType();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -