diff options
Diffstat (limited to 'src/app/panelmanager.cpp')
-rw-r--r-- | src/app/panelmanager.cpp | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/src/app/panelmanager.cpp b/src/app/panelmanager.cpp new file mode 100644 index 0000000..6445f4d --- /dev/null +++ b/src/app/panelmanager.cpp @@ -0,0 +1,352 @@ +#include <tqwidgetstack.h> +#include <tqtoolbutton.h> +#include <tdelocale.h> +#include <tqimage.h> +#include <kdebug.h> +#include <tdeconfig.h> +#include <kiconloader.h> +#include "panelmanager.h" +#include "Panel/listpanel.h" +#include "Panel/panelfunc.h" +#include "krusaderview.h" +#include "defaults.h" + +#define HIDE_ON_SINGLE_TAB false + +#define SHOW { _newTab->show(); _tabbar->show(); _closeTab->show(); } +#define HIDE { _newTab->hide(); _tabbar->hide(); _closeTab->hide(); } + +#define _self (*_selfPtr) +#define _other (*_otherPtr) + +PanelManager::PanelManager( TQWidget *parent, bool left ) : +TQWidget( parent, "PanelManager" ), _layout( 0 ), _left( left ), + _selfPtr( _left ? &MAIN_VIEW->left : &MAIN_VIEW->right ), + _otherPtr( _left ? &MAIN_VIEW->right : &MAIN_VIEW->left ) { + _layout = new TQGridLayout( this, 1, 1 ); + _stack = new TQWidgetStack( this ); + + // new tab button + _newTab = new TQToolButton( this ); + _newTab->setFixedSize( 22, 22 ); + _newTab->setTextLabel( i18n( "Open a new tab in home" ) ); + _newTab->setIconSet( SmallIcon( "tab_new" ) ); + _newTab->adjustSize(); + connect( _newTab, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotNewTab() ) ); + + // close tab button + _closeTab = new TQToolButton( this ); + _closeTab->setFixedSize( 22, 22 ); + _closeTab->setTextLabel( i18n( "Close current tab" ) ); + _closeTab->setIconSet( SmallIcon( "tab_remove" ) ); + _closeTab->adjustSize(); + connect( _closeTab, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotCloseTab() ) ); + _closeTab->setEnabled( false ); // disabled when there's only 1 tab + + // tab-bar + _tabbar = new PanelTabBar( this ); + connect( _tabbar, TQ_SIGNAL( changePanel( ListPanel* ) ), this, TQ_SLOT( slotChangePanel( ListPanel * ) ) ); + connect( _tabbar, TQ_SIGNAL( closeCurrentTab() ), this, TQ_SLOT( slotCloseTab() ) ); + connect( _tabbar, TQ_SIGNAL( newTab( const KURL& ) ), this, TQ_SLOT( slotNewTab( const KURL& ) ) ); + + _layout->addMultiCellWidget( _stack, 0, 0, 0, 2 ); + _layout->addWidget( _newTab, 1, 0 ); + _layout->addWidget( _tabbar, 1, 1 ); + _layout->addWidget( _closeTab, 1, 2 ); + + if ( HIDE_ON_SINGLE_TAB ) HIDE + else SHOW +} + +void PanelManager::slotChangePanel( ListPanel *p ) { + _self = p; + _self->otherPanel = _other; + _other->otherPanel = _self; + + _stack->raiseWidget( _self ); + tdeApp->processEvents(); + _self->slotFocusOnMe(); +} + +ListPanel* PanelManager::createPanel( TQString type, bool setCurrent ) { + // create the panel and add it into the widgetstack + ListPanel * p = new ListPanel( type, _stack, _left ); + _stack->addWidget( p ); + + // now, create the corrosponding tab + _tabbar->addPanel( p, setCurrent ); + + // allow close button if more than 1 tab + if ( _tabbar->count() > 1 ) { + _closeTab->setEnabled( true ); + SHOW // needed if we were hidden + } + if( setCurrent ) + _stack->raiseWidget( p ); + + // connect the activePanelChanged signal to enable/disable actions + connect( p, TQ_SIGNAL( activePanelChanged( ListPanel* ) ), this, TQ_SLOT( slotRefreshActions() ) ); + return p; +} + +void PanelManager::startPanel( ListPanel *panel, const KURL& path ) { + panel->start( path ); +} + +void PanelManager::saveSettings( TDEConfig *config, const TQString& key, bool localOnly ) { + TQStringList l; + TQStringList types; + TQValueList<int> props; + int i=0, cnt=0; + while (cnt < _tabbar->count()) { + PanelTab *t = dynamic_cast<PanelTab*>(_tabbar->tabAt(i)); + if (t && t->panel) { + l << ( localOnly ? t->panel->realPath() : vfs::pathOrURL( t->panel->virtualPath() ) ); + types << t->panel->getType(); + props << t->panel->getProperties(); + ++cnt; + } + ++i; + } + config->writePathEntry( key, l ); + config->writeEntry( key + " Types", types ); + config->writeEntry( key + " Props", props ); +} + +void PanelManager::loadSettings( TDEConfig *config, const TQString& key ) { + TQStringList l = config->readPathListEntry( key ); + TQStringList types = config->readListEntry( key + " Types" ); + TQValueList<int> props = config->readIntListEntry( key + " Props" ); + + if( l.count() < 1 ) + return; + + while( types.count() < l.count() ) + { + TDEConfigGroupSaver saver( config, "Look&Feel"); + types << krConfig->readEntry( "Default Panel Type", _DefaultPanelType ); + } + while( props.count() < l.count() ) + props << 0; + + int i=0, totalTabs = _tabbar->count(); + + while (i < totalTabs && i < (int)l.count() ) + { + PanelTab *t = dynamic_cast<PanelTab*>(_tabbar->tabAt(i)); + if (t && t->panel) + { + if( t->panel->getType() != types[ i ] ) + t->panel->changeType( types[ i ] ); + t->panel->setProperties( props[ i ] ); + t->panel->otherPanel = _other; + _other->otherPanel = t->panel; + t->panel->func->files()->vfs_enableRefresh( true ); + t->panel->func->immediateOpenUrl( vfs::fromPathOrURL( l[ i ] ) ); + } + ++i; + } + + while( i < totalTabs ) + slotCloseTab( --totalTabs ); + + for(; i < (int)l.count(); i++ ) + slotNewTab( vfs::fromPathOrURL(l[i]), false, types[ i ], props[ i ] ); +} + +void PanelManager::slotNewTab(const KURL& url, bool setCurrent, TQString type, int props ) { + if( type.isNull() ) + { + krConfig->setGroup( "Look&Feel" ); + type = krConfig->readEntry( "Default Panel Type", _DefaultPanelType ); + } + ListPanel *p = createPanel( type, setCurrent ); + // update left/right pointers + p->otherPanel = _other; + if( setCurrent ) + { + _self = p; + _other->otherPanel = _self; + } + startPanel( p, url ); + p->setProperties( props ); +} + +void PanelManager::slotNewTab() { + slotNewTab( TQDir::home().absPath() ); +} + +void PanelManager::slotCloseTab() { + if ( _tabbar->count() <= 1 ) /* if this is the last tab don't close it */ + return ; + + // setup current one + ListPanel * oldp; + _self = _tabbar->removeCurrentPanel( oldp ); + _stack->raiseWidget( _self ); + _stack->removeWidget( oldp ); + deletePanel( oldp ); + + // setup pointers + _self->otherPanel = _other; + _other->otherPanel = _self; + _self->slotFocusOnMe(); + + // disable close button if only 1 tab is left + if ( _tabbar->count() == 1 ) { + _closeTab->setEnabled( false ); + if ( HIDE_ON_SINGLE_TAB ) HIDE + } +} + +void PanelManager::slotCloseTab( int index ) { + PanelTab *t = dynamic_cast<PanelTab*>(_tabbar->tabAt( index )); + if (t && t->panel) + { + ListPanel *oldp = t->panel; + disconnect( oldp ); + if( t->identifier() == _tabbar->currentTab() ) + { + PanelTab *newCurrent = dynamic_cast<PanelTab*>( _tabbar->tabAt( 0 ) ); + if( newCurrent != 0 ) + { + _tabbar->setCurrentTab( newCurrent ); + _self = newCurrent->panel; + _self->otherPanel = _other; + _other->otherPanel = _self; + } + } + _tabbar->removeTab( t ); + + _stack->removeWidget( oldp ); + deletePanel( oldp ); + } + + if ( _tabbar->count() == 1 ) + { + _closeTab->setEnabled( false ); + if ( HIDE_ON_SINGLE_TAB ) HIDE + } +} + +void PanelManager::slotRefreshActions() { + krCloseTab->setEnabled( _tabbar->count() > 1 ); + krNextTab->setEnabled(_tabbar->count() > 1); + krPreviousTab->setEnabled(_tabbar->count() > 1); +} + +int PanelManager::activeTab() +{ + return _tabbar->indexOf( _tabbar->currentTab() ); +} + +void PanelManager::setActiveTab( int panelIndex ) +{ + TQTab *current = _tabbar->tabAt( panelIndex ); + if( current == 0 ) + return; + _tabbar->setCurrentTab( current ); + slotChangePanel ( dynamic_cast<PanelTab*>( _tabbar->tabAt( panelIndex ) )->panel ); +} + +void PanelManager::setCurrentTab( int panelIndex ) +{ + PanelTab *current = dynamic_cast<PanelTab*>(_tabbar->tabAt( panelIndex ) ); + if( current == 0 ) + return; + _tabbar->setCurrentTab( current ); + _self = current->panel; + _self->otherPanel = _other; + _other->otherPanel = _self; + + _stack->raiseWidget( _self ); +} + +void PanelManager::slotRecreatePanels() { + int actTab = activeTab(); + + for( int i = 0; i != _tabbar->count(); i++ ) + { + PanelTab *updatedPanel = dynamic_cast<PanelTab*>(_tabbar->tabAt( i ) ); + + ListPanel *oldPanel = updatedPanel->panel; + TQString type = oldPanel->getType(); + ListPanel *newPanel = new ListPanel( type, _stack, _left ); + _stack->addWidget( newPanel, i ); + _stack->removeWidget( oldPanel ); + + disconnect( oldPanel ); + connect( newPanel, TQ_SIGNAL( activePanelChanged( ListPanel* ) ), this, TQ_SLOT( slotRefreshActions() ) ); + connect( newPanel, TQ_SIGNAL( pathChanged(ListPanel*) ), _tabbar, TQ_SLOT(updateTab(ListPanel*))); + + newPanel->otherPanel = _other; + if( _other->otherPanel == oldPanel ) + _other->otherPanel = newPanel; + updatedPanel->panel = newPanel; + newPanel->start( oldPanel->virtualPath(), true ); + if( _self == oldPanel ) + { + _self = newPanel; + _self->otherPanel = _other; + _other->otherPanel = _self; + } + deletePanel( oldPanel ); + + _tabbar->updateTab( newPanel ); + } + + setActiveTab( actTab ); +} + +void PanelManager::slotNextTab() { + int currTab = _tabbar->currentTab(); + int nextInd = (_tabbar->indexOf(currTab) == _tabbar->count()-1 ? 0 : _tabbar->indexOf(currTab)+1); + ListPanel *nextp = dynamic_cast<PanelTab*>(_tabbar->tabAt(nextInd))->panel; + _tabbar->setCurrentTab(_tabbar->tabAt(nextInd)); + slotChangePanel(nextp); +} + + +void PanelManager::slotPreviousTab() { + int currTab = _tabbar->currentTab(); + int nextInd = (_tabbar->indexOf(currTab) == 0 ? _tabbar->count()-1 : _tabbar->indexOf(currTab)-1); + ListPanel *nextp = dynamic_cast<PanelTab*>(_tabbar->tabAt(nextInd))->panel; + _tabbar->setCurrentTab(_tabbar->tabAt(nextInd)); + slotChangePanel(nextp); +} + +void PanelManager::refreshAllTabs( bool invalidate ) { + int i=0; + while (i < _tabbar->count()) { + PanelTab *t = dynamic_cast<PanelTab*>(_tabbar->tabAt(i)); + if (t && t->panel && t->panel->func ) { + vfs * vfs = t->panel->func->files(); + if( vfs ) { + if( invalidate ) + vfs->vfs_invalidate(); + vfs->vfs_refresh(); + } + } + ++i; + } +} + +void PanelManager::deletePanel( ListPanel * p ) { + if( ACTIVE_PANEL == p ) + ACTIVE_PANEL = _self; + + if( p && p->func && p->func->files() && !p->func->files()->vfs_canDelete() ) { + connect( p->func->files(), TQ_SIGNAL( deleteAllowed() ), p, TQ_SLOT( deleteLater() ) ); + p->func->files()->vfs_requestDelete(); + return; + } + delete p; +} + +void PanelManager::swapPanels() { + _left = !_left; + _selfPtr = _left ? &MAIN_VIEW->left : &MAIN_VIEW->right; + _otherPtr = _left ? &MAIN_VIEW->right : &MAIN_VIEW->left; +} + +#include "panelmanager.moc" |