]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Fix selection issue when expanding a tree
[dolphin.git] / src / dolphinmainwindow.cpp
index 74d9674580fddde24986bc098dacb6bbbf805383..4502e703f8c960e546883c453a25348c468f93c4 100644 (file)
@@ -156,6 +156,8 @@ DolphinMainWindow::DolphinMainWindow() :
     setObjectName("Dolphin#");
 
     m_viewTab.append(ViewTab());
+    ViewTab& viewTab = m_viewTab[m_tabIndex];
+    viewTab.wasActive = true; // The first opened tab is automatically active
 
     KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self();
     undoManager->setUiInterface(new UndoUiInterface());
@@ -177,8 +179,8 @@ DolphinMainWindow::DolphinMainWindow() :
 
     setAcceptDrops(true);
 
-    m_viewTab[m_tabIndex].splitter = new QSplitter(this);
-    m_viewTab[m_tabIndex].splitter->setChildrenCollapsible(false);
+    viewTab.splitter = new QSplitter(this);
+    viewTab.splitter->setChildrenCollapsible(false);
 
     setupActions();
 
@@ -188,9 +190,9 @@ DolphinMainWindow::DolphinMainWindow() :
     connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar()));
     connect(m_actionHandler, SIGNAL(createDirectory()), SLOT(createDirectory()));
 
-    m_viewTab[m_tabIndex].primaryView = createViewContainer(homeUrl, m_viewTab[m_tabIndex].splitter);
+    viewTab.primaryView = createViewContainer(homeUrl, viewTab.splitter);
 
-    m_activeViewContainer = m_viewTab[m_tabIndex].primaryView;
+    m_activeViewContainer = viewTab.primaryView;
     connectViewSignals(m_activeViewContainer);
     DolphinView* view = m_activeViewContainer->view();
     m_activeViewContainer->show();
@@ -227,7 +229,7 @@ DolphinMainWindow::DolphinMainWindow() :
     m_centralWidgetLayout->setSpacing(0);
     m_centralWidgetLayout->setMargin(0);
     m_centralWidgetLayout->addWidget(m_tabBar);
-    m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter, 1);
+    m_centralWidgetLayout->addWidget(viewTab.splitter, 1);
 
     setCentralWidget(centralWidget);
     setupDockWidgets();
@@ -510,10 +512,10 @@ void DolphinMainWindow::openNewTab(const KUrl& url)
 
     // provide a split view, if the startup settings are set this way
     if (GeneralSettings::splitView()) {
-        const int tabIndex = m_viewTab.count() - 1;
-        createSecondaryView(tabIndex);
-        m_viewTab[tabIndex].secondaryView->setActive(true);
-        m_viewTab[tabIndex].isPrimaryViewActive = false;
+        const int newTabIndex = m_viewTab.count() - 1;
+        createSecondaryView(newTabIndex);
+        viewTab.secondaryView->setActive(true);
+        viewTab.isPrimaryViewActive = false;
     }
 
     if (focusWidget) {
@@ -525,25 +527,21 @@ void DolphinMainWindow::openNewTab(const KUrl& url)
 
 void DolphinMainWindow::activateNextTab()
 {
-    if ((m_viewTab.count() == 1) || (m_tabBar->count() < 2)) {
-        return;
+    if (m_viewTab.count() >= 2) {
+        const int tabIndex = (m_tabBar->currentIndex() + 1) % m_tabBar->count();
+        m_tabBar->setCurrentIndex(tabIndex);
     }
-
-    const int tabIndex = (m_tabBar->currentIndex() + 1) % m_tabBar->count();
-    m_tabBar->setCurrentIndex(tabIndex);
 }
 
 void DolphinMainWindow::activatePrevTab()
 {
-    if ((m_viewTab.count() == 1) || (m_tabBar->count() < 2)) {
-        return;
-    }
-
-    int tabIndex = m_tabBar->currentIndex() - 1;
-    if (tabIndex == -1) {
-        tabIndex = m_tabBar->count() - 1;
+    if (m_viewTab.count() >= 2) {
+        int tabIndex = m_tabBar->currentIndex() - 1;
+        if (tabIndex == -1) {
+            tabIndex = m_tabBar->count() - 1;
+        }
+        m_tabBar->setCurrentIndex(tabIndex);
     }
-    m_tabBar->setCurrentIndex(tabIndex);
 }
 
 void DolphinMainWindow::openInNewTab()
@@ -1026,6 +1024,14 @@ void DolphinMainWindow::goUp(Qt::MouseButtons buttons)
     }
 }
 
+void DolphinMainWindow::goHome(Qt::MouseButtons buttons)
+{
+    // The default case (left button pressed) is handled in goHome().
+    if (buttons == Qt::MidButton) {
+        openNewTab(GeneralSettings::self()->homeUrl());
+    }
+}
+
 void DolphinMainWindow::compareFiles()
 {
     // The method is only invoked if exactly 2 files have
@@ -1152,6 +1158,18 @@ void DolphinMainWindow::setActiveTab(int index)
     }
     viewTab.splitter->show();
 
+    if (!viewTab.wasActive) {
+        viewTab.wasActive = true;
+
+        // If the tab has not been activated yet the size of the KItemListView is
+        // undefined and results in an unwanted animation. To prevent this a
+        // reloading of the directory gets triggered.
+        viewTab.primaryView->view()->reload();
+        if (viewTab.secondaryView) {
+            viewTab.secondaryView->view()->reload();
+        }
+    }
+
     setActiveViewContainer(viewTab.isPrimaryViewActive ? viewTab.primaryView :
                                                          viewTab.secondaryView);
 }
@@ -1680,7 +1698,8 @@ void DolphinMainWindow::setupActions()
     KAction* upAction = KStandardAction::up(this, SLOT(goUp()), actionCollection());
     connect(upAction, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(goUp(Qt::MouseButtons)));
 
-    KStandardAction::home(this, SLOT(goHome()), actionCollection());
+    KAction* homeAction = KStandardAction::home(this, SLOT(goHome()), actionCollection());
+    connect(homeAction, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(goHome(Qt::MouseButtons)));
 
     // setup 'Tools' menu
     KAction* showFilterBar = actionCollection()->addAction("show_filter_bar");
@@ -1872,14 +1891,15 @@ void DolphinMainWindow::setupDockWidgets()
     KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
     actionCollection()->addAction("panels", panelsMenu);
     panelsMenu->setDelayed(false);
-    panelsMenu->addAction(placesAction);
-    panelsMenu->addAction(infoAction);
-    panelsMenu->addAction(foldersAction);
+    const KActionCollection* ac = actionCollection();
+    panelsMenu->addAction(ac->action("show_places_panel"));
+    panelsMenu->addAction(ac->action("show_information_panel"));
+    panelsMenu->addAction(ac->action("show_folders_panel"));
 #ifndef Q_OS_WIN
-    panelsMenu->addAction(terminalAction);
+    panelsMenu->addAction(ac->action("show_terminal_panel"));
 #endif
 #ifdef HAVE_NEPOMUK
-    panelsMenu->addAction(searchAction);
+    panelsMenu->addAction(ac->action("show_search_panel"));
 #endif
     panelsMenu->addSeparator();
     panelsMenu->addAction(lockLayoutAction);
@@ -2164,16 +2184,20 @@ bool DolphinMainWindow::isKompareInstalled() const
 
 void DolphinMainWindow::createSecondaryView(int tabIndex)
 {
-    QSplitter* splitter = m_viewTab[tabIndex].splitter;
-    const int newWidth = (m_viewTab[tabIndex].primaryView->width() - splitter->handleWidth()) / 2;
+    ViewTab& viewTab = m_viewTab[tabIndex];
 
-    const DolphinView* view = m_viewTab[tabIndex].primaryView->view();
-    m_viewTab[tabIndex].secondaryView = createViewContainer(view->url(), 0);
-    splitter->addWidget(m_viewTab[tabIndex].secondaryView);
+    QSplitter* splitter = viewTab.splitter;
+    const int newWidth = (viewTab.primaryView->width() - splitter->handleWidth()) / 2;
+
+    const DolphinView* view = viewTab.primaryView->view();
+    viewTab.secondaryView = createViewContainer(view->url(), 0);
+    splitter->addWidget(viewTab.secondaryView);
     splitter->setSizes(QList<int>() << newWidth << newWidth);
-    connectViewSignals(m_viewTab[tabIndex].secondaryView);
-    m_viewTab[tabIndex].secondaryView->setActive(false);
-    m_viewTab[tabIndex].secondaryView->show();
+
+    connectViewSignals(viewTab.secondaryView);
+    viewTab.secondaryView->setActive(false);
+    viewTab.secondaryView->resize(newWidth, viewTab.primaryView->height());
+    viewTab.secondaryView->show();
 }
 
 QString DolphinMainWindow::tabProperty(const QString& property, int tabIndex) const
@@ -2209,13 +2233,14 @@ void DolphinMainWindow::createPanelAction(const KIcon& icon,
                                           const QString& actionName)
 {
     KAction* panelAction = actionCollection()->addAction(actionName);
+    panelAction->setCheckable(true);
+    panelAction->setChecked(dockAction->isChecked());
     panelAction->setText(dockAction->text());
     panelAction->setIcon(icon);
     panelAction->setShortcut(shortcut);
 
-    dockAction->setIcon(icon);
-    dockAction->setShortcut(shortcut);
     connect(panelAction, SIGNAL(triggered()), dockAction, SLOT(trigger()));
+    connect(dockAction, SIGNAL(toggled(bool)), panelAction, SLOT(setChecked(bool)));
 }
 
 DolphinMainWindow::UndoUiInterface::UndoUiInterface() :