⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panelpopup.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
字号:
#include "../krusader.h"#include "panelpopup.h"#include "../kicons.h"#include "../Dialogs/krsqueezedtextlabel.h"#include "../defaults.h"#include "../krslots.h"#include "panelfunc.h"#include <qtooltip.h>#include <qbuttongroup.h>#include <qtoolbutton.h>#include <kfiletreeview.h>#include <klocale.h>#include <qcursor.h>#include <qlayout.h>#include <qlabel.h>#include <qheader.h>#include <krview.h>#include <krviewitem.h>#include <klineedit.h>#include <kio/jobclasses.h>#include "../KViewer/kimagefilepreview.h"#include "../KViewer/panelviewer.h"#include "../KViewer/diskusageviewer.h"PanelPopup::PanelPopup( QSplitter *parent, bool left ) : QWidget( parent ), 	_left( left ), _hidden(true), stack( 0 ), viewer( 0 ), pjob( 0 ), splitterSizes() {	splitter = parent;	QGridLayout * layout = new QGridLayout(this, 1, 1);		// loading the splitter sizes	krConfig->setGroup( "Private" );	if( left )		splitterSizes = krConfig->readIntListEntry( "Left PanelPopup Splitter Sizes" );	else		splitterSizes = krConfig->readIntListEntry( "Right PanelPopup Splitter Sizes" );		if( splitterSizes.count() < 2 ) {		splitterSizes.clear();		splitterSizes.push_back( 100 );		splitterSizes.push_back( 100 );	}		// create the label+buttons setup	dataLine = new KrSqueezedTextLabel(this);	dataLine->setText("blah blah");	connect( dataLine, SIGNAL( clicked() ), this, SLOT( setFocus() ) );	krConfig->setGroup( "Look&Feel" );   dataLine->setFont( krConfig->readFontEntry( "Filelist Font", _FilelistFont ) );   // --- hack: setup colors to be the same as an inactive panel	dataLine->setBackgroundMode( PaletteBackground );	QPalette q( dataLine->palette() );   q.setColor( QColorGroup::Foreground, KGlobalSettings::textColor() );   q.setColor( QColorGroup::Background, KGlobalSettings::baseColor() );   dataLine->setPalette( q );   dataLine->setFrameStyle( QFrame::Box | QFrame::Raised );   dataLine->setLineWidth( 1 );		// a nice 3D touch :-)   int sheight = QFontMetrics( dataLine->font() ).height() + 4;   dataLine->setMaximumHeight( sheight );		btns = new QButtonGroup(this);	btns->setExclusive(true);	btns->hide();	// it should be invisible	connect(btns, SIGNAL(clicked(int)), this, SLOT(tabSelected(int)));		treeBtn = new QToolButton(this);	QToolTip::add(treeBtn, i18n("Tree Panel: a tree view of the local file system"));	treeBtn->setPixmap(krLoader->loadIcon( "view_tree", KIcon::Toolbar, 16 ));	treeBtn->setFixedSize(20, 20);	treeBtn->setToggleButton(true);	btns->insert(treeBtn, Tree);			previewBtn = new QToolButton(this);	QToolTip::add(previewBtn, i18n("Preview Panel: display a preview of the current file"));	previewBtn->setPixmap(krLoader->loadIcon( "thumbnail", KIcon::Toolbar, 16 ));	previewBtn->setFixedSize(20, 20);	previewBtn->setToggleButton(true);	btns->insert(previewBtn, Preview);		quickBtn = new QToolButton(this);	QToolTip::add(quickBtn, i18n("Quick Panel: quick way to perform actions"));	quickBtn->setPixmap(krLoader->loadIcon( "misc", KIcon::Toolbar, 16 ));	quickBtn->setFixedSize(20, 20);	quickBtn->setToggleButton(true);	btns->insert(quickBtn, QuickPanel);	viewerBtn = new QToolButton(this);	QToolTip::add(viewerBtn, i18n("View Panel: view the current file"));	viewerBtn->setPixmap(krLoader->loadIcon( "viewmag", KIcon::Toolbar, 16 ));	viewerBtn->setFixedSize(20, 20);	viewerBtn->setToggleButton(true);	btns->insert(viewerBtn, View);				duBtn = new QToolButton(this);	QToolTip::add(duBtn, i18n("Disk Usage Panel: view the usage of a directory"));	duBtn->setPixmap(krLoader->loadIcon( "kr_diskusage", KIcon::Toolbar, 16 ));	duBtn->setFixedSize(20, 20);	duBtn->setToggleButton(true);	btns->insert(duBtn, DskUsage);				layout->addWidget(dataLine,0,0);	layout->addWidget(treeBtn,0,1);	layout->addWidget(previewBtn,0,2);	layout->addWidget(quickBtn,0,3);	layout->addWidget(viewerBtn,0,4);	layout->addWidget(duBtn,0,5);		// create a widget stack on which to put the parts   stack = new QWidgetStack( this );   // create the tree part ----------	tree = new KFileTreeView( stack );	tree->setAcceptDrops(true);	connect(tree, SIGNAL(dropped (QWidget *, QDropEvent *, KURL::List &, KURL &)), 		this, SLOT(slotDroppedOnTree(QWidget *, QDropEvent *, KURL::List&, KURL& )));   stack->addWidget( tree, Tree );   tree->addColumn( "" );	// add ~	tree->addBranch( QDir::home().absPath(), i18n("Home"));	tree->setDirOnlyMode( tree->branch(i18n("Home")), true);	tree->branch(i18n("Home"))->setChildRecurse(false);	// add /	tree->addBranch( "/", i18n( "Root" ) );   tree->setDirOnlyMode( tree->branch( i18n( "Root" ) ), true );	tree->setShowFolderOpenPixmap(true);	tree->branch( i18n( "Root" ) ) ->setChildRecurse(false);	tree->branch( i18n( "Root" ) ) ->setOpen( true );   tree->header() ->setHidden( true );	connect(tree, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(treeSelection(QListViewItem*)));   // start listing the tree   tree->branch( i18n( "Root" ) ) ->root();	tree->branch( i18n( "Home" ) ) ->root();   // create the quickview part ------	viewer = new KrusaderImageFilePreview(stack);   stack->addWidget( viewer, Preview );	// create the panelview		panelviewer = new PanelViewer(stack);	stack->addWidget(panelviewer, View);	connect(panelviewer, SIGNAL(openURLRequest(const KURL &)), this, SLOT(handleOpenURLRequest(const KURL &)));		// create the disk usage view		diskusage = new DiskUsageViewer( stack );	diskusage->setStatusLabel( dataLine, i18n("Disk Usage: ") );	stack->addWidget( diskusage, DskUsage );	connect(diskusage, SIGNAL(openURLRequest(const KURL &)), this, SLOT(handleOpenURLRequest(const KURL &)));		// create the quick-panel part ----		QWidget *quickPanel = new QWidget(stack);	QGridLayout *qlayout = new QGridLayout(quickPanel);		// --- quick select	QLabel *selectLabel = new QLabel(i18n("Quick Select"), quickPanel);	quickSelectCombo = new KComboBox( quickPanel );	quickSelectCombo->setEditable( true );	krConfig->setGroup( "Private" );	QStrList lst;	int i = krConfig->readListEntry( "Predefined Selections", lst );	if ( i > 0 )		quickSelectCombo->insertStrList( lst );	quickSelectCombo->setCurrentText( "*" );	quickSelectCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );	connect(quickSelectCombo, SIGNAL(returnPressed(const QString& )),		this, SLOT(quickSelect(const QString& )));		QToolButton *qselectBtn = new QToolButton(quickPanel);	qselectBtn->setPixmap(krLoader->loadIcon( "kr_selectall", KIcon::Toolbar, 16 ));	qselectBtn->setFixedSize(20, 20);	QToolTip::add( qselectBtn, i18n("apply the selection") );	connect(qselectBtn, SIGNAL(clicked()), this, SLOT(quickSelect()));	QToolButton *qstoreBtn = new QToolButton(quickPanel);	qstoreBtn->setPixmap(krLoader->loadIcon( "filesave", KIcon::Toolbar, 16 ));	qstoreBtn->setFixedSize(20, 20);	QToolTip::add( qstoreBtn, i18n("store the current selection") );	connect(qstoreBtn, SIGNAL(clicked()), this, SLOT(quickSelectStore()));		QToolButton *qsettingsBtn = new QToolButton(quickPanel);	qsettingsBtn->setPixmap(krLoader->loadIcon( "configure", KIcon::Toolbar, 16 ));	qsettingsBtn->setFixedSize(20, 20);	QToolTip::add( qsettingsBtn, i18n("select group dialog") );	connect(qsettingsBtn, SIGNAL(clicked()), krSelect, SLOT(activate()));	qlayout->addWidget(selectLabel,0,0);	qlayout->addWidget(quickSelectCombo,0,1);	qlayout->addWidget(qselectBtn,0,2);	qlayout->addWidget(qstoreBtn,0,3);	qlayout->addWidget(qsettingsBtn,0,4);	stack->addWidget(quickPanel, QuickPanel);		// -------- finish the layout (General one)	layout->addMultiCellWidget(stack,1,1,0,5);	   // set the wanted widget	// ugly: are we left or right?	int id;	krConfig->setGroup("Startup");	if (left) {		id = krConfig->readNumEntry("Left Panel Popup", _LeftPanelPopup);	} else {		id = krConfig->readNumEntry("Right Panel Popup", _RightPanelPopup);		}	btns->setButton(id);	hide(); // for not to open the 3rd hand tool at start (selecting the last used tab)	tabSelected(id);}PanelPopup::~PanelPopup() {}void PanelPopup::show() {  QWidget::show();  if( _hidden )    splitter->setSizes( splitterSizes );  _hidden = false;  tabSelected( stack->id(stack->visibleWidget()) );}void PanelPopup::hide() {  if( !_hidden )    splitterSizes = splitter->sizes();  QWidget::hide();  _hidden = true;  if (stack->id(stack->visibleWidget()) == View) panelviewer->closeURL();  if (stack->id(stack->visibleWidget()) == DskUsage) diskusage->closeURL();}void PanelPopup::setFocus() {	switch ( stack->id( stack->visibleWidget() ) ) {	case Preview:		if( !isHidden() )			viewer->setFocus();		break;	case View:		if( !isHidden() && panelviewer->part() && panelviewer->part()->widget() )			panelviewer->part()->widget()->setFocus();		break;	case DskUsage:		if( !isHidden() && diskusage->getWidget() && diskusage->getWidget()->visibleWidget() )			diskusage->getWidget()->visibleWidget()->setFocus();		break;	case Tree:		if( !isHidden() )			tree->setFocus();		break;	case QuickPanel:		if( !isHidden() )			quickSelectCombo->setFocus();		break;	}}void PanelPopup::saveSizes() {  krConfig->setGroup( "Private" );  if( !isHidden() )    splitterSizes = splitter->sizes();  if( _left )    krConfig->writeEntry( "Left PanelPopup Splitter Sizes", splitterSizes );  else    krConfig->writeEntry( "Right PanelPopup Splitter Sizes", splitterSizes );}void PanelPopup::handleOpenURLRequest(const KURL &url) {  if (KMimeType::findByURL(url.url())->name() == "inode/directory") ACTIVE_PANEL->func->openUrl(url);}void PanelPopup::tabSelected( int id ) {	KURL url = "";	if ( ACTIVE_PANEL && ACTIVE_PANEL->func && ACTIVE_PANEL->func->files() && ACTIVE_PANEL->view ) {		url = ACTIVE_PANEL->func->files()->vfs_getFile( ACTIVE_PANEL->view->getCurrentItem());	}		stack->raiseWidget( id );		// if tab is tree, set something logical in the data line	switch (id) {		case Tree:			dataLine->setText( i18n("Tree:") );			if( !isHidden() )				tree->setFocus();			break;		case Preview:			dataLine->setText( i18n("Preview:") );			update(url);			break;		case QuickPanel:			dataLine->setText( i18n("Quick Select:") );			if( !isHidden() )				quickSelectCombo->setFocus();			break;		case View:			dataLine->setText( i18n("View:") );			update(url);			if( !isHidden() && panelviewer->part() && panelviewer->part()->widget() )				panelviewer->part()->widget()->setFocus();			break;		case DskUsage:			dataLine->setText( i18n("Disk Usage:") );			update(url);			if( !isHidden() && diskusage->getWidget() && diskusage->getWidget()->visibleWidget() )				diskusage->getWidget()->visibleWidget()->setFocus();			break;	}	if (id != View) panelviewer->closeURL();  }// decide which part to update, if at allvoid PanelPopup::update( KURL url ) {   if ( isHidden() || url.url()=="" ) return ; // failsafe   KFileItemList lst;   switch ( stack->id( stack->visibleWidget() ) ) {      case Preview:			viewer->showPreview(url);			dataLine->setText( i18n("Preview: ")+url.fileName() );			break;      case View:			panelviewer->openURL(url);			dataLine->setText( i18n("View: ")+url.fileName() );			break;      case DskUsage:			if( url.fileName() == ".." )				url.setFileName( "" );			if (KMimeType::findByURL(url.url())->name() != "inode/directory")				url = url.upURL();			dataLine->setText( i18n("Disk Usage: ")+url.fileName() );			diskusage->openURL(url);         break;      case Tree:  // nothing to do               break;   }}// ------------------- treevoid PanelPopup::treeSelection(QListViewItem*) {	emit selection(tree->currentURL());	//emit hideMe();}// ------------------- quick panelvoid PanelPopup::quickSelect() {	SLOTS->markGroup(quickSelectCombo->currentText(), true);}void PanelPopup::quickSelect(const QString &mask) {	SLOTS->markGroup(mask, true);}void PanelPopup::quickSelectStore() {        krConfig->setGroup( "Private" );        QStringList lst = krConfig->readListEntry( "Predefined Selections" );        if ( lst.find(quickSelectCombo->currentText()) == lst.end() )           lst.append( quickSelectCombo->currentText() );        krConfig->writeEntry( "Predefined Selections", lst );}void PanelPopup::slotDroppedOnTree(QWidget *widget, QDropEvent *e, KURL::List &lst, KURL &) {	// KFileTreeView is buggy: when dropped, it might not give us the correct	// destination, but actually, it's parent. workaround: don't use	// the destination in the signal, but take the current item	KURL dest = tree->currentURL();		// ask the user what to do: copy, move or link?   QPopupMenu popup( this );   popup.insertItem( i18n( "Copy Here" ), 1 );   popup.insertItem( i18n( "Move Here" ), 2 );   popup.insertItem( i18n( "Link Here" ), 3 );   popup.insertItem( i18n( "Cancel" ), 4 );	QPoint tmp = widget->mapToGlobal( e->pos() );   int result = popup.exec( QCursor::pos() );		KIO::CopyJob *job;   switch ( result ) {         case 1 :			job = KIO::copy(lst, dest, true);         break;         case 2 :			job = KIO::move(lst, dest, true);         break;         case 3 :			job = KIO::link(lst, dest, true);         break;         case - 1 :         // user pressed outside the menu         case 4:         return ; // cancel was pressed;   }}#include "panelpopup.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -