summaryrefslogtreecommitdiffstats
path: root/src/app/Panel/panelpopup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/Panel/panelpopup.cpp')
-rw-r--r--src/app/Panel/panelpopup.cpp400
1 files changed, 400 insertions, 0 deletions
diff --git a/src/app/Panel/panelpopup.cpp b/src/app/Panel/panelpopup.cpp
new file mode 100644
index 0000000..d54692e
--- /dev/null
+++ b/src/app/Panel/panelpopup.cpp
@@ -0,0 +1,400 @@
+#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"