mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-17 15:31:20 +00:00
Implemented DolphinTabWidget class to encapsulate the tab handling from DolphinMainWindow.
REVIEW: 119115
This commit is contained in:
parent
1ffb64db1f
commit
38381bc6a2
|
@ -174,6 +174,7 @@ set(dolphin_SRCS
|
||||||
dolphintabbar.cpp
|
dolphintabbar.cpp
|
||||||
dolphinrecenttabsmenu.cpp
|
dolphinrecenttabsmenu.cpp
|
||||||
dolphintabpage.cpp
|
dolphintabpage.cpp
|
||||||
|
dolphintabwidget.cpp
|
||||||
filterbar/filterbar.cpp
|
filterbar/filterbar.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
panels/information/filemetadataconfigurationdialog.cpp
|
panels/information/filemetadataconfigurationdialog.cpp
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "dolphincontextmenu.h"
|
#include "dolphincontextmenu.h"
|
||||||
#include "dolphinnewfilemenu.h"
|
#include "dolphinnewfilemenu.h"
|
||||||
#include "dolphinrecenttabsmenu.h"
|
#include "dolphinrecenttabsmenu.h"
|
||||||
#include "dolphintabbar.h"
|
#include "dolphintabwidget.h"
|
||||||
#include "dolphinviewcontainer.h"
|
#include "dolphinviewcontainer.h"
|
||||||
#include "dolphintabpage.h"
|
#include "dolphintabpage.h"
|
||||||
#include "panels/folders/folderspanel.h"
|
#include "panels/folders/folderspanel.h"
|
||||||
|
@ -97,11 +97,8 @@ namespace {
|
||||||
DolphinMainWindow::DolphinMainWindow() :
|
DolphinMainWindow::DolphinMainWindow() :
|
||||||
KXmlGuiWindow(0),
|
KXmlGuiWindow(0),
|
||||||
m_newFileMenu(0),
|
m_newFileMenu(0),
|
||||||
m_tabBar(0),
|
m_tabWidget(0),
|
||||||
m_activeViewContainer(0),
|
m_activeViewContainer(0),
|
||||||
m_centralWidgetLayout(0),
|
|
||||||
m_tabIndex(-1),
|
|
||||||
m_viewTab(),
|
|
||||||
m_actionHandler(0),
|
m_actionHandler(0),
|
||||||
m_remoteEncoding(0),
|
m_remoteEncoding(0),
|
||||||
m_settingsDialog(),
|
m_settingsDialog(),
|
||||||
|
@ -134,6 +131,13 @@ DolphinMainWindow::DolphinMainWindow() :
|
||||||
|
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
|
||||||
|
m_tabWidget = new DolphinTabWidget(this);
|
||||||
|
connect(m_tabWidget, SIGNAL(activeViewChanged(DolphinViewContainer*)),
|
||||||
|
this, SLOT(activeViewChanged(DolphinViewContainer*)));
|
||||||
|
connect(m_tabWidget, SIGNAL(tabCountChanged(int)),
|
||||||
|
this, SLOT(tabCountChanged(int)));
|
||||||
|
setCentralWidget(m_tabWidget);
|
||||||
|
|
||||||
setupActions();
|
setupActions();
|
||||||
|
|
||||||
m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
|
m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
|
||||||
|
@ -144,30 +148,6 @@ DolphinMainWindow::DolphinMainWindow() :
|
||||||
connect(this, SIGNAL(urlChanged(KUrl)),
|
connect(this, SIGNAL(urlChanged(KUrl)),
|
||||||
m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
|
m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
|
||||||
|
|
||||||
m_tabBar = new DolphinTabBar(this);
|
|
||||||
connect(m_tabBar, SIGNAL(currentChanged(int)),
|
|
||||||
this, SLOT(setActiveTab(int)));
|
|
||||||
connect(m_tabBar, SIGNAL(tabCloseRequested(int)),
|
|
||||||
this, SLOT(closeTab(int)));
|
|
||||||
connect(m_tabBar, SIGNAL(openNewActivatedTab(int)),
|
|
||||||
this, SLOT(openNewActivatedTab(int)));
|
|
||||||
connect(m_tabBar, SIGNAL(tabMoved(int,int)),
|
|
||||||
this, SLOT(slotTabMoved(int,int)));
|
|
||||||
connect(m_tabBar, SIGNAL(tabDropEvent(int,QDropEvent*)),
|
|
||||||
this, SLOT(tabDropEvent(int,QDropEvent*)));
|
|
||||||
connect(m_tabBar, SIGNAL(tabDetachRequested(int)),
|
|
||||||
this, SLOT(detachTab(int)));
|
|
||||||
|
|
||||||
m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open
|
|
||||||
m_tabBar->hide();
|
|
||||||
|
|
||||||
QWidget* centralWidget = new QWidget(this);
|
|
||||||
m_centralWidgetLayout = new QVBoxLayout(centralWidget);
|
|
||||||
m_centralWidgetLayout->setSpacing(0);
|
|
||||||
m_centralWidgetLayout->setMargin(0);
|
|
||||||
m_centralWidgetLayout->addWidget(m_tabBar);
|
|
||||||
|
|
||||||
setCentralWidget(centralWidget);
|
|
||||||
setupDockWidgets();
|
setupDockWidgets();
|
||||||
|
|
||||||
setupGUI(Keys | Save | Create | ToolBar);
|
setupGUI(Keys | Save | Create | ToolBar);
|
||||||
|
@ -200,48 +180,12 @@ DolphinMainWindow::~DolphinMainWindow()
|
||||||
|
|
||||||
void DolphinMainWindow::openDirectories(const QList<KUrl>& dirs)
|
void DolphinMainWindow::openDirectories(const QList<KUrl>& dirs)
|
||||||
{
|
{
|
||||||
const bool hasSplitView = GeneralSettings::splitView();
|
m_tabWidget->openDirectories(dirs);
|
||||||
|
|
||||||
// Open each directory inside a new tab. If the "split view" option has been enabled,
|
|
||||||
// always show two directories within one tab.
|
|
||||||
QList<KUrl>::const_iterator it = dirs.constBegin();
|
|
||||||
while (it != dirs.constEnd()) {
|
|
||||||
const KUrl& primaryUrl = *(it++);
|
|
||||||
if (hasSplitView && (it != dirs.constEnd())) {
|
|
||||||
const KUrl& secondaryUrl = *(it++);
|
|
||||||
openNewTab(primaryUrl, secondaryUrl);
|
|
||||||
} else {
|
|
||||||
openNewTab(primaryUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::openFiles(const QList<KUrl>& files)
|
void DolphinMainWindow::openFiles(const QList<KUrl>& files)
|
||||||
{
|
{
|
||||||
if (files.isEmpty()) {
|
m_tabWidget->openFiles(files);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all distinct directories from 'files' and open a tab
|
|
||||||
// for each directory. If the "split view" option is enabled, two
|
|
||||||
// directories are shown inside one tab (see openDirectories()).
|
|
||||||
QList<KUrl> dirs;
|
|
||||||
foreach (const KUrl& url, files) {
|
|
||||||
const KUrl dir(url.directory());
|
|
||||||
if (!dirs.contains(dir)) {
|
|
||||||
dirs.append(dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openDirectories(dirs);
|
|
||||||
|
|
||||||
// Select the files. Although the files can be split between several
|
|
||||||
// tabs, there is no need to split 'files' accordingly, as
|
|
||||||
// the DolphinView will just ignore invalid selections.
|
|
||||||
foreach (DolphinTabPage* tabPage, m_viewTab) {
|
|
||||||
tabPage->markUrlsAsSelected(files);
|
|
||||||
tabPage->markUrlAsCurrent(files.first());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::showCommand(CommandType command)
|
void DolphinMainWindow::showCommand(CommandType command)
|
||||||
|
@ -287,21 +231,14 @@ void DolphinMainWindow::changeUrl(const KUrl& url)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DolphinViewContainer* view = activeViewContainer();
|
m_activeViewContainer->setUrl(url);
|
||||||
if (view) {
|
updateEditActions();
|
||||||
view->setUrl(url);
|
updatePasteAction();
|
||||||
updateEditActions();
|
updateViewActions();
|
||||||
updatePasteAction();
|
updateGoActions();
|
||||||
updateViewActions();
|
setUrlAsCaption(url);
|
||||||
updateGoActions();
|
|
||||||
setUrlAsCaption(url);
|
|
||||||
|
|
||||||
const QString iconName = KMimeType::iconNameForUrl(url);
|
emit urlChanged(url);
|
||||||
m_tabBar->setTabIcon(m_tabIndex, KIcon(iconName));
|
|
||||||
m_tabBar->setTabText(m_tabIndex, squeezedText(tabName(view->url())));
|
|
||||||
|
|
||||||
emit urlChanged(url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::slotTerminalDirectoryChanged(const KUrl& url)
|
void DolphinMainWindow::slotTerminalDirectoryChanged(const KUrl& url)
|
||||||
|
@ -322,7 +259,7 @@ void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection)
|
||||||
{
|
{
|
||||||
updateEditActions();
|
updateEditActions();
|
||||||
|
|
||||||
const int selectedUrlsCount = m_viewTab.at(m_tabIndex)->selectedItemsCount();
|
const int selectedUrlsCount = m_tabWidget->currentTabPage()->selectedItemsCount();
|
||||||
|
|
||||||
QAction* compareFilesAction = actionCollection()->action("compare_files");
|
QAction* compareFilesAction = actionCollection()->action("compare_files");
|
||||||
if (selectedUrlsCount == 2) {
|
if (selectedUrlsCount == 2) {
|
||||||
|
@ -368,99 +305,19 @@ void DolphinMainWindow::openNewMainWindow()
|
||||||
KRun::run("dolphin %u", KUrl::List(), this);
|
KRun::run("dolphin %u", KUrl::List(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::openNewTab()
|
void DolphinMainWindow::openNewActivatedTab()
|
||||||
{
|
{
|
||||||
const bool isUrlEditable = m_activeViewContainer->urlNavigator()->isUrlEditable();
|
m_tabWidget->openNewActivatedTab();
|
||||||
|
|
||||||
openNewTab(m_activeViewContainer->url());
|
|
||||||
m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
|
|
||||||
|
|
||||||
// The URL navigator of the new tab should have the same editable state
|
|
||||||
// as the current tab
|
|
||||||
KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
|
|
||||||
navigator->setUrlEditable(isUrlEditable);
|
|
||||||
|
|
||||||
if (isUrlEditable) {
|
|
||||||
// If a new tab is opened and the URL is editable, assure that
|
|
||||||
// the user can edit the URL without manually setting the focus
|
|
||||||
navigator->setFocus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::openNewTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
void DolphinMainWindow::openNewTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
||||||
{
|
{
|
||||||
QWidget* focusWidget = QApplication::focusWidget();
|
m_tabWidget->openNewTab(primaryUrl, secondaryUrl);
|
||||||
|
|
||||||
DolphinTabPage* tabPage = new DolphinTabPage(primaryUrl, secondaryUrl, this);
|
|
||||||
m_viewTab.append(tabPage);
|
|
||||||
|
|
||||||
connect(tabPage, SIGNAL(activeViewChanged()),
|
|
||||||
this, SLOT(activeViewChanged()));
|
|
||||||
|
|
||||||
// The places-selector from the URL navigator should only be shown
|
|
||||||
// if the places dock is invisible
|
|
||||||
QDockWidget* placesDock = findChild<QDockWidget*>("placesDock");
|
|
||||||
const bool placesSelectorVisible = !placesDock || !placesDock->isVisible();
|
|
||||||
tabPage->setPlacesSelectorVisible(placesSelectorVisible);
|
|
||||||
|
|
||||||
DolphinViewContainer* primaryContainer = tabPage->primaryViewContainer();
|
|
||||||
connectViewSignals(primaryContainer);
|
|
||||||
|
|
||||||
if (tabPage->splitViewEnabled()) {
|
|
||||||
DolphinViewContainer* secondaryContainer = tabPage->secondaryViewContainer();
|
|
||||||
connectViewSignals(secondaryContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
tabPage->hide();
|
|
||||||
|
|
||||||
m_tabBar->addTab(KIcon(KMimeType::iconNameForUrl(primaryUrl)),
|
|
||||||
squeezedText(tabName(primaryUrl)));
|
|
||||||
|
|
||||||
if (m_viewTab.count() > 1) {
|
|
||||||
actionCollection()->action("close_tab")->setEnabled(true);
|
|
||||||
actionCollection()->action("activate_prev_tab")->setEnabled(true);
|
|
||||||
actionCollection()->action("activate_next_tab")->setEnabled(true);
|
|
||||||
m_tabBar->show();
|
|
||||||
m_tabBar->blockSignals(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (focusWidget) {
|
|
||||||
// The DolphinViewContainer grabbed the keyboard focus. As the tab is opened
|
|
||||||
// in background, assure that the previous focused widget gets the focus back.
|
|
||||||
focusWidget->setFocus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
void DolphinMainWindow::openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
||||||
{
|
{
|
||||||
openNewTab(primaryUrl, secondaryUrl);
|
m_tabWidget->openNewActivatedTab(primaryUrl, secondaryUrl);
|
||||||
setActiveTab(m_viewTab.count() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::openNewActivatedTab(int index)
|
|
||||||
{
|
|
||||||
Q_ASSERT(index >= 0);
|
|
||||||
const DolphinTabPage* tabPage = m_viewTab.at(index);
|
|
||||||
openNewActivatedTab(tabPage->activeViewContainer()->url());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::activateNextTab()
|
|
||||||
{
|
|
||||||
if (m_viewTab.count() >= 2) {
|
|
||||||
const int tabIndex = (m_tabBar->currentIndex() + 1) % m_tabBar->count();
|
|
||||||
setActiveTab(tabIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::activatePrevTab()
|
|
||||||
{
|
|
||||||
if (m_viewTab.count() >= 2) {
|
|
||||||
int tabIndex = m_tabBar->currentIndex() - 1;
|
|
||||||
if (tabIndex == -1) {
|
|
||||||
tabIndex = m_tabBar->count() - 1;
|
|
||||||
}
|
|
||||||
setActiveTab(tabIndex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::openInNewTab()
|
void DolphinMainWindow::openInNewTab()
|
||||||
|
@ -499,12 +356,6 @@ void DolphinMainWindow::showEvent(QShowEvent* event)
|
||||||
{
|
{
|
||||||
KXmlGuiWindow::showEvent(event);
|
KXmlGuiWindow::showEvent(event);
|
||||||
|
|
||||||
if (!m_activeViewContainer && m_viewTab.count() > 0) {
|
|
||||||
// If we have no active view container yet, we set the primary view container
|
|
||||||
// of the first tab as active view container.
|
|
||||||
setActiveTab(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!event->spontaneous()) {
|
if (!event->spontaneous()) {
|
||||||
m_activeViewContainer->view()->setFocus();
|
m_activeViewContainer->view()->setFocus();
|
||||||
}
|
}
|
||||||
|
@ -520,7 +371,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
|
||||||
closedByUser = false;
|
closedByUser = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_viewTab.count() > 1 && GeneralSettings::confirmClosingMultipleTabs() && closedByUser) {
|
if (m_tabWidget->count() > 1 && GeneralSettings::confirmClosingMultipleTabs() && closedByUser) {
|
||||||
// Ask the user if he really wants to quit and close all tabs.
|
// Ask the user if he really wants to quit and close all tabs.
|
||||||
// Open a confirmation dialog with 3 buttons:
|
// Open a confirmation dialog with 3 buttons:
|
||||||
// KDialog::Yes -> Quit
|
// KDialog::Yes -> Quit
|
||||||
|
@ -555,7 +406,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
|
||||||
break;
|
break;
|
||||||
case KDialog::No:
|
case KDialog::No:
|
||||||
// Close only the current tab
|
// Close only the current tab
|
||||||
closeTab();
|
m_tabWidget->closeTab();
|
||||||
default:
|
default:
|
||||||
event->ignore();
|
event->ignore();
|
||||||
return;
|
return;
|
||||||
|
@ -570,32 +421,12 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
|
||||||
|
|
||||||
void DolphinMainWindow::saveProperties(KConfigGroup& group)
|
void DolphinMainWindow::saveProperties(KConfigGroup& group)
|
||||||
{
|
{
|
||||||
const int tabCount = m_viewTab.count();
|
m_tabWidget->saveProperties(group);
|
||||||
group.writeEntry("Tab Count", tabCount);
|
|
||||||
group.writeEntry("Active Tab Index", m_tabBar->currentIndex());
|
|
||||||
|
|
||||||
for (int i = 0; i < tabCount; ++i) {
|
|
||||||
const DolphinTabPage* tabPage = m_viewTab.at(i);
|
|
||||||
group.writeEntry("Tab " % QString::number(i), tabPage->saveState());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::readProperties(const KConfigGroup& group)
|
void DolphinMainWindow::readProperties(const KConfigGroup& group)
|
||||||
{
|
{
|
||||||
const int tabCount = group.readEntry("Tab Count", 1);
|
m_tabWidget->readProperties(group);
|
||||||
for (int i = 0; i < tabCount; ++i) {
|
|
||||||
const QByteArray state = group.readEntry("Tab " % QString::number(i), QByteArray());
|
|
||||||
DolphinTabPage* tabPage = m_viewTab.at(i);
|
|
||||||
tabPage->restoreState(state);
|
|
||||||
|
|
||||||
// openNewTab() needs to be called only tabCount - 1 times
|
|
||||||
if (i != tabCount - 1) {
|
|
||||||
openNewTab();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const int index = group.readEntry("Active Tab Index", 0);
|
|
||||||
m_tabBar->setCurrentIndex(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::updateNewMenu()
|
void DolphinMainWindow::updateNewMenu()
|
||||||
|
@ -699,13 +530,9 @@ void DolphinMainWindow::invertSelection()
|
||||||
|
|
||||||
void DolphinMainWindow::toggleSplitView()
|
void DolphinMainWindow::toggleSplitView()
|
||||||
{
|
{
|
||||||
DolphinTabPage* tabPage = m_viewTab.at(m_tabIndex);
|
DolphinTabPage* tabPage = m_tabWidget->currentTabPage();
|
||||||
tabPage->setSplitViewEnabled(!tabPage->splitViewEnabled());
|
tabPage->setSplitViewEnabled(!tabPage->splitViewEnabled());
|
||||||
|
|
||||||
if (tabPage->splitViewEnabled()) {
|
|
||||||
connectViewSignals(tabPage->secondaryViewContainer());
|
|
||||||
}
|
|
||||||
|
|
||||||
updateViewActions();
|
updateViewActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,14 +595,6 @@ void DolphinMainWindow::togglePanelLockState()
|
||||||
GeneralSettings::setLockPanels(newLockState);
|
GeneralSettings::setLockPanels(newLockState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::slotPlacesPanelVisibilityChanged(bool visible)
|
|
||||||
{
|
|
||||||
foreach (DolphinTabPage* tabPage, m_viewTab) {
|
|
||||||
// The Places selector in the location bar should be shown if and only if the Places panel is hidden.
|
|
||||||
tabPage->setPlacesSelectorVisible(!visible);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::goBack()
|
void DolphinMainWindow::goBack()
|
||||||
{
|
{
|
||||||
KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
|
KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
|
||||||
|
@ -841,7 +660,7 @@ void DolphinMainWindow::goHome(Qt::MouseButtons buttons)
|
||||||
|
|
||||||
void DolphinMainWindow::compareFiles()
|
void DolphinMainWindow::compareFiles()
|
||||||
{
|
{
|
||||||
const KFileItemList items = m_viewTab.at(m_tabIndex)->selectedItems();
|
const KFileItemList items = m_tabWidget->currentTabPage()->selectedItems();
|
||||||
if (items.count() != 2) {
|
if (items.count() != 2) {
|
||||||
// The action is disabled in this case, but it could have been triggered
|
// The action is disabled in this case, but it could have been triggered
|
||||||
// via D-Bus, see https://bugs.kde.org/show_bug.cgi?id=325517
|
// via D-Bus, see https://bugs.kde.org/show_bug.cgi?id=325517
|
||||||
|
@ -903,111 +722,6 @@ void DolphinMainWindow::editSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::setActiveTab(int index)
|
|
||||||
{
|
|
||||||
Q_ASSERT(index >= 0);
|
|
||||||
Q_ASSERT(index < m_viewTab.count());
|
|
||||||
if (index == m_tabIndex) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_tabBar->setCurrentIndex(index);
|
|
||||||
|
|
||||||
// hide current tab content
|
|
||||||
if (m_tabIndex >= 0) {
|
|
||||||
DolphinTabPage* hiddenTabPage = m_viewTab.at(m_tabIndex);
|
|
||||||
hiddenTabPage->hide();
|
|
||||||
m_centralWidgetLayout->removeWidget(hiddenTabPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
// show active tab content
|
|
||||||
m_tabIndex = index;
|
|
||||||
|
|
||||||
DolphinTabPage* tabPage = m_viewTab.at(index);
|
|
||||||
m_centralWidgetLayout->addWidget(tabPage, 1);
|
|
||||||
tabPage->show();
|
|
||||||
|
|
||||||
setActiveViewContainer(tabPage->activeViewContainer());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::closeTab()
|
|
||||||
{
|
|
||||||
closeTab(m_tabBar->currentIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::closeTab(int index)
|
|
||||||
{
|
|
||||||
Q_ASSERT(index >= 0);
|
|
||||||
Q_ASSERT(index < m_viewTab.count());
|
|
||||||
if (m_viewTab.count() == 1) {
|
|
||||||
// the last tab may never get closed
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == m_tabIndex) {
|
|
||||||
// The tab that should be closed is the active tab. Activate the
|
|
||||||
// previous tab before closing the tab.
|
|
||||||
m_tabBar->setCurrentIndex((index > 0) ? index - 1 : 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
DolphinTabPage* tabPage = m_viewTab.at(index);
|
|
||||||
|
|
||||||
if (tabPage->splitViewEnabled()) {
|
|
||||||
emit rememberClosedTab(tabPage->primaryViewContainer()->url(),
|
|
||||||
tabPage->secondaryViewContainer()->url());
|
|
||||||
} else {
|
|
||||||
emit rememberClosedTab(tabPage->primaryViewContainer()->url(), KUrl());
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete tab
|
|
||||||
m_viewTab.removeAt(index);
|
|
||||||
tabPage->deleteLater();
|
|
||||||
|
|
||||||
m_tabBar->blockSignals(true);
|
|
||||||
m_tabBar->removeTab(index);
|
|
||||||
|
|
||||||
if (m_tabIndex > index) {
|
|
||||||
m_tabIndex--;
|
|
||||||
Q_ASSERT(m_tabIndex >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if only one tab is left, also remove the tab entry so that
|
|
||||||
// closing the last tab is not possible
|
|
||||||
if (m_viewTab.count() < 2) {
|
|
||||||
actionCollection()->action("close_tab")->setEnabled(false);
|
|
||||||
actionCollection()->action("activate_prev_tab")->setEnabled(false);
|
|
||||||
actionCollection()->action("activate_next_tab")->setEnabled(false);
|
|
||||||
m_tabBar->hide();
|
|
||||||
} else {
|
|
||||||
m_tabBar->blockSignals(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::detachTab(int index)
|
|
||||||
{
|
|
||||||
Q_ASSERT(index >= 0);
|
|
||||||
|
|
||||||
const QString separator(QLatin1Char(' '));
|
|
||||||
QString command = QLatin1String("dolphin");
|
|
||||||
|
|
||||||
const DolphinTabPage* tabPage = m_viewTab.at(index);
|
|
||||||
command += separator + tabPage->primaryViewContainer()->url().url();
|
|
||||||
if (tabPage->splitViewEnabled()) {
|
|
||||||
command += separator + tabPage->secondaryViewContainer()->url().url();
|
|
||||||
command += separator + QLatin1String("-split");
|
|
||||||
}
|
|
||||||
|
|
||||||
KRun::runCommand(command, this);
|
|
||||||
|
|
||||||
closeTab(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::slotTabMoved(int from, int to)
|
|
||||||
{
|
|
||||||
m_viewTab.move(from, to);
|
|
||||||
m_tabIndex = m_tabBar->currentIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::handleUrl(const KUrl& url)
|
void DolphinMainWindow::handleUrl(const KUrl& url)
|
||||||
{
|
{
|
||||||
delete m_lastHandleUrlStatJob;
|
delete m_lastHandleUrlStatJob;
|
||||||
|
@ -1041,20 +755,6 @@ void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event)
|
|
||||||
{
|
|
||||||
const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
|
|
||||||
if (!urls.isEmpty() && tab != -1) {
|
|
||||||
const DolphinView* view = m_viewTab.at(tab)->activeViewContainer()->view();
|
|
||||||
|
|
||||||
QString error;
|
|
||||||
DragAndDropHelper::dropUrls(view->rootItem(), view->url(), event, error);
|
|
||||||
if (!error.isEmpty()) {
|
|
||||||
activeViewContainer()->showMessage(error, DolphinViewContainer::Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable)
|
void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable)
|
||||||
{
|
{
|
||||||
newFileMenu()->setEnabled(isFolderWritable);
|
newFileMenu()->setEnabled(isFolderWritable);
|
||||||
|
@ -1214,27 +914,28 @@ void DolphinMainWindow::slotPlaceActivated(const KUrl& url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::activeViewChanged()
|
|
||||||
{
|
|
||||||
const DolphinTabPage* tabPage = m_viewTab.at(m_tabIndex);
|
|
||||||
setActiveViewContainer(tabPage->activeViewContainer());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::closedTabsCountChanged(unsigned int count)
|
void DolphinMainWindow::closedTabsCountChanged(unsigned int count)
|
||||||
{
|
{
|
||||||
actionCollection()->action("undo_close_tab")->setEnabled(count > 0);
|
actionCollection()->action("undo_close_tab")->setEnabled(count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer)
|
void DolphinMainWindow::activeViewChanged(DolphinViewContainer* viewContainer)
|
||||||
{
|
{
|
||||||
|
DolphinViewContainer* oldViewContainer = m_activeViewContainer;
|
||||||
Q_ASSERT(viewContainer);
|
Q_ASSERT(viewContainer);
|
||||||
Q_ASSERT((viewContainer == m_viewTab.at(m_tabIndex)->primaryViewContainer()) ||
|
|
||||||
(viewContainer == m_viewTab.at(m_tabIndex)->secondaryViewContainer()));
|
|
||||||
if (m_activeViewContainer == viewContainer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_activeViewContainer = viewContainer;
|
m_activeViewContainer = viewContainer;
|
||||||
|
|
||||||
|
if (oldViewContainer) {
|
||||||
|
// Disconnect all signals between the old view container (container,
|
||||||
|
// view and url navigator) and main window.
|
||||||
|
oldViewContainer->disconnect(this);
|
||||||
|
oldViewContainer->view()->disconnect(this);
|
||||||
|
oldViewContainer->urlNavigator()->disconnect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
connectViewSignals(viewContainer);
|
||||||
|
|
||||||
m_actionHandler->setCurrentView(viewContainer->view());
|
m_actionHandler->setCurrentView(viewContainer->view());
|
||||||
|
|
||||||
updateHistory();
|
updateHistory();
|
||||||
|
@ -1243,14 +944,20 @@ void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContain
|
||||||
updateViewActions();
|
updateViewActions();
|
||||||
updateGoActions();
|
updateGoActions();
|
||||||
|
|
||||||
const KUrl url = m_activeViewContainer->url();
|
const KUrl url = viewContainer->url();
|
||||||
setUrlAsCaption(url);
|
setUrlAsCaption(url);
|
||||||
m_tabBar->setTabText(m_tabIndex, squeezedText(tabName(url)));
|
|
||||||
m_tabBar->setTabIcon(m_tabIndex, KIcon(KMimeType::iconNameForUrl(url)));
|
|
||||||
|
|
||||||
emit urlChanged(url);
|
emit urlChanged(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DolphinMainWindow::tabCountChanged(int count)
|
||||||
|
{
|
||||||
|
const bool enableTabActions = (count > 1);
|
||||||
|
actionCollection()->action("close_tab")->setEnabled(enableTabActions);
|
||||||
|
actionCollection()->action("activate_next_tab")->setEnabled(enableTabActions);
|
||||||
|
actionCollection()->action("activate_prev_tab")->setEnabled(enableTabActions);
|
||||||
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::setupActions()
|
void DolphinMainWindow::setupActions()
|
||||||
{
|
{
|
||||||
// setup 'File' menu
|
// setup 'File' menu
|
||||||
|
@ -1272,14 +979,14 @@ void DolphinMainWindow::setupActions()
|
||||||
newTab->setIcon(KIcon("tab-new"));
|
newTab->setIcon(KIcon("tab-new"));
|
||||||
newTab->setText(i18nc("@action:inmenu File", "New Tab"));
|
newTab->setText(i18nc("@action:inmenu File", "New Tab"));
|
||||||
newTab->setShortcut(KShortcut(Qt::CTRL | Qt::Key_T, Qt::CTRL | Qt::SHIFT | Qt::Key_N));
|
newTab->setShortcut(KShortcut(Qt::CTRL | Qt::Key_T, Qt::CTRL | Qt::SHIFT | Qt::Key_N));
|
||||||
connect(newTab, SIGNAL(triggered()), this, SLOT(openNewTab()));
|
connect(newTab, SIGNAL(triggered()), this, SLOT(openNewActivatedTab()));
|
||||||
|
|
||||||
KAction* closeTab = actionCollection()->addAction("close_tab");
|
KAction* closeTab = actionCollection()->addAction("close_tab");
|
||||||
closeTab->setIcon(KIcon("tab-close"));
|
closeTab->setIcon(KIcon("tab-close"));
|
||||||
closeTab->setText(i18nc("@action:inmenu File", "Close Tab"));
|
closeTab->setText(i18nc("@action:inmenu File", "Close Tab"));
|
||||||
closeTab->setShortcut(Qt::CTRL | Qt::Key_W);
|
closeTab->setShortcut(Qt::CTRL | Qt::Key_W);
|
||||||
closeTab->setEnabled(false);
|
closeTab->setEnabled(false);
|
||||||
connect(closeTab, SIGNAL(triggered()), this, SLOT(closeTab()));
|
connect(closeTab, SIGNAL(triggered()), m_tabWidget, SLOT(closeTab()));
|
||||||
|
|
||||||
KStandardAction::quit(this, SLOT(quit()), actionCollection());
|
KStandardAction::quit(this, SLOT(quit()), actionCollection());
|
||||||
|
|
||||||
|
@ -1351,7 +1058,7 @@ void DolphinMainWindow::setupActions()
|
||||||
|
|
||||||
DolphinRecentTabsMenu* recentTabsMenu = new DolphinRecentTabsMenu(this);
|
DolphinRecentTabsMenu* recentTabsMenu = new DolphinRecentTabsMenu(this);
|
||||||
actionCollection()->addAction("closed_tabs", recentTabsMenu);
|
actionCollection()->addAction("closed_tabs", recentTabsMenu);
|
||||||
connect(this, SIGNAL(rememberClosedTab(KUrl,KUrl)),
|
connect(m_tabWidget, SIGNAL(rememberClosedTab(KUrl,KUrl)),
|
||||||
recentTabsMenu, SLOT(rememberClosedTab(KUrl,KUrl)));
|
recentTabsMenu, SLOT(rememberClosedTab(KUrl,KUrl)));
|
||||||
connect(recentTabsMenu, SIGNAL(restoreClosedTab(KUrl,KUrl)),
|
connect(recentTabsMenu, SIGNAL(restoreClosedTab(KUrl,KUrl)),
|
||||||
this, SLOT(openNewActivatedTab(KUrl,KUrl)));
|
this, SLOT(openNewActivatedTab(KUrl,KUrl)));
|
||||||
|
@ -1412,14 +1119,14 @@ void DolphinMainWindow::setupActions()
|
||||||
activateNextTab->setIconText(i18nc("@action:inmenu", "Next Tab"));
|
activateNextTab->setIconText(i18nc("@action:inmenu", "Next Tab"));
|
||||||
activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
|
activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
|
||||||
activateNextTab->setEnabled(false);
|
activateNextTab->setEnabled(false);
|
||||||
connect(activateNextTab, SIGNAL(triggered()), SLOT(activateNextTab()));
|
connect(activateNextTab, SIGNAL(triggered()), m_tabWidget, SLOT(activateNextTab()));
|
||||||
activateNextTab->setShortcuts(QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
|
activateNextTab->setShortcuts(QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
|
||||||
|
|
||||||
KAction* activatePrevTab = actionCollection()->addAction("activate_prev_tab");
|
KAction* activatePrevTab = actionCollection()->addAction("activate_prev_tab");
|
||||||
activatePrevTab->setIconText(i18nc("@action:inmenu", "Previous Tab"));
|
activatePrevTab->setIconText(i18nc("@action:inmenu", "Previous Tab"));
|
||||||
activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
|
activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
|
||||||
activatePrevTab->setEnabled(false);
|
activatePrevTab->setEnabled(false);
|
||||||
connect(activatePrevTab, SIGNAL(triggered()), SLOT(activatePrevTab()));
|
connect(activatePrevTab, SIGNAL(triggered()), m_tabWidget, SLOT(activatePrevTab()));
|
||||||
activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
|
activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
|
||||||
|
|
||||||
// for context menu
|
// for context menu
|
||||||
|
@ -1548,10 +1255,12 @@ void DolphinMainWindow::setupDockWidgets()
|
||||||
connect(this, SIGNAL(urlChanged(KUrl)),
|
connect(this, SIGNAL(urlChanged(KUrl)),
|
||||||
placesPanel, SLOT(setUrl(KUrl)));
|
placesPanel, SLOT(setUrl(KUrl)));
|
||||||
connect(placesDock, SIGNAL(visibilityChanged(bool)),
|
connect(placesDock, SIGNAL(visibilityChanged(bool)),
|
||||||
this, SLOT(slotPlacesPanelVisibilityChanged(bool)));
|
m_tabWidget, SLOT(slotPlacesPanelVisibilityChanged(bool)));
|
||||||
connect(this, SIGNAL(settingsChanged()),
|
connect(this, SIGNAL(settingsChanged()),
|
||||||
placesPanel, SLOT(readSettings()));
|
placesPanel, SLOT(readSettings()));
|
||||||
|
|
||||||
|
m_tabWidget->slotPlacesPanelVisibilityChanged(placesPanel->isVisible());
|
||||||
|
|
||||||
// Add actions into the "Panels" menu
|
// Add actions into the "Panels" menu
|
||||||
KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
|
KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
|
||||||
actionCollection()->addAction("panels", panelsMenu);
|
actionCollection()->addAction("panels", panelsMenu);
|
||||||
|
@ -1674,15 +1383,13 @@ bool DolphinMainWindow::addActionToMenu(QAction* action, KMenu* menu)
|
||||||
|
|
||||||
void DolphinMainWindow::refreshViews()
|
void DolphinMainWindow::refreshViews()
|
||||||
{
|
{
|
||||||
foreach (DolphinTabPage* tabPage, m_viewTab) {
|
m_tabWidget->refreshViews();
|
||||||
tabPage->refreshViews();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GeneralSettings::modifiedStartupSettings()) {
|
if (GeneralSettings::modifiedStartupSettings()) {
|
||||||
// The startup settings have been changed by the user (see bug #254947).
|
// The startup settings have been changed by the user (see bug #254947).
|
||||||
// Synchronize the split-view setting with the active view:
|
// Synchronize the split-view setting with the active view:
|
||||||
const bool splitView = GeneralSettings::splitView();
|
const bool splitView = GeneralSettings::splitView();
|
||||||
m_viewTab.at(m_tabIndex)->setSplitViewEnabled(splitView);
|
m_tabWidget->currentTabPage()->setSplitViewEnabled(splitView);
|
||||||
updateSplitAction();
|
updateSplitAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1733,7 +1440,7 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
|
||||||
void DolphinMainWindow::updateSplitAction()
|
void DolphinMainWindow::updateSplitAction()
|
||||||
{
|
{
|
||||||
QAction* splitAction = actionCollection()->action("split_view");
|
QAction* splitAction = actionCollection()->action("split_view");
|
||||||
const DolphinTabPage* tabPage = m_viewTab.at(m_tabIndex);
|
const DolphinTabPage* tabPage = m_tabWidget->currentTabPage();
|
||||||
if (tabPage->splitViewEnabled()) {
|
if (tabPage->splitViewEnabled()) {
|
||||||
if (tabPage->primaryViewActive()) {
|
if (tabPage->primaryViewActive()) {
|
||||||
splitAction->setText(i18nc("@action:intoolbar Close left view", "Close"));
|
splitAction->setText(i18nc("@action:intoolbar Close left view", "Close"));
|
||||||
|
@ -1751,24 +1458,6 @@ void DolphinMainWindow::updateSplitAction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DolphinMainWindow::tabName(const KUrl& url) const
|
|
||||||
{
|
|
||||||
QString name;
|
|
||||||
if (url.equals(KUrl("file:///"))) {
|
|
||||||
name = '/';
|
|
||||||
} else {
|
|
||||||
name = url.fileName();
|
|
||||||
if (name.isEmpty()) {
|
|
||||||
name = url.protocol();
|
|
||||||
} else {
|
|
||||||
// Make sure that a '&' inside the directory name is displayed correctly
|
|
||||||
// and not misinterpreted as a keyboard shortcut in QTabBar::setTabText()
|
|
||||||
name.replace('&', "&&");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DolphinMainWindow::isKompareInstalled() const
|
bool DolphinMainWindow::isKompareInstalled() const
|
||||||
{
|
{
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
|
@ -1798,12 +1487,6 @@ void DolphinMainWindow::setUrlAsCaption(const KUrl& url)
|
||||||
setCaption(caption);
|
setCaption(caption);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DolphinMainWindow::squeezedText(const QString& text) const
|
|
||||||
{
|
|
||||||
const QFontMetrics fm = fontMetrics();
|
|
||||||
return fm.elidedText(text, Qt::ElideMiddle, fm.maxWidth() * 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DolphinMainWindow::createPanelAction(const KIcon& icon,
|
void DolphinMainWindow::createPanelAction(const KIcon& icon,
|
||||||
const QKeySequence& shortcut,
|
const QKeySequence& shortcut,
|
||||||
QAction* dockAction,
|
QAction* dockAction,
|
||||||
|
|
|
@ -38,19 +38,16 @@ typedef KIO::FileUndoManager::CommandType CommandType;
|
||||||
class DolphinViewActionHandler;
|
class DolphinViewActionHandler;
|
||||||
class DolphinApplication;
|
class DolphinApplication;
|
||||||
class DolphinSettingsDialog;
|
class DolphinSettingsDialog;
|
||||||
class DolphinTabBar;
|
|
||||||
class DolphinViewContainer;
|
class DolphinViewContainer;
|
||||||
class DolphinRemoteEncoding;
|
class DolphinRemoteEncoding;
|
||||||
class DolphinTabPage;
|
class DolphinTabWidget;
|
||||||
class KAction;
|
class KAction;
|
||||||
class KFileItem;
|
class KFileItem;
|
||||||
class KFileItemList;
|
class KFileItemList;
|
||||||
class KJob;
|
class KJob;
|
||||||
class KNewFileMenu;
|
class KNewFileMenu;
|
||||||
class KUrl;
|
class KUrl;
|
||||||
class QSplitter;
|
|
||||||
class QToolButton;
|
class QToolButton;
|
||||||
class QVBoxLayout;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @short Main window for Dolphin.
|
* @short Main window for Dolphin.
|
||||||
|
@ -149,11 +146,6 @@ signals:
|
||||||
*/
|
*/
|
||||||
void settingsChanged();
|
void settingsChanged();
|
||||||
|
|
||||||
/**
|
|
||||||
* Is emitted when a tab has been closed.
|
|
||||||
*/
|
|
||||||
void rememberClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** @see QWidget::showEvent() */
|
/** @see QWidget::showEvent() */
|
||||||
virtual void showEvent(QShowEvent* event);
|
virtual void showEvent(QShowEvent* event);
|
||||||
|
@ -262,13 +254,6 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void togglePanelLockState();
|
void togglePanelLockState();
|
||||||
|
|
||||||
/**
|
|
||||||
* Is invoked if the Places panel got visible/invisible and takes care
|
|
||||||
* that the places-selector of all views is only shown if the Places panel
|
|
||||||
* is invisible.
|
|
||||||
*/
|
|
||||||
void slotPlacesPanelVisibilityChanged(bool visible);
|
|
||||||
|
|
||||||
/** Goes back one step of the URL history. */
|
/** Goes back one step of the URL history. */
|
||||||
void goBack();
|
void goBack();
|
||||||
|
|
||||||
|
@ -343,8 +328,11 @@ private slots:
|
||||||
/** Open a new main window. */
|
/** Open a new main window. */
|
||||||
void openNewMainWindow();
|
void openNewMainWindow();
|
||||||
|
|
||||||
/** Opens a new view with the current URL that is part of a tab. */
|
/**
|
||||||
void openNewTab();
|
* Opens a new view with the current URL that is part of a tab and
|
||||||
|
* activates it.
|
||||||
|
*/
|
||||||
|
void openNewActivatedTab();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a new tab in the background showing the URL \a primaryUrl and the
|
* Opens a new tab in the background showing the URL \a primaryUrl and the
|
||||||
|
@ -358,16 +346,6 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl = KUrl());
|
void openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl = KUrl());
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens a new tab showing the url from tab at the given \a index and
|
|
||||||
* activates the tab.
|
|
||||||
*/
|
|
||||||
void openNewActivatedTab(int index);
|
|
||||||
|
|
||||||
void activateNextTab();
|
|
||||||
|
|
||||||
void activatePrevTab();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens the selected folder in a new tab.
|
* Opens the selected folder in a new tab.
|
||||||
*/
|
*/
|
||||||
|
@ -384,33 +362,6 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void showCommand(CommandType command);
|
void showCommand(CommandType command);
|
||||||
|
|
||||||
/**
|
|
||||||
* Activates the tab with the index \a index, which means that the current view
|
|
||||||
* is replaced by the view of the given tab.
|
|
||||||
*/
|
|
||||||
void setActiveTab(int index);
|
|
||||||
|
|
||||||
/** Closes the currently active tab. */
|
|
||||||
void closeTab();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Closes the tab with the index \a index and activates the tab with index - 1.
|
|
||||||
*/
|
|
||||||
void closeTab(int index);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the tab with the index \a index in a new Dolphin instance and closes
|
|
||||||
* this tab.
|
|
||||||
*/
|
|
||||||
void detachTab(int index);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is connected to the QTabBar signal tabMoved(int from, int to).
|
|
||||||
* Reorders the list of tabs after a tab was moved in the tab bar
|
|
||||||
* and sets m_tabIndex to the new index of the current tab.
|
|
||||||
*/
|
|
||||||
void slotTabMoved(int from, int to);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the URL can be listed, open it in the current view, otherwise
|
* If the URL can be listed, open it in the current view, otherwise
|
||||||
* run it through KRun.
|
* run it through KRun.
|
||||||
|
@ -423,12 +374,6 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void slotHandleUrlStatFinished(KJob* job);
|
void slotHandleUrlStatFinished(KJob* job);
|
||||||
|
|
||||||
/**
|
|
||||||
* Is connected to the KTabBar signal receivedDropEvent.
|
|
||||||
* Allows dragging and dropping files onto tabs.
|
|
||||||
*/
|
|
||||||
void tabDropEvent(int tab, QDropEvent* event);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is invoked when the write state of a folder has been changed and
|
* Is invoked when the write state of a folder has been changed and
|
||||||
* enables/disables the "Create New..." menu entry.
|
* enables/disables the "Create New..." menu entry.
|
||||||
|
@ -466,19 +411,25 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void slotPlaceActivated(const KUrl& url);
|
void slotPlaceActivated(const KUrl& url);
|
||||||
|
|
||||||
void activeViewChanged();
|
/**
|
||||||
|
* Is called if the another view has been activated by changing the current
|
||||||
|
* tab or activating another view in split-view mode.
|
||||||
|
*
|
||||||
|
* Activates the given view, which means that all menu actions are applied
|
||||||
|
* to this view. When having a split view setup, the nonactive view is
|
||||||
|
* usually shown in darker colors.
|
||||||
|
*/
|
||||||
|
void activeViewChanged(DolphinViewContainer* viewContainer);
|
||||||
|
|
||||||
void closedTabsCountChanged(unsigned int count);
|
void closedTabsCountChanged(unsigned int count);
|
||||||
|
|
||||||
private:
|
|
||||||
/**
|
/**
|
||||||
* Activates the given view, which means that
|
* Is called if a new tab has been opened or a tab has been closed to
|
||||||
* all menu actions are applied to this view. When
|
* enable/disable the tab actions.
|
||||||
* having a split view setup, the nonactive view
|
|
||||||
* is usually shown in darker colors.
|
|
||||||
*/
|
*/
|
||||||
void setActiveViewContainer(DolphinViewContainer* view);
|
void tabCountChanged(int count);
|
||||||
|
|
||||||
|
private:
|
||||||
void setupActions();
|
void setupActions();
|
||||||
void setupDockWidgets();
|
void setupDockWidgets();
|
||||||
void updateEditActions();
|
void updateEditActions();
|
||||||
|
@ -511,10 +462,6 @@ private:
|
||||||
*/
|
*/
|
||||||
void updateSplitAction();
|
void updateSplitAction();
|
||||||
|
|
||||||
/** Returns the name of the tab for the URL \a url. */
|
|
||||||
QString tabName(const KUrl& url) const;
|
|
||||||
|
|
||||||
|
|
||||||
bool isKompareInstalled() const;
|
bool isKompareInstalled() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -523,8 +470,6 @@ private:
|
||||||
*/
|
*/
|
||||||
void setUrlAsCaption(const KUrl& url);
|
void setUrlAsCaption(const KUrl& url);
|
||||||
|
|
||||||
QString squeezedText(const QString& text) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an action for showing/hiding a panel, that is accessible
|
* Creates an action for showing/hiding a panel, that is accessible
|
||||||
* in "Configure toolbars..." and "Configure shortcuts...". This is necessary
|
* in "Configure toolbars..." and "Configure shortcuts...". This is necessary
|
||||||
|
@ -551,14 +496,10 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
KNewFileMenu* m_newFileMenu;
|
KNewFileMenu* m_newFileMenu;
|
||||||
DolphinTabBar* m_tabBar;
|
DolphinTabWidget* m_tabWidget;
|
||||||
DolphinViewContainer* m_activeViewContainer;
|
DolphinViewContainer* m_activeViewContainer;
|
||||||
QVBoxLayout* m_centralWidgetLayout;
|
|
||||||
int m_id;
|
int m_id;
|
||||||
|
|
||||||
int m_tabIndex;
|
|
||||||
QList<DolphinTabPage*> m_viewTab;
|
|
||||||
|
|
||||||
DolphinViewActionHandler* m_actionHandler;
|
DolphinViewActionHandler* m_actionHandler;
|
||||||
DolphinRemoteEncoding* m_remoteEncoding;
|
DolphinRemoteEncoding* m_remoteEncoding;
|
||||||
QWeakPointer<DolphinSettingsDialog> m_settingsDialog;
|
QWeakPointer<DolphinSettingsDialog> m_settingsDialog;
|
||||||
|
|
|
@ -246,7 +246,7 @@ void DolphinTabPage::slotViewActivated()
|
||||||
}
|
}
|
||||||
|
|
||||||
emit activeViewUrlChanged(activeViewContainer()->url());
|
emit activeViewUrlChanged(activeViewContainer()->url());
|
||||||
emit activeViewChanged();
|
emit activeViewChanged(activeViewContainer());
|
||||||
}
|
}
|
||||||
|
|
||||||
DolphinViewContainer* DolphinTabPage::createViewContainer(const KUrl& url) const
|
DolphinViewContainer* DolphinTabPage::createViewContainer(const KUrl& url) const
|
||||||
|
|
|
@ -121,7 +121,7 @@ public:
|
||||||
void restoreState(const QByteArray& state);
|
void restoreState(const QByteArray& state);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void activeViewChanged();
|
void activeViewChanged(DolphinViewContainer* viewContainer);
|
||||||
void activeViewUrlChanged(const KUrl& url);
|
void activeViewUrlChanged(const KUrl& url);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
345
src/dolphintabwidget.cpp
Normal file
345
src/dolphintabwidget.cpp
Normal file
|
@ -0,0 +1,345 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "dolphintabwidget.h"
|
||||||
|
|
||||||
|
#include "dolphintabbar.h"
|
||||||
|
#include "dolphintabpage.h"
|
||||||
|
#include "dolphinviewcontainer.h"
|
||||||
|
#include "dolphin_generalsettings.h"
|
||||||
|
#include "views/draganddrophelper.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <KConfigGroup>
|
||||||
|
#include <KIcon>
|
||||||
|
#include <KRun>
|
||||||
|
|
||||||
|
DolphinTabWidget::DolphinTabWidget(QWidget* parent) :
|
||||||
|
QTabWidget(parent),
|
||||||
|
m_placesSelectorVisible(true)
|
||||||
|
{
|
||||||
|
connect(this, SIGNAL(tabCloseRequested(int)),
|
||||||
|
this, SLOT(closeTab(int)));
|
||||||
|
connect(this, SIGNAL(currentChanged(int)),
|
||||||
|
this, SLOT(currentTabChanged(int)));
|
||||||
|
|
||||||
|
DolphinTabBar* tabBar = new DolphinTabBar(this);
|
||||||
|
connect(tabBar, SIGNAL(openNewActivatedTab(int)),
|
||||||
|
this, SLOT(openNewActivatedTab(int)));
|
||||||
|
connect(tabBar, SIGNAL(tabDropEvent(int,QDropEvent*)),
|
||||||
|
this, SLOT(tabDropEvent(int,QDropEvent*)));
|
||||||
|
connect(tabBar, SIGNAL(tabDetachRequested(int)),
|
||||||
|
this, SLOT(detachTab(int)));
|
||||||
|
tabBar->hide();
|
||||||
|
|
||||||
|
setTabBar(tabBar);
|
||||||
|
setDocumentMode(true);
|
||||||
|
setElideMode(Qt::ElideRight);
|
||||||
|
setUsesScrollButtons(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
DolphinTabPage* DolphinTabWidget::currentTabPage() const
|
||||||
|
{
|
||||||
|
return tabPageAt(currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
DolphinTabPage* DolphinTabWidget::tabPageAt(const int index) const
|
||||||
|
{
|
||||||
|
return static_cast<DolphinTabPage*>(widget(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::saveProperties(KConfigGroup& group) const
|
||||||
|
{
|
||||||
|
const int tabCount = count();
|
||||||
|
group.writeEntry("Tab Count", tabCount);
|
||||||
|
group.writeEntry("Active Tab Index", currentIndex());
|
||||||
|
|
||||||
|
for (int i = 0; i < tabCount; ++i) {
|
||||||
|
const DolphinTabPage* tabPage = tabPageAt(i);
|
||||||
|
group.writeEntry("Tab " % QString::number(i), tabPage->saveState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::readProperties(const KConfigGroup& group)
|
||||||
|
{
|
||||||
|
const int tabCount = group.readEntry("Tab Count", 0);
|
||||||
|
for (int i = 0; i < tabCount; ++i) {
|
||||||
|
if (i >= count()) {
|
||||||
|
openNewActivatedTab();
|
||||||
|
}
|
||||||
|
const QByteArray state = group.readEntry("Tab " % QString::number(i), QByteArray());
|
||||||
|
tabPageAt(i)->restoreState(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int index = group.readEntry("Active Tab Index", 0);
|
||||||
|
setCurrentIndex(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::refreshViews()
|
||||||
|
{
|
||||||
|
const int tabCount = count();
|
||||||
|
for (int i = 0; i < tabCount; ++i) {
|
||||||
|
tabPageAt(i)->refreshViews();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openNewActivatedTab()
|
||||||
|
{
|
||||||
|
const DolphinViewContainer* oldActiveViewContainer = currentTabPage()->activeViewContainer();
|
||||||
|
Q_ASSERT(oldActiveViewContainer);
|
||||||
|
|
||||||
|
const bool isUrlEditable = oldActiveViewContainer->urlNavigator()->isUrlEditable();
|
||||||
|
|
||||||
|
openNewActivatedTab(oldActiveViewContainer->url());
|
||||||
|
|
||||||
|
DolphinViewContainer* newActiveViewContainer = currentTabPage()->activeViewContainer();
|
||||||
|
Q_ASSERT(newActiveViewContainer);
|
||||||
|
|
||||||
|
// The URL navigator of the new tab should have the same editable state
|
||||||
|
// as the current tab
|
||||||
|
KUrlNavigator* navigator = newActiveViewContainer->urlNavigator();
|
||||||
|
navigator->setUrlEditable(isUrlEditable);
|
||||||
|
|
||||||
|
if (isUrlEditable) {
|
||||||
|
// If a new tab is opened and the URL is editable, assure that
|
||||||
|
// the user can edit the URL without manually setting the focus
|
||||||
|
navigator->setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
||||||
|
{
|
||||||
|
openNewTab(primaryUrl, secondaryUrl);
|
||||||
|
setCurrentIndex(count() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openNewTab(const KUrl& primaryUrl, const KUrl& secondaryUrl)
|
||||||
|
{
|
||||||
|
QWidget* focusWidget = QApplication::focusWidget();
|
||||||
|
|
||||||
|
DolphinTabPage* tabPage = new DolphinTabPage(primaryUrl, secondaryUrl, this);
|
||||||
|
tabPage->setPlacesSelectorVisible(m_placesSelectorVisible);
|
||||||
|
connect(tabPage, SIGNAL(activeViewChanged(DolphinViewContainer*)),
|
||||||
|
this, SIGNAL(activeViewChanged(DolphinViewContainer*)));
|
||||||
|
connect(tabPage, SIGNAL(activeViewUrlChanged(KUrl)),
|
||||||
|
this, SLOT(tabUrlChanged(KUrl)));
|
||||||
|
addTab(tabPage, KIcon(KMimeType::iconNameForUrl(primaryUrl)), tabName(primaryUrl));
|
||||||
|
|
||||||
|
if (focusWidget) {
|
||||||
|
// The DolphinViewContainer grabbed the keyboard focus. As the tab is opened
|
||||||
|
// in background, assure that the previous focused widget gets the focus back.
|
||||||
|
focusWidget->setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openDirectories(const QList<KUrl>& dirs)
|
||||||
|
{
|
||||||
|
const bool hasSplitView = GeneralSettings::splitView();
|
||||||
|
|
||||||
|
// Open each directory inside a new tab. If the "split view" option has been enabled,
|
||||||
|
// always show two directories within one tab.
|
||||||
|
QList<KUrl>::const_iterator it = dirs.constBegin();
|
||||||
|
while (it != dirs.constEnd()) {
|
||||||
|
const KUrl& primaryUrl = *(it++);
|
||||||
|
if (hasSplitView && (it != dirs.constEnd())) {
|
||||||
|
const KUrl& secondaryUrl = *(it++);
|
||||||
|
openNewTab(primaryUrl, secondaryUrl);
|
||||||
|
} else {
|
||||||
|
openNewTab(primaryUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openFiles(const QList<KUrl>& files)
|
||||||
|
{
|
||||||
|
if (files.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all distinct directories from 'files' and open a tab
|
||||||
|
// for each directory. If the "split view" option is enabled, two
|
||||||
|
// directories are shown inside one tab (see openDirectories()).
|
||||||
|
QList<KUrl> dirs;
|
||||||
|
foreach (const KUrl& url, files) {
|
||||||
|
const KUrl dir(url.directory());
|
||||||
|
if (!dirs.contains(dir)) {
|
||||||
|
dirs.append(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int oldTabCount = count();
|
||||||
|
openDirectories(dirs);
|
||||||
|
const int tabCount = count();
|
||||||
|
|
||||||
|
// Select the files. Although the files can be split between several
|
||||||
|
// tabs, there is no need to split 'files' accordingly, as
|
||||||
|
// the DolphinView will just ignore invalid selections.
|
||||||
|
for (int i = oldTabCount; i < tabCount; ++i) {
|
||||||
|
DolphinTabPage* tabPage = tabPageAt(i);
|
||||||
|
tabPage->markUrlsAsSelected(files);
|
||||||
|
tabPage->markUrlAsCurrent(files.first());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::closeTab()
|
||||||
|
{
|
||||||
|
closeTab(currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::closeTab(const int index)
|
||||||
|
{
|
||||||
|
Q_ASSERT(index >= 0);
|
||||||
|
Q_ASSERT(index < count());
|
||||||
|
|
||||||
|
if (count() < 2) {
|
||||||
|
// Never close the last tab.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DolphinTabPage* tabPage = tabPageAt(index);
|
||||||
|
if (tabPage->splitViewEnabled()) {
|
||||||
|
emit rememberClosedTab(tabPage->primaryViewContainer()->url(),
|
||||||
|
tabPage->secondaryViewContainer()->url());
|
||||||
|
} else {
|
||||||
|
emit rememberClosedTab(tabPage->primaryViewContainer()->url(), KUrl());
|
||||||
|
}
|
||||||
|
|
||||||
|
removeTab(index);
|
||||||
|
tabPage->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::activateNextTab()
|
||||||
|
{
|
||||||
|
const int index = currentIndex() + 1;
|
||||||
|
setCurrentIndex(index < count() ? index : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::activatePrevTab()
|
||||||
|
{
|
||||||
|
const int index = currentIndex() - 1;
|
||||||
|
setCurrentIndex(index >= 0 ? index : (count() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::slotPlacesPanelVisibilityChanged(bool visible)
|
||||||
|
{
|
||||||
|
// The places-selector from the URL navigator should only be shown
|
||||||
|
// if the places dock is invisible
|
||||||
|
m_placesSelectorVisible = !visible;
|
||||||
|
|
||||||
|
const int tabCount = count();
|
||||||
|
for (int i = 0; i < tabCount; ++i) {
|
||||||
|
DolphinTabPage* tabPage = tabPageAt(i);
|
||||||
|
tabPage->setPlacesSelectorVisible(m_placesSelectorVisible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::detachTab(int index)
|
||||||
|
{
|
||||||
|
Q_ASSERT(index >= 0);
|
||||||
|
|
||||||
|
const QString separator(QLatin1Char(' '));
|
||||||
|
QString command = QLatin1String("dolphin");
|
||||||
|
|
||||||
|
const DolphinTabPage* tabPage = tabPageAt(index);
|
||||||
|
command += separator + tabPage->primaryViewContainer()->url().url();
|
||||||
|
if (tabPage->splitViewEnabled()) {
|
||||||
|
command += separator + tabPage->secondaryViewContainer()->url().url();
|
||||||
|
command += separator + QLatin1String("-split");
|
||||||
|
}
|
||||||
|
|
||||||
|
KRun::runCommand(command, this);
|
||||||
|
|
||||||
|
closeTab(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::openNewActivatedTab(int index)
|
||||||
|
{
|
||||||
|
Q_ASSERT(index >= 0);
|
||||||
|
const DolphinTabPage* tabPage = tabPageAt(index);
|
||||||
|
openNewActivatedTab(tabPage->activeViewContainer()->url());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::tabDropEvent(int index, QDropEvent* event)
|
||||||
|
{
|
||||||
|
if (index >= 0) {
|
||||||
|
const DolphinView* view = tabPageAt(index)->activeViewContainer()->view();
|
||||||
|
|
||||||
|
QString error;
|
||||||
|
DragAndDropHelper::dropUrls(view->rootItem(), view->url(), event, error);
|
||||||
|
if (!error.isEmpty()) {
|
||||||
|
currentTabPage()->activeViewContainer()->showMessage(error, DolphinViewContainer::Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::tabUrlChanged(const KUrl& url)
|
||||||
|
{
|
||||||
|
const int index = indexOf(qobject_cast<QWidget*>(sender()));
|
||||||
|
if (index >= 0) {
|
||||||
|
tabBar()->setTabText(index, tabName(url));
|
||||||
|
tabBar()->setTabIcon(index, KIcon(KMimeType::iconNameForUrl(url)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::currentTabChanged(int index)
|
||||||
|
{
|
||||||
|
emit activeViewChanged(tabPageAt(index)->activeViewContainer());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::tabInserted(int index)
|
||||||
|
{
|
||||||
|
QTabWidget::tabInserted(index);
|
||||||
|
|
||||||
|
if (count() > 1) {
|
||||||
|
tabBar()->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
emit tabCountChanged(count());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinTabWidget::tabRemoved(int index)
|
||||||
|
{
|
||||||
|
QTabWidget::tabRemoved(index);
|
||||||
|
|
||||||
|
// If only one tab is left, then remove the tab entry so that
|
||||||
|
// closing the last tab is not possible.
|
||||||
|
if (count() < 2) {
|
||||||
|
tabBar()->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
emit tabCountChanged(count());
|
||||||
|
}
|
||||||
|
|
||||||
|
QString DolphinTabWidget::tabName(const KUrl& url) const
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
if (url.equals(KUrl("file:///"))) {
|
||||||
|
name = '/';
|
||||||
|
} else {
|
||||||
|
name = url.fileName();
|
||||||
|
if (name.isEmpty()) {
|
||||||
|
name = url.protocol();
|
||||||
|
} else {
|
||||||
|
// Make sure that a '&' inside the directory name is displayed correctly
|
||||||
|
// and not misinterpreted as a keyboard shortcut in QTabBar::setTabText()
|
||||||
|
name.replace('&', "&&");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
178
src/dolphintabwidget.h
Normal file
178
src/dolphintabwidget.h
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef DOLPHIN_TAB_WIDGET_H
|
||||||
|
#define DOLPHIN_TAB_WIDGET_H
|
||||||
|
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <KUrl>
|
||||||
|
|
||||||
|
class DolphinViewContainer;
|
||||||
|
class DolphinTabPage;
|
||||||
|
class KConfigGroup;
|
||||||
|
|
||||||
|
class DolphinTabWidget : public QTabWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DolphinTabWidget(QWidget* parent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Tab page at the current index (can be 0 if tabs count is smaller than 1)
|
||||||
|
*/
|
||||||
|
DolphinTabPage* currentTabPage() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Tab page at the given \a index (can be 0 if the index is out-of-range)
|
||||||
|
*/
|
||||||
|
DolphinTabPage* tabPageAt(const int index) const;
|
||||||
|
|
||||||
|
void saveProperties(KConfigGroup& group) const;
|
||||||
|
void readProperties(const KConfigGroup& group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the views of the main window by recreating them according to
|
||||||
|
* the given Dolphin settings.
|
||||||
|
*/
|
||||||
|
void refreshViews();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
/**
|
||||||
|
* Is emitted when the active view has been changed, by changing the current
|
||||||
|
* tab or by activating another view when split view is enabled in the current
|
||||||
|
* tab.
|
||||||
|
*/
|
||||||
|
void activeViewChanged(DolphinViewContainer* viewContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is emitted when the number of open tabs has changed (e.g. by opening or
|
||||||
|
* closing a tab)
|
||||||
|
*/
|
||||||
|
void tabCountChanged(int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is emitted when a tab has been closed.
|
||||||
|
*/
|
||||||
|
void rememberClosedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
/**
|
||||||
|
* Opens a new view with the current URL that is part of a tab and activates
|
||||||
|
* the tab.
|
||||||
|
*/
|
||||||
|
void openNewActivatedTab();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a new tab showing the URL \a primaryUrl and the optional URL
|
||||||
|
* \a secondaryUrl and activates the tab.
|
||||||
|
*/
|
||||||
|
void openNewActivatedTab(const KUrl& primaryUrl, const KUrl& secondaryUrl = KUrl());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a new tab in the background showing the URL \a primaryUrl and the
|
||||||
|
* optional URL \a secondaryUrl.
|
||||||
|
*/
|
||||||
|
void openNewTab(const KUrl& primaryUrl, const KUrl& secondaryUrl = KUrl());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens each directory in \p dirs in a separate tab. If the "split view"
|
||||||
|
* option is enabled, 2 directories are collected within one tab.
|
||||||
|
*/
|
||||||
|
void openDirectories(const QList<KUrl>& dirs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the directory which contains the files \p files
|
||||||
|
* and selects all files (implements the --select option
|
||||||
|
* of Dolphin).
|
||||||
|
*/
|
||||||
|
void openFiles(const QList<KUrl>& files);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the currently active tab.
|
||||||
|
*/
|
||||||
|
void closeTab();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the tab with the index \a index and activates the tab with index - 1.
|
||||||
|
*/
|
||||||
|
void closeTab(const int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activates the next tab in the tab bar.
|
||||||
|
* If the current active tab is the last tab, it activates the first tab.
|
||||||
|
*/
|
||||||
|
void activateNextTab();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activates the previous tab in the tab bar.
|
||||||
|
* If the current active tab is the first tab, it activates the last tab.
|
||||||
|
*/
|
||||||
|
void activatePrevTab();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is invoked if the Places panel got visible/invisible and takes care
|
||||||
|
* that the places-selector of all views is only shown if the Places panel
|
||||||
|
* is invisible.
|
||||||
|
*/
|
||||||
|
void slotPlacesPanelVisibilityChanged(bool visible);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
/**
|
||||||
|
* Opens the tab with the index \a index in a new Dolphin instance and closes
|
||||||
|
* this tab.
|
||||||
|
*/
|
||||||
|
void detachTab(int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a new tab showing the url from tab at the given \a index and
|
||||||
|
* activates the tab.
|
||||||
|
*/
|
||||||
|
void openNewActivatedTab(int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is connected to the KTabBar signal receivedDropEvent.
|
||||||
|
* Allows dragging and dropping files onto tabs.
|
||||||
|
*/
|
||||||
|
void tabDropEvent(int tab, QDropEvent* event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The active view url of a tab has been changed so update the text and the
|
||||||
|
* icon of the corresponding tab.
|
||||||
|
*/
|
||||||
|
void tabUrlChanged(const KUrl& url);
|
||||||
|
|
||||||
|
void currentTabChanged(int index);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void tabInserted(int index);
|
||||||
|
virtual void tabRemoved(int index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Returns the name of the tab for the URL \a url.
|
||||||
|
*/
|
||||||
|
QString tabName(const KUrl& url) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** Caches the (negated) places panel visibility */
|
||||||
|
bool m_placesSelectorVisible;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue