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.
krusader/krusader/Panel/panelpopup.cpp

401 lines
13 KiB

#include "../krusader.h"
#include "panelpopup.h"
#include "../kicons.h"
#include "../Dialogs/krsqueezedtextlabel.h"
#include "../defaults.h"
#include "../krslots.h"
#include "panelfunc.h"
#include <tqtooltip.h>
#include <tqbuttongroup.h>
#include <tqtoolbutton.h>
#include <tdefiletreeview.h>
#include <tdelocale.h>
#include <tqcursor.h>
#include <tqlayout.h>
#include <tqlabel.h>
#include <tqheader.h>
#include <krview.h>
#include <krviewitem.h>
#include <klineedit.h>
#include <tdeio/jobclasses.h>
#include "../KViewer/kimagefilepreview.h"
#include "../KViewer/panelviewer.h"
#include "../KViewer/diskusageviewer.h"
PanelPopup::PanelPopup( TQSplitter *parent, bool left ) : TQWidget( parent ),
_left( left ), _hidden(true), stack( 0 ), viewer( 0 ), pjob( 0 ), splitterSizes() {
splitter = parent;
TQGridLayout * layout = new TQGridLayout(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, TQ_SIGNAL( clicked() ), this, TQ_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 );
TQPalette q( dataLine->palette() );
q.setColor( TQColorGroup::Foreground, TDEGlobalSettings::textColor() );
q.setColor( TQColorGroup::Background, TDEGlobalSettings::baseColor() );
dataLine->setPalette( q );
dataLine->setFrameStyle( TQFrame::Box | TQFrame::Raised );
dataLine->setLineWidth( 1 ); // a nice 3D touch :-)
int sheight = TQFontMetrics( dataLine->font() ).height() + 4;
dataLine->setMaximumHeight( sheight );
btns = new TQButtonGroup(this);
btns->setExclusive(true);
btns->hide(); // it should be invisible
connect(btns, TQ_SIGNAL(clicked(int)), this, TQ_SLOT(tabSelected(int)));
treeBtn = new TQToolButton(this);
TQToolTip::add(treeBtn, i18n("Tree Panel: a tree view of the local file system"));
treeBtn->setPixmap(krLoader->loadIcon( "view_tree", TDEIcon::Toolbar, 16 ));
treeBtn->setFixedSize(20, 20);
treeBtn->setToggleButton(true);
btns->insert(treeBtn, Tree);
previewBtn = new TQToolButton(this);
TQToolTip::add(previewBtn, i18n("Preview Panel: display a preview of the current file"));
previewBtn->setPixmap(krLoader->loadIcon( "thumbnail", TDEIcon::Toolbar, 16 ));
previewBtn->setFixedSize(20, 20);
previewBtn->setToggleButton(true);
btns->insert(previewBtn, Preview);
quickBtn = new TQToolButton(this);
TQToolTip::add(quickBtn, i18n("Quick Panel: quick way to perform actions"));
quickBtn->setPixmap(krLoader->loadIcon( "misc", TDEIcon::Toolbar, 16 ));
quickBtn->setFixedSize(20, 20);
quickBtn->setToggleButton(true);
btns->insert(quickBtn, QuickPanel);
viewerBtn = new TQToolButton(this);
TQToolTip::add(viewerBtn, i18n("View Panel: view the current file"));
viewerBtn->setPixmap(krLoader->loadIcon( "viewmag", TDEIcon::Toolbar, 16 ));
viewerBtn->setFixedSize(20, 20);
viewerBtn->setToggleButton(true);
btns->insert(viewerBtn, View);
duBtn = new TQToolButton(this);
TQToolTip::add(duBtn, i18n("Disk Usage Panel: view the usage of a directory"));
duBtn->setPixmap(krLoader->loadIcon( "kr_diskusage", TDEIcon::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 TQWidgetStack( this );
// create the tree part ----------
tree = new KFileTreeView( stack );
tree->setAcceptDrops(true);
connect(tree, TQ_SIGNAL(dropped (TQWidget *, TQDropEvent *, KURL::List &, KURL &)),
this, TQ_SLOT(slotDroppedOnTree(TQWidget *, TQDropEvent *, KURL::List&, KURL& )));
stack->addWidget( tree, Tree );
tree->addColumn( "" );
// add ~
tree->addBranch( TQDir::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, TQ_SIGNAL(doubleClicked(TQListViewItem*)), this, TQ_SLOT(treeSelection(TQListViewItem*)));
// 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, TQ_SIGNAL(openURLRequest(const KURL &)), this, TQ_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, TQ_SIGNAL(openURLRequest(const KURL &)), this, TQ_SLOT(handleOpenURLRequest(const KURL &)));
// create the quick-panel part ----
TQWidget *quickPanel = new TQWidget(stack);
TQGridLayout *qlayout = new TQGridLayout(quickPanel);
// --- quick select
TQLabel *selectLabel = new TQLabel(i18n("Quick Select"), quickPanel);
quickSelectCombo = new KComboBox( quickPanel );
quickSelectCombo->setEditable( true );
krConfig->setGroup( "Private" );
TQStrList lst;
int i = krConfig->readListEntry( "Predefined Selections", lst );
if ( i > 0 )
quickSelectCombo->insertStrList( lst );
quickSelectCombo->setCurrentText( "*" );
quickSelectCombo->setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Preferred ) );
connect(quickSelectCombo, TQ_SIGNAL(returnPressed(const TQString& )),
this, TQ_SLOT(quickSelect(const TQString& )));
TQToolButton *qselectBtn = new TQToolButton(quickPanel);
qselectBtn->setPixmap(krLoader->loadIcon( "kr_selectall", TDEIcon::Toolbar, 16 ));
qselectBtn->setFixedSize(20, 20);
TQToolTip::add( qselectBtn, i18n("apply the selection") );
connect(qselectBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(quickSelect()));
TQToolButton *qstoreBtn = new TQToolButton(quickPanel);
qstoreBtn->setPixmap(krLoader->loadIcon( "document-save", TDEIcon::Toolbar, 16 ));
qstoreBtn->setFixedSize(20, 20);
TQToolTip::add( qstoreBtn, i18n("store the current selection") );
connect(qstoreBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(quickSelectStore()));
TQToolButton *qsettingsBtn = new TQToolButton(quickPanel);
qsettingsBtn->setPixmap(krLoader->loadIcon( "configure", TDEIcon::Toolbar, 16 ));
qsettingsBtn->setFixedSize(20, 20);
TQToolTip::add( qsettingsBtn, i18n("select group dialog") );
connect(qsettingsBtn, TQ_SIGNAL(clicked()), krSelect, TQ_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() {
TQWidget::show();
if( _hidden )
splitter->setSizes( splitterSizes );
_hidden = false;
tabSelected( stack->id(stack->visibleWidget()) );
}
void PanelPopup::hide() {
if( !_hidden )
splitterSizes = splitter->sizes();
TQWidget::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 all
void 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;
}
}
// ------------------- tree
void PanelPopup::treeSelection(TQListViewItem*) {
emit selection(tree->currentURL());
//emit hideMe();
}
// ------------------- quick panel
void PanelPopup::quickSelect() {
SLOTS->markGroup(quickSelectCombo->currentText(), true);
}
void PanelPopup::quickSelect(const TQString &mask) {
SLOTS->markGroup(mask, true);
}
void PanelPopup::quickSelectStore() {
krConfig->setGroup( "Private" );
TQStringList lst = krConfig->readListEntry( "Predefined Selections" );
if ( lst.find(quickSelectCombo->currentText()) == lst.end() )
lst.append( quickSelectCombo->currentText() );
krConfig->writeEntry( "Predefined Selections", lst );
}
void PanelPopup::slotDroppedOnTree(TQWidget *widget, TQDropEvent *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?
TQPopupMenu 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 );
TQPoint tmp = widget->mapToGlobal( e->pos() );
int result = popup.exec( TQCursor::pos() );
TDEIO::CopyJob *job;
switch ( result ) {
case 1 :
job = TDEIO::copy(lst, dest, true);
break;
case 2 :
job = TDEIO::move(lst, dest, true);
break;
case 3 :
job = TDEIO::link(lst, dest, true);
break;
case - 1 : // user pressed outside the menu
case 4:
return ; // cancel was pressed;
}
}
#include "panelpopup.moc"