From: Kai Uwe Broulik Date: Wed, 24 Oct 2018 07:53:07 +0000 (+0200) Subject: Merge branch 'Applications/18.08' X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/d575e1e88409d819fb92456e8022e8e0322549af?hp=502a5c86feb0015c42f052d242c8115de320a38e Merge branch 'Applications/18.08' --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b2e666a43..390376e94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0) # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "18") -set (KDE_APPLICATIONS_VERSION_MINOR "08") -set (KDE_APPLICATIONS_VERSION_MICRO "2") +set (KDE_APPLICATIONS_VERSION_MINOR "11") +set (KDE_APPLICATIONS_VERSION_MICRO "70") set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}") project(Dolphin VERSION ${KDE_APPLICATIONS_VERSION}) @@ -94,10 +94,7 @@ if (KF5Baloo_FOUND AND KF5BalooWidgets_FOUND AND KF5FileMetaData_FOUND) message(STATUS "Baloo packages are found") set(HAVE_BALOO TRUE) else() - message(WARNING "Baloo packages not found. They are needed for the metadata features of Dolphin.") - find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS - KDELibs4Support # for KFileMetaDataWidget - ) + message(WARNING "Baloo packages not found. They are needed for the metadata features of Dolphin (including the information panel).") endif() add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eacb792fc..5aff4b0fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -98,8 +98,6 @@ set(dolphinprivate_LIB_SRCS views/dolphinviewactionhandler.cpp views/draganddrophelper.cpp views/renamedialog.cpp - views/tooltips/dolphinfilemetadatawidget.cpp - views/tooltips/tooltipmanager.cpp views/versioncontrol/updateitemstatesthread.cpp views/versioncontrol/versioncontrolobserver.cpp views/viewmodecontroller.cpp @@ -114,6 +112,8 @@ set(dolphinprivate_LIB_SRCS if(HAVE_BALOO) set(dolphinprivate_LIB_SRCS ${dolphinprivate_LIB_SRCS} + views/tooltips/dolphinfilemetadatawidget.cpp + views/tooltips/tooltipmanager.cpp kitemviews/private/kbaloorolesprovider.cpp ) endif() @@ -155,11 +155,6 @@ if(HAVE_BALOO) KF5::Baloo KF5::BalooWidgets ) -else() - target_link_libraries( - dolphinprivate PUBLIC - KF5::KDELibs4Support # for KFileMetaDataWidget - ) endif() set_target_properties(dolphinprivate PROPERTIES @@ -204,11 +199,6 @@ set(dolphinstatic_SRCS dolphintabwidget.cpp trash/dolphintrash.cpp filterbar/filterbar.cpp - panels/information/filemetadataconfigurationdialog.cpp - panels/information/informationpanel.cpp - panels/information/informationpanelcontent.cpp - panels/information/pixmapviewer.cpp - panels/information/phononwidget.cpp panels/places/placespanel.cpp panels/places/placesitem.cpp panels/places/placesitemeditdialog.cpp @@ -252,6 +242,17 @@ set(dolphinstatic_SRCS global.cpp ) +if(HAVE_BALOO) + set(dolphinstatic_SRCS + ${dolphinstatic_SRCS} + panels/information/filemetadataconfigurationdialog.cpp + panels/information/informationpanel.cpp + panels/information/informationpanelcontent.cpp + panels/information/pixmapviewer.cpp + panels/information/phononwidget.cpp + ) +endif() + kconfig_add_kcfg_files(dolphinstatic_SRCS GENERATE_MOC panels/folders/dolphin_folderspanelsettings.kcfgc panels/information/dolphin_informationpanelsettings.kcfgc diff --git a/src/dbusinterface.cpp b/src/dbusinterface.cpp index e5192f207..c780bc7cd 100644 --- a/src/dbusinterface.cpp +++ b/src/dbusinterface.cpp @@ -23,13 +23,15 @@ #include #include +#include DBusInterface::DBusInterface() : QObject() { - QDBusConnection::sessionBus().registerService(QStringLiteral("org.freedesktop.FileManager1")); QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/freedesktop/FileManager1"), this, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportAdaptors); + QDBusConnection::sessionBus().interface()->registerService(QStringLiteral("org.freedesktop.FileManager1"), + QDBusConnectionInterface::QueueService); } void DBusInterface::ShowFolders(const QStringList& uriList, const QString& startUpId) diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 8fdaab1d0..a521551e5 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -341,7 +341,12 @@ void DolphinContextMenu::openViewportContextMenu() addSeparator(); // Insert 'Open With' entries - const KFileItemListProperties baseUrlProperties(KFileItemList() << baseFileItem()); + KFileItem baseItem = view->rootItem(); + if (baseItem.isNull() || baseItem.url() != m_baseUrl) { + baseItem = baseFileItem(); + } + + const KFileItemListProperties baseUrlProperties(KFileItemList() << baseItem); KFileItemActions fileItemActions; fileItemActions.setParentWidget(m_mainWindow); fileItemActions.setItemListProperties(baseUrlProperties); diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 38537d92a..75a340f0a 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -25,7 +25,6 @@ #include "dolphindockwidget.h" #include "dolphincontextmenu.h" #include "dolphinnewfilemenu.h" -#include "dolphinplacesmodelsingleton.h" #include "dolphinrecenttabsmenu.h" #include "dolphintabwidget.h" #include "dolphinviewcontainer.h" @@ -49,7 +48,6 @@ #include #include #include -#include #include #include #include @@ -137,7 +135,7 @@ DolphinMainWindow::DolphinMainWindow() : connect(m_tabWidget, &DolphinTabWidget::tabCountChanged, this, &DolphinMainWindow::tabCountChanged); connect(m_tabWidget, &DolphinTabWidget::currentUrlChanged, - this, &DolphinMainWindow::setUrlAsCaption); + this, &DolphinMainWindow::updateWindowTitle); setCentralWidget(m_tabWidget); setupActions(); @@ -588,6 +586,7 @@ void DolphinMainWindow::reloadView() { clearStatusBar(); m_activeViewContainer->reload(); + m_activeViewContainer->statusBar()->updateSpaceInfo(); } void DolphinMainWindow::stopLoading() @@ -855,6 +854,11 @@ void DolphinMainWindow::updateControlMenu() KActionCollection* ac = actionCollection(); + // Add "Create New" menu + menu->addMenu(m_newFileMenu->menu()); + + menu->addSeparator(); + // Add "Edit" actions bool added = addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Undo)), menu) | addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Find)), menu) | @@ -996,46 +1000,9 @@ void DolphinMainWindow::tabCountChanged(int count) actionCollection()->action(QStringLiteral("activate_prev_tab"))->setEnabled(enableTabActions); } -void DolphinMainWindow::setUrlAsCaption(const QUrl& url) +void DolphinMainWindow::updateWindowTitle() { - QString schemePrefix; - if (!url.isLocalFile()) { - schemePrefix.append(url.scheme() + " - "); - if (!url.host().isEmpty()) { - schemePrefix.append(url.host() + " - "); - } - } - - if (GeneralSettings::showFullPathInTitlebar()) { - const QString path = url.adjusted(QUrl::StripTrailingSlash).path(); - setWindowTitle(schemePrefix + path); - return; - } - - KFilePlacesModel *placesModel = DolphinPlacesModelSingleton::instance().placesModel(); - const auto& matchedPlaces = placesModel->match(placesModel->index(0,0), KFilePlacesModel::UrlRole, url, 1, Qt::MatchExactly); - - if (!matchedPlaces.isEmpty()) { - setWindowTitle(placesModel->text(matchedPlaces.first())); - return; - } - - QString fileName = url.adjusted(QUrl::StripTrailingSlash).fileName(); - if (fileName.isEmpty()) { - fileName = '/'; - } - - if (m_activeViewContainer->isSearchModeEnabled()) { - if(m_activeViewContainer->currentSearchText().isEmpty()){ - setWindowTitle(i18n("Search")); - } else { - const auto searchText = i18n("Search for %1", m_activeViewContainer->currentSearchText()); - setWindowTitle(searchText); - } - return; - } - - setWindowTitle(schemePrefix + fileName); + setWindowTitle(m_activeViewContainer->caption()); } void DolphinMainWindow::slotStorageTearDownFromPlacesRequested(const QString& mountPath) @@ -1262,6 +1229,8 @@ void DolphinMainWindow::setupDockWidgets() infoDock->setLocked(lock); infoDock->setObjectName(QStringLiteral("infoDock")); infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + +#ifdef HAVE_BALOO InformationPanel* infoPanel = new InformationPanel(infoDock); infoPanel->setCustomContextMenuActions({lockLayoutAction}); connect(infoPanel, &InformationPanel::urlActivated, this, &DolphinMainWindow::handleUrl); @@ -1277,6 +1246,7 @@ void DolphinMainWindow::setupDockWidgets() infoPanel, &InformationPanel::setSelection); connect(this, &DolphinMainWindow::requestItemInfo, infoPanel, &InformationPanel::requestDelayedItemInfo); +#endif // Setup "Folders" DolphinDockWidget* foldersDock = new DolphinDockWidget(i18nc("@title:window", "Folders")); @@ -1373,7 +1343,9 @@ void DolphinMainWindow::setupDockWidgets() panelsMenu->setDelayed(false); const KActionCollection* ac = actionCollection(); panelsMenu->addAction(ac->action(QStringLiteral("show_places_panel"))); +#ifdef HAVE_BALOO panelsMenu->addAction(ac->action(QStringLiteral("show_information_panel"))); +#endif panelsMenu->addAction(ac->action(QStringLiteral("show_folders_panel"))); panelsMenu->addAction(ac->action(QStringLiteral("show_terminal_panel"))); panelsMenu->addSeparator(); @@ -1497,7 +1469,7 @@ void DolphinMainWindow::refreshViews() const bool splitView = GeneralSettings::splitView(); m_tabWidget->currentTabPage()->setSplitViewEnabled(splitView); updateSplitAction(); - setUrlAsCaption(activeViewContainer()->url()); + updateWindowTitle(); } emit settingsChanged(); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 637f41f21..f2876a877 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -412,10 +412,9 @@ private slots: void tabCountChanged(int count); /** - * Sets the window caption to url.fileName() if this is non-empty, - * "/" if the URL is "file:///", and url.protocol() otherwise. + * Updates the Window Title with the caption from the active view container */ - void setUrlAsCaption(const QUrl& url); + void updateWindowTitle(); /** * This slot is called when the user requested to unmount a removable media diff --git a/src/dolphintabwidget.cpp b/src/dolphintabwidget.cpp index a5c2f8c98..edb7247cc 100644 --- a/src/dolphintabwidget.cpp +++ b/src/dolphintabwidget.cpp @@ -116,6 +116,7 @@ void DolphinTabWidget::refreshViews() { const int tabCount = count(); for (int i = 0; i < tabCount; ++i) { + tabBar()->setTabText(i, tabName(tabPageAt(i))); tabPageAt(i)->refreshViews(); } } @@ -160,7 +161,7 @@ void DolphinTabWidget::openNewTab(const QUrl& primaryUrl, const QUrl& secondaryU this, &DolphinTabWidget::activeViewChanged); connect(tabPage, &DolphinTabPage::activeViewUrlChanged, this, &DolphinTabWidget::tabUrlChanged); - addTab(tabPage, QIcon::fromTheme(KIO::iconNameForUrl(primaryUrl)), tabName(primaryUrl)); + addTab(tabPage, QIcon::fromTheme(KIO::iconNameForUrl(primaryUrl)), tabName(tabPage)); if (focusWidget) { // The DolphinViewContainer grabbed the keyboard focus. As the tab is opened @@ -305,7 +306,7 @@ void DolphinTabWidget::tabUrlChanged(const QUrl& url) { const int index = indexOf(qobject_cast(sender())); if (index >= 0) { - tabBar()->setTabText(index, tabName(url)); + tabBar()->setTabText(index, tabName(tabPageAt(index))); tabBar()->setTabIcon(index, QIcon::fromTheme(KIO::iconNameForUrl(url))); // Emit the currentUrlChanged signal if the url of the current tab has been changed. @@ -353,20 +354,13 @@ void DolphinTabWidget::tabRemoved(int index) emit tabCountChanged(count()); } -QString DolphinTabWidget::tabName(const QUrl& url) const +QString DolphinTabWidget::tabName(DolphinTabPage* tabPage) const { - QString name; - if (url == QUrl(QStringLiteral("file:///"))) { - name = '/'; - } else { - name = url.adjusted(QUrl::StripTrailingSlash).fileName(); - if (name.isEmpty()) { - name = url.scheme(); - } else { - // Make sure that a '&' inside the directory name is displayed correctly - // and not misinterpreted as a keyboard shortcut in QTabBar::setTabText() - name.replace('&', QLatin1String("&&")); - } + if (!tabPage) { + return QString(); } - return name; + QString name = tabPage->activeViewContainer()->caption(); + // Make sure that a '&' inside the directory name is displayed correctly + // and not misinterpreted as a keyboard shortcut in QTabBar::setTabText() + return name.replace('&', QLatin1String("&&")); } diff --git a/src/dolphintabwidget.h b/src/dolphintabwidget.h index b4493f7ed..0cb662966 100644 --- a/src/dolphintabwidget.h +++ b/src/dolphintabwidget.h @@ -191,9 +191,10 @@ protected: private: /** - * Returns the name of the tab for the URL \a url. + * @param tabPage The tab page to get the name of + * @return The name of the tab page */ - QString tabName(const QUrl& url) const; + QString tabName(DolphinTabPage* tabPage) const; private: /** Caches the (negated) places panel visibility */ diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index f473752dc..767af64e1 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -31,6 +31,7 @@ #include "views/viewproperties.h" #include +#include #include #include #include @@ -55,6 +56,7 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : m_urlNavigator(nullptr), m_emptyTrashButton(nullptr), m_searchBox(nullptr), + m_searchModeEnabled(false), m_messageWidget(nullptr), m_view(nullptr), m_filterBar(nullptr), @@ -377,11 +379,13 @@ void DolphinViewContainer::setSearchModeEnabled(bool enabled) } m_urlNavigator->setLocationUrl(url); } + + m_searchModeEnabled = enabled; } bool DolphinViewContainer::isSearchModeEnabled() const { - return m_searchBox->isVisible(); + return m_searchModeEnabled; } QString DolphinViewContainer::placesText() const @@ -409,6 +413,53 @@ void DolphinViewContainer::reload() m_messageWidget->hide(); } +QString DolphinViewContainer::caption() const +{ + if (GeneralSettings::showFullPathInTitlebar()) { + if (!url().isLocalFile()) { + return url().adjusted(QUrl::StripTrailingSlash).toString(); + } + return url().adjusted(QUrl::StripTrailingSlash).path(); + } + + KFilePlacesModel *placesModel = DolphinPlacesModelSingleton::instance().placesModel(); + const auto& matchedPlaces = placesModel->match(placesModel->index(0,0), KFilePlacesModel::UrlRole, url(), 1, Qt::MatchExactly); + + if (!matchedPlaces.isEmpty()) { + return placesModel->text(matchedPlaces.first()); + } + + if (isSearchModeEnabled()) { + if (currentSearchText().isEmpty()){ + return i18n("Search"); + } else { + return i18n("Search for %1", currentSearchText()); + } + } + + if (!url().isLocalFile()) { + QUrl adjustedUrl = url().adjusted(QUrl::StripTrailingSlash); + QString caption; + if (!adjustedUrl.fileName().isEmpty()) { + caption = adjustedUrl.fileName(); + } else if (!adjustedUrl.path().isEmpty() && adjustedUrl.path() != "/") { + caption = adjustedUrl.path(); + } else if (!adjustedUrl.host().isEmpty()) { + caption = adjustedUrl.host(); + } else { + caption = adjustedUrl.toString(); + } + return caption; + } + + QString fileName = url().adjusted(QUrl::StripTrailingSlash).fileName(); + if (fileName.isEmpty()) { + fileName = '/'; + } + + return fileName; +} + void DolphinViewContainer::setUrl(const QUrl& newUrl) { if (newUrl != m_urlNavigator->locationUrl()) { @@ -633,7 +684,6 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const QUrl& url) void DolphinViewContainer::slotUrlSelectionRequested(const QUrl& url) { - qCDebug(DolphinDebug) << "slotUrlSelectionRequested: " << url; m_view->markUrlsAsSelected({url}); m_view->markUrlAsCurrent(url); // makes the item scroll into view } diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index b5bcc78ad..f33a5a118 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -136,6 +136,13 @@ public: */ void reload(); + /** + * @return Returns a Caption suitable for display to the user. It is + * calculated depending on settings, if a search is active and other + * factors. + */ + QString caption() const; + public slots: /** * Sets the current active URL, where all actions are applied. The @@ -324,6 +331,7 @@ private: KUrlNavigator* m_urlNavigator; QPushButton* m_emptyTrashButton; DolphinSearchBox* m_searchBox; + bool m_searchModeEnabled; KMessageWidget* m_messageWidget; DolphinView* m_view; diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index e548e7519..40b8ccf37 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -78,7 +78,13 @@ QString KFileItemListWidgetInformant::roleText(const QByteArray& role, const KIO::filesize_t size = roleValue.value(); text = KFormat().formatByteSize(size); } - } else if (role == "modificationtime" || role == "creationtime" || role == "accesstime" || role == "deletiontime" || role == "imageDateTime") { + } else if (role == "modificationtime" || role == "creationtime" || role == "accesstime") { + bool ok; + const long long time = roleValue.toLongLong(&ok); + if (ok && time != -1) { + return QLocale().toString(QDateTime::fromSecsSinceEpoch(time), QLocale::ShortFormat); + } + } else if (role == "deletiontime" || role == "imageDateTime") { const QDateTime dateTime = roleValue.toDateTime(); text = QLocale().toString(dateTime, QLocale::ShortFormat); } else { diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 8503cc8bc..fd0a88fb6 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -1563,26 +1563,26 @@ QHash KFileItemModel::retrieveData(const KFileItem& item, } if (m_requestRole[ModificationTimeRole]) { - // Don't use KFileItem::timeString() as this is too expensive when - // having several thousands of items. Instead the formatting of the - // date-time will be done on-demand by the view when the date will be shown. - const QDateTime dateTime = item.time(KFileItem::ModificationTime); + // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when + // having several thousands of items. Instead read the raw number from UDSEntry directly + // and the formatting of the date-time will be done on-demand by the view when the date will be shown. + const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1); data.insert(sharedValue("modificationtime"), dateTime); } if (m_requestRole[CreationTimeRole]) { - // Don't use KFileItem::timeString() as this is too expensive when - // having several thousands of items. Instead the formatting of the - // date-time will be done on-demand by the view when the date will be shown. - const QDateTime dateTime = item.time(KFileItem::CreationTime); + // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when + // having several thousands of items. Instead read the raw number from UDSEntry directly + // and the formatting of the date-time will be done on-demand by the view when the date will be shown. + const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1); data.insert(sharedValue("creationtime"), dateTime); } if (m_requestRole[AccessTimeRole]) { - // Don't use KFileItem::timeString() as this is too expensive when - // having several thousands of items. Instead the formatting of the - // date-time will be done on-demand by the view when the date will be shown. - const QDateTime dateTime = item.time(KFileItem::AccessTime); + // Don't use KFileItem::timeString() or KFileItem::time() as this is too expensive when + // having several thousands of items. Instead read the raw number from UDSEntry directly + // and the formatting of the date-time will be done on-demand by the view when the date will be shown. + const long long dateTime = item.entry().numberValue(KIO::UDSEntry::UDS_ACCESS_TIME, -1); data.insert(sharedValue("accesstime"), dateTime); } diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index abc5f176a..f4d69dec2 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -495,14 +495,9 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi QPixmap scaledPixmap = pixmap; - const QString mimeType = item.mimetype(); - const int slashIndex = mimeType.indexOf(QLatin1Char('/')); - const bool isFontPreview = mimeType.rightRef(slashIndex).contains(QLatin1String("font")); - const bool isFolderPreview = item.isDir(); - const bool isWindowsExePreview = mimeType == QLatin1String("application/x-ms-dos-executable") || - mimeType == QLatin1String("application/x-msdownload"); - - if (!isFolderPreview && !isFontPreview && !isWindowsExePreview) { + if (!pixmap.hasAlpha() + && m_iconSize.width() > KIconLoader::SizeSmallMedium + && m_iconSize.height() > KIconLoader::SizeSmallMedium) { if (m_enlargeSmallPreviews) { KPixmapModifier::applyFrame(scaledPixmap, m_iconSize); } else { diff --git a/src/kitemviews/private/kdirectorycontentscounterworker.h b/src/kitemviews/private/kdirectorycontentscounterworker.h index 2460a0e1f..b40da6e87 100644 --- a/src/kitemviews/private/kdirectorycontentscounterworker.h +++ b/src/kitemviews/private/kdirectorycontentscounterworker.h @@ -17,8 +17,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#ifndef KDIRECTORYCONTENTENTSCOUNTERWORKER_H -#define KDIRECTORYCONTENTENTSCOUNTERWORKER_H +#ifndef KDIRECTORYCONTENTSCOUNTERWORKER_H +#define KDIRECTORYCONTENTSCOUNTERWORKER_H #include #include diff --git a/src/kitemviews/private/kitemlistviewlayouter.cpp b/src/kitemviews/private/kitemlistviewlayouter.cpp index c765cdcfe..56e0f338f 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.cpp +++ b/src/kitemviews/private/kitemlistviewlayouter.cpp @@ -17,9 +17,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ +#include "kitemlistviewlayouter.h" #include "dolphindebug.h" #include "kitemlistsizehintresolver.h" -#include "kitemlistviewlayouter.h" #include "kitemviews/kitemmodelbase.h" // #define KITEMLISTVIEWLAYOUTER_DEBUG diff --git a/src/main.cpp b/src/main.cpp index a46b5e2d8..3db63eab0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -144,7 +144,6 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) } DolphinMainWindow* mainWindow = new DolphinMainWindow(); - mainWindow->setAttribute(Qt::WA_DeleteOnClose); if (parser.isSet(QStringLiteral("select"))) { mainWindow->openFiles(urls, splitView); diff --git a/src/org.kde.dolphin.appdata.xml b/src/org.kde.dolphin.appdata.xml index 30b0be216..9aa3d146f 100644 --- a/src/org.kde.dolphin.appdata.xml +++ b/src/org.kde.dolphin.appdata.xml @@ -97,6 +97,7 @@

Dolphin is a lightweight file manager. It has been designed with ease of use and simplicity in mind, while still allowing flexibility and customisation. This means that you can do your file management exactly the way you want to do it.

دولفين هو مدير ملفات خفيف. صُمِّم دولفين مع أخذ سهولة الاستخدام والبساطة بعين الاعتبار، مع السماح بالمرونة والتخصيص. يعني هذا أنه يمكنك إدارة ملفاتك كما تريد تمامًا.

+

Dolphin ye un xestor de ficheros llixeru. Diseñóse cola cenciellez y facilidá d'usu en mente, al empar que permite flexibilidá y personalización. Esto quier dicir que pues facer la xestión de ficheros del mou exautu que quieras.

Dolphinje lagan file manager. On je bio dizajniran sa lakoćom korišćenja i jednostavnosti u vidu, još omogućavajući fleksibilnost i prilagođavanje. To znači da možete da radite svoje upravljanje datotekama onako kako želite da to uradi.

El Dolphin és un gestor de fitxers lleuger. S'ha dissenyat pensant a facilitar el seu ús i que sigui simple, permetent la flexibilitat i la personalització. Això vol dir que podeu fer la gestió dels vostres fitxers de la manera exacta com ho vulgueu fer.

El Dolphin és un gestor de fitxers lleuger. S'ha dissenyat pensant a facilitar el seu ús i que siga simple, permetent la flexibilitat i la personalització. Això vol dir que podeu fer la gestió dels vostres fitxers de la manera exacta com ho vulgueu fer.

@@ -224,6 +225,7 @@
  • 網址導覽列讓您可以快速瀏覽檔案與資料夾。
  • Supports several different kinds of view styles and properties and allows you to configure the view exactly how you want it.
  • يدعم العديد من الأنواع المختلفة من الخصائص وأنماط العرض ويسمح لك بضبط العرض كما تريد تمامًا.
  • +
  • Sofita estilos y propiedaes de vista diferentes, y permítete configurar la vista exautamente como quieras.
  • DopuÅ¡ta viÅ¡te vrsta stilova pogleda i svojstava i dopÅ¡ta vam da konfiguriÅ¡ete pogled baÅ¡ kako želite.
  • Accepta diferents classes diverses d'estils de visualització i propietats i us permet configurar la visualització exactament com la vulgueu.
  • Accepta diferents classes diverses d'estils de visualització i propietats i vos permet configurar la visualització exactament com la vulgueu.
  • @@ -264,6 +266,7 @@
  • 網址導覽列讓您可以快速瀏覽檔案與資料夾。
  • Split view, allowing you to easily copy or move files between locations.
  • العرض المقسوم، يسمح لك بنسخ ونقل الملفات بين مكانين بسهولة.
  • +
  • La vista dixebrada permítete copiar o mover ficheros de mou fácil ente allugamientos.
  • Razdvaja pogled, dopuÅ¡tajući lako kopiranje ili pomijeranje datoteka između lokacija
  • Divisió de visualització, permetent copiar o moure fitxers fàcilment entre les ubicacions.
  • Divisió de visualització, permetent copiar o moure fitxers fàcilment entre les ubicacions.
  • @@ -304,6 +307,7 @@
  • 支援數個檢視模式,您也可以調整檢視模式的屬性。
  • Additional information and shortcuts are available as dock-able panels, allowing you to move them around freely and display exactly what you want.
  • تتوفر معلومات واختصارات إضافية كلوحات قابلة للرصف، مما يسمح لك بنقلها بحريّة وعرضها بالضبط كما تريد.
  • +
  • La información adicional y los atayos tán disponibles como paneles anclables que pues mover ande quieras y amosar como exautamente quieras.
  • Dodatne informacije i kratice su dostupne kao usidreni paneli, dopuÅ¡tajući vam da se krećete slobodno i prikažete Å¡ta želite.
  • Hi ha informació addicional i dreceres disponibles com a plafons que es poden acoblar, permetent moure'ls lliurement i mostrar exactament el què vulgueu.
  • Hi ha informació addicional i dreceres disponibles com a plafons que es poden acoblar, permetent moure'ls lliurement i mostrar exactament el què vulgueu.
  • @@ -390,6 +394,7 @@
  • 額外資訊與嵌入式面板捷徑讓您可以輕易顯示您常用的項目。
  • Informational dialogues are displayed in an unobtrusive way.
  • حواريات المعلومات تُعرَض بطريقة غير مُزعجة.
  • +
  • Los diálogos informativos amuésense d'un mou non intrusivu.
  • Informativni dijalozi su prikazani na nenametljiv način.
  • Els diàlegs informatius es mostren d'una manera no molesta.
  • Els diàlegs informatius es mostren d'una manera no molesta.
  • @@ -430,6 +435,7 @@
  • 支援多分頁
  • Undo/redo support
  • دعم التراجع والإعادة
  • +
  • Sofitu pa la desfechura/refechura
  • PodrÅ¡ka za poniÅ¡tavanje/ponavljanje akcija
  • Admet desfer/refer
  • Admet desfer/refer
  • diff --git a/src/panels/information/filemetadataconfigurationdialog.cpp b/src/panels/information/filemetadataconfigurationdialog.cpp index 3b3789175..f3ca819b7 100644 --- a/src/panels/information/filemetadataconfigurationdialog.cpp +++ b/src/panels/information/filemetadataconfigurationdialog.cpp @@ -19,11 +19,7 @@ #include "filemetadataconfigurationdialog.h" -#ifndef HAVE_BALOO -#include -#else #include -#endif #include #include #include @@ -56,12 +52,7 @@ FileMetaDataConfigurationDialog::FileMetaDataConfigurationDialog(QWidget* parent "be shown:"), this); m_descriptionLabel->setWordWrap(true); -#ifndef HAVE_BALOO - m_configWidget = new KFileMetaDataConfigurationWidget(this); -#else m_configWidget = new Baloo::FileMetaDataConfigWidget(this); -#endif - QWidget* mainWidget = new QWidget(this); QVBoxLayout* topLayout = new QVBoxLayout(mainWidget); diff --git a/src/panels/information/filemetadataconfigurationdialog.h b/src/panels/information/filemetadataconfigurationdialog.h index b38404da8..04357783c 100644 --- a/src/panels/information/filemetadataconfigurationdialog.h +++ b/src/panels/information/filemetadataconfigurationdialog.h @@ -70,11 +70,7 @@ protected slots: void slotAccepted(); private: QLabel* m_descriptionLabel; -#ifndef HAVE_BALOO - KFileMetaDataConfigurationWidget* m_configWidget; -#else Baloo::FileMetaDataConfigWidget* m_configWidget; -#endif }; #endif diff --git a/src/panels/information/informationpanelcontent.cpp b/src/panels/information/informationpanelcontent.cpp index 0cba0cdf0..6f671e683 100644 --- a/src/panels/information/informationpanelcontent.cpp +++ b/src/panels/information/informationpanelcontent.cpp @@ -32,11 +32,7 @@ #include #include -#ifndef HAVE_BALOO -#include -#else #include -#endif #include #include @@ -106,19 +102,13 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : const bool previewsShown = InformationPanelSettings::previewsShown(); m_preview->setVisible(previewsShown); -#ifndef HAVE_BALOO - m_metaDataWidget = new KFileMetaDataWidget(parent); - connect(m_metaDataWidget, &KFileMetaDataWidget::urlActivated, - this, &InformationPanelContent::urlActivated); -#else m_metaDataWidget = new Baloo::FileMetaDataWidget(parent); m_metaDataWidget->setDateFormat(static_cast(InformationPanelSettings::dateFormat())); connect(m_metaDataWidget, &Baloo::FileMetaDataWidget::urlActivated, this, &InformationPanelContent::urlActivated); -#endif m_metaDataWidget->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); m_metaDataWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); - + // Encapsulate the MetaDataWidget inside a container that has a dummy widget // at the bottom. This prevents that the meta data widget gets vertically stretched // in the case where the height of m_metaDataArea > m_metaDataWidget. @@ -180,7 +170,10 @@ void InformationPanelContent::showItem(const KFileItem& item) m_outdatedPreviewTimer->start(); } - m_previewJob = new KIO::PreviewJob(KFileItemList() << item, QSize(m_preview->width(), m_preview->height())); + QStringList plugins = KIO::PreviewJob::availablePlugins(); + m_previewJob = new KIO::PreviewJob(KFileItemList() << item, + QSize(m_preview->width(), m_preview->height()), + &plugins); m_previewJob->setScaleType(KIO::PreviewJob::Unscaled); m_previewJob->setIgnoreMaximumSize(item.isLocalFile()); if (m_previewJob->uiDelegate()) { @@ -194,9 +187,7 @@ void InformationPanelContent::showItem(const KFileItem& item) } if (m_metaDataWidget) { -#ifdef HAVE_BALOO m_metaDataWidget->setDateFormat(static_cast(InformationPanelSettings::dateFormat())); -#endif m_metaDataWidget->show(); m_metaDataWidget->setItems(KFileItemList() << item); } @@ -285,12 +276,11 @@ void InformationPanelContent::configureSettings(const QList& customCon QAction* configureAction = popup.addAction(i18nc("@action:inmenu", "Configure...")); configureAction->setIcon(QIcon::fromTheme(QStringLiteral("configure"))); -#ifdef HAVE_BALOO QAction* dateformatAction = popup.addAction(i18nc("@action:inmenu", "Condensed Date")); dateformatAction->setIcon(QIcon::fromTheme(QStringLiteral("change-date-symbolic"))); dateformatAction->setCheckable(true); dateformatAction->setChecked(InformationPanelSettings::dateFormat() == static_cast(Baloo::DateFormats::ShortFormat)); -#endif + popup.addSeparator(); foreach (QAction* action, customContextMenuActions) { popup.addAction(action); @@ -316,14 +306,12 @@ void InformationPanelContent::configureSettings(const QList& customCon dialog->show(); connect(dialog, &FileMetaDataConfigurationDialog::destroyed, this, &InformationPanelContent::refreshMetaData); } -#ifdef HAVE_BALOO if (action == dateformatAction) { int dateFormat = static_cast(isChecked ? Baloo::DateFormats::ShortFormat : Baloo::DateFormats::LongFormat); InformationPanelSettings::setDateFormat(dateFormat); refreshMetaData(); } -#endif } void InformationPanelContent::showIcon(const KFileItem& item) diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 7e313482d..f7fe5587c 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -120,11 +120,6 @@ void PlacesItemModel::setHiddenItemsShown(bool show) } } } - -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Changed visibility of hidden items"; - showModelState(); -#endif } bool PlacesItemModel::hiddenItemsShown() const @@ -169,10 +164,6 @@ void PlacesItemModel::insertSortedItem(PlacesItem* item) void PlacesItemModel::onItemInserted(int index) { KStandardItemModel::onItemInserted(index); -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Inserted item" << index; - showModelState(); -#endif } void PlacesItemModel::onItemRemoved(int index, KStandardItem* removedItem) @@ -180,10 +171,6 @@ void PlacesItemModel::onItemRemoved(int index, KStandardItem* removedItem) m_indexMap.removeAt(index); KStandardItemModel::onItemRemoved(index, removedItem); -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Removed item" << index; - showModelState(); -#endif } void PlacesItemModel::onItemChanged(int index, const QSet& changedRoles) @@ -635,11 +622,6 @@ void PlacesItemModel::loadBookmarks() addItemFromSourceModel(sourceIndex); } } - -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Loaded bookmarks"; - showModelState(); -#endif } void PlacesItemModel::clear() { @@ -786,44 +768,3 @@ PlacesItem *PlacesItemModel::itemFromBookmark(const KBookmark &bookmark) const return nullptr; } -#ifdef PLACESITEMMODEL_DEBUG -void PlacesItemModel::showModelState() -{ - qCDebug(DolphinDebug) << "================================="; - qCDebug(DolphinDebug) << "Model:"; - qCDebug(DolphinDebug) << "hidden-index model-index text"; - int modelIndex = 0; - for (int i = 0; i < m_bookmarkedItems.count(); ++i) { - if (m_bookmarkedItems[i]) { - qCDebug(DolphinDebug) << i << "(Hidden) " << " " << m_bookmarkedItems[i]->dataValue("text").toString(); - } else { - if (item(modelIndex)) { - qCDebug(DolphinDebug) << i << " " << modelIndex << " " << item(modelIndex)->dataValue("text").toString(); - } else { - qCDebug(DolphinDebug) << i << " " << modelIndex << " " << "(not available yet)"; - } - ++modelIndex; - } - } - - qCDebug(DolphinDebug); - qCDebug(DolphinDebug) << "Bookmarks:"; - - int bookmarkIndex = 0; - KBookmarkGroup root = m_bookmarkManager->root(); - KBookmark bookmark = root.first(); - while (!bookmark.isNull()) { - const QString udi = bookmark.metaDataItem("UDI"); - const QString text = udi.isEmpty() ? bookmark.text() : udi; - if (bookmark.metaDataItem("IsHidden") == QLatin1String("true")) { - qCDebug(DolphinDebug) << bookmarkIndex << "(Hidden)" << text; - } else { - qCDebug(DolphinDebug) << bookmarkIndex << " " << text; - } - - bookmark = root.next(bookmark); - ++bookmarkIndex; - } -} -#endif - diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h index a2086efc5..c4ff7e2dd 100644 --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -32,17 +32,13 @@ #include class KBookmark; -class KBookmarkManager; class PlacesItem; class QAction; -// #define PLACESITEMMODEL_DEBUG - /** * @brief Model for maintaining the bookmarks of the places panel. * - * It is compatible to the KFilePlacesModel from kdelibs but adds - * the ability to have groups for places. + * It is based on KFilePlacesModel from KIO. */ class PlacesItemModel: public KStandardItemModel { @@ -204,10 +200,6 @@ private: */ void insertSortedItem(PlacesItem* item); -#ifdef PLACESITEMMODEL_DEBUG - void showModelState(); -#endif - PlacesItem *itemFromBookmark(const KBookmark &bookmark) const; void addItemFromSourceModel(const QModelIndex &index); diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 00d8735c3..7b4900f7c 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -38,22 +38,19 @@ #include "trash/dolphintrash.h" #include "views/draganddrophelper.h" -#include -#include #include #include #include #include -#include #include -#include #include -#include -#include +#include +#include #include #include #include +#include #include PlacesPanel::PlacesPanel(QWidget* parent) : @@ -174,6 +171,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) QAction* editAction = nullptr; QAction* teardownAction = nullptr; QAction* ejectAction = nullptr; + QAction* mountAction = nullptr; const bool isDevice = !item->udi().isEmpty(); const bool isTrash = (item->url().scheme() == QLatin1String("trash")); @@ -186,11 +184,25 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) teardownAction = m_model->teardownAction(index); if (teardownAction) { + // Disable teardown option for root and home partitions + bool teardownEnabled = item->url() != QUrl::fromLocalFile(QDir::rootPath()); + if (teardownEnabled) { + KMountPoint::Ptr mountPoint = KMountPoint::currentMountPoints().findByPath(QDir::homePath()); + if (mountPoint && item->url() == QUrl::fromLocalFile(mountPoint->mountPoint())) { + teardownEnabled = false; + } + } + teardownAction->setEnabled(teardownEnabled); + teardownAction->setParent(&menu); menu.addAction(teardownAction); } - if (teardownAction || ejectAction) { + if (item->storageSetupNeeded()) { + mountAction = menu.addAction(QIcon::fromTheme(QStringLiteral("media-mount")), i18nc("@action:inmenu", "Mount")); + } + + if (teardownAction || ejectAction || mountAction) { menu.addSeparator(); } } else { @@ -201,14 +213,18 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) } } - QAction* openInNewWindowAction = menu.addAction(QIcon::fromTheme("window-new"), i18nc("@item:inmenu", "Open in New Window")); - QAction* openInNewTabAction = menu.addAction(QIcon::fromTheme("tab-new"), i18nc("@item:inmenu", "Open in New Tab")); + QAction* openInNewWindowAction = menu.addAction(QIcon::fromTheme(QStringLiteral("window-new")), i18nc("@item:inmenu", "Open in New Window")); + QAction* openInNewTabAction = menu.addAction(QIcon::fromTheme(QStringLiteral("tab-new")), i18nc("@item:inmenu", "Open in New Tab")); + QAction* propertiesAction = nullptr; + if (item->url().isLocalFile()) { + propertiesAction = menu.addAction(QIcon::fromTheme(QStringLiteral("document-properties")), i18nc("@action:inmenu", "Properties")); + } if (!isDevice && !isTrash) { menu.addSeparator(); } if (!isDevice) { - editAction = menu.addAction(QIcon::fromTheme("document-properties"), i18nc("@item:inmenu", "Edit...")); + editAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-entry")), i18nc("@item:inmenu", "Edit...")); } QAction* removeAction = nullptr; @@ -216,7 +232,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) removeAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18nc("@item:inmenu", "Remove")); } - QAction* hideAction = menu.addAction(i18nc("@item:inmenu", "Hide")); + QAction* hideAction = menu.addAction(QIcon::fromTheme(QStringLiteral("hint")), i18nc("@item:inmenu", "Hide")); hideAction->setCheckable(true); hideAction->setChecked(item->isHidden()); @@ -248,10 +264,16 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) // TriggerItem does set up the storage first and then it will // emit the slotItemMiddleClicked signal, because of Qt::MiddleButton. triggerItem(index, Qt::MiddleButton); + } else if (action == mountAction) { + m_model->requestStorageSetup(index); } else if (action == teardownAction) { m_model->requestTearDown(index); } else if (action == ejectAction) { m_model->requestEject(index); + } else if (action == propertiesAction) { + KPropertiesDialog* dialog = new KPropertiesDialog(item->url(), this); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); } } } @@ -267,7 +289,7 @@ void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos) QAction* showAllAction = nullptr; if (m_model->hiddenCount() > 0) { - showAllAction = menu.addAction(i18nc("@item:inmenu", "Show All Entries")); + showAllAction = menu.addAction(QIcon::fromTheme(QStringLiteral("visibility")), i18nc("@item:inmenu", "Show All Entries")); showAllAction->setCheckable(true); showAllAction->setChecked(m_model->hiddenItemsShown()); } @@ -334,7 +356,7 @@ QAction *PlacesPanel::buildGroupContextMenu(QMenu *menu, int index) } KFilePlacesModel::GroupType groupType = m_model->groupType(index); - QAction *hideGroupAction = menu->addAction(i18nc("@item:inmenu", "Hide Section '%1'", m_model->item(index)->group())); + QAction *hideGroupAction = menu->addAction(QIcon::fromTheme(QStringLiteral("hint")), i18nc("@item:inmenu", "Hide Section '%1'", m_model->item(index)->group())); hideGroupAction->setCheckable(true); hideGroupAction->setChecked(m_model->isGroupHidden(groupType)); diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h index d62697940..c6f959d23 100644 --- a/src/panels/places/placespanel.h +++ b/src/panels/places/placespanel.h @@ -23,16 +23,14 @@ #include "panels/panel.h" -#include #include class KItemListController; -class PlacesItem; class PlacesItemModel; class PlacesView; class QGraphicsSceneDragDropEvent; -class KJob; class QMenu; +class QMimeData; /** * @brief Combines bookmarks and mounted devices as list. */ diff --git a/src/settings/general/behaviorsettingspage.cpp b/src/settings/general/behaviorsettingspage.cpp index 921ab3f8e..add9acad5 100644 --- a/src/settings/general/behaviorsettingspage.cpp +++ b/src/settings/general/behaviorsettingspage.cpp @@ -78,13 +78,19 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) : topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed)); +#ifdef HAVE_BALOO // 'Show tooltips' m_showToolTips = new QCheckBox(i18nc("@option:check", "Show tooltips")); topLayout->addRow(i18nc("@title:group", "Miscellaneous: "), m_showToolTips); +#endif // 'Show selection marker' m_showSelectionToggle = new QCheckBox(i18nc("@option:check", "Show selection marker")); +#ifdef HAVE_BALOO topLayout->addRow(QString(), m_showSelectionToggle); +#else + topLayout->addRow(i18nc("@title:group", "Miscellaneous: "), m_showSelectionToggle); +#endif // 'Inline renaming of items' m_renameInline = new QCheckBox(i18nc("option:check", "Rename inline")); @@ -98,7 +104,9 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) : connect(m_localViewProps, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); connect(m_globalViewProps, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); +#ifdef HAVE_BALOO connect(m_showToolTips, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); +#endif connect(m_showSelectionToggle, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed); connect(m_naturalSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed); @@ -118,7 +126,9 @@ void BehaviorSettingsPage::applySettings() const bool useGlobalViewProps = m_globalViewProps->isChecked(); settings->setGlobalViewProps(useGlobalViewProps); +#ifdef HAVE_BALOO settings->setShowToolTips(m_showToolTips->isChecked()); +#endif settings->setShowSelectionToggle(m_showSelectionToggle->isChecked()); setSortingChoiceValue(settings); settings->setRenameInline(m_renameInline->isChecked()); @@ -149,7 +159,9 @@ void BehaviorSettingsPage::loadSettings() m_localViewProps->setChecked(!useGlobalViewProps); m_globalViewProps->setChecked(useGlobalViewProps); +#ifdef HAVE_BALOO m_showToolTips->setChecked(GeneralSettings::showToolTips()); +#endif m_showSelectionToggle->setChecked(GeneralSettings::showSelectionToggle()); m_renameInline->setChecked(GeneralSettings::renameInline()); m_useTabForSplitViewSwitch->setChecked(GeneralSettings::useTabForSwitchingSplitView()); diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 34916830e..b3fddba10 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -252,6 +252,11 @@ void DolphinStatusBar::readSettings() setExtensionsVisible(true); } +void DolphinStatusBar::updateSpaceInfo() +{ + m_spaceInfo->update(); +} + void DolphinStatusBar::contextMenuEvent(QContextMenuEvent* event) { Q_UNUSED(event); diff --git a/src/statusbar/dolphinstatusbar.h b/src/statusbar/dolphinstatusbar.h index 8b872ace5..7461d1d7d 100644 --- a/src/statusbar/dolphinstatusbar.h +++ b/src/statusbar/dolphinstatusbar.h @@ -88,6 +88,11 @@ public: */ void readSettings(); + /** + * Refreshes the disk space information. + */ + void updateSpaceInfo(); + public slots: void setText(const QString& text); void setUrl(const QUrl& url); diff --git a/src/statusbar/mountpointobservercache.cpp b/src/statusbar/mountpointobservercache.cpp index bcdc0b61c..b39e26e3a 100644 --- a/src/statusbar/mountpointobservercache.cpp +++ b/src/statusbar/mountpointobservercache.cpp @@ -78,7 +78,7 @@ MountPointObserver* MountPointObserverCache::observerForUrl(const QUrl& url) connect(observer, &MountPointObserver::destroyed, this, &MountPointObserverCache::slotObserverDestroyed); if (!m_updateTimer->isActive()) { - m_updateTimer->start(10000); + m_updateTimer->start(60000); // 1 minute } connect(m_updateTimer, &QTimer::timeout, observer, &MountPointObserver::update); diff --git a/src/statusbar/spaceinfoobserver.cpp b/src/statusbar/spaceinfoobserver.cpp index 6cf695d55..692eba7e7 100644 --- a/src/statusbar/spaceinfoobserver.cpp +++ b/src/statusbar/spaceinfoobserver.cpp @@ -71,6 +71,13 @@ void SpaceInfoObserver::setUrl(const QUrl& url) } } +void SpaceInfoObserver::update() +{ + if (m_mountPointObserver) { + m_mountPointObserver->update(); + } +} + void SpaceInfoObserver::spaceInfoChanged(quint64 size, quint64 available) { // Make sure that the size has actually changed diff --git a/src/statusbar/spaceinfoobserver.h b/src/statusbar/spaceinfoobserver.h index 1e74caef4..93f4c8c91 100644 --- a/src/statusbar/spaceinfoobserver.h +++ b/src/statusbar/spaceinfoobserver.h @@ -40,6 +40,9 @@ public: void setUrl(const QUrl& url); +public slots: + void update(); + signals: /** * This signal is emitted when the size or available space changes. diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index 65af17490..882249576 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -54,6 +54,13 @@ QUrl StatusBarSpaceInfo::url() const return m_url; } +void StatusBarSpaceInfo::update() +{ + if (m_observer) { + m_observer->update(); + } +} + void StatusBarSpaceInfo::showEvent(QShowEvent* event) { KCapacityBar::showEvent(event); diff --git a/src/statusbar/statusbarspaceinfo.h b/src/statusbar/statusbarspaceinfo.h index 4f36517ae..24f8b7f29 100644 --- a/src/statusbar/statusbarspaceinfo.h +++ b/src/statusbar/statusbarspaceinfo.h @@ -45,6 +45,8 @@ public: void setUrl(const QUrl& url); QUrl url() const; + void update(); + protected: void showEvent(QShowEvent* event) override; void hideEvent(QHideEvent* event) override; diff --git a/src/tests/dolphinmainwindowtest.cpp b/src/tests/dolphinmainwindowtest.cpp index 0dc330124..673bccd44 100644 --- a/src/tests/dolphinmainwindowtest.cpp +++ b/src/tests/dolphinmainwindowtest.cpp @@ -40,9 +40,11 @@ private slots: void testActiveViewAfterClosingSplitView_data(); void testActiveViewAfterClosingSplitView(); void testUpdateWindowTitleAfterClosingSplitView(); + void testOpenInNewTabTitle(); void testNewFileMenuEnabled_data(); void testNewFileMenuEnabled(); + private: QScopedPointer m_mainWindow; }; @@ -173,6 +175,25 @@ void DolphinMainWindowTest::testUpdateWindowTitleAfterClosingSplitView() QCOMPARE(currentUrlChangedSpy.count(), 1); } +// Test case for bug #397910 +void DolphinMainWindowTest::testOpenInNewTabTitle() +{ + m_mainWindow->openDirectories({ QUrl::fromLocalFile(QDir::homePath()) }, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + auto tabWidget = m_mainWindow->findChild("tabWidget"); + QVERIFY(tabWidget); + + tabWidget->openNewTab(QUrl::fromLocalFile(QDir::tempPath())); + QCOMPARE(tabWidget->count(), 2); + QVERIFY(tabWidget->tabText(0) != tabWidget->tabText(1)); + if (!tabWidget->tabIcon(0).isNull() && !tabWidget->tabIcon(1).isNull()) { + QVERIFY(tabWidget->tabIcon(0).name() != tabWidget->tabIcon(1).name()); + } +} + void DolphinMainWindowTest::testNewFileMenuEnabled_data() { QTest::addColumn("activeViewUrl"); diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index b455c521d..2f258d17d 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -1551,25 +1551,26 @@ void KFileItemModelTest::testChangeSortRoleWhileFiltering() { KFileItemList items; - KIO::UDSEntry entry; - entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, 0100000); // S_IFREG might not be defined on non-Unix platforms. - entry.insert(KIO::UDSEntry::UDS_ACCESS, 07777); - entry.insert(KIO::UDSEntry::UDS_SIZE, 0); - entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, 0); - entry.insert(KIO::UDSEntry::UDS_GROUP, "group"); - entry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, 0); - - entry.insert(KIO::UDSEntry::UDS_NAME, "a.txt"); - entry.insert(KIO::UDSEntry::UDS_USER, "user-b"); - items.append(KFileItem(entry, m_testDir->url(), false, true)); - - entry.insert(KIO::UDSEntry::UDS_NAME, "b.txt"); - entry.insert(KIO::UDSEntry::UDS_USER, "user-c"); - items.append(KFileItem(entry, m_testDir->url(), false, true)); - - entry.insert(KIO::UDSEntry::UDS_NAME, "c.txt"); - entry.insert(KIO::UDSEntry::UDS_USER, "user-a"); - items.append(KFileItem(entry, m_testDir->url(), false, true)); + KIO::UDSEntry entry[3]; + + entry[0].insert(KIO::UDSEntry::UDS_NAME, "a.txt"); + entry[0].insert(KIO::UDSEntry::UDS_USER, "user-b"); + + entry[1].insert(KIO::UDSEntry::UDS_NAME, "b.txt"); + entry[1].insert(KIO::UDSEntry::UDS_USER, "user-c"); + + entry[2].insert(KIO::UDSEntry::UDS_NAME, "c.txt"); + entry[2].insert(KIO::UDSEntry::UDS_USER, "user-a"); + + for (int i = 0; i < 3; ++i) { + entry[i].insert(KIO::UDSEntry::UDS_FILE_TYPE, 0100000); // S_IFREG might not be defined on non-Unix platforms. + entry[i].insert(KIO::UDSEntry::UDS_ACCESS, 07777); + entry[i].insert(KIO::UDSEntry::UDS_SIZE, 0); + entry[i].insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, 0); + entry[i].insert(KIO::UDSEntry::UDS_GROUP, "group"); + entry[i].insert(KIO::UDSEntry::UDS_ACCESS_TIME, 0); + items.append(KFileItem(entry[i], m_testDir->url(), false, true)); + } m_model->slotItemsAdded(m_testDir->url(), items); m_model->slotCompleted(); diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index a468ca6dc..c472f128f 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -545,6 +545,7 @@ void KItemListControllerTest::testKeyboardNavigation() } // No items are selected. Therefore, the current item should be activated. // This is handled by falling through to the NoSelection/SingleSelection case. + Q_FALLTHROUGH(); case KItemListController::NoSelection: case KItemListController::SingleSelection: // In NoSelection and SingleSelection mode, the current item should be activated. diff --git a/src/tests/placesitemmodeltest.cpp b/src/tests/placesitemmodeltest.cpp index 545bba89c..40ee47cbc 100644 --- a/src/tests/placesitemmodeltest.cpp +++ b/src/tests/placesitemmodeltest.cpp @@ -96,7 +96,7 @@ private: QStringList placesUrls(PlacesItemModel *model = nullptr) const; QStringList initialUrls() const; void createPlaceItem(const QString &text, const QUrl &url, const QString &icon); - void removePlaceAfter(int index); + void schedulePlaceRemoval(int index); void cancelPlaceRemoval(int index); void removeTestUserData(); QMimeData *createMimeData(const QList &indexes) const; @@ -190,7 +190,7 @@ void PlacesItemModelTest::createPlaceItem(const QString &text, const QUrl &url, m_model->createPlacesItem(text, url, icon); } -void PlacesItemModelTest::removePlaceAfter(int index) +void PlacesItemModelTest::schedulePlaceRemoval(int index) { m_tobeRemoved.insert(index); } @@ -235,7 +235,7 @@ QMimeData *PlacesItemModelTest::createMimeData(const QList &indexes) const void PlacesItemModelTest::init() { m_model = new PlacesItemModel(); - // WORKAROUND: need to wait for bookmark to load, check: PlacesItemModel::updateBookmarks + // WORKAROUND: need to wait for bookmark to load QTest::qWait(300); QCOMPARE(m_model->count(), m_expectedModelCount); } @@ -563,7 +563,7 @@ void PlacesItemModelTest::testSystemItems() QTRY_COMPARE(itemsInsertedSpy.count(), 1); // make sure the new place get removed - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex); QList args = itemsInsertedSpy.takeFirst(); KItemRangeList range = args.at(0).value(); @@ -589,7 +589,7 @@ void PlacesItemModelTest::testSystemItems() void PlacesItemModelTest::testEditBookmark() { - int tempDirIndex = 3; + int tempDirIndex = 1; if (m_hasDesktopFolder) { tempDirIndex++; } @@ -602,32 +602,32 @@ void PlacesItemModelTest::testEditBookmark() createPlaceItem(QStringLiteral("Temporary Dir"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)), QString()); // make sure that the new item will be removed later - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex + 2); QSignalSpy itemsChangedSply(m_model, &PlacesItemModel::itemsChanged); // modify place text - m_model->item(3)->setText(QStringLiteral("Renamed place")); + m_model->item(tempDirIndex)->setText(QStringLiteral("Renamed place")); m_model->refresh(); // check if the correct signal was fired QTRY_COMPARE(itemsChangedSply.count(), 1); QList args = itemsChangedSply.takeFirst(); KItemRangeList range = args.at(0).value(); - QCOMPARE(range.first().index, 3); + QCOMPARE(range.first().index, tempDirIndex); QCOMPARE(range.first().count, 1); QSet roles = args.at(1).value >(); QCOMPARE(roles.size(), 1); QCOMPARE(*roles.begin(), QByteArrayLiteral("text")); - QCOMPARE(m_model->item(3)->text(), QStringLiteral("Renamed place")); + QCOMPARE(m_model->item(tempDirIndex)->text(), QStringLiteral("Renamed place")); // check if the item was updated in the other model - QTRY_COMPARE(other->item(3)->text(), QStringLiteral("Renamed place")); + QTRY_COMPARE(other->item(tempDirIndex)->text(), QStringLiteral("Renamed place")); } void PlacesItemModelTest::testEditAfterCreation() { - int tempDirIndex = 3; + int tempDirIndex = 1; if (m_hasDesktopFolder) { tempDirIndex++; } @@ -646,25 +646,25 @@ void PlacesItemModelTest::testEditAfterCreation() QTRY_COMPARE(model->count(), m_model->count()); // make sure that the new item will be removed later - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex + 2); // modify place text - PlacesItem *item = m_model->placesItem(3); + PlacesItem *item = m_model->placesItem(tempDirIndex); item->setText(QStringLiteral("Renamed place")); m_model->refresh(); // check if the second model got the changes QTRY_COMPARE(model->count(), m_model->count()); - QTRY_COMPARE(model->placesItem(3)->text(), m_model->placesItem(3)->text()); - QTRY_COMPARE(model->placesItem(3)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), - m_model->placesItem(3)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); - QTRY_COMPARE(model->placesItem(3)->icon(), m_model->placesItem(3)->icon()); - QTRY_COMPARE(model->placesItem(3)->url(), m_model->placesItem(3)->url()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), m_model->placesItem(tempDirIndex)->text()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), + m_model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); + QTRY_COMPARE(model->placesItem(tempDirIndex)->icon(), m_model->placesItem(tempDirIndex)->icon()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->url(), m_model->placesItem(tempDirIndex)->url()); } void PlacesItemModelTest::testEditMetadata() { - int tempDirIndex = 3; + int tempDirIndex = 1; if (m_hasDesktopFolder) { tempDirIndex++; } @@ -684,21 +684,21 @@ void PlacesItemModelTest::testEditMetadata() QTRY_COMPARE(model->count(), m_model->count()); // make sure that the new item will be removed later - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex + 2); // modify place metadata - PlacesItem *item = m_model->placesItem(3); + PlacesItem *item = m_model->placesItem(tempDirIndex); item->bookmark().setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName()); m_model->refresh(); // check if the place was modified in both models - QTRY_COMPARE(model->placesItem(3)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), + QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), KAboutData::applicationData().componentName()); - QTRY_COMPARE(model->placesItem(3)->text(), m_model->placesItem(3)->text()); - QTRY_COMPARE(model->placesItem(3)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), - m_model->placesItem(3)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); - QTRY_COMPARE(model->placesItem(3)->icon(), m_model->placesItem(3)->icon()); - QTRY_COMPARE(model->placesItem(3)->url(), m_model->placesItem(3)->url()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), m_model->placesItem(tempDirIndex)->text()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), + m_model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); + QTRY_COMPARE(model->placesItem(tempDirIndex)->icon(), m_model->placesItem(tempDirIndex)->icon()); + QTRY_COMPARE(model->placesItem(tempDirIndex)->url(), m_model->placesItem(tempDirIndex)->url()); } void PlacesItemModelTest::testRefresh() @@ -722,7 +722,7 @@ void PlacesItemModelTest::testRefresh() QTRY_COMPARE(model->count(), m_model->count()); // make sure that the new item will be removed later - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex); PlacesItem *item = m_model->placesItem(tempDirIndex); PlacesItem *sameItem = model->placesItem(tempDirIndex); @@ -893,7 +893,7 @@ void PlacesItemModelTest::testDuplicatedEntries() void PlacesItemModelTest::renameAfterCreation() { - int tempDirIndex = 3; + int tempDirIndex = 1; if (m_hasDesktopFolder) { tempDirIndex++; } @@ -910,10 +910,10 @@ void PlacesItemModelTest::renameAfterCreation() // create a new place createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - urls.insert(tempDirIndex, tempUrl.toLocalFile()); + urls.insert(tempDirIndex + 2, tempUrl.toLocalFile()); // make sure that the new item will be removed later - removePlaceAfter(tempDirIndex); + schedulePlaceRemoval(tempDirIndex + 2); CHECK_PLACES_URLS(urls); QCOMPARE(model->count(), m_model->count()); @@ -922,7 +922,7 @@ void PlacesItemModelTest::renameAfterCreation() // modify place text QSignalSpy changedSpy(m_model, &PlacesItemModel::itemsChanged); - PlacesItem *item = m_model->placesItem(3); + PlacesItem *item = m_model->placesItem(tempDirIndex); item->setText(QStringLiteral("New Temporary Dir")); item->setUrl(item->url()); item->setIcon(item->icon()); @@ -931,8 +931,8 @@ void PlacesItemModelTest::renameAfterCreation() QTRY_COMPARE(changedSpy.count(), 1); // check if the place was modified in both models - QTRY_COMPARE(m_model->placesItem(3)->text(), QStringLiteral("New Temporary Dir")); - QTRY_COMPARE(model->placesItem(3)->text(), QStringLiteral("New Temporary Dir")); + QTRY_COMPARE(m_model->placesItem(tempDirIndex)->text(), QStringLiteral("New Temporary Dir")); + QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), QStringLiteral("New Temporary Dir")); } QTEST_MAIN(PlacesItemModelTest) diff --git a/src/trash/dolphintrash.cpp b/src/trash/dolphintrash.cpp index 749d0d481..e4a2d947c 100644 --- a/src/trash/dolphintrash.cpp +++ b/src/trash/dolphintrash.cpp @@ -26,7 +26,7 @@ #include #include #include - +#include Trash::Trash() : m_trashDirLister(new KDirLister()) @@ -66,8 +66,10 @@ KIO::Job *Trash::empty(QWidget *window) KJobWidgets::setWindow(job, window); job->uiDelegate()->setAutoErrorHandlingEnabled(true); // as long as KIO doesn't do this, do it ourselves - connect(job, &KIO::Job::result, [](){ - KNotification::event(QStringLiteral("Trash: emptied"), QString(), QPixmap(), nullptr, KNotification::DefaultEvent); + connect(job, &KIO::Job::result, []() { + KNotification::event(QStringLiteral("Trash: emptied"), i18n("Trash Emptied"), + i18n("The Trash was emptied."), QStringLiteral("user-trash"), + nullptr, KNotification::DefaultEvent); }); return job; } diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 1db62b800..40346c169 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -176,8 +176,10 @@ DolphinView::DolphinView(const QUrl& url, QWidget* parent) : connect(selectionManager, &KItemListSelectionManager::selectionChanged, this, &DolphinView::slotSelectionChanged); +#ifdef HAVE_BALOO m_toolTipManager = new ToolTipManager(this); connect(m_toolTipManager, &ToolTipManager::urlActivated, this, &DolphinView::urlActivated); +#endif m_versionControlObserver = new VersionControlObserver(this); m_versionControlObserver->setModel(m_model); @@ -1031,7 +1033,9 @@ void DolphinView::slotItemHovered(int index) const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint()); itemRect.moveTo(pos); +#ifdef HAVE_BALOO m_toolTipManager->showToolTip(item, itemRect, nativeParentWidget()->windowHandle()); +#endif } emit requestItemInfo(item); @@ -1408,9 +1412,11 @@ void DolphinView::updateViewState() void DolphinView::hideToolTip() { +#ifdef HAVE_BALOO if (GeneralSettings::showToolTips()) { m_toolTipManager->hideToolTip(); } +#endif } void DolphinView::calculateItemCount(int& fileCount, @@ -1482,7 +1488,7 @@ void DolphinView::slotRenamingResult(KJob* job) void DolphinView::slotDirectoryLoadingStarted() { // Disable the writestate temporary until it can be determined in a fast way - // in DolphinView::slotLoadingCompleted() + // in DolphinView::slotDirectoryLoadingCompleted() if (m_isFolderWritable) { m_isFolderWritable = false; emit writeStateChanged(m_isFolderWritable); @@ -1563,7 +1569,7 @@ void DolphinView::slotRoleEditingFinished(int index, const QByteArray& role, con if (role == "text") { const KFileItem oldItem = m_model->fileItem(index); const QString newName = value.toString(); - if (!newName.isEmpty() && newName != oldItem.text() && newName != QLatin1String(".") && newName != QLatin1String("..")) { + if (!newName.isEmpty() && newName != oldItem.text() && newName != QLatin1Char('.') && newName != QLatin1String("..")) { const QUrl oldUrl = oldItem.url(); QUrl newUrl = oldUrl.adjusted(QUrl::RemoveFilename); diff --git a/src/views/tooltips/dolphinfilemetadatawidget.cpp b/src/views/tooltips/dolphinfilemetadatawidget.cpp index 1df6a6673..f4a688ea8 100644 --- a/src/views/tooltips/dolphinfilemetadatawidget.cpp +++ b/src/views/tooltips/dolphinfilemetadatawidget.cpp @@ -24,11 +24,7 @@ #include #include #include -#ifndef HAVE_BALOO -#include -#else #include -#endif #include #include @@ -61,19 +57,11 @@ DolphinFileMetaDataWidget::DolphinFileMetaDataWidget(QWidget* parent) : m_name->setMaximumWidth(fontMetrics.averageCharWidth() * 40); // Create widget for the meta data -#ifndef HAVE_BALOO - m_fileMetaDataWidget = new KFileMetaDataWidget(this); - connect(m_fileMetaDataWidget, &KFileMetaDataWidget::metaDataRequestFinished, - this, &DolphinFileMetaDataWidget::metaDataRequestFinished); - connect(m_fileMetaDataWidget, &KFileMetaDataWidget::urlActivated, - this, &DolphinFileMetaDataWidget::urlActivated); -#else m_fileMetaDataWidget = new Baloo::FileMetaDataWidget(this); connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::metaDataRequestFinished, this, &DolphinFileMetaDataWidget::metaDataRequestFinished); connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::urlActivated, this, &DolphinFileMetaDataWidget::urlActivated); -#endif m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText); m_fileMetaDataWidget->setReadOnly(true); diff --git a/src/views/tooltips/dolphinfilemetadatawidget.h b/src/views/tooltips/dolphinfilemetadatawidget.h index 1e2cfadb6..b9dbd98a1 100644 --- a/src/views/tooltips/dolphinfilemetadatawidget.h +++ b/src/views/tooltips/dolphinfilemetadatawidget.h @@ -29,13 +29,9 @@ class KFileItemList; class QLabel; -#ifndef HAVE_BALOO -class KFileMetaDataWidget; -#else namespace Baloo { class FileMetaDataWidget; } -#endif /** * @brief Widget that shows the meta information and a preview of one @@ -79,11 +75,7 @@ signals: private: QLabel* m_preview; QLabel* m_name; -#ifndef HAVE_BALOO - KFileMetaDataWidget* m_fileMetaDataWidget; -#else Baloo::FileMetaDataWidget* m_fileMetaDataWidget; -#endif }; #endif diff --git a/src/views/tooltips/tooltipmanager.cpp b/src/views/tooltips/tooltipmanager.cpp index 19c87b084..bb2890138 100644 --- a/src/views/tooltips/tooltipmanager.cpp +++ b/src/views/tooltips/tooltipmanager.cpp @@ -129,7 +129,10 @@ void ToolTipManager::startContentRetrieval() // Request a preview of the item m_fileMetaDataWidget->setPreview(QPixmap()); - KIO::PreviewJob* job = new KIO::PreviewJob(KFileItemList() << m_item, QSize(256, 256)); + QStringList plugins = KIO::PreviewJob::availablePlugins(); + KIO::PreviewJob* job = new KIO::PreviewJob(KFileItemList() << m_item, + QSize(256, 256), + &plugins); job->setIgnoreMaximumSize(m_item.isLocalFile()); if (job->uiDelegate()) { KJobWidgets::setWindow(job, qApp->activeWindow()); diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index e5d636cd1..d7c6abd65 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -63,17 +63,19 @@ ViewProperties::ViewProperties(const QUrl& url) : useDetailsViewWithPath = true; } else if (url.isLocalFile()) { m_filePath = url.toLocalFile(); - const QFileInfo dirInfo(m_filePath); - const QFileInfo fileInfo(m_filePath + QDir::separator() + ViewPropertiesFileName); - // Check if the directory is writable and check if the ".directory" file exists and - // is read- and writable. - if (!dirInfo.isWritable() - || (fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.isWritable())) - || !isPartOfHome(m_filePath)) { -#ifdef Q_OS_WIN - // m_filePath probably begins with C:/ - the colon is not a valid character for paths though - m_filePath = QDir::separator() + m_filePath.remove(QLatin1Char(':')); -#endif + + bool useDestinationDir = !isPartOfHome(m_filePath); + if (!useDestinationDir) { + const QFileInfo dirInfo(m_filePath); + const QFileInfo fileInfo(m_filePath + QDir::separator() + ViewPropertiesFileName); + useDestinationDir = !dirInfo.isWritable() || (dirInfo.size() > 0 && fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.isWritable())); + } + + if (useDestinationDir) { + #ifdef Q_OS_WIN + // m_filePath probably begins with C:/ - the colon is not a valid character for paths though + m_filePath = QDir::separator() + m_filePath.remove(QLatin1Char(':')); + #endif m_filePath = destinationDir(QStringLiteral("local")) + m_filePath; } } else {