diff options
Diffstat (limited to 'src')
188 files changed, 2618 insertions, 1890 deletions
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index d4cf196b7..de40d7eaa 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -66,14 +66,14 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent, m_mainWindow(parent), m_fileInfo(fileInfo), m_baseUrl(baseUrl), - m_baseFileItem(0), + m_baseFileItem(nullptr), m_selectedItems(), m_selectedItemsProperties(nullptr), m_context(NoContext), m_copyToMenu(parent), m_customActions(), m_command(None), - m_removeAction(0) + m_removeAction(nullptr) { // The context menu either accesses the URLs of the selected items // or the items itself. To increase the performance both lists are cached. @@ -306,9 +306,7 @@ void DolphinContextMenu::openItemContextMenu() if (selectedUrl.isValid()) { PlacesItemModel model; const QString text = selectedUrl.fileName(); - PlacesItem* item = model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl)); - model.appendItemToGroup(item); - model.saveBookmarks(); + model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl)); } } else if (activatedAction == openParentAction) { m_command = OpenParentFolder; @@ -337,7 +335,7 @@ void DolphinContextMenu::openViewportContextMenu() addAction(m_mainWindow->actionCollection()->action(QStringLiteral("new_tab"))); // Insert 'Add to Places' entry if exactly one item is selected - QAction* addToPlacesAction = 0; + QAction* addToPlacesAction = nullptr; if (!placeExists(m_mainWindow->activeViewContainer()->url())) { addToPlacesAction = addAction(QIcon::fromTheme(QStringLiteral("bookmark-new")), i18nc("@action:inmenu Add current folder to places", "Add to Places")); @@ -378,9 +376,7 @@ void DolphinContextMenu::openViewportContextMenu() } else { icon = KIO::iconNameForUrl(url); } - PlacesItem* item = model.createPlacesItem(container->placesText(), url, icon); - model.appendItemToGroup(item); - model.saveBookmarks(); + model.createPlacesItem(container->placesText(), url, icon); } } } @@ -408,7 +404,7 @@ void DolphinContextMenu::insertDefaultItemActions(const KFileItemListProperties& if (showDeleteAction && showMoveToTrashAction) { delete m_removeAction; - m_removeAction = 0; + m_removeAction = nullptr; addAction(m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::MoveToTrash))); addAction(m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::DeleteFile))); } else if (showDeleteAction && !showMoveToTrashAction) { @@ -445,7 +441,7 @@ bool DolphinContextMenu::placeExists(const QUrl& url) const QAction* DolphinContextMenu::createPasteAction() { - QAction* action = 0; + QAction* action = nullptr; const bool isDir = !m_fileInfo.isNull() && m_fileInfo.isDir(); if (isDir && (m_selectedItems.count() == 1)) { const QMimeData *mimeData = QApplication::clipboard()->mimeData(); diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h index ea68244e1..558115fb0 100644 --- a/src/dolphincontextmenu.h +++ b/src/dolphincontextmenu.h @@ -74,7 +74,7 @@ public: const KFileItem& fileInfo, const QUrl& baseUrl); - virtual ~DolphinContextMenu(); + ~DolphinContextMenu() override; void setCustomActions(const QList<QAction*>& actions); @@ -89,8 +89,8 @@ public: Command open(); protected: - virtual void keyPressEvent(QKeyEvent *ev) Q_DECL_OVERRIDE; - virtual void keyReleaseEvent(QKeyEvent *ev) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *ev) override; + void keyReleaseEvent(QKeyEvent *ev) override; private: void openTrashContextMenu(); diff --git a/src/dolphindockwidget.cpp b/src/dolphindockwidget.cpp index c7beb1689..726338377 100644 --- a/src/dolphindockwidget.cpp +++ b/src/dolphindockwidget.cpp @@ -36,15 +36,15 @@ class DolphinDockTitleBar : public QWidget public: explicit DolphinDockTitleBar(QWidget* parent = nullptr) : QWidget(parent) {} - virtual ~DolphinDockTitleBar() {} + ~DolphinDockTitleBar() override {} - QSize minimumSizeHint() const Q_DECL_OVERRIDE + QSize minimumSizeHint() const override { const int border = style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin); return QSize(border, border); } - QSize sizeHint() const Q_DECL_OVERRIDE + QSize sizeHint() const override { return minimumSizeHint(); } diff --git a/src/dolphindockwidget.h b/src/dolphindockwidget.h index 8f491295d..c4fcbf753 100644 --- a/src/dolphindockwidget.h +++ b/src/dolphindockwidget.h @@ -30,9 +30,9 @@ class DolphinDockWidget : public QDockWidget Q_OBJECT public: - explicit DolphinDockWidget(const QString& title, QWidget* parent = 0, Qt::WindowFlags flags = 0); - explicit DolphinDockWidget(QWidget* parent = 0, Qt::WindowFlags flags = 0); - virtual ~DolphinDockWidget(); + explicit DolphinDockWidget(const QString& title, QWidget* parent = nullptr, Qt::WindowFlags flags = nullptr); + explicit DolphinDockWidget(QWidget* parent = nullptr, Qt::WindowFlags flags = nullptr); + ~DolphinDockWidget() override; /** * @param lock If \a lock is true, the title bar of the dock-widget will get hidden so diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 070d56aeb..95b05785f 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -90,20 +90,20 @@ namespace { } DolphinMainWindow::DolphinMainWindow() : - KXmlGuiWindow(0), - m_newFileMenu(0), - m_tabWidget(0), - m_activeViewContainer(0), - m_actionHandler(0), - m_remoteEncoding(0), + KXmlGuiWindow(nullptr), + m_newFileMenu(nullptr), + m_tabWidget(nullptr), + m_activeViewContainer(nullptr), + m_actionHandler(nullptr), + m_remoteEncoding(nullptr), m_settingsDialog(), - m_controlButton(0), - m_updateToolBarTimer(0), - m_lastHandleUrlStatJob(0), + m_controlButton(nullptr), + m_updateToolBarTimer(nullptr), + m_lastHandleUrlStatJob(nullptr), #ifndef Q_OS_WIN - m_terminalPanel(0), + m_terminalPanel(nullptr), #endif - m_placesPanel(0), + m_placesPanel(nullptr), m_tearDownFromPlacesRequested(false) { Q_INIT_RESOURCE(dolphin); @@ -629,6 +629,15 @@ void DolphinMainWindow::togglePanelLockState() GeneralSettings::setLockPanels(newLockState); } +void DolphinMainWindow::slotTerminalPanelVisibilityChanged() +{ +#ifndef Q_OS_WIN + if (m_terminalPanel->isHiddenInVisibleWindow()) { + m_activeViewContainer->view()->setFocus(); + } +#endif +} + void DolphinMainWindow::goBack() { KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator(); @@ -751,7 +760,7 @@ void DolphinMainWindow::editSettings() void DolphinMainWindow::handleUrl(const QUrl& url) { delete m_lastHandleUrlStatJob; - m_lastHandleUrlStatJob = 0; + m_lastHandleUrlStatJob = nullptr; if (url.isLocalFile() && QFileInfo(url.toLocalFile()).isDir()) { activeViewContainer()->setUrl(url); @@ -771,7 +780,7 @@ void DolphinMainWindow::handleUrl(const QUrl& url) void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job) { - m_lastHandleUrlStatJob = 0; + m_lastHandleUrlStatJob = nullptr; const KIO::UDSEntry entry = static_cast<KIO::StatJob*>(job)->statResult(); const QUrl url = static_cast<KIO::StatJob*>(job)->url(); if (entry.isDir()) { @@ -912,7 +921,7 @@ void DolphinMainWindow::updateToolBar() void DolphinMainWindow::slotControlButtonDeleted() { - m_controlButton = 0; + m_controlButton = nullptr; m_updateToolBarTimer->start(); } @@ -1001,6 +1010,16 @@ void DolphinMainWindow::setUrlAsCaption(const QUrl& url) 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); } @@ -1165,6 +1184,7 @@ void DolphinMainWindow::setupActions() compareFiles->setEnabled(false); connect(compareFiles, &QAction::triggered, this, &DolphinMainWindow::compareFiles); +#ifndef Q_OS_WIN if (KAuthorized::authorize(QStringLiteral("shell_access"))) { QAction* openTerminal = actionCollection()->addAction(QStringLiteral("open_terminal")); openTerminal->setText(i18nc("@action:inmenu Tools", "Open Terminal")); @@ -1172,9 +1192,10 @@ void DolphinMainWindow::setupActions() actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT | Qt::Key_F4); connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal); } +#endif // setup 'Settings' menu - KToggleAction* showMenuBar = KStandardAction::showMenubar(0, 0, actionCollection()); + KToggleAction* showMenuBar = KStandardAction::showMenubar(nullptr, nullptr, actionCollection()); connect(showMenuBar, &KToggleAction::triggered, // Fixes #286822 this, &DolphinMainWindow::toggleShowMenuBar, Qt::QueuedConnection); KStandardAction::preferences(this, SLOT(editSettings()), actionCollection()); @@ -1286,6 +1307,8 @@ void DolphinMainWindow::setupDockWidgets() connect(m_terminalPanel, &TerminalPanel::changeUrl, this, &DolphinMainWindow::slotTerminalDirectoryChanged); connect(terminalDock, &DolphinDockWidget::visibilityChanged, m_terminalPanel, &TerminalPanel::dockVisibilityChanged); + connect(terminalDock, &DolphinDockWidget::visibilityChanged, + this, &DolphinMainWindow::slotTerminalPanelVisibilityChanged); QAction* terminalAction = terminalDock->toggleViewAction(); createPanelAction(QIcon::fromTheme(QStringLiteral("utilities-terminal")), Qt::Key_F4, terminalAction, QStringLiteral("show_terminal_panel")); @@ -1435,10 +1458,10 @@ void DolphinMainWindow::createControlButton() void DolphinMainWindow::deleteControlButton() { delete m_controlButton; - m_controlButton = 0; + m_controlButton = nullptr; delete m_updateToolBarTimer; - m_updateToolBarTimer = 0; + m_updateToolBarTimer = nullptr; } bool DolphinMainWindow::addActionToMenu(QAction* action, QMenu* menu) diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index c05fc34ad..01746169b 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -64,7 +64,7 @@ class DolphinMainWindow: public KXmlGuiWindow public: DolphinMainWindow(); - virtual ~DolphinMainWindow(); + ~DolphinMainWindow() override; /** * Returns the currently active view. @@ -152,16 +152,16 @@ signals: protected: /** @see QWidget::showEvent() */ - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; /** @see QMainWindow::closeEvent() */ - virtual void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE; + void closeEvent(QCloseEvent* event) override; /** @see KMainWindow::saveProperties() */ - virtual void saveProperties(KConfigGroup& group) Q_DECL_OVERRIDE; + void saveProperties(KConfigGroup& group) override; /** @see KMainWindow::readProperties() */ - virtual void readProperties(const KConfigGroup& group) Q_DECL_OVERRIDE; + void readProperties(const KConfigGroup& group) override; private slots: /** @@ -261,6 +261,12 @@ private slots: */ void togglePanelLockState(); + /** + * Is invoked if the Terminal panel got visible/invisible and takes care + * that the active view has the focus if the Terminal panel is invisible. + */ + void slotTerminalPanelVisibilityChanged(); + /** Goes back one step of the URL history. */ void goBack(); @@ -499,8 +505,8 @@ private: { public: UndoUiInterface(); - virtual ~UndoUiInterface(); - virtual void jobError(KIO::Job* job) Q_DECL_OVERRIDE; + ~UndoUiInterface() override; + void jobError(KIO::Job* job) override; }; KNewFileMenu* m_newFileMenu; diff --git a/src/dolphinnewfilemenu.h b/src/dolphinnewfilemenu.h index 9f1cb5599..3505017e1 100644 --- a/src/dolphinnewfilemenu.h +++ b/src/dolphinnewfilemenu.h @@ -41,14 +41,14 @@ class DOLPHIN_EXPORT DolphinNewFileMenu : public KNewFileMenu public: DolphinNewFileMenu(KActionCollection* collection, QObject* parent); - virtual ~DolphinNewFileMenu(); + ~DolphinNewFileMenu() override; signals: void errorMessage(const QString& error); protected slots: /** @see KNewFileMenu::slotResult() */ - virtual void slotResult(KJob* job) Q_DECL_OVERRIDE; + void slotResult(KJob* job) override; }; #endif diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index b3b47304e..6f8e20489 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -60,8 +60,8 @@ K_PLUGIN_FACTORY(DolphinPartFactory, registerPlugin<DolphinPart>();) DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantList& args) : KParts::ReadOnlyPart(parent) - ,m_openTerminalAction(0) - ,m_removeAction(0) + ,m_openTerminalAction(nullptr) + ,m_removeAction(nullptr) { Q_UNUSED(args) setComponentData(*createAboutData(), false); @@ -223,6 +223,7 @@ void DolphinPart::createActions() m_findFileAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-find"))); connect(m_findFileAction, &QAction::triggered, this, &DolphinPart::slotFindFile); +#ifndef Q_OS_WIN if (KAuthorized::authorize(QStringLiteral("shell_access"))) { m_openTerminalAction = actionCollection()->addAction(QStringLiteral("open_terminal")); m_openTerminalAction->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); @@ -230,6 +231,7 @@ void DolphinPart::createActions() connect(m_openTerminalAction, &QAction::triggered, this, &DolphinPart::slotOpenTerminal); actionCollection()->setDefaultShortcut(m_openTerminalAction, Qt::Key_F4); } +#endif } void DolphinPart::createGoAction(const char* name, const char* iconName, @@ -316,7 +318,7 @@ bool DolphinPart::openUrl(const QUrl &url) QString prettyUrl = visibleUrl.toDisplayString(QUrl::PreferLocalFile); emit setWindowCaption(prettyUrl); emit m_extension->setLocationBarUrl(prettyUrl); - emit started(0); // get the wheel to spin + emit started(nullptr); // get the wheel to spin m_view->setNameFilter(m_nameFilter); m_view->setUrl(url); updatePasteAction(); @@ -431,7 +433,7 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos, if (showDeleteAction && showMoveToTrashAction) { delete m_removeAction; - m_removeAction = 0; + m_removeAction = nullptr; editActions.append(actionCollection()->action(KStandardAction::name(KStandardAction::MoveToTrash))); editActions.append(actionCollection()->action(KStandardAction::name(KStandardAction::DeleteFile))); } else if (showDeleteAction && !showMoveToTrashAction) { diff --git a/src/dolphinpart.desktop b/src/dolphinpart.desktop index 9bf9f95cf..fb257221c 100644 --- a/src/dolphinpart.desktop +++ b/src/dolphinpart.desktop @@ -130,7 +130,7 @@ Name[lt]=Kompaktiškas Name[nb]=Kompakt Name[nl]=Compact Name[nn]=Kompakt -Name[pa]=ਸੰਖਿਪਤ +Name[pa]=ਸੰਖੇਪ Name[pl]=Kompaktowy Name[pt]=Compacta Name[pt_BR]=Compacto diff --git a/src/dolphinpart.h b/src/dolphinpart.h index 48aff5602..845d84365 100644 --- a/src/dolphinpart.h +++ b/src/dolphinpart.h @@ -54,7 +54,7 @@ class DolphinPart : public KParts::ReadOnlyPart public: explicit DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantList& args); - ~DolphinPart(); + ~DolphinPart() override; static KAboutData* createAboutData(); @@ -62,7 +62,7 @@ public: * Standard KParts::ReadOnlyPart openUrl method. * Called by Konqueror to view a directory in DolphinPart. */ - virtual bool openUrl(const QUrl& url) Q_DECL_OVERRIDE; + bool openUrl(const QUrl& url) override; /// see the supportsUndo property bool supportsUndo() const { return true; } @@ -98,7 +98,7 @@ protected: /** * We reimplement openUrl so no need to implement openFile. */ - virtual bool openFile() override { return true; } + bool openFile() override { return true; } Q_SIGNALS: /** @@ -223,7 +223,7 @@ private Q_SLOTS: void setFilesToSelect(const QList<QUrl> &files); QList<QUrl> filesToSelect() const { return QList<QUrl>(); } // silence moc - virtual bool eventFilter(QObject*, QEvent*) Q_DECL_OVERRIDE; + bool eventFilter(QObject*, QEvent*) override; private: void createActions(); diff --git a/src/dolphinpart_ext.h b/src/dolphinpart_ext.h index 0b7018dbb..590fc169c 100644 --- a/src/dolphinpart_ext.h +++ b/src/dolphinpart_ext.h @@ -33,8 +33,8 @@ class DolphinPartBrowserExtension : public KParts::BrowserExtension Q_OBJECT public: DolphinPartBrowserExtension( DolphinPart* part ); - virtual void restoreState(QDataStream &stream) Q_DECL_OVERRIDE; - virtual void saveState(QDataStream &stream) Q_DECL_OVERRIDE; + void restoreState(QDataStream &stream) override; + void saveState(QDataStream &stream) override; public Q_SLOTS: void cut(); @@ -54,10 +54,10 @@ class DolphinPartFileInfoExtension : public KParts::FileInfoExtension public: DolphinPartFileInfoExtension(DolphinPart* part); - virtual QueryModes supportedQueryModes() const Q_DECL_OVERRIDE; - virtual bool hasSelection() const Q_DECL_OVERRIDE; + QueryModes supportedQueryModes() const override; + bool hasSelection() const override; - virtual KFileItemList queryFor(QueryMode mode) const Q_DECL_OVERRIDE; + KFileItemList queryFor(QueryMode mode) const override; private: DolphinPart* m_part; @@ -69,10 +69,10 @@ class DolphinPartListingFilterExtension : public KParts::ListingFilterExtension public: DolphinPartListingFilterExtension(DolphinPart* part); - virtual FilterModes supportedFilterModes() const Q_DECL_OVERRIDE; - virtual bool supportsMultipleFilters(FilterMode mode) const Q_DECL_OVERRIDE; - virtual QVariant filter(FilterMode mode) const Q_DECL_OVERRIDE; - virtual void setFilter(FilterMode mode, const QVariant& filter) Q_DECL_OVERRIDE; + FilterModes supportedFilterModes() const override; + bool supportsMultipleFilters(FilterMode mode) const override; + QVariant filter(FilterMode mode) const override; + void setFilter(FilterMode mode, const QVariant& filter) override; private: DolphinPart* m_part; @@ -84,7 +84,7 @@ class DolphinPartListingNotificationExtension : public KParts::ListingNotificati public: DolphinPartListingNotificationExtension(DolphinPart* part); - virtual NotificationEventTypes supportedNotificationEventTypes() const Q_DECL_OVERRIDE; + NotificationEventTypes supportedNotificationEventTypes() const override; public Q_SLOTS: void slotNewItems(const KFileItemList&); diff --git a/src/dolphinrecenttabsmenu.cpp b/src/dolphinrecenttabsmenu.cpp index c155632c6..f425df218 100644 --- a/src/dolphinrecenttabsmenu.cpp +++ b/src/dolphinrecenttabsmenu.cpp @@ -86,7 +86,7 @@ void DolphinRecentTabsMenu::handleAction(QAction* action) const QByteArray state = action->data().toByteArray(); removeAction(action); delete action; - action = 0; + action = nullptr; emit restoreClosedTab(state); emit closedTabsCountChanged(menu()->actions().size() - 2); } diff --git a/src/dolphintabbar.h b/src/dolphintabbar.h index 0c08031a9..02270d0fc 100644 --- a/src/dolphintabbar.h +++ b/src/dolphintabbar.h @@ -35,18 +35,18 @@ signals: void tabDetachRequested(int index); protected: - virtual void dragEnterEvent(QDragEnterEvent* event) Q_DECL_OVERRIDE; - virtual void dragLeaveEvent(QDragLeaveEvent* event) Q_DECL_OVERRIDE; - virtual void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE; - virtual void dropEvent(QDropEvent* event) Q_DECL_OVERRIDE; - virtual void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; - virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE; - virtual void mouseDoubleClickEvent(QMouseEvent* event) Q_DECL_OVERRIDE; + void dragEnterEvent(QDragEnterEvent* event) override; + void dragLeaveEvent(QDragLeaveEvent* event) override; + void dragMoveEvent(QDragMoveEvent* event) override; + void dropEvent(QDropEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void mouseDoubleClickEvent(QMouseEvent* event) override; /** * Opens a context menu for the tab on the \a event position. */ - virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE; + void contextMenuEvent(QContextMenuEvent* event) override; private slots: void slotAutoActivationTimeout(); diff --git a/src/dolphintabpage.h b/src/dolphintabpage.h index b8772602d..ba4c144d9 100644 --- a/src/dolphintabpage.h +++ b/src/dolphintabpage.h @@ -33,7 +33,7 @@ class DolphinTabPage : public QWidget Q_OBJECT public: - explicit DolphinTabPage(const QUrl& primaryUrl, const QUrl& secondaryUrl = QUrl(), QWidget* parent = 0); + explicit DolphinTabPage(const QUrl& primaryUrl, const QUrl& secondaryUrl = QUrl(), QWidget* parent = nullptr); /** * @return True if primary view is the active view in this tab. diff --git a/src/dolphintabwidget.h b/src/dolphintabwidget.h index 50ebd602a..ba2fd4867 100644 --- a/src/dolphintabwidget.h +++ b/src/dolphintabwidget.h @@ -174,8 +174,8 @@ private slots: void currentTabChanged(int index); protected: - virtual void tabInserted(int index) Q_DECL_OVERRIDE; - virtual void tabRemoved(int index) Q_DECL_OVERRIDE; + void tabInserted(int index) override; + void tabRemoved(int index) override; private: /** diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index e92ec6022..83b9f4343 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -52,14 +52,14 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) : QWidget(parent), - m_topLayout(0), - m_urlNavigator(0), - m_searchBox(0), - m_messageWidget(0), - m_view(0), - m_filterBar(0), - m_statusBar(0), - m_statusBarTimer(0), + m_topLayout(nullptr), + m_urlNavigator(nullptr), + m_searchBox(nullptr), + m_messageWidget(nullptr), + m_view(nullptr), + m_filterBar(nullptr), + m_statusBar(nullptr), + m_statusBarTimer(nullptr), m_statusBarTimestamp(), m_autoGrabFocus(true) #ifdef KActivities_FOUND @@ -245,6 +245,11 @@ bool DolphinViewContainer::autoGrabFocus() const return m_autoGrabFocus; } +QString DolphinViewContainer::currentSearchText() const +{ + return m_searchBox->text(); +} + const DolphinStatusBar* DolphinViewContainer::statusBar() const { return m_statusBar; diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index 41c8f0b04..837b168d7 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -70,7 +70,7 @@ public: }; DolphinViewContainer(const QUrl& url, QWidget* parent); - virtual ~DolphinViewContainer(); + ~DolphinViewContainer() override; /** * Returns the current active URL, where all actions are applied. @@ -93,6 +93,8 @@ public: void setAutoGrabFocus(bool grab); bool autoGrabFocus() const; + QString currentSearchText() const; + const DolphinStatusBar* statusBar() const; DolphinStatusBar* statusBar(); diff --git a/src/filterbar/filterbar.h b/src/filterbar/filterbar.h index a275d1ea4..0c7dcb6cd 100644 --- a/src/filterbar/filterbar.h +++ b/src/filterbar/filterbar.h @@ -37,8 +37,8 @@ class FilterBar : public QWidget Q_OBJECT public: - explicit FilterBar(QWidget* parent = 0); - virtual ~FilterBar(); + explicit FilterBar(QWidget* parent = nullptr); + ~FilterBar() override; /** Called by view container to hide this **/ void closeFilterBar(); @@ -74,8 +74,8 @@ signals: void focusViewRequest(); protected: - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - virtual void keyReleaseEvent(QKeyEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; private: QLineEdit* m_filterInput; diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index c17d54367..41f8aeade 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -49,9 +49,9 @@ namespace { KFileItemListView::KFileItemListView(QGraphicsWidget* parent) : KStandardItemListView(parent), - m_modelRolesUpdater(0), - m_updateVisibleIndexRangeTimer(0), - m_updateIconSizeTimer(0) + m_modelRolesUpdater(nullptr), + m_updateVisibleIndexRangeTimer(nullptr), + m_updateIconSizeTimer(nullptr) { setAcceptDrops(true); @@ -229,7 +229,7 @@ void KFileItemListView::onModelChanged(KItemModelBase* current, KItemModelBase* KStandardItemListView::onModelChanged(current, previous); delete m_modelRolesUpdater; - m_modelRolesUpdater = 0; + m_modelRolesUpdater = nullptr; if (current) { m_modelRolesUpdater = new KFileItemModelRolesUpdater(static_cast<KFileItemModel*>(current), this); diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h index 84aa17d89..95ad9ba68 100644 --- a/src/kitemviews/kfileitemlistview.h +++ b/src/kitemviews/kfileitemlistview.h @@ -41,8 +41,8 @@ class DOLPHIN_EXPORT KFileItemListView : public KStandardItemListView Q_OBJECT public: - KFileItemListView(QGraphicsWidget* parent = 0); - virtual ~KFileItemListView(); + KFileItemListView(QGraphicsWidget* parent = nullptr); + ~KFileItemListView() override; void setPreviewsShown(bool show); bool previewsShown() const; @@ -72,27 +72,27 @@ public: */ QStringList enabledPlugins() const; - virtual QPixmap createDragPixmap(const KItemSet& indexes) const Q_DECL_OVERRIDE; + QPixmap createDragPixmap(const KItemSet& indexes) const override; protected: - virtual KItemListWidgetCreatorBase* defaultWidgetCreator() const Q_DECL_OVERRIDE; - virtual void initializeItemListWidget(KItemListWidget* item) Q_DECL_OVERRIDE; + KItemListWidgetCreatorBase* defaultWidgetCreator() const override; + void initializeItemListWidget(KItemListWidget* item) override; virtual void onPreviewsShownChanged(bool shown); - virtual void onItemLayoutChanged(ItemLayout current, ItemLayout previous) Q_DECL_OVERRIDE; - virtual void onModelChanged(KItemModelBase* current, KItemModelBase* previous) Q_DECL_OVERRIDE; - virtual void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) Q_DECL_OVERRIDE; - virtual void onItemSizeChanged(const QSizeF& current, const QSizeF& previous) Q_DECL_OVERRIDE; - virtual void onScrollOffsetChanged(qreal current, qreal previous) Q_DECL_OVERRIDE; - virtual void onVisibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous) Q_DECL_OVERRIDE; - virtual void onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) Q_DECL_OVERRIDE; - virtual void onSupportsItemExpandingChanged(bool supportsExpanding) Q_DECL_OVERRIDE; - virtual void onTransactionBegin() Q_DECL_OVERRIDE; - virtual void onTransactionEnd() Q_DECL_OVERRIDE; - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; + void onItemLayoutChanged(ItemLayout current, ItemLayout previous) override; + void onModelChanged(KItemModelBase* current, KItemModelBase* previous) override; + void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) override; + void onItemSizeChanged(const QSizeF& current, const QSizeF& previous) override; + void onScrollOffsetChanged(qreal current, qreal previous) override; + void onVisibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous) override; + void onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) override; + void onSupportsItemExpandingChanged(bool supportsExpanding) override; + void onTransactionBegin() override; + void onTransactionEnd() override; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; protected slots: - virtual void slotItemsRemoved(const KItemRangeList& itemRanges) Q_DECL_OVERRIDE; - virtual void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous) Q_DECL_OVERRIDE; + void slotItemsRemoved(const KItemRangeList& itemRanges) override; + void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous) override; private slots: void triggerVisibleIndexRangeUpdate(); diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index fa98093b5..5fa3e548c 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -80,7 +80,7 @@ QString KFileItemListWidgetInformant::roleText(const QByteArray& role, const KIO::filesize_t size = roleValue.value<KIO::filesize_t>(); text = KFormat().formatByteSize(size); } - } else if (role == "modificationtime" || role == "accesstime" || role == "deletiontime") { + } else if (role == "modificationtime" || role == "accesstime" || role == "deletiontime" || role == "imageDateTime") { const QDateTime dateTime = roleValue.toDateTime(); text = QLocale().toString(dateTime, QLocale::ShortFormat); } else { diff --git a/src/kitemviews/kfileitemlistwidget.h b/src/kitemviews/kfileitemlistwidget.h index 07ca59b44..fbb0300f8 100644 --- a/src/kitemviews/kfileitemlistwidget.h +++ b/src/kitemviews/kfileitemlistwidget.h @@ -28,13 +28,13 @@ class DOLPHIN_EXPORT KFileItemListWidgetInformant : public KStandardItemListWidg { public: KFileItemListWidgetInformant(); - virtual ~KFileItemListWidgetInformant(); + ~KFileItemListWidgetInformant() override; protected: - virtual QString itemText(int index, const KItemListView* view) const Q_DECL_OVERRIDE; - virtual bool itemIsLink(int index, const KItemListView* view) const Q_DECL_OVERRIDE; - virtual QString roleText(const QByteArray& role, const QHash<QByteArray, QVariant>& values) const Q_DECL_OVERRIDE; - virtual QFont customizedFontForLinks(const QFont& baseFont) const Q_DECL_OVERRIDE; + QString itemText(int index, const KItemListView* view) const override; + bool itemIsLink(int index, const KItemListView* view) const override; + QString roleText(const QByteArray& role, const QHash<QByteArray, QVariant>& values) const override; + QFont customizedFontForLinks(const QFont& baseFont) const override; }; class DOLPHIN_EXPORT KFileItemListWidget : public KStandardItemListWidget @@ -43,19 +43,19 @@ class DOLPHIN_EXPORT KFileItemListWidget : public KStandardItemListWidget public: KFileItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~KFileItemListWidget(); + ~KFileItemListWidget() override; static KItemListWidgetInformant* createInformant(); protected: - virtual bool isRoleRightAligned(const QByteArray& role) const Q_DECL_OVERRIDE; - virtual bool isHidden() const Q_DECL_OVERRIDE; - virtual QFont customizedFont(const QFont& baseFont) const Q_DECL_OVERRIDE; + bool isRoleRightAligned(const QByteArray& role) const override; + bool isHidden() const override; + QFont customizedFont(const QFont& baseFont) const override; /** * @return Selection length without MIME-type extension */ - virtual int selectionLength(const QString& text) const Q_DECL_OVERRIDE; + int selectionLength(const QString& text) const override; }; #endif diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 5919e6427..a5422a7bf 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -42,7 +42,7 @@ KFileItemModel::KFileItemModel(QObject* parent) : KItemModelBase("text", parent), - m_dirLister(0), + m_dirLister(nullptr), m_sortDirsFirst(true), m_sortRole(NameRole), m_sortingProgressPercent(-1), @@ -52,8 +52,8 @@ KFileItemModel::KFileItemModel(QObject* parent) : m_filter(), m_filteredItems(), m_requestRole(), - m_maximumUpdateIntervalTimer(0), - m_resortAllItemsTimer(0), + m_maximumUpdateIntervalTimer(nullptr), + m_resortAllItemsTimer(nullptr), m_pendingItemsToInsert(), m_groups(), m_expandedDirs(), @@ -251,7 +251,7 @@ QMimeData* KFileItemModel::createMimeData(const KItemSet& indexes) const QList<QUrl> urls; QList<QUrl> mostLocalUrls; bool canUseMostLocalUrls = true; - const ItemData* lastAddedItem = 0; + const ItemData* lastAddedItem = nullptr; for (int index : indexes) { const ItemData* itemData = m_itemData.at(index); @@ -2299,19 +2299,20 @@ const KFileItemModel::RoleInfoMap* KFileItemModel::rolesInfoMap(int& count) { static const RoleInfoMap rolesInfoMap[] = { // | role | roleType | role translation | group translation | requires Baloo | requires indexer - { 0, NoRole, 0, 0, 0, 0, false, false }, - { "text", NameRole, I18N_NOOP2_NOSTRIP("@label", "Name"), 0, 0, false, false }, - { "size", SizeRole, I18N_NOOP2_NOSTRIP("@label", "Size"), 0, 0, false, false }, - { "modificationtime", ModificationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Modified"), 0, 0, false, false }, - { "creationtime", CreationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Created"), 0, 0, false, false }, - { "accesstime", AccessTimeRole, I18N_NOOP2_NOSTRIP("@label", "Accessed"), 0, 0, false, false }, - { "type", TypeRole, I18N_NOOP2_NOSTRIP("@label", "Type"), 0, 0, false, false }, - { "rating", RatingRole, I18N_NOOP2_NOSTRIP("@label", "Rating"), 0, 0, true, false }, - { "tags", TagsRole, I18N_NOOP2_NOSTRIP("@label", "Tags"), 0, 0, true, false }, - { "comment", CommentRole, I18N_NOOP2_NOSTRIP("@label", "Comment"), 0, 0, true, false }, + { nullptr, NoRole, nullptr, nullptr, nullptr, nullptr, false, false }, + { "text", NameRole, I18N_NOOP2_NOSTRIP("@label", "Name"), nullptr, nullptr, false, false }, + { "size", SizeRole, I18N_NOOP2_NOSTRIP("@label", "Size"), nullptr, nullptr, false, false }, + { "modificationtime", ModificationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Modified"), nullptr, nullptr, false, false }, + { "creationtime", CreationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Created"), nullptr, nullptr, false, false }, + { "accesstime", AccessTimeRole, I18N_NOOP2_NOSTRIP("@label", "Accessed"), nullptr, nullptr, false, false }, + { "type", TypeRole, I18N_NOOP2_NOSTRIP("@label", "Type"), nullptr, nullptr, false, false }, + { "rating", RatingRole, I18N_NOOP2_NOSTRIP("@label", "Rating"), nullptr, nullptr, true, false }, + { "tags", TagsRole, I18N_NOOP2_NOSTRIP("@label", "Tags"), nullptr, nullptr, true, false }, + { "comment", CommentRole, I18N_NOOP2_NOSTRIP("@label", "Comment"), nullptr, nullptr, true, false }, { "title", TitleRole, I18N_NOOP2_NOSTRIP("@label", "Title"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true }, { "wordCount", WordCountRole, I18N_NOOP2_NOSTRIP("@label", "Word Count"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true }, { "lineCount", LineCountRole, I18N_NOOP2_NOSTRIP("@label", "Line Count"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true }, + { "imageDateTime", ImageDateTimeRole, I18N_NOOP2_NOSTRIP("@label", "Date Photographed"), I18N_NOOP2_NOSTRIP("@label", "Image"), true, true }, { "imageSize", ImageSizeRole, I18N_NOOP2_NOSTRIP("@label", "Image Size"), I18N_NOOP2_NOSTRIP("@label", "Image"), true, true }, { "orientation", OrientationRole, I18N_NOOP2_NOSTRIP("@label", "Orientation"), I18N_NOOP2_NOSTRIP("@label", "Image"), true, true }, { "artist", ArtistRole, I18N_NOOP2_NOSTRIP("@label", "Artist"), I18N_NOOP2_NOSTRIP("@label", "Audio"), true, true }, @@ -2377,7 +2378,7 @@ bool KFileItemModel::isConsistent() const return false; } - for (int i = 0; i < count(); ++i) { + for (int i = 0, iMax = count(); i < iMax; ++i) { // Check if m_items and m_itemData are consistent. const KFileItem item = fileItem(i); if (item.isNull()) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 0ca748d7a..4589b5422 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -50,8 +50,8 @@ class DOLPHIN_EXPORT KFileItemModel : public KItemModelBase Q_OBJECT public: - explicit KFileItemModel(QObject* parent = 0); - virtual ~KFileItemModel(); + explicit KFileItemModel(QObject* parent = nullptr); + ~KFileItemModel() override; /** * Loads the directory specified by \a url. The signals @@ -73,7 +73,7 @@ public: * the root-parent of all items. * @see rootItem() */ - QUrl directory() const Q_DECL_OVERRIDE; + QUrl directory() const override; /** * Cancels the loading of a directory which has been started by either @@ -81,9 +81,9 @@ public: */ void cancelDirectoryLoading(); - virtual int count() const Q_DECL_OVERRIDE; - virtual QHash<QByteArray, QVariant> data(int index) const Q_DECL_OVERRIDE; - virtual bool setData(int index, const QHash<QByteArray, QVariant>& values) Q_DECL_OVERRIDE; + int count() const override; + QHash<QByteArray, QVariant> data(int index) const override; + bool setData(int index, const QHash<QByteArray, QVariant>& values) override; /** * Sets a separate sorting with directories first (true) or a mixed @@ -102,15 +102,15 @@ public: void setShowDirectoriesOnly(bool enabled); bool showDirectoriesOnly() const; - virtual QMimeData* createMimeData(const KItemSet& indexes) const Q_DECL_OVERRIDE; + QMimeData* createMimeData(const KItemSet& indexes) const override; - virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const Q_DECL_OVERRIDE; + int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const override; - virtual bool supportsDropping(int index) const Q_DECL_OVERRIDE; + bool supportsDropping(int index) const override; - virtual QString roleDescription(const QByteArray& role) const Q_DECL_OVERRIDE; + QString roleDescription(const QByteArray& role) const override; - virtual QList<QPair<int, QVariant> > groups() const Q_DECL_OVERRIDE; + QList<QPair<int, QVariant> > groups() const override; /** * @return The file-item for the index \a index. If the index is in a valid @@ -156,10 +156,10 @@ public: void setRoles(const QSet<QByteArray>& roles); QSet<QByteArray> roles() const; - virtual bool setExpanded(int index, bool expanded) Q_DECL_OVERRIDE; - virtual bool isExpanded(int index) const Q_DECL_OVERRIDE; - virtual bool isExpandable(int index) const Q_DECL_OVERRIDE; - virtual int expandedParentsCount(int index) const Q_DECL_OVERRIDE; + bool setExpanded(int index, bool expanded) override; + bool isExpanded(int index) const override; + bool isExpandable(int index) const override; + int expandedParentsCount(int index) const override; QSet<QUrl> expandedDirectories() const; @@ -258,9 +258,9 @@ signals: void urlIsFileError(const QUrl& url); protected: - virtual void onGroupedSortingChanged(bool current) Q_DECL_OVERRIDE; - virtual void onSortRoleChanged(const QByteArray& current, const QByteArray& previous) Q_DECL_OVERRIDE; - virtual void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) Q_DECL_OVERRIDE; + void onGroupedSortingChanged(bool current) override; + void onSortRoleChanged(const QByteArray& current, const QByteArray& previous) override; + void onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous) override; private slots: /** @@ -285,7 +285,7 @@ private: NoRole, NameRole, SizeRole, ModificationTimeRole, CreationTimeRole, AccessTimeRole, PermissionsRole, OwnerRole, GroupRole, TypeRole, DestinationRole, PathRole, DeletionTimeRole, // User visible roles available with Baloo: - CommentRole, TagsRole, RatingRole, ImageSizeRole, OrientationRole, + CommentRole, TagsRole, RatingRole, ImageSizeRole, ImageDateTimeRole, OrientationRole, WordCountRole, TitleRole, LineCountRole, ArtistRole, GenreRole, AlbumRole, DurationRole, TrackRole, ReleaseYearRole, BitrateRole, OriginUrlRole, // Non-visible roles: diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 0d7f98311..a08f1ae15 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -88,21 +88,18 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO m_pendingIndexes(), m_pendingPreviewItems(), m_previewJob(), - m_recentlyChangedItemsTimer(0), + m_recentlyChangedItemsTimer(nullptr), m_recentlyChangedItems(), m_changedItems(), - m_directoryContentsCounter(0) + m_directoryContentsCounter(nullptr) #ifdef HAVE_BALOO - , m_balooFileMonitor(0) + , m_balooFileMonitor(nullptr) #endif { Q_ASSERT(model); const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings"); - m_enabledPlugins = globalConfig.readEntry("Plugins", QStringList() - << QStringLiteral("directorythumbnail") - << QStringLiteral("imagethumbnail") - << QStringLiteral("jpegthumbnail")); + m_enabledPlugins = globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()); connect(m_model, &KFileItemModel::itemsInserted, this, &KFileItemModelRolesUpdater::slotItemsInserted); @@ -299,7 +296,7 @@ void KFileItemModelRolesUpdater::setRoles(const QSet<QByteArray>& roles) this, &KFileItemModelRolesUpdater::applyChangedBalooRoles); } else if (!hasBalooRole && m_balooFileMonitor) { delete m_balooFileMonitor; - m_balooFileMonitor = 0; + m_balooFileMonitor = nullptr; } #endif @@ -597,7 +594,7 @@ void KFileItemModelRolesUpdater::slotPreviewFailed(const KFileItem& item) void KFileItemModelRolesUpdater::slotPreviewJobFinished() { - m_previewJob = 0; + m_previewJob = nullptr; if (m_state != PreviewJobRunning) { return; @@ -1141,7 +1138,7 @@ void KFileItemModelRolesUpdater::killPreviewJob() disconnect(m_previewJob, &KIO::PreviewJob::finished, this, &KFileItemModelRolesUpdater::slotPreviewJobFinished); m_previewJob->kill(); - m_previewJob = 0; + m_previewJob = nullptr; m_pendingPreviewItems.clear(); } } diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h index cd86fce1e..d971a7c17 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.h +++ b/src/kitemviews/kfileitemmodelrolesupdater.h @@ -94,8 +94,8 @@ class DOLPHIN_EXPORT KFileItemModelRolesUpdater : public QObject Q_OBJECT public: - explicit KFileItemModelRolesUpdater(KFileItemModel* model, QObject* parent = 0); - virtual ~KFileItemModelRolesUpdater(); + explicit KFileItemModelRolesUpdater(KFileItemModel* model, QObject* parent = nullptr); + ~KFileItemModelRolesUpdater() override; void setIconSize(const QSize& size); QSize iconSize() const; diff --git a/src/kitemviews/kitemlistcontainer.cpp b/src/kitemviews/kitemlistcontainer.cpp index b4ea62fac..c1eae53bd 100644 --- a/src/kitemviews/kitemlistcontainer.cpp +++ b/src/kitemviews/kitemlistcontainer.cpp @@ -35,7 +35,6 @@ #include <QStyle> #include <QStyleOption> - /** * Replaces the default viewport of KItemListContainer by a * non-scrollable viewport. The scrolling is done in an optimized @@ -48,7 +47,7 @@ class KItemListContainerViewport : public QGraphicsView public: KItemListContainerViewport(QGraphicsScene* scene, QWidget* parent); protected: - void wheelEvent(QWheelEvent* event) Q_DECL_OVERRIDE; + void wheelEvent(QWheelEvent* event) override; }; KItemListContainerViewport::KItemListContainerViewport(QGraphicsScene* scene, QWidget* parent) : @@ -70,8 +69,8 @@ void KItemListContainerViewport::wheelEvent(QWheelEvent* event) KItemListContainer::KItemListContainer(KItemListController* controller, QWidget* parent) : QAbstractScrollArea(parent), m_controller(controller), - m_horizontalSmoothScroller(0), - m_verticalSmoothScroller(0) + m_horizontalSmoothScroller(nullptr), + m_verticalSmoothScroller(nullptr) { Q_ASSERT(controller); controller->setParent(this); @@ -83,10 +82,10 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget* m_verticalSmoothScroller = new KItemListSmoothScroller(verticalScrollBar(), this); if (controller->model()) { - slotModelChanged(controller->model(), 0); + slotModelChanged(controller->model(), nullptr); } if (controller->view()) { - slotViewChanged(controller->view(), 0); + slotViewChanged(controller->view(), nullptr); } connect(controller, &KItemListController::modelChanged, @@ -100,7 +99,7 @@ KItemListContainer::~KItemListContainer() // Don't rely on the QObject-order to delete the controller, otherwise // the QGraphicsScene might get deleted before the view. delete m_controller; - m_controller = 0; + m_controller = nullptr; } KItemListController* KItemListContainer::controller() const @@ -216,8 +215,8 @@ void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView* disconnect(previous, &KItemListView::maximumItemOffsetChanged, this, &KItemListContainer::updateItemOffsetScrollBar); disconnect(previous, &KItemListView::scrollTo, this, &KItemListContainer::scrollTo); - m_horizontalSmoothScroller->setTargetObject(0); - m_verticalSmoothScroller->setTargetObject(0); + m_horizontalSmoothScroller->setTargetObject(nullptr); + m_verticalSmoothScroller->setTargetObject(nullptr); } if (current) { scene->addItem(current); @@ -257,8 +256,8 @@ void KItemListContainer::updateScrollOffsetScrollBar() return; } - KItemListSmoothScroller* smoothScroller = 0; - QScrollBar* scrollOffsetScrollBar = 0; + KItemListSmoothScroller* smoothScroller = nullptr; + QScrollBar* scrollOffsetScrollBar = nullptr; int singleStep = 0; int pageStep = 0; int maximum = 0; @@ -308,8 +307,8 @@ void KItemListContainer::updateItemOffsetScrollBar() return; } - KItemListSmoothScroller* smoothScroller = 0; - QScrollBar* itemOffsetScrollBar = 0; + KItemListSmoothScroller* smoothScroller = nullptr; + QScrollBar* itemOffsetScrollBar = nullptr; int singleStep = 0; int pageStep = 0; if (view->scrollOrientation() == Qt::Vertical) { diff --git a/src/kitemviews/kitemlistcontainer.h b/src/kitemviews/kitemlistcontainer.h index 9fc3d4957..c5ef85563 100644 --- a/src/kitemviews/kitemlistcontainer.h +++ b/src/kitemviews/kitemlistcontainer.h @@ -50,19 +50,19 @@ public: * (the parent will be set to the KItemListContainer). * @param parent Optional parent widget. */ - explicit KItemListContainer(KItemListController* controller, QWidget* parent = 0); - virtual ~KItemListContainer(); + explicit KItemListContainer(KItemListController* controller, QWidget* parent = nullptr); + ~KItemListContainer() override; KItemListController* controller() const; void setEnabledFrame(bool enable); bool enabledFrame() const; protected: - virtual void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE; - virtual void scrollContentsBy(int dx, int dy) Q_DECL_OVERRIDE; - virtual void wheelEvent(QWheelEvent* event) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent* event) override; + void showEvent(QShowEvent* event) override; + void resizeEvent(QResizeEvent* event) override; + void scrollContentsBy(int dx, int dy) override; + void wheelEvent(QWheelEvent* event) override; private slots: void slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 008b6c4c6..130936488 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -49,13 +49,13 @@ KItemListController::KItemListController(KItemModelBase* model, KItemListView* v m_selectionBehavior(NoSelection), m_autoActivationBehavior(ActivationAndExpansion), m_mouseDoubleClickAction(ActivateItemOnly), - m_model(0), - m_view(0), + m_model(nullptr), + m_view(nullptr), m_selectionManager(new KItemListSelectionManager(this)), m_keyboardManager(new KItemListKeyboardSearchManager(this)), m_pressedIndex(-1), m_pressedMousePos(), - m_autoActivationTimer(0), + m_autoActivationTimer(nullptr), m_oldSelection(), m_keyboardAnchorIndex(-1), m_keyboardAnchorPos(0) @@ -76,10 +76,10 @@ KItemListController::KItemListController(KItemModelBase* model, KItemListView* v KItemListController::~KItemListController() { - setView(0); + setView(nullptr); Q_ASSERT(!m_view); - setModel(0); + setModel(nullptr); Q_ASSERT(!m_model); } @@ -179,6 +179,20 @@ KItemListController::MouseDoubleClickAction KItemListController::mouseDoubleClic return m_mouseDoubleClickAction; } +int KItemListController::indexCloseToMousePressedPosition() const +{ + QHashIterator<KItemListWidget*, KItemListGroupHeader*> it(m_view->m_visibleGroups); + while (it.hasNext()) { + it.next(); + KItemListGroupHeader *groupHeader = it.value(); + const QPointF mappedToGroup = groupHeader->mapFromItem(nullptr, m_pressedMousePos); + if (groupHeader->contains(mappedToGroup)) { + return it.key()->index(); + } + } + return -1; +} + void KItemListController::setAutoActivationDelay(int delay) { m_autoActivationTimer->setInterval(delay); @@ -1216,7 +1230,7 @@ KItemListWidget* KItemListController::hoveredWidget() const } } - return 0; + return nullptr; } KItemListWidget* KItemListController::widgetForPos(const QPointF& pos) const @@ -1233,7 +1247,7 @@ KItemListWidget* KItemListController::widgetForPos(const QPointF& pos) const } } - return 0; + return nullptr; } void KItemListController::updateKeyboardAnchor() diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index f29377443..3de5edece 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -88,8 +88,8 @@ public: * @param view View of the controller. The ownership is passed to the controller. * @param parent Optional parent object. */ - KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent = 0); - virtual ~KItemListController(); + KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent = nullptr); + ~KItemListController() override; void setModel(KItemModelBase* model); KItemModelBase* model() const; @@ -108,6 +108,8 @@ public: void setMouseDoubleClickAction(MouseDoubleClickAction action); MouseDoubleClickAction mouseDoubleClickAction() const; + int indexCloseToMousePressedPosition() const; + /** * Sets the delay in milliseconds when dragging an object above an item * until the item gets activated automatically. A value of -1 indicates diff --git a/src/kitemviews/kitemlistgroupheader.cpp b/src/kitemviews/kitemlistgroupheader.cpp index f8576b08c..fb9298989 100644 --- a/src/kitemviews/kitemlistgroupheader.cpp +++ b/src/kitemviews/kitemlistgroupheader.cpp @@ -29,7 +29,7 @@ #include <QStyleOptionGraphicsItem> KItemListGroupHeader::KItemListGroupHeader(QGraphicsWidget* parent) : - QGraphicsWidget(parent, 0), + QGraphicsWidget(parent, nullptr), m_dirtyCache(true), m_role(), m_data(), diff --git a/src/kitemviews/kitemlistgroupheader.h b/src/kitemviews/kitemlistgroupheader.h index 4612bc4da..6a8bd76e8 100644 --- a/src/kitemviews/kitemlistgroupheader.h +++ b/src/kitemviews/kitemlistgroupheader.h @@ -42,8 +42,8 @@ class DOLPHIN_EXPORT KItemListGroupHeader : public QGraphicsWidget Q_OBJECT public: - KItemListGroupHeader(QGraphicsWidget* parent = 0); - virtual ~KItemListGroupHeader(); + KItemListGroupHeader(QGraphicsWidget* parent = nullptr); + ~KItemListGroupHeader() override; void setRole(const QByteArray& role); QByteArray role() const; @@ -65,7 +65,7 @@ public: void setItemIndex(int index); int itemIndex() const; - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; protected: virtual void paintRole(QPainter* painter, const QRectF& roleBounds, const QColor& color) = 0; @@ -101,7 +101,7 @@ protected: */ virtual void itemIndexChanged(int current, int previous); - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; virtual QPalette::ColorRole normalTextColorRole() const; virtual QPalette::ColorRole normalBaseColorRole() const; diff --git a/src/kitemviews/kitemlistheader.h b/src/kitemviews/kitemlistheader.h index 76c420559..4d9d9a5b0 100644 --- a/src/kitemviews/kitemlistheader.h +++ b/src/kitemviews/kitemlistheader.h @@ -38,7 +38,7 @@ class DOLPHIN_EXPORT KItemListHeader : public QObject Q_OBJECT public: - virtual ~KItemListHeader(); + ~KItemListHeader() override; /** * If set to true, KItemListView will automatically adjust the diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp index 46ffe7c13..5d7b08eeb 100644 --- a/src/kitemviews/kitemlistselectionmanager.cpp +++ b/src/kitemviews/kitemlistselectionmanager.cpp @@ -31,7 +31,7 @@ KItemListSelectionManager::KItemListSelectionManager(QObject* parent) : m_anchorItem(-1), m_selectedItems(), m_isAnchoredSelectionActive(false), - m_model(0) + m_model(nullptr) { } diff --git a/src/kitemviews/kitemlistselectionmanager.h b/src/kitemviews/kitemlistselectionmanager.h index 16761428b..54c2cc062 100644 --- a/src/kitemviews/kitemlistselectionmanager.h +++ b/src/kitemviews/kitemlistselectionmanager.h @@ -51,8 +51,8 @@ public: Toggle }; - KItemListSelectionManager(QObject* parent = 0); - virtual ~KItemListSelectionManager(); + KItemListSelectionManager(QObject* parent = nullptr); + ~KItemListSelectionManager() override; void setCurrentItem(int current); int currentItem() const; diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index d26809797..dbeb571a4 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -67,7 +67,7 @@ QAccessibleInterface* accessibleInterfaceFactory(const QString& key, QObject* ob return new KItemListViewAccessible(view); } - return 0; + return nullptr; } #endif @@ -80,30 +80,30 @@ KItemListView::KItemListView(QGraphicsWidget* parent) : m_activeTransactions(0), m_endTransactionAnimationHint(Animation), m_itemSize(), - m_controller(0), - m_model(0), + m_controller(nullptr), + m_model(nullptr), m_visibleRoles(), - m_widgetCreator(0), - m_groupHeaderCreator(0), + m_widgetCreator(nullptr), + m_groupHeaderCreator(nullptr), m_styleOption(), m_visibleItems(), m_visibleGroups(), m_visibleCells(), - m_sizeHintResolver(0), - m_layouter(0), - m_animation(0), - m_layoutTimer(0), + m_sizeHintResolver(nullptr), + m_layouter(nullptr), + m_animation(nullptr), + m_layoutTimer(nullptr), m_oldScrollOffset(0), m_oldMaximumScrollOffset(0), m_oldItemOffset(0), m_oldMaximumItemOffset(0), m_skipAutoScrollForRubberBand(false), - m_rubberBand(0), + m_rubberBand(nullptr), m_mousePos(), m_autoScrollIncrement(0), - m_autoScrollTimer(0), - m_header(0), - m_headerWidget(0), + m_autoScrollTimer(nullptr), + m_header(nullptr), + m_headerWidget(nullptr), m_dropIndicator() { setAcceptHoverEvents(true); @@ -141,13 +141,13 @@ KItemListView::~KItemListView() // widgetCreator(). So it is mandatory to delete the group headers // first. delete m_groupHeaderCreator; - m_groupHeaderCreator = 0; + m_groupHeaderCreator = nullptr; delete m_widgetCreator; - m_widgetCreator = 0; + m_widgetCreator = nullptr; delete m_sizeHintResolver; - m_sizeHintResolver = 0; + m_sizeHintResolver = nullptr; } void KItemListView::setScrollOffset(qreal offset) @@ -270,13 +270,13 @@ void KItemListView::setAutoScroll(bool enabled) m_autoScrollTimer->start(InitialAutoScrollDelay); } else if (!enabled && m_autoScrollTimer) { delete m_autoScrollTimer; - m_autoScrollTimer = 0; + m_autoScrollTimer = nullptr; } } bool KItemListView::autoScroll() const { - return m_autoScrollTimer != 0; + return m_autoScrollTimer != nullptr; } void KItemListView::setEnabledSelectionToggles(bool enabled) @@ -342,7 +342,7 @@ QSizeF KItemListView::itemSize() const QSizeF KItemListView::itemSizeHint() const { - return m_sizeHintResolver->maxSizeHint(); + return m_sizeHintResolver->minSizeHint(); } const KItemListStyleOption& KItemListView::styleOption() const @@ -629,7 +629,7 @@ QPixmap KItemListView::createDragPixmap(const KItemSet& indexes) const KItemListWidget* item = m_visibleItems.value(indexes.first()); QGraphicsView* graphicsView = scene()->views()[0]; if (item && graphicsView) { - pixmap = item->createDragPixmap(0, graphicsView); + pixmap = item->createDragPixmap(nullptr, graphicsView); } } else { // TODO: Not implemented yet. Probably extend the interface @@ -834,12 +834,12 @@ Qt::Orientation KItemListView::scrollOrientation() const KItemListWidgetCreatorBase* KItemListView::defaultWidgetCreator() const { - return 0; + return nullptr; } KItemListGroupHeaderCreatorBase* KItemListView::defaultGroupHeaderCreator() const { - return 0; + return nullptr; } void KItemListView::initializeItemListWidget(KItemListWidget* item) @@ -2090,7 +2090,7 @@ void KItemListView::recycleGroupHeaderForWidget(KItemListWidget* widget) { KItemListGroupHeader* header = m_visibleGroups.value(widget); if (header) { - header->setParentItem(0); + header->setParentItem(nullptr); groupHeaderCreator()->recycle(header); m_visibleGroups.remove(widget); disconnect(widget, &KItemListWidget::geometryChanged, this, &KItemListView::slotGeometryOfGroupHeaderParentChanged); @@ -2551,7 +2551,7 @@ void KItemListView::updateSiblingsInformation(int firstIndex, int lastIndex) const int parents = m_model->expandedParentsCount(lastIndex + 1); for (int i = lastIndex; i >= firstIndex; --i) { if (m_model->expandedParentsCount(i) != parents) { - widget = 0; + widget = nullptr; break; } } @@ -2714,7 +2714,7 @@ void KItemListCreatorBase::pushRecycleableWidget(QGraphicsWidget* widget) QGraphicsWidget* KItemListCreatorBase::popRecycleableWidget() { if (m_recycleableWidgets.isEmpty()) { - return 0; + return nullptr; } QGraphicsWidget* widget = m_recycleableWidgets.takeLast(); @@ -2728,7 +2728,7 @@ KItemListWidgetCreatorBase::~KItemListWidgetCreatorBase() void KItemListWidgetCreatorBase::recycle(KItemListWidget* widget) { - widget->setParentItem(0); + widget->setParentItem(nullptr); widget->setOpacity(1.0); pushRecycleableWidget(widget); } diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index e64ac7e31..e3793e10e 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -67,8 +67,8 @@ class DOLPHIN_EXPORT KItemListView : public QGraphicsWidget Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset) public: - KItemListView(QGraphicsWidget* parent = 0); - virtual ~KItemListView(); + KItemListView(QGraphicsWidget* parent = nullptr); + ~KItemListView() override; /** * Offset of the scrollbar that represents the scroll-orientation @@ -165,7 +165,7 @@ public: const KItemListStyleOption& styleOption() const; - virtual void setGeometry(const QRectF& rect) Q_DECL_OVERRIDE; + void setGeometry(const QRectF& rect) override; /** * @return The page step which should be used by the vertical scroll bar. @@ -285,7 +285,7 @@ public: */ void editRole(int index, const QByteArray& role); - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; signals: void scrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous); @@ -325,7 +325,7 @@ signals: void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); protected: - virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) Q_DECL_OVERRIDE; + QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; void setItemSize(const QSizeF& size); void setStyleOption(const KItemListStyleOption& option); @@ -382,13 +382,13 @@ protected: virtual void onTransactionBegin(); virtual void onTransactionEnd(); - virtual bool event(QEvent* event) Q_DECL_OVERRIDE; - virtual void mousePressEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - virtual void dragEnterEvent(QGraphicsSceneDragDropEvent* event) Q_DECL_OVERRIDE; - virtual void dragMoveEvent(QGraphicsSceneDragDropEvent* event) Q_DECL_OVERRIDE; - virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) Q_DECL_OVERRIDE; - virtual void dropEvent(QGraphicsSceneDragDropEvent* event) Q_DECL_OVERRIDE; + bool event(QEvent* event) override; + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; + void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override; + void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override; + void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) override; + void dropEvent(QGraphicsSceneDragDropEvent* event) override; QList<KItemListWidget*> visibleItemListWidgets() const; @@ -803,7 +803,7 @@ private: class DOLPHIN_EXPORT KItemListWidgetCreatorBase : public KItemListCreatorBase { public: - virtual ~KItemListWidgetCreatorBase(); + ~KItemListWidgetCreatorBase() override; virtual KItemListWidget* create(KItemListView* view) = 0; @@ -824,15 +824,15 @@ class KItemListWidgetCreator : public KItemListWidgetCreatorBase { public: KItemListWidgetCreator(); - virtual ~KItemListWidgetCreator(); + ~KItemListWidgetCreator() override; - virtual KItemListWidget* create(KItemListView* view) Q_DECL_OVERRIDE; + KItemListWidget* create(KItemListView* view) override; - virtual void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const Q_DECL_OVERRIDE; + void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; - virtual qreal preferredRoleColumnWidth(const QByteArray& role, + qreal preferredRoleColumnWidth(const QByteArray& role, int index, - const KItemListView* view) const Q_DECL_OVERRIDE; + const KItemListView* view) const override; private: KItemListWidgetInformant* m_informant; }; @@ -885,7 +885,7 @@ qreal KItemListWidgetCreator<T>::preferredRoleColumnWidth(const QByteArray& role class DOLPHIN_EXPORT KItemListGroupHeaderCreatorBase : public KItemListCreatorBase { public: - virtual ~KItemListGroupHeaderCreatorBase(); + ~KItemListGroupHeaderCreatorBase() override; virtual KItemListGroupHeader* create(KItemListView* view) = 0; virtual void recycle(KItemListGroupHeader* header); }; @@ -894,8 +894,8 @@ template <class T> class KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase { public: - virtual ~KItemListGroupHeaderCreator(); - virtual KItemListGroupHeader* create(KItemListView* view) Q_DECL_OVERRIDE; + ~KItemListGroupHeaderCreator() override; + KItemListGroupHeader* create(KItemListView* view) override; }; template <class T> diff --git a/src/kitemviews/kitemlistviewaccessible.cpp b/src/kitemviews/kitemlistviewaccessible.cpp index 6f06e243e..c593dad82 100644 --- a/src/kitemviews/kitemlistviewaccessible.cpp +++ b/src/kitemviews/kitemlistviewaccessible.cpp @@ -60,7 +60,7 @@ void* KItemListViewAccessible::interface_cast(QAccessible::InterfaceType type) if (type == QAccessible::TableInterface) { return static_cast<QAccessibleTableInterface*>(this); } - return Q_NULLPTR; + return nullptr; } void KItemListViewAccessible::modelReset() @@ -70,7 +70,7 @@ void KItemListViewAccessible::modelReset() QAccessibleInterface* KItemListViewAccessible::cell(int index) const { if (index < 0 || index >= view()->model()->count()) { - return 0; + return nullptr; } if (m_cells.size() <= index) { @@ -93,7 +93,7 @@ QAccessibleInterface* KItemListViewAccessible::cellAt(int row, int column) const QAccessibleInterface* KItemListViewAccessible::caption() const { - return 0; + return nullptr; } QString KItemListViewAccessible::columnDescription(int) const @@ -168,7 +168,7 @@ QList<int> KItemListViewAccessible::selectedRows() const QAccessibleInterface* KItemListViewAccessible::summary() const { - return 0; + return nullptr; } bool KItemListViewAccessible::isColumnSelected(int) const @@ -225,7 +225,7 @@ QAccessibleInterface* KItemListViewAccessible::childAt(int x, int y) const QAccessibleInterface* KItemListViewAccessible::parent() const { // FIXME: return KItemListContainerAccessible here - return Q_NULLPTR; + return nullptr; } int KItemListViewAccessible::childCount() const @@ -265,7 +265,7 @@ QAccessibleInterface* KItemListViewAccessible::child(int index) const if (index >= 0 && index < childCount()) { return cell(index); } - return Q_NULLPTR; + return nullptr; } // Table Cell @@ -282,7 +282,7 @@ void* KItemListAccessibleCell::interface_cast(QAccessible::InterfaceType type) if (type == QAccessible::TableCellInterface) { return static_cast<QAccessibleTableCellInterface*>(this); } - return Q_NULLPTR; + return nullptr; } int KItemListAccessibleCell::columnExtent() const @@ -398,7 +398,7 @@ void KItemListAccessibleCell::setText(QAccessible::Text, const QString&) QAccessibleInterface* KItemListAccessibleCell::child(int) const { - return Q_NULLPTR; + return nullptr; } bool KItemListAccessibleCell::isValid() const @@ -408,7 +408,7 @@ bool KItemListAccessibleCell::isValid() const QAccessibleInterface* KItemListAccessibleCell::childAt(int, int) const { - return Q_NULLPTR; + return nullptr; } int KItemListAccessibleCell::childCount() const @@ -434,7 +434,7 @@ int KItemListAccessibleCell::index() const QObject* KItemListAccessibleCell::object() const { - return 0; + return nullptr; } // Container Interface @@ -465,7 +465,7 @@ QAccessibleInterface* KItemListContainerAccessible::child(int index) const if (index == 0) { return QAccessible::queryAccessibleInterface(container()->controller()->view()); } - return Q_NULLPTR; + return nullptr; } const KItemListContainer* KItemListContainerAccessible::container() const diff --git a/src/kitemviews/kitemlistviewaccessible.h b/src/kitemviews/kitemlistviewaccessible.h index afef2d5fe..674d98ee6 100644 --- a/src/kitemviews/kitemlistviewaccessible.h +++ b/src/kitemviews/kitemlistviewaccessible.h @@ -36,44 +36,44 @@ class DOLPHIN_EXPORT KItemListViewAccessible: public QAccessibleObject, public Q { public: explicit KItemListViewAccessible(KItemListView* view); - ~KItemListViewAccessible(); + ~KItemListViewAccessible() override; - void* interface_cast(QAccessible::InterfaceType type) Q_DECL_OVERRIDE; + void* interface_cast(QAccessible::InterfaceType type) override; - QAccessible::Role role() const Q_DECL_OVERRIDE; - QAccessible::State state() const Q_DECL_OVERRIDE; - QString text(QAccessible::Text t) const Q_DECL_OVERRIDE; - QRect rect() const Q_DECL_OVERRIDE; + QAccessible::Role role() const override; + QAccessible::State state() const override; + QString text(QAccessible::Text t) const override; + QRect rect() const override; - QAccessibleInterface* child(int index) const Q_DECL_OVERRIDE; - int childCount() const Q_DECL_OVERRIDE; - int indexOfChild(const QAccessibleInterface*) const Q_DECL_OVERRIDE; - QAccessibleInterface* childAt(int x, int y) const Q_DECL_OVERRIDE; - QAccessibleInterface* parent() const Q_DECL_OVERRIDE; + QAccessibleInterface* child(int index) const override; + int childCount() const override; + int indexOfChild(const QAccessibleInterface*) const override; + QAccessibleInterface* childAt(int x, int y) const override; + QAccessibleInterface* parent() const override; // Table interface - virtual QAccessibleInterface* cellAt(int row, int column) const Q_DECL_OVERRIDE; - virtual QAccessibleInterface* caption() const Q_DECL_OVERRIDE; - virtual QAccessibleInterface* summary() const Q_DECL_OVERRIDE; - virtual QString columnDescription(int column) const Q_DECL_OVERRIDE; - virtual QString rowDescription(int row) const Q_DECL_OVERRIDE; - virtual int columnCount() const Q_DECL_OVERRIDE; - virtual int rowCount() const Q_DECL_OVERRIDE; + QAccessibleInterface* cellAt(int row, int column) const override; + QAccessibleInterface* caption() const override; + QAccessibleInterface* summary() const override; + QString columnDescription(int column) const override; + QString rowDescription(int row) const override; + int columnCount() const override; + int rowCount() const override; // Selection - virtual int selectedCellCount() const Q_DECL_OVERRIDE; - virtual int selectedColumnCount() const Q_DECL_OVERRIDE; - virtual int selectedRowCount() const Q_DECL_OVERRIDE; - virtual QList<QAccessibleInterface*> selectedCells() const Q_DECL_OVERRIDE; - virtual QList<int> selectedColumns() const Q_DECL_OVERRIDE; - virtual QList<int> selectedRows() const Q_DECL_OVERRIDE; - virtual bool isColumnSelected(int column) const Q_DECL_OVERRIDE; - virtual bool isRowSelected(int row) const Q_DECL_OVERRIDE; - virtual bool selectRow(int row) Q_DECL_OVERRIDE; - virtual bool selectColumn(int column) Q_DECL_OVERRIDE; - virtual bool unselectRow(int row) Q_DECL_OVERRIDE; - virtual bool unselectColumn(int column) Q_DECL_OVERRIDE; - virtual void modelChange(QAccessibleTableModelChangeEvent*) Q_DECL_OVERRIDE; + int selectedCellCount() const override; + int selectedColumnCount() const override; + int selectedRowCount() const override; + QList<QAccessibleInterface*> selectedCells() const override; + QList<int> selectedColumns() const override; + QList<int> selectedRows() const override; + bool isColumnSelected(int column) const override; + bool isRowSelected(int row) const override; + bool selectRow(int row) override; + bool selectColumn(int column) override; + bool unselectRow(int row) override; + bool unselectColumn(int column) override; + void modelChange(QAccessibleTableModelChangeEvent*) override; KItemListView* view() const; @@ -94,32 +94,32 @@ class DOLPHIN_EXPORT KItemListAccessibleCell: public QAccessibleInterface, publi public: KItemListAccessibleCell(KItemListView* view, int m_index); - void* interface_cast(QAccessible::InterfaceType type) Q_DECL_OVERRIDE; - QObject* object() const Q_DECL_OVERRIDE; - bool isValid() const Q_DECL_OVERRIDE; - QAccessible::Role role() const Q_DECL_OVERRIDE; - QAccessible::State state() const Q_DECL_OVERRIDE; - QRect rect() const Q_DECL_OVERRIDE; - QString text(QAccessible::Text t) const Q_DECL_OVERRIDE; - void setText(QAccessible::Text t, const QString& text) Q_DECL_OVERRIDE; + void* interface_cast(QAccessible::InterfaceType type) override; + QObject* object() const override; + bool isValid() const override; + QAccessible::Role role() const override; + QAccessible::State state() const override; + QRect rect() const override; + QString text(QAccessible::Text t) const override; + void setText(QAccessible::Text t, const QString& text) override; - QAccessibleInterface* child(int index) const Q_DECL_OVERRIDE; - int childCount() const Q_DECL_OVERRIDE; - QAccessibleInterface* childAt(int x, int y) const Q_DECL_OVERRIDE; - int indexOfChild(const QAccessibleInterface*) const Q_DECL_OVERRIDE; + QAccessibleInterface* child(int index) const override; + int childCount() const override; + QAccessibleInterface* childAt(int x, int y) const override; + int indexOfChild(const QAccessibleInterface*) const override; - QAccessibleInterface* parent() const Q_DECL_OVERRIDE; + QAccessibleInterface* parent() const override; bool isExpandable() const; // Cell Interface - virtual int columnExtent() const Q_DECL_OVERRIDE; - virtual QList<QAccessibleInterface*> columnHeaderCells() const Q_DECL_OVERRIDE; - virtual int columnIndex() const Q_DECL_OVERRIDE; - virtual int rowExtent() const Q_DECL_OVERRIDE; - virtual QList<QAccessibleInterface*> rowHeaderCells() const Q_DECL_OVERRIDE; - virtual int rowIndex() const Q_DECL_OVERRIDE; - virtual bool isSelected() const Q_DECL_OVERRIDE; - virtual QAccessibleInterface* table() const Q_DECL_OVERRIDE; + int columnExtent() const override; + QList<QAccessibleInterface*> columnHeaderCells() const override; + int columnIndex() const override; + int rowExtent() const override; + QList<QAccessibleInterface*> rowHeaderCells() const override; + int rowIndex() const override; + bool isSelected() const override; + QAccessibleInterface* table() const override; inline int index() const; @@ -132,11 +132,11 @@ class DOLPHIN_EXPORT KItemListContainerAccessible : public QAccessibleWidget { public: explicit KItemListContainerAccessible(KItemListContainer* container); - virtual ~KItemListContainerAccessible(); + ~KItemListContainerAccessible() override; - QAccessibleInterface* child(int index) const Q_DECL_OVERRIDE; - int childCount() const Q_DECL_OVERRIDE; - int indexOfChild(const QAccessibleInterface* child) const Q_DECL_OVERRIDE; + QAccessibleInterface* child(int index) const override; + int childCount() const override; + int indexOfChild(const QAccessibleInterface* child) const override; private: const KItemListContainer* container() const; diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 65fc911bd..579d8b7a2 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -42,7 +42,7 @@ KItemListWidgetInformant::~KItemListWidgetInformant() } KItemListWidget::KItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : - QGraphicsWidget(parent, 0), + QGraphicsWidget(parent, nullptr), m_informant(informant), m_index(-1), m_selected(false), @@ -56,9 +56,9 @@ KItemListWidget::KItemListWidget(KItemListWidgetInformant* informant, QGraphicsI m_styleOption(), m_siblingsInfo(), m_hoverOpacity(0), - m_hoverCache(0), - m_hoverAnimation(0), - m_selectionToggle(0), + m_hoverCache(nullptr), + m_hoverAnimation(nullptr), + m_selectionToggle(nullptr), m_editedRole() { } @@ -72,7 +72,7 @@ void KItemListWidget::setIndex(int index) { if (m_index != index) { delete m_selectionToggle; - m_selectionToggle = 0; + m_selectionToggle = nullptr; if (m_hoverAnimation) { m_hoverAnimation->stop(); @@ -474,7 +474,7 @@ void KItemListWidget::slotHoverAnimationFinished() { if (!m_hovered && m_selectionToggle) { m_selectionToggle->deleteLater(); - m_selectionToggle = 0; + m_selectionToggle = nullptr; } } @@ -502,7 +502,7 @@ void KItemListWidget::setHoverOpacity(qreal opacity) if (m_hoverOpacity <= 0.0) { delete m_hoverCache; - m_hoverCache = 0; + m_hoverCache = nullptr; } update(); @@ -511,7 +511,7 @@ void KItemListWidget::setHoverOpacity(qreal opacity) void KItemListWidget::clearHoverCache() { delete m_hoverCache; - m_hoverCache = 0; + m_hoverCache = nullptr; } void KItemListWidget::drawItemStyleOption(QPainter* painter, QWidget* widget, QStyle::State styleState) diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index d1ea7c9da..06fea0e39 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -69,7 +69,7 @@ class DOLPHIN_EXPORT KItemListWidget : public QGraphicsWidget public: KItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~KItemListWidget(); + ~KItemListWidget() override; void setIndex(int index); int index() const; @@ -82,7 +82,7 @@ public: * to show the data of the custom model provided by KItemListWidget::data(). * @reimp */ - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; void setVisibleRoles(const QList<QByteArray>& roles); QList<QByteArray> visibleRoles() const; @@ -142,7 +142,7 @@ public: * or KItemListWidget::expansionToggleRect(). * @reimp */ - virtual bool contains(const QPointF& point) const override; + bool contains(const QPointF& point) const override; /** * @return Rectangle for the area that shows the icon. @@ -186,7 +186,7 @@ public: * @return Pixmap that is used when dragging an item. Per default the current state of the * widget is returned as pixmap. */ - virtual QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = 0); + virtual QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr); signals: void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); @@ -203,7 +203,7 @@ protected: virtual void alternateBackgroundChanged(bool enabled); virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous); virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous); - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; /** * @return The current opacity of the hover-animation. When implementing a custom painting-code for a hover-state diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp index d73468336..983b46960 100644 --- a/src/kitemviews/kitemmodelbase.cpp +++ b/src/kitemviews/kitemmodelbase.cpp @@ -126,7 +126,7 @@ int KItemModelBase::expandedParentsCount(int index) const QMimeData* KItemModelBase::createMimeData(const KItemSet& indexes) const { Q_UNUSED(indexes); - return 0; + return nullptr; } int KItemModelBase::indexForKeyboardSearch(const QString& text, int startFromIndex) const diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index a7773ee3b..0aa6d187f 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -55,9 +55,9 @@ class DOLPHIN_EXPORT KItemModelBase : public QObject Q_OBJECT public: - KItemModelBase(QObject* parent = 0); - explicit KItemModelBase(const QByteArray& sortRole, QObject* parent = 0); - virtual ~KItemModelBase(); + KItemModelBase(QObject* parent = nullptr); + explicit KItemModelBase(const QByteArray& sortRole, QObject* parent = nullptr); + ~KItemModelBase() override; /** @return The number of items. */ virtual int count() const = 0; diff --git a/src/kitemviews/kstandarditem.cpp b/src/kitemviews/kstandarditem.cpp index f3fd258f9..d4d1fa2f9 100644 --- a/src/kitemviews/kstandarditem.cpp +++ b/src/kitemviews/kstandarditem.cpp @@ -25,7 +25,7 @@ KStandardItem::KStandardItem(KStandardItem* parent) : m_parent(parent), m_children(), - m_model(0), + m_model(nullptr), m_data() { } @@ -33,7 +33,7 @@ KStandardItem::KStandardItem(KStandardItem* parent) : KStandardItem::KStandardItem(const QString& text, KStandardItem* parent) : m_parent(parent), m_children(), - m_model(0), + m_model(nullptr), m_data() { setText(text); @@ -42,7 +42,7 @@ KStandardItem::KStandardItem(const QString& text, KStandardItem* parent) : KStandardItem::KStandardItem(const QString& icon, const QString& text, KStandardItem* parent) : m_parent(parent), m_children(), - m_model(0), + m_model(nullptr), m_data() { setIcon(icon); diff --git a/src/kitemviews/kstandarditem.h b/src/kitemviews/kstandarditem.h index 5bb2bb36f..fec197c06 100644 --- a/src/kitemviews/kstandarditem.h +++ b/src/kitemviews/kstandarditem.h @@ -40,9 +40,9 @@ class DOLPHIN_EXPORT KStandardItem { public: - explicit KStandardItem(KStandardItem* parent = 0); - explicit KStandardItem(const QString& text, KStandardItem* parent = 0); - KStandardItem(const QString& icon, const QString& text, KStandardItem* parent = 0); + explicit KStandardItem(KStandardItem* parent = nullptr); + explicit KStandardItem(const QString& text, KStandardItem* parent = nullptr); + KStandardItem(const QString& icon, const QString& text, KStandardItem* parent = nullptr); KStandardItem(const KStandardItem& item); virtual ~KStandardItem(); diff --git a/src/kitemviews/kstandarditemlistgroupheader.h b/src/kitemviews/kstandarditemlistgroupheader.h index f0eacfd49..36ab77722 100644 --- a/src/kitemviews/kstandarditemlistgroupheader.h +++ b/src/kitemviews/kstandarditemlistgroupheader.h @@ -32,17 +32,17 @@ class DOLPHIN_EXPORT KStandardItemListGroupHeader : public KItemListGroupHeader Q_OBJECT public: - KStandardItemListGroupHeader(QGraphicsWidget* parent = 0); - virtual ~KStandardItemListGroupHeader(); + KStandardItemListGroupHeader(QGraphicsWidget* parent = nullptr); + ~KStandardItemListGroupHeader() override; - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; protected: - virtual void paintRole(QPainter* painter, const QRectF& roleBounds, const QColor& color) Q_DECL_OVERRIDE; - virtual void paintSeparator(QPainter* painter, const QColor& color) Q_DECL_OVERRIDE; - virtual void roleChanged(const QByteArray ¤t, const QByteArray &previous) Q_DECL_OVERRIDE; - virtual void dataChanged(const QVariant& current, const QVariant& previous) Q_DECL_OVERRIDE; - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; + void paintRole(QPainter* painter, const QRectF& roleBounds, const QColor& color) override; + void paintSeparator(QPainter* painter, const QColor& color) override; + void roleChanged(const QByteArray ¤t, const QByteArray &previous) override; + void dataChanged(const QVariant& current, const QVariant& previous) override; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; private: void updateCache(); diff --git a/src/kitemviews/kstandarditemlistview.h b/src/kitemviews/kstandarditemlistview.h index 2e4c7a0a0..6321a1d2e 100644 --- a/src/kitemviews/kstandarditemlistview.h +++ b/src/kitemviews/kstandarditemlistview.h @@ -52,22 +52,22 @@ public: DetailsLayout }; - KStandardItemListView(QGraphicsWidget* parent = 0); - virtual ~KStandardItemListView(); + KStandardItemListView(QGraphicsWidget* parent = nullptr); + ~KStandardItemListView() override; void setItemLayout(ItemLayout layout); ItemLayout itemLayout() const; protected: - virtual KItemListWidgetCreatorBase* defaultWidgetCreator() const Q_DECL_OVERRIDE; - virtual KItemListGroupHeaderCreatorBase* defaultGroupHeaderCreator() const Q_DECL_OVERRIDE; - virtual void initializeItemListWidget(KItemListWidget* item) Q_DECL_OVERRIDE; - virtual bool itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const Q_DECL_OVERRIDE; + KItemListWidgetCreatorBase* defaultWidgetCreator() const override; + KItemListGroupHeaderCreatorBase* defaultGroupHeaderCreator() const override; + void initializeItemListWidget(KItemListWidget* item) override; + bool itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const override; virtual bool itemLayoutSupportsItemExpanding(ItemLayout layout) const; virtual void onItemLayoutChanged(ItemLayout current, ItemLayout previous); - virtual void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) Q_DECL_OVERRIDE; - virtual void onSupportsItemExpandingChanged(bool supportsExpanding) Q_DECL_OVERRIDE; - virtual void polishEvent() Q_DECL_OVERRIDE; + void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) override; + void onSupportsItemExpandingChanged(bool supportsExpanding) override; + void polishEvent() override; private: void applyDefaultStyleOption(int iconSize, int padding, int horizontalMargin, int verticalMargin); diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 7d94a59f5..827537612 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -273,8 +273,8 @@ KStandardItemListWidget::KStandardItemListWidget(KItemListWidgetInformant* infor m_additionalInfoTextColor(), m_overlay(), m_rating(), - m_roleEditor(0), - m_oldRoleEditor(0) + m_roleEditor(nullptr), + m_oldRoleEditor(nullptr) { } @@ -770,7 +770,7 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); - m_roleEditor = 0; + m_roleEditor = nullptr; } return; } @@ -998,7 +998,7 @@ void KStandardItemListWidget::updatePixmapCache() if (!m_overlay.isNull()) { QPainter painter(&m_pixmap); - painter.drawPixmap(0, m_pixmap.height() - m_overlay.height(), m_overlay); + painter.drawPixmap(0, (m_pixmap.height() - m_overlay.height()) / m_pixmap.devicePixelRatio(), m_overlay); } int scaledIconSize = 0; @@ -1452,7 +1452,7 @@ void KStandardItemListWidget::closeRoleEditor() } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); - m_roleEditor = 0; + m_roleEditor = nullptr; } QPixmap KStandardItemListWidget::pixmapForIcon(const QString& name, const QStringList& overlays, int size, QIcon::Mode mode) diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index cb7364795..b13c303bc 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -36,13 +36,13 @@ class DOLPHIN_EXPORT KStandardItemListWidgetInformant : public KItemListWidgetIn { public: KStandardItemListWidgetInformant(); - virtual ~KStandardItemListWidgetInformant(); + ~KStandardItemListWidgetInformant() override; - virtual void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const Q_DECL_OVERRIDE; + void calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; - virtual qreal preferredRoleColumnWidth(const QByteArray& role, + qreal preferredRoleColumnWidth(const QByteArray& role, int index, - const KItemListView* view) const Q_DECL_OVERRIDE; + const KItemListView* view) const override; protected: /** * @return The value of the "text" role. The default implementation returns @@ -96,7 +96,7 @@ public: }; KStandardItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~KStandardItemListWidget(); + ~KStandardItemListWidget() override; void setLayout(Layout layout); Layout layout() const; @@ -104,15 +104,15 @@ public: void setSupportsItemExpanding(bool supportsItemExpanding); bool supportsItemExpanding() const; - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) override; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; - virtual QRectF iconRect() const Q_DECL_OVERRIDE; - virtual QRectF textRect() const Q_DECL_OVERRIDE; - virtual QRectF textFocusRect() const Q_DECL_OVERRIDE; - virtual QRectF selectionRect() const Q_DECL_OVERRIDE; - virtual QRectF expansionToggleRect() const Q_DECL_OVERRIDE; - virtual QRectF selectionToggleRect() const Q_DECL_OVERRIDE; - virtual QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + QRectF iconRect() const override; + QRectF textRect() const override; + QRectF textFocusRect() const override; + QRectF selectionRect() const override; + QRectF expansionToggleRect() const override; + QRectF selectionToggleRect() const override; + QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; static KItemListWidgetInformant* createInformant(); @@ -172,18 +172,18 @@ protected: */ virtual int selectionLength(const QString& text) const; - virtual void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>()) Q_DECL_OVERRIDE; - virtual void visibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous) Q_DECL_OVERRIDE; - virtual void columnWidthChanged(const QByteArray& role, qreal current, qreal previous) Q_DECL_OVERRIDE; - virtual void styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) Q_DECL_OVERRIDE; - virtual void hoveredChanged(bool hovered) Q_DECL_OVERRIDE; - virtual void selectedChanged(bool selected) Q_DECL_OVERRIDE; - virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous) Q_DECL_OVERRIDE; - virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous) Q_DECL_OVERRIDE; - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; - bool event(QEvent *event) Q_DECL_OVERRIDE; + void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>()) override; + void visibleRolesChanged(const QList<QByteArray>& current, const QList<QByteArray>& previous) override; + void columnWidthChanged(const QByteArray& role, qreal current, qreal previous) override; + void styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) override; + void hoveredChanged(bool hovered) override; + void selectedChanged(bool selected) override; + void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous) override; + void editedRoleChanged(const QByteArray& current, const QByteArray& previous) override; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; + void showEvent(QShowEvent* event) override; + void hideEvent(QHideEvent* event) override; + bool event(QEvent *event) override; public slots: void finishRoleEditing(); diff --git a/src/kitemviews/kstandarditemmodel.cpp b/src/kitemviews/kstandarditemmodel.cpp index 25288e50f..0779614c3 100644 --- a/src/kitemviews/kstandarditemmodel.cpp +++ b/src/kitemviews/kstandarditemmodel.cpp @@ -89,7 +89,7 @@ void KStandardItemModel::changeItem(int index, KStandardItem* item) m_indexesForItems.remove(oldItem); delete oldItem; - oldItem = 0; + oldItem = nullptr; m_items[index] = item; m_indexesForItems.insert(item, index); @@ -114,7 +114,7 @@ void KStandardItemModel::removeItem(int index) onItemRemoved(index, item); delete item; - item = 0; + item = nullptr; emit itemsRemoved(KItemRangeList() << KItemRange(index, 1)); @@ -134,7 +134,7 @@ void KStandardItemModel::clear() KStandardItem* KStandardItemModel::item(int index) const { if (index < 0 || index >= m_items.count()) { - return 0; + return nullptr; } return m_items[index]; } @@ -178,7 +178,7 @@ bool KStandardItemModel::setData(int index, const QHash<QByteArray, QVariant>& v QMimeData* KStandardItemModel::createMimeData(const KItemSet& indexes) const { Q_UNUSED(indexes); - return 0; + return nullptr; } int KStandardItemModel::indexForKeyboardSearch(const QString& text, int startFromIndex) const diff --git a/src/kitemviews/kstandarditemmodel.h b/src/kitemviews/kstandarditemmodel.h index 58c5a5d88..288b5b84f 100644 --- a/src/kitemviews/kstandarditemmodel.h +++ b/src/kitemviews/kstandarditemmodel.h @@ -40,8 +40,8 @@ class DOLPHIN_EXPORT KStandardItemModel : public KItemModelBase Q_OBJECT public: - explicit KStandardItemModel(QObject* parent = 0); - virtual ~KStandardItemModel(); + explicit KStandardItemModel(QObject* parent = nullptr); + ~KStandardItemModel() override; /** * Inserts the item \a item at the index \a index. If the index @@ -69,14 +69,14 @@ public: */ void appendItem(KStandardItem* item); - virtual int count() const Q_DECL_OVERRIDE; - virtual QHash<QByteArray, QVariant> data(int index) const Q_DECL_OVERRIDE; - virtual bool setData(int index, const QHash<QByteArray, QVariant>& values) Q_DECL_OVERRIDE; - virtual QMimeData* createMimeData(const KItemSet& indexes) const Q_DECL_OVERRIDE; - virtual int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const Q_DECL_OVERRIDE; - virtual bool supportsDropping(int index) const Q_DECL_OVERRIDE; - virtual QString roleDescription(const QByteArray& role) const Q_DECL_OVERRIDE; - virtual QList<QPair<int, QVariant> > groups() const Q_DECL_OVERRIDE; + int count() const override; + QHash<QByteArray, QVariant> data(int index) const override; + bool setData(int index, const QHash<QByteArray, QVariant>& values) override; + QMimeData* createMimeData(const KItemSet& indexes) const override; + int indexForKeyboardSearch(const QString& text, int startFromIndex = 0) const override; + bool supportsDropping(int index) const override; + QString roleDescription(const QByteArray& role) const override; + QList<QPair<int, QVariant> > groups() const override; virtual void clear(); protected: diff --git a/src/kitemviews/private/kbaloorolesprovider.cpp b/src/kitemviews/private/kbaloorolesprovider.cpp index 314c2f06b..53fc0b3b9 100644 --- a/src/kitemviews/private/kbaloorolesprovider.cpp +++ b/src/kitemviews/private/kbaloorolesprovider.cpp @@ -148,6 +148,7 @@ KBalooRolesProvider::KBalooRolesProvider() : { "lineCount", "lineCount" }, { "width", "imageSize" }, { "height", "imageSize" }, + { "imageDateTime", "imageDateTime"}, { "nexif.orientation", "orientation", }, { "artist", "artist" }, { "genre", "genre" }, diff --git a/src/kitemviews/private/kdirectorycontentscounter.cpp b/src/kitemviews/private/kdirectorycontentscounter.cpp index af7312ad2..90716173c 100644 --- a/src/kitemviews/private/kdirectorycontentscounter.cpp +++ b/src/kitemviews/private/kdirectorycontentscounter.cpp @@ -30,9 +30,9 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj QObject(parent), m_model(model), m_queue(), - m_worker(0), + m_worker(nullptr), m_workerIsBusy(false), - m_dirWatcher(0), + m_dirWatcher(nullptr), m_watchedDirs() { connect(m_model, &KFileItemModel::itemsRemoved, @@ -70,7 +70,7 @@ KDirectoryContentsCounter::~KDirectoryContentsCounter() m_workerThread->quit(); m_workerThread->wait(); delete m_workerThread; - m_workerThread = 0; + m_workerThread = nullptr; // The worker thread has finished running now, so it's safe to delete // m_worker. deleteLater() would not work at all because the event loop @@ -180,5 +180,5 @@ void KDirectoryContentsCounter::startWorker(const QString& path) } } -QThread* KDirectoryContentsCounter::m_workerThread = 0; +QThread* KDirectoryContentsCounter::m_workerThread = nullptr; int KDirectoryContentsCounter::m_workersCount = 0; diff --git a/src/kitemviews/private/kdirectorycontentscounter.h b/src/kitemviews/private/kdirectorycontentscounter.h index 988208e02..977765ab7 100644 --- a/src/kitemviews/private/kdirectorycontentscounter.h +++ b/src/kitemviews/private/kdirectorycontentscounter.h @@ -35,8 +35,8 @@ class KDirectoryContentsCounter : public QObject Q_OBJECT public: - explicit KDirectoryContentsCounter(KFileItemModel* model, QObject* parent = 0); - ~KDirectoryContentsCounter(); + explicit KDirectoryContentsCounter(KFileItemModel* model, QObject* parent = nullptr); + ~KDirectoryContentsCounter() override; /** * Requests the number of items inside the directory \a path. The actual diff --git a/src/kitemviews/private/kdirectorycontentscounterworker.cpp b/src/kitemviews/private/kdirectorycontentscounterworker.cpp index 47fbb5dd5..79e134724 100644 --- a/src/kitemviews/private/kdirectorycontentscounterworker.cpp +++ b/src/kitemviews/private/kdirectorycontentscounterworker.cpp @@ -59,7 +59,7 @@ int KDirectoryContentsCounterWorker::subItemsCount(const QString& path, Options DIR* dir = ::opendir(QFile::encodeName(path)); if (dir) { // krazy:exclude=syscalls count = 0; - struct dirent *dirEntry = 0; + struct dirent *dirEntry = nullptr; while ((dirEntry = ::readdir(dir))) { if (dirEntry->d_name[0] == '.') { if (dirEntry->d_name[1] == '\0' || !countHiddenFiles) { diff --git a/src/kitemviews/private/kdirectorycontentscounterworker.h b/src/kitemviews/private/kdirectorycontentscounterworker.h index b2e31ef0f..2460a0e1f 100644 --- a/src/kitemviews/private/kdirectorycontentscounterworker.h +++ b/src/kitemviews/private/kdirectorycontentscounterworker.h @@ -37,7 +37,7 @@ public: }; Q_DECLARE_FLAGS(Options, Option) - explicit KDirectoryContentsCounterWorker(QObject* parent = 0); + explicit KDirectoryContentsCounterWorker(QObject* parent = nullptr); /** * Counts the items inside the directory \a path using the options diff --git a/src/kitemviews/private/kfileitemclipboard.cpp b/src/kitemviews/private/kfileitemclipboard.cpp index d27869dff..31e6c6198 100644 --- a/src/kitemviews/private/kfileitemclipboard.cpp +++ b/src/kitemviews/private/kfileitemclipboard.cpp @@ -74,7 +74,7 @@ void KFileItemClipboard::updateCutItems() } KFileItemClipboard::KFileItemClipboard() : - QObject(0), + QObject(nullptr), m_cutItems() { updateCutItems(); diff --git a/src/kitemviews/private/kfileitemclipboard.h b/src/kitemviews/private/kfileitemclipboard.h index 3ee50d661..5b5ab1eec 100644 --- a/src/kitemviews/private/kfileitemclipboard.h +++ b/src/kitemviews/private/kfileitemclipboard.h @@ -46,7 +46,7 @@ signals: void cutItemsChanged(); protected: - virtual ~KFileItemClipboard(); + ~KFileItemClipboard() override; private slots: void updateCutItems(); diff --git a/src/kitemviews/private/kfileitemmodeldirlister.cpp b/src/kitemviews/private/kfileitemmodeldirlister.cpp index 778625573..eeeba11b2 100644 --- a/src/kitemviews/private/kfileitemmodeldirlister.cpp +++ b/src/kitemviews/private/kfileitemmodeldirlister.cpp @@ -24,7 +24,7 @@ KFileItemModelDirLister::KFileItemModelDirLister(QObject* parent) : KDirLister(parent) { - setAutoErrorHandlingEnabled(false, 0); + setAutoErrorHandlingEnabled(false, nullptr); } KFileItemModelDirLister::~KFileItemModelDirLister() diff --git a/src/kitemviews/private/kfileitemmodeldirlister.h b/src/kitemviews/private/kfileitemmodeldirlister.h index 5aa2b6303..c8b670f71 100644 --- a/src/kitemviews/private/kfileitemmodeldirlister.h +++ b/src/kitemviews/private/kfileitemmodeldirlister.h @@ -34,8 +34,8 @@ class DOLPHIN_EXPORT KFileItemModelDirLister : public KDirLister Q_OBJECT public: - KFileItemModelDirLister(QObject* parent = 0); - virtual ~KFileItemModelDirLister(); + KFileItemModelDirLister(QObject* parent = nullptr); + ~KFileItemModelDirLister() override; signals: /** Is emitted whenever an error has occurred. */ @@ -48,7 +48,7 @@ signals: void urlIsFileError(const QUrl& url); protected: - void handleError(KIO::Job* job) Q_DECL_OVERRIDE; + void handleError(KIO::Job* job) override; }; #endif diff --git a/src/kitemviews/private/kfileitemmodelfilter.cpp b/src/kitemviews/private/kfileitemmodelfilter.cpp index 6c6f94ffa..a388a242c 100644 --- a/src/kitemviews/private/kfileitemmodelfilter.cpp +++ b/src/kitemviews/private/kfileitemmodelfilter.cpp @@ -26,7 +26,7 @@ KFileItemModelFilter::KFileItemModelFilter() : m_useRegExp(false), - m_regExp(0), + m_regExp(nullptr), m_lowerCasePattern(), m_pattern() { @@ -35,7 +35,7 @@ KFileItemModelFilter::KFileItemModelFilter() : KFileItemModelFilter::~KFileItemModelFilter() { delete m_regExp; - m_regExp = 0; + m_regExp = nullptr; } void KFileItemModelFilter::setPattern(const QString& filter) diff --git a/src/kitemviews/private/kitemlistheaderwidget.cpp b/src/kitemviews/private/kitemlistheaderwidget.cpp index cc11e19da..4092ec523 100644 --- a/src/kitemviews/private/kitemlistheaderwidget.cpp +++ b/src/kitemviews/private/kitemlistheaderwidget.cpp @@ -30,7 +30,7 @@ KItemListHeaderWidget::KItemListHeaderWidget(QGraphicsWidget* parent) : QGraphicsWidget(parent), m_automaticColumnResizing(true), - m_model(0), + m_model(nullptr), m_offset(0), m_columns(), m_columnWidths(), diff --git a/src/kitemviews/private/kitemlistheaderwidget.h b/src/kitemviews/private/kitemlistheaderwidget.h index 2342b4907..6d0974f97 100644 --- a/src/kitemviews/private/kitemlistheaderwidget.h +++ b/src/kitemviews/private/kitemlistheaderwidget.h @@ -38,8 +38,8 @@ class DOLPHIN_EXPORT KItemListHeaderWidget : public QGraphicsWidget Q_OBJECT public: - KItemListHeaderWidget(QGraphicsWidget* parent = 0); - virtual ~KItemListHeaderWidget(); + KItemListHeaderWidget(QGraphicsWidget* parent = nullptr); + ~KItemListHeaderWidget() override; void setModel(KItemModelBase* model); KItemModelBase* model() const; @@ -64,7 +64,7 @@ public: qreal minimumColumnWidth() const; - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; signals: /** @@ -104,13 +104,13 @@ signals: void sortRoleChanged(const QByteArray& current, const QByteArray& previous); protected: - void mousePressEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - void mouseMoveEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE; - void hoverEnterEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE; - void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE; - void hoverMoveEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE; + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) override; + void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override; private slots: void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous); @@ -121,7 +121,7 @@ private: const QByteArray& role, const QRectF& rect, int orderIndex, - QWidget* widget = 0) const; + QWidget* widget = nullptr) const; void updatePressedRoleIndex(const QPointF& pos); void updateHoveredRoleIndex(const QPointF& pos); diff --git a/src/kitemviews/private/kitemlistkeyboardsearchmanager.h b/src/kitemviews/private/kitemlistkeyboardsearchmanager.h index 2a14ca470..02dedefca 100644 --- a/src/kitemviews/private/kitemlistkeyboardsearchmanager.h +++ b/src/kitemviews/private/kitemlistkeyboardsearchmanager.h @@ -41,8 +41,8 @@ class DOLPHIN_EXPORT KItemListKeyboardSearchManager : public QObject public: - KItemListKeyboardSearchManager(QObject* parent = 0); - virtual ~KItemListKeyboardSearchManager(); + KItemListKeyboardSearchManager(QObject* parent = nullptr); + ~KItemListKeyboardSearchManager() override; /** * Add \a keys to the text buffer used for searching. diff --git a/src/kitemviews/private/kitemlistroleeditor.h b/src/kitemviews/private/kitemlistroleeditor.h index f889ea4f4..7285d62f7 100644 --- a/src/kitemviews/private/kitemlistroleeditor.h +++ b/src/kitemviews/private/kitemlistroleeditor.h @@ -39,20 +39,20 @@ class DOLPHIN_EXPORT KItemListRoleEditor : public KTextEdit public: explicit KItemListRoleEditor(QWidget* parent); - virtual ~KItemListRoleEditor(); + ~KItemListRoleEditor() override; void setRole(const QByteArray& role); QByteArray role() const; - bool eventFilter(QObject* watched, QEvent* event) Q_DECL_OVERRIDE; + bool eventFilter(QObject* watched, QEvent* event) override; signals: void roleEditingFinished(const QByteArray& role, const QVariant& value); void roleEditingCanceled(const QByteArray& role, const QVariant& value); protected: - bool event(QEvent* event) Q_DECL_OVERRIDE; - void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE; + bool event(QEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; private slots: /** diff --git a/src/kitemviews/private/kitemlistrubberband.h b/src/kitemviews/private/kitemlistrubberband.h index b47c30c1f..eaef59173 100644 --- a/src/kitemviews/private/kitemlistrubberband.h +++ b/src/kitemviews/private/kitemlistrubberband.h @@ -32,8 +32,8 @@ class DOLPHIN_EXPORT KItemListRubberBand : public QObject Q_OBJECT public: - explicit KItemListRubberBand(QObject* parent = 0); - virtual ~KItemListRubberBand(); + explicit KItemListRubberBand(QObject* parent = nullptr); + ~KItemListRubberBand() override; void setStartPosition(const QPointF& pos); QPointF startPosition() const; diff --git a/src/kitemviews/private/kitemlistselectiontoggle.cpp b/src/kitemviews/private/kitemlistselectiontoggle.cpp index 9031c870f..25f97ee02 100644 --- a/src/kitemviews/private/kitemlistselectiontoggle.cpp +++ b/src/kitemviews/private/kitemlistselectiontoggle.cpp @@ -24,7 +24,7 @@ KItemListSelectionToggle::KItemListSelectionToggle(QGraphicsItem* parent) : - QGraphicsWidget(parent, 0), + QGraphicsWidget(parent, nullptr), m_checked(false), m_hovered(false) { diff --git a/src/kitemviews/private/kitemlistselectiontoggle.h b/src/kitemviews/private/kitemlistselectiontoggle.h index e3f5bb63c..a10995372 100644 --- a/src/kitemviews/private/kitemlistselectiontoggle.h +++ b/src/kitemviews/private/kitemlistselectiontoggle.h @@ -35,17 +35,17 @@ class DOLPHIN_EXPORT KItemListSelectionToggle : public QGraphicsWidget public: KItemListSelectionToggle(QGraphicsItem* parent); - virtual ~KItemListSelectionToggle(); + ~KItemListSelectionToggle() override; void setChecked(bool checked); bool isChecked() const; void setHovered(bool hovered); - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; protected: - void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; + void resizeEvent(QGraphicsSceneResizeEvent* event) override; private: void updatePixmap(); diff --git a/src/kitemviews/private/kitemlistsizehintresolver.cpp b/src/kitemviews/private/kitemlistsizehintresolver.cpp index 02f1865b3..5c121c667 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.cpp +++ b/src/kitemviews/private/kitemlistsizehintresolver.cpp @@ -26,6 +26,7 @@ KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemLi m_logicalHeightHintCache(), m_logicalWidthHint(0.0), m_logicalHeightHint(0.0), + m_minHeightHint(0.0), m_needsResolving(false) { } @@ -40,6 +41,12 @@ QSizeF KItemListSizeHintResolver::maxSizeHint() return QSizeF(m_logicalWidthHint, m_logicalHeightHint); } +QSizeF KItemListSizeHintResolver::minSizeHint() +{ + updateCache(); + return QSizeF(m_logicalWidthHint, m_minHeightHint); +} + QSizeF KItemListSizeHintResolver::sizeHint(int index) { updateCache(); @@ -161,6 +168,7 @@ void KItemListSizeHintResolver::updateCache() m_logicalHeightHint = 0.0; } else { m_logicalHeightHint = *std::max_element(m_logicalHeightHintCache.begin(), m_logicalHeightHintCache.end()); + m_minHeightHint = *std::min_element(m_logicalHeightHintCache.begin(), m_logicalHeightHintCache.end()); } m_needsResolving = false; } diff --git a/src/kitemviews/private/kitemlistsizehintresolver.h b/src/kitemviews/private/kitemlistsizehintresolver.h index 841e9ca10..fa92b8682 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.h +++ b/src/kitemviews/private/kitemlistsizehintresolver.h @@ -37,6 +37,7 @@ public: KItemListSizeHintResolver(const KItemListView* itemListView); virtual ~KItemListSizeHintResolver(); QSizeF maxSizeHint(); + QSizeF minSizeHint(); QSizeF sizeHint(int index); void itemsInserted(const KItemRangeList& itemRanges); @@ -52,6 +53,7 @@ private: mutable QVector<qreal> m_logicalHeightHintCache; mutable qreal m_logicalWidthHint; mutable qreal m_logicalHeightHint; + mutable qreal m_minHeightHint; bool m_needsResolving; }; diff --git a/src/kitemviews/private/kitemlistsmoothscroller.cpp b/src/kitemviews/private/kitemlistsmoothscroller.cpp index 6bfdba4c9..77a842838 100644 --- a/src/kitemviews/private/kitemlistsmoothscroller.cpp +++ b/src/kitemviews/private/kitemlistsmoothscroller.cpp @@ -32,11 +32,17 @@ KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar* scrollBar, m_scrollBarPressed(false), m_smoothScrolling(true), m_scrollBar(scrollBar), - m_animation(0) + m_animation(nullptr) { m_animation = new QPropertyAnimation(this); - const int duration = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animate, nullptr, m_scrollBar) ? 100 : 1; - m_animation->setDuration(duration); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + const int animationDuration = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, m_scrollBar); + const bool animationEnabled = (animationDuration > 0); + #else + const int animationDuration = 100; + const bool animationEnabled = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animate, nullptr, m_scrollBar); +#endif + m_animation->setDuration(animationEnabled ? animationDuration : 1); connect(m_animation, &QPropertyAnimation::stateChanged, this, &KItemListSmoothScroller::slotAnimationStateChanged); diff --git a/src/kitemviews/private/kitemlistsmoothscroller.h b/src/kitemviews/private/kitemlistsmoothscroller.h index 7d01a6b62..a5aca82e6 100644 --- a/src/kitemviews/private/kitemlistsmoothscroller.h +++ b/src/kitemviews/private/kitemlistsmoothscroller.h @@ -39,8 +39,8 @@ class DOLPHIN_EXPORT KItemListSmoothScroller : public QObject public: explicit KItemListSmoothScroller(QScrollBar* scrollBar, - QObject* parent = 0); - virtual ~KItemListSmoothScroller(); + QObject* parent = nullptr); + ~KItemListSmoothScroller() override; void setScrollBar(QScrollBar* scrollBar); QScrollBar* scrollBar() const; @@ -83,7 +83,7 @@ public: void handleWheelEvent(QWheelEvent* event); protected: - bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE; + bool eventFilter(QObject* obj, QEvent* event) override; private slots: void slotAnimationStateChanged(QAbstractAnimation::State newState, diff --git a/src/kitemviews/private/kitemlistviewanimation.cpp b/src/kitemviews/private/kitemlistviewanimation.cpp index 67ad192c6..89b345210 100644 --- a/src/kitemviews/private/kitemlistviewanimation.cpp +++ b/src/kitemviews/private/kitemlistviewanimation.cpp @@ -116,7 +116,7 @@ void KItemListViewAnimation::start(QGraphicsWidget* widget, AnimationType type, { stop(widget, type); - QPropertyAnimation* propertyAnim = 0; + QPropertyAnimation* propertyAnim = nullptr; const int animationDuration = widget->style()->styleHint(QStyle::SH_Widget_Animate) ? 200 : 1; switch (type) { diff --git a/src/kitemviews/private/kitemlistviewanimation.h b/src/kitemviews/private/kitemlistviewanimation.h index 06c81c9b8..ba3a33dc9 100644 --- a/src/kitemviews/private/kitemlistviewanimation.h +++ b/src/kitemviews/private/kitemlistviewanimation.h @@ -48,8 +48,8 @@ public: ResizeAnimation }; - KItemListViewAnimation(QObject* parent = 0); - virtual ~KItemListViewAnimation(); + KItemListViewAnimation(QObject* parent = nullptr); + ~KItemListViewAnimation() override; void setScrollOrientation(Qt::Orientation orientation); Qt::Orientation scrollOrientation() const; diff --git a/src/kitemviews/private/kitemlistviewlayouter.cpp b/src/kitemviews/private/kitemlistviewlayouter.cpp index d54457908..ca3942644 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.cpp +++ b/src/kitemviews/private/kitemlistviewlayouter.cpp @@ -35,7 +35,7 @@ KItemListViewLayouter::KItemListViewLayouter(KItemListSizeHintResolver* sizeHint m_itemSize(128, 128), m_itemMargin(), m_headerHeight(0), - m_model(0), + m_model(nullptr), m_sizeHintResolver(sizeHintResolver), m_scrollOffset(0), m_maximumScrollOffset(0), diff --git a/src/kitemviews/private/kitemlistviewlayouter.h b/src/kitemviews/private/kitemlistviewlayouter.h index 3f1cf68d4..2116f8405 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.h +++ b/src/kitemviews/private/kitemlistviewlayouter.h @@ -50,8 +50,8 @@ class DOLPHIN_EXPORT KItemListViewLayouter : public QObject Q_OBJECT public: - KItemListViewLayouter(KItemListSizeHintResolver* sizeHintResolver, QObject* parent = 0); - virtual ~KItemListViewLayouter(); + KItemListViewLayouter(KItemListSizeHintResolver* sizeHintResolver, QObject* parent = nullptr); + ~KItemListViewLayouter() override; void setScrollOrientation(Qt::Orientation orientation); Qt::Orientation scrollOrientation() const; diff --git a/src/panels/folders/foldersitemlistwidget.h b/src/panels/folders/foldersitemlistwidget.h index 2278762e3..5a4595c4a 100644 --- a/src/panels/folders/foldersitemlistwidget.h +++ b/src/panels/folders/foldersitemlistwidget.h @@ -31,10 +31,10 @@ class FoldersItemListWidget : public KFileItemListWidget public: FoldersItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~FoldersItemListWidget(); + ~FoldersItemListWidget() override; protected: - virtual QPalette::ColorRole normalTextColorRole() const Q_DECL_OVERRIDE; + QPalette::ColorRole normalTextColorRole() const override; }; #endif diff --git a/src/panels/folders/folderspanel.h b/src/panels/folders/folderspanel.h index 3b27dd3dd..f67c19cbb 100644 --- a/src/panels/folders/folderspanel.h +++ b/src/panels/folders/folderspanel.h @@ -40,7 +40,7 @@ class FoldersPanel : public Panel public: explicit FoldersPanel(QWidget* parent = nullptr); - virtual ~FoldersPanel(); + ~FoldersPanel() override; void setShowHiddenFiles(bool show); void setLimitFoldersPanelToHome(bool enable); @@ -59,13 +59,13 @@ signals: protected: /** @see Panel::urlChanged() */ - virtual bool urlChanged() Q_DECL_OVERRIDE; + bool urlChanged() override; /** @see QWidget::showEvent() */ - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; /** @see QWidget::keyPressEvent() */ - virtual void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent* event) override; private slots: void slotItemActivated(int index); diff --git a/src/panels/folders/treeviewcontextmenu.h b/src/panels/folders/treeviewcontextmenu.h index 93ddd7aef..3e61c4941 100644 --- a/src/panels/folders/treeviewcontextmenu.h +++ b/src/panels/folders/treeviewcontextmenu.h @@ -45,7 +45,7 @@ public: TreeViewContextMenu(FoldersPanel* parent, const KFileItem& fileInfo); - virtual ~TreeViewContextMenu(); + ~TreeViewContextMenu() override; /** Opens the context menu modal. */ void open(); diff --git a/src/panels/information/filemetadataconfigurationdialog.h b/src/panels/information/filemetadataconfigurationdialog.h index 13562ef5c..8ca9ef6fe 100644 --- a/src/panels/information/filemetadataconfigurationdialog.h +++ b/src/panels/information/filemetadataconfigurationdialog.h @@ -43,8 +43,8 @@ class FileMetaDataConfigurationDialog : public QDialog Q_OBJECT public: - explicit FileMetaDataConfigurationDialog(QWidget* parent = 0); - virtual ~FileMetaDataConfigurationDialog(); + explicit FileMetaDataConfigurationDialog(QWidget* parent = nullptr); + ~FileMetaDataConfigurationDialog() override; /** * Sets the items, for which the visibility of the meta data should diff --git a/src/panels/information/informationpanel.cpp b/src/panels/information/informationpanel.cpp index 850d94d92..ac987c9b4 100644 --- a/src/panels/information/informationpanel.cpp +++ b/src/panels/information/informationpanel.cpp @@ -198,7 +198,7 @@ void InformationPanel::showItemInfo() void InformationPanel::slotFolderStatFinished(KJob* job) { - m_folderStatJob = 0; + m_folderStatJob = nullptr; const KIO::UDSEntry entry = static_cast<KIO::StatJob*>(job)->statResult(); m_content->showItem(KFileItem(entry, m_shownUrl)); } @@ -296,7 +296,7 @@ void InformationPanel::slotLeftDirectory(const QString& directory) void InformationPanel::cancelRequest() { delete m_folderStatJob; - m_folderStatJob = 0; + m_folderStatJob = nullptr; m_infoTimer->stop(); m_resetUrlTimer->stop(); diff --git a/src/panels/information/informationpanel.h b/src/panels/information/informationpanel.h index a698e544f..89a1bc3d2 100644 --- a/src/panels/information/informationpanel.h +++ b/src/panels/information/informationpanel.h @@ -37,7 +37,7 @@ class InformationPanel : public Panel public: explicit InformationPanel(QWidget* parent = nullptr); - virtual ~InformationPanel(); + ~InformationPanel() override; signals: void urlActivated(const QUrl& url); @@ -59,16 +59,16 @@ public slots: protected: /** @see Panel::urlChanged() */ - virtual bool urlChanged() Q_DECL_OVERRIDE; + bool urlChanged() override; /** @see QWidget::showEvent() */ - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; /** @see QWidget::resizeEvent() */ - virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE; + void resizeEvent(QResizeEvent* event) override; /** @see QWidget::contextMenuEvent() */ - virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE; + void contextMenuEvent(QContextMenuEvent* event) override; private slots: /** diff --git a/src/panels/information/informationpanelcontent.cpp b/src/panels/information/informationpanelcontent.cpp index 3c48a2296..2e279dc62 100644 --- a/src/panels/information/informationpanelcontent.cpp +++ b/src/panels/information/informationpanelcontent.cpp @@ -65,14 +65,14 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) : QWidget(parent), m_item(), - m_previewJob(0), - m_outdatedPreviewTimer(0), - m_preview(0), - m_phononWidget(0), - m_nameLabel(0), - m_metaDataWidget(0), - m_metaDataArea(0), - m_placesItemModel(0) + m_previewJob(nullptr), + m_outdatedPreviewTimer(nullptr), + m_preview(nullptr), + m_phononWidget(nullptr), + m_nameLabel(nullptr), + m_metaDataWidget(nullptr), + m_metaDataArea(nullptr), + m_placesItemModel(nullptr) { parent->installEventFilter(this); diff --git a/src/panels/information/informationpanelcontent.h b/src/panels/information/informationpanelcontent.h index 533e9de3b..8b143af1d 100644 --- a/src/panels/information/informationpanelcontent.h +++ b/src/panels/information/informationpanelcontent.h @@ -57,8 +57,8 @@ class InformationPanelContent : public QWidget Q_OBJECT public: - explicit InformationPanelContent(QWidget* parent = 0); - virtual ~InformationPanelContent(); + explicit InformationPanelContent(QWidget* parent = nullptr); + ~InformationPanelContent() override; /** * Shows the meta information for the item \p item. @@ -85,7 +85,7 @@ signals: protected: /** @see QObject::eventFilter() */ - virtual bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE; + bool eventFilter(QObject* obj, QEvent* event) override; private slots: /** diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index 3a3268cb3..a71a77897 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -52,7 +52,7 @@ class EmbeddedVideoPlayer : public Phonon::VideoWidget updateGeometry(); } - QSize sizeHint() const Q_DECL_OVERRIDE + QSize sizeHint() const override { return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoWidget::sizeHint(); } diff --git a/src/panels/information/phononwidget.h b/src/panels/information/phononwidget.h index 837a66888..947f0cdac 100644 --- a/src/panels/information/phononwidget.h +++ b/src/panels/information/phononwidget.h @@ -43,7 +43,7 @@ class PhononWidget : public QWidget { Q_OBJECT public: - PhononWidget(QWidget *parent = 0); + PhononWidget(QWidget *parent = nullptr); void setUrl(const QUrl &url); QUrl url() const; @@ -63,8 +63,8 @@ class PhononWidget : public QWidget void hasVideoChanged(bool hasVideo); protected: - virtual void showEvent(QShowEvent *event) Q_DECL_OVERRIDE; - virtual void hideEvent(QHideEvent *event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; private slots: void stateChanged(Phonon::State); diff --git a/src/panels/information/pixmapviewer.h b/src/panels/information/pixmapviewer.h index ddc183351..f6b456ee6 100644 --- a/src/panels/information/pixmapviewer.h +++ b/src/panels/information/pixmapviewer.h @@ -62,7 +62,7 @@ public: explicit PixmapViewer(QWidget* parent, Transition transition = DefaultTransition); - virtual ~PixmapViewer(); + ~PixmapViewer() override; void setPixmap(const QPixmap& pixmap); QPixmap pixmap() const; @@ -71,10 +71,10 @@ public: * of the parent widget. Per default no size hint is given. */ void setSizeHint(const QSize& size); - virtual QSize sizeHint() const Q_DECL_OVERRIDE; + QSize sizeHint() const override; protected: - virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent* event) override; private Q_SLOTS: void checkPendingPixmaps(); diff --git a/src/panels/panel.h b/src/panels/panel.h index d3460bf13..84d73e74c 100644 --- a/src/panels/panel.h +++ b/src/panels/panel.h @@ -35,8 +35,8 @@ class Panel : public QWidget Q_OBJECT public: - explicit Panel(QWidget* parent = 0); - virtual ~Panel(); + explicit Panel(QWidget* parent = nullptr); + ~Panel() override; /** Returns the current set URL of the active Dolphin view. */ QUrl url() const; @@ -49,7 +49,7 @@ public: void setCustomContextMenuActions(const QList<QAction*>& actions); QList<QAction*> customContextMenuActions() const; - virtual QSize sizeHint() const Q_DECL_OVERRIDE; + QSize sizeHint() const override; public slots: /** diff --git a/src/panels/places/placesitem.cpp b/src/panels/places/placesitem.cpp index 93cc4d5c3..3c6023ba8 100644 --- a/src/panels/places/placesitem.cpp +++ b/src/panels/places/placesitem.cpp @@ -66,7 +66,7 @@ void PlacesItem::setUrl(const QUrl &url) // watches for changes if the number of items has been changed. // The update of the icon is handled in onTrashDirListerCompleted(). m_trashDirLister = new KDirLister(); - m_trashDirLister->setAutoErrorHandlingEnabled(false, 0); + m_trashDirLister->setAutoErrorHandlingEnabled(false, nullptr); m_trashDirLister->setDelayedMimeTypes(true); QObject::connect(m_trashDirLister.data(), static_cast<void(KDirLister::*)()>(&KDirLister::completed), m_signalHandler.data(), &PlacesItemSignalHandler::onTrashDirListerCompleted); @@ -102,6 +102,16 @@ bool PlacesItem::isHidden() const return dataValue("isHidden").toBool(); } +bool PlacesItem::isGroupHidden() const +{ + return dataValue("isGroupHidden").toBool(); +} + +void PlacesItem::setGroupHidden(bool hidden) +{ + setDataValue("isGroupHidden", hidden); +} + void PlacesItem::setSystemItem(bool isSystemItem) { setDataValue("isSystemItem", isSystemItem); @@ -119,46 +129,30 @@ Solid::Device PlacesItem::device() const void PlacesItem::setBookmark(const KBookmark& bookmark) { - if (bookmark == m_bookmark) { - return; - } + const bool bookmarkDataChanged = !(bookmark == m_bookmark); + // bookmark object must be updated to keep in sync with source model m_bookmark = bookmark; + if (!bookmarkDataChanged) { + return; + } + delete m_access; delete m_volume; delete m_disc; delete m_mtp; - const QString udi = bookmark.metaDataItem(QStringLiteral("UDI")); if (udi.isEmpty()) { setIcon(bookmark.icon()); setText(i18nc("KFile System Bookmarks", bookmark.text().toUtf8().constData())); setUrl(bookmark.url()); + setSystemItem(bookmark.metaDataItem(QStringLiteral("isSystemItem")) == QLatin1String("true")); } else { initializeDevice(udi); } - const GroupType type = groupType(); - if (icon().isEmpty()) { - switch (type) { - case RecentlySavedType: setIcon(QStringLiteral("chronometer")); break; - case SearchForType: setIcon(QStringLiteral("system-search")); break; - case PlacesType: - default: setIcon(QStringLiteral("folder")); - } - - } - - switch (type) { - case PlacesType: setGroup(i18nc("@item", "Places")); break; - case RecentlySavedType: setGroup(i18nc("@item", "Recently Saved")); break; - case SearchForType: setGroup(i18nc("@item", "Search For")); break; - case DevicesType: setGroup(i18nc("@item", "Devices")); break; - default: Q_ASSERT(false); break; - } - setHidden(bookmark.metaDataItem(QStringLiteral("IsHidden")) == QLatin1String("true")); } @@ -167,62 +161,15 @@ KBookmark PlacesItem::bookmark() const return m_bookmark; } -PlacesItem::GroupType PlacesItem::groupType() const -{ - if (udi().isEmpty()) { - const QString protocol = url().scheme(); - if (protocol == QLatin1String("timeline")) { - return RecentlySavedType; - } - - if (protocol.contains(QLatin1String("search"))) { - return SearchForType; - } - - if (protocol == QLatin1String("bluetooth") || protocol == QLatin1String("obexftp") || protocol == QLatin1String("kdeconnect")) { - return DevicesType; - } - - return PlacesType; - } - - return DevicesType; -} - bool PlacesItem::storageSetupNeeded() const { return m_access ? !m_access->isAccessible() : false; } -KBookmark PlacesItem::createBookmark(KBookmarkManager* manager, - const QString& text, - const QUrl& url, - const QString& iconName) +bool PlacesItem::isSearchOrTimelineUrl() const { - KBookmarkGroup root = manager->root(); - if (root.isNull()) { - return KBookmark(); - } - - KBookmark bookmark = root.addBookmark(text, url, iconName); - bookmark.setFullText(text); - bookmark.setMetaDataItem(QStringLiteral("ID"), generateNewId()); - - return bookmark; -} - -KBookmark PlacesItem::createDeviceBookmark(KBookmarkManager* manager, - const QString& udi) -{ - KBookmarkGroup root = manager->root(); - if (root.isNull()) { - return KBookmark(); - } - - KBookmark bookmark = root.createNewSeparator(); - bookmark.setMetaDataItem(QStringLiteral("UDI"), udi); - bookmark.setMetaDataItem(QStringLiteral("isSystemItem"), QStringLiteral("true")); - return bookmark; + const QString urlScheme = url().scheme(); + return (urlScheme.contains("search") || urlScheme.contains("timeline")); } void PlacesItem::onDataValueChanged(const QByteArray& role, diff --git a/src/panels/places/placesitem.h b/src/panels/places/placesitem.h index d1b5b5d96..733265d46 100644 --- a/src/panels/places/placesitem.h +++ b/src/panels/places/placesitem.h @@ -40,16 +40,8 @@ class PlacesItem : public KStandardItem { public: - enum GroupType - { - PlacesType, - SearchForType, - RecentlySavedType, - DevicesType - }; - - explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = 0); - virtual ~PlacesItem(); + explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = nullptr); + ~PlacesItem() override; void setUrl(const QUrl& url); QUrl url() const; @@ -60,6 +52,9 @@ public: void setHidden(bool hidden); bool isHidden() const; + void setGroupHidden(bool hidden); + bool isGroupHidden() const; + void setSystemItem(bool isSystemItem); bool isSystemItem() const; @@ -68,26 +63,19 @@ public: void setBookmark(const KBookmark& bookmark); KBookmark bookmark() const; - GroupType groupType() const; - bool storageSetupNeeded() const; - static KBookmark createBookmark(KBookmarkManager* manager, - const QString& text, - const QUrl& url, - const QString& iconName); - static KBookmark createDeviceBookmark(KBookmarkManager* manager, - const QString& udi); + bool isSearchOrTimelineUrl() const; PlacesItemSignalHandler* signalHandler() const; protected: - virtual void onDataValueChanged(const QByteArray& role, + void onDataValueChanged(const QByteArray& role, const QVariant& current, - const QVariant& previous) Q_DECL_OVERRIDE; + const QVariant& previous) override; - virtual void onDataChanged(const QHash<QByteArray, QVariant>& current, - const QHash<QByteArray, QVariant>& previous) Q_DECL_OVERRIDE; + void onDataChanged(const QHash<QByteArray, QVariant>& current, + const QHash<QByteArray, QVariant>& previous) override; private: PlacesItem(const PlacesItem& item); diff --git a/src/panels/places/placesitemeditdialog.cpp b/src/panels/places/placesitemeditdialog.cpp index ffcac4c8f..4a56ce908 100644 --- a/src/panels/places/placesitemeditdialog.cpp +++ b/src/panels/places/placesitemeditdialog.cpp @@ -44,10 +44,10 @@ PlacesItemEditDialog::PlacesItemEditDialog(QWidget* parent) : m_text(), m_url(), m_allowGlobal(false), - m_urlEdit(0), - m_textEdit(0), - m_iconButton(0), - m_appLocal(0), + m_urlEdit(nullptr), + m_textEdit(nullptr), + m_iconButton(nullptr), + m_appLocal(nullptr), m_buttonBox(nullptr) { } diff --git a/src/panels/places/placesitemeditdialog.h b/src/panels/places/placesitemeditdialog.h index f2d69781a..73104a1b6 100644 --- a/src/panels/places/placesitemeditdialog.h +++ b/src/panels/places/placesitemeditdialog.h @@ -38,8 +38,8 @@ class PlacesItemEditDialog: public QDialog Q_OBJECT public: - explicit PlacesItemEditDialog(QWidget* parent = 0); - virtual ~PlacesItemEditDialog(); + explicit PlacesItemEditDialog(QWidget* parent = nullptr); + ~PlacesItemEditDialog() override; void setIcon(const QString& icon); QString icon() const; @@ -54,7 +54,7 @@ public: bool allowGlobal() const; protected: - virtual bool event(QEvent* event) Q_DECL_OVERRIDE; + bool event(QEvent* event) override; private slots: void slotUrlChanged(const QString& text); diff --git a/src/panels/places/placesitemlistgroupheader.h b/src/panels/places/placesitemlistgroupheader.h index ec845e0ae..4408aa9ef 100644 --- a/src/panels/places/placesitemlistgroupheader.h +++ b/src/panels/places/placesitemlistgroupheader.h @@ -27,13 +27,13 @@ class PlacesItemListGroupHeader : public KStandardItemListGroupHeader Q_OBJECT public: - PlacesItemListGroupHeader(QGraphicsWidget* parent = 0); - virtual ~PlacesItemListGroupHeader(); + PlacesItemListGroupHeader(QGraphicsWidget* parent = nullptr); + ~PlacesItemListGroupHeader() override; protected: - virtual void paintSeparator(QPainter* painter, const QColor& color) Q_DECL_OVERRIDE; + void paintSeparator(QPainter* painter, const QColor& color) override; - virtual QPalette::ColorRole normalTextColorRole() const Q_DECL_OVERRIDE; + QPalette::ColorRole normalTextColorRole() const override; }; #endif diff --git a/src/panels/places/placesitemlistwidget.cpp b/src/panels/places/placesitemlistwidget.cpp index 18e561864..b0b3fb2aa 100644 --- a/src/panels/places/placesitemlistwidget.cpp +++ b/src/panels/places/placesitemlistwidget.cpp @@ -30,7 +30,8 @@ PlacesItemListWidget::~PlacesItemListWidget() bool PlacesItemListWidget::isHidden() const { - return data().value("isHidden").toBool(); + return data().value("isHidden").toBool() || + data().value("isGroupHidden").toBool(); } QPalette::ColorRole PlacesItemListWidget::normalTextColorRole() const diff --git a/src/panels/places/placesitemlistwidget.h b/src/panels/places/placesitemlistwidget.h index e9e6a0767..3be5dde7c 100644 --- a/src/panels/places/placesitemlistwidget.h +++ b/src/panels/places/placesitemlistwidget.h @@ -32,11 +32,11 @@ class PlacesItemListWidget : public KStandardItemListWidget public: PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~PlacesItemListWidget(); + ~PlacesItemListWidget() override; protected: - virtual bool isHidden() const Q_DECL_OVERRIDE; - virtual QPalette::ColorRole normalTextColorRole() const Q_DECL_OVERRIDE; + bool isHidden() const override; + QPalette::ColorRole normalTextColorRole() const override; }; #endif diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index abdd4c20b..077c9044c 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -40,6 +40,7 @@ #include <QMimeData> #include <QTimer> #include <KUrlMimeData> +#include <KFilePlacesModel> #include <Solid/Device> #include <Solid/DeviceNotifier> @@ -51,21 +52,10 @@ #include <views/dolphinview.h> #include <views/viewproperties.h> -#ifdef HAVE_BALOO - #include <Baloo/Query> - #include <Baloo/IndexerConfig> -#endif - namespace { - // As long as KFilePlacesView from kdelibs is available in parallel, the - // system-bookmarks for "Recently Saved" and "Search For" should be - // shown only inside the Places Panel. This is necessary as the stored - // URLs needs to get translated to a Baloo-search-URL on-the-fly to - // be independent from changes in the Baloo-search-URL-syntax. - // Hence a prefix to the application-name of the stored bookmarks is + // A suffix to the application-name of the stored bookmarks is // added, which is only read by PlacesItemModel. - const char AppNamePrefix[] = "-places-panel"; - + const QString AppNameSuffix = QStringLiteral("-places-panel"); static QList<QUrl> balooURLs = { QUrl(QStringLiteral("timeline:/today")), QUrl(QStringLiteral("timeline:/yesterday")), @@ -80,53 +70,33 @@ namespace { PlacesItemModel::PlacesItemModel(QObject* parent) : KStandardItemModel(parent), - m_fileIndexingEnabled(false), m_hiddenItemsShown(false), - m_availableDevices(), - m_predicate(), - m_bookmarkManager(0), - m_systemBookmarks(), - m_systemBookmarksIndexes(), - m_bookmarkedItems(), - m_hiddenItemToRemove(-1), - m_deviceToTearDown(0), - m_updateBookmarksTimer(0), - m_storageSetupInProgress() + m_deviceToTearDown(nullptr), + m_storageSetupInProgress(), + m_sourceModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + AppNameSuffix, this)) { -#ifdef HAVE_BALOO - Baloo::IndexerConfig config; - m_fileIndexingEnabled = config.fileIndexingEnabled(); -#endif - const QString file = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/user-places.xbel"; - m_bookmarkManager = KBookmarkManager::managerForExternalFile(file); - - createSystemBookmarks(); - initializeAvailableDevices(); + cleanupBookmarks(); loadBookmarks(); + initializeDefaultViewProperties(); - const int syncBookmarksTimeout = 100; - - m_updateBookmarksTimer = new QTimer(this); - m_updateBookmarksTimer->setInterval(syncBookmarksTimeout); - m_updateBookmarksTimer->setSingleShot(true); - connect(m_updateBookmarksTimer, &QTimer::timeout, this, &PlacesItemModel::updateBookmarks); - - connect(m_bookmarkManager, &KBookmarkManager::changed, - m_updateBookmarksTimer, static_cast<void(QTimer::*)()>(&QTimer::start)); + connect(m_sourceModel.data(), &KFilePlacesModel::rowsInserted, this, &PlacesItemModel::onSourceModelRowsInserted); + connect(m_sourceModel.data(), &KFilePlacesModel::rowsAboutToBeRemoved, this, &PlacesItemModel::onSourceModelRowsAboutToBeRemoved); + connect(m_sourceModel.data(), &KFilePlacesModel::dataChanged, this, &PlacesItemModel::onSourceModelDataChanged); + connect(m_sourceModel.data(), &KFilePlacesModel::rowsAboutToBeMoved, this, &PlacesItemModel::onSourceModelRowsAboutToBeMoved); + connect(m_sourceModel.data(), &KFilePlacesModel::rowsMoved, this, &PlacesItemModel::onSourceModelRowsMoved); + connect(m_sourceModel.data(), &KFilePlacesModel::groupHiddenChanged, this, &PlacesItemModel::onSourceModelGroupHiddenChanged); } PlacesItemModel::~PlacesItemModel() { - qDeleteAll(m_bookmarkedItems); - m_bookmarkedItems.clear(); } -PlacesItem* PlacesItemModel::createPlacesItem(const QString& text, - const QUrl& url, - const QString& iconName) +void PlacesItemModel::createPlacesItem(const QString& text, + const QUrl& url, + const QString& iconName, + int after) { - const KBookmark bookmark = PlacesItem::createBookmark(m_bookmarkManager, text, url, iconName); - return new PlacesItem(bookmark); + m_sourceModel->addPlace(text, url, iconName, {}, mapToSource(after)); } PlacesItem* PlacesItemModel::placesItem(int index) const @@ -136,20 +106,7 @@ PlacesItem* PlacesItemModel::placesItem(int index) const int PlacesItemModel::hiddenCount() const { - int modelIndex = 0; - int hiddenItemCount = 0; - foreach (const PlacesItem* item, m_bookmarkedItems) { - if (item) { - ++hiddenItemCount; - } else { - if (placesItem(modelIndex)->isHidden()) { - ++hiddenItemCount; - } - ++modelIndex; - } - } - - return hiddenItemCount; + return m_sourceModel->hiddenCount(); } void PlacesItemModel::setHiddenItemsShown(bool show) @@ -161,38 +118,18 @@ void PlacesItemModel::setHiddenItemsShown(bool show) m_hiddenItemsShown = show; if (show) { - // Move all items that are part of m_bookmarkedItems to the model. - QList<PlacesItem*> itemsToInsert; - QList<int> insertPos; - int modelIndex = 0; - for (int i = 0; i < m_bookmarkedItems.count(); ++i) { - if (m_bookmarkedItems[i]) { - itemsToInsert.append(m_bookmarkedItems[i]); - m_bookmarkedItems[i] = 0; - insertPos.append(modelIndex); + for (int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { + const QModelIndex index = m_sourceModel->index(r, 0); + if (!m_sourceModel->isHidden(index)) { + continue; } - ++modelIndex; - } - - // Inserting the items will automatically insert an item - // to m_bookmarkedItems in PlacesItemModel::onItemsInserted(). - // The items are temporary saved in itemsToInsert, so - // m_bookmarkedItems can be shrinked now. - m_bookmarkedItems.erase(m_bookmarkedItems.begin(), - m_bookmarkedItems.begin() + itemsToInsert.count()); - - for (int i = 0; i < itemsToInsert.count(); ++i) { - insertItem(insertPos[i], itemsToInsert[i]); + addItemFromSourceModel(index); } - - Q_ASSERT(m_bookmarkedItems.count() == count()); } else { - // Move all items of the model, where the "isHidden" property is true, to - // m_bookmarkedItems. - Q_ASSERT(m_bookmarkedItems.count() == count()); - for (int i = count() - 1; i >= 0; --i) { - if (placesItem(i)->isHidden()) { - hideItem(i); + for (int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { + const QModelIndex index = m_sourceModel->index(r, 0); + if (m_sourceModel->isHidden(index)) { + removeItemByIndex(index); } } } @@ -210,75 +147,99 @@ bool PlacesItemModel::hiddenItemsShown() const int PlacesItemModel::closestItem(const QUrl& url) const { - int foundIndex = -1; - int maxLength = 0; - - for (int i = 0; i < count(); ++i) { - const QUrl itemUrl = placesItem(i)->url(); - if (url == itemUrl) { - // We can't find a closer one, so stop here. - foundIndex = i; - break; - } else if (itemUrl.isParentOf(url)) { - const int length = itemUrl.path().length(); - if (length > maxLength) { - foundIndex = i; - maxLength = length; - } - } - } - - return foundIndex; + return mapFromSource(m_sourceModel->closestItem(url)); } -void PlacesItemModel::appendItemToGroup(PlacesItem* item) +// look for the correct position for the item based on source model +void PlacesItemModel::insertSortedItem(PlacesItem* item) { if (!item) { return; } - int i = 0; - while (i < count() && placesItem(i)->group() != item->group()) { - ++i; - } + const KBookmark iBookmark = item->bookmark(); + const QString iBookmarkId = bookmarkId(iBookmark); + QModelIndex sourceIndex; + int pos = 0; - bool inserted = false; - while (!inserted && i < count()) { - if (placesItem(i)->group() != item->group()) { - insertItem(i, item); - inserted = true; + for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { + sourceIndex = m_sourceModel->index(r, 0); + const KBookmark sourceBookmark = m_sourceModel->bookmarkForIndex(sourceIndex); + + if (bookmarkId(sourceBookmark) == iBookmarkId) { + break; } - ++i; - } - if (!inserted) { - appendItem(item); + if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { + pos++; + } } + + m_indexMap.insert(pos, sourceIndex); + insertItem(pos, 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) +{ + 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<QByteArray>& changedRoles) +{ + const QModelIndex sourceIndex = mapToSource(index); + const PlacesItem *changedItem = placesItem(mapFromSource(sourceIndex)); + + if (!changedItem || !sourceIndex.isValid()) { + qWarning() << "invalid item changed signal"; + return; + } + if (changedRoles.contains("isHidden")) { + if (m_sourceModel->isHidden(sourceIndex) != changedItem->isHidden()) { + m_sourceModel->setPlaceHidden(sourceIndex, changedItem->isHidden()); + } else { + m_sourceModel->refresh(); + } + } + KStandardItemModel::onItemChanged(index, changedRoles); +} QAction* PlacesItemModel::ejectAction(int index) const { const PlacesItem* item = placesItem(index); if (item && item->device().is<Solid::OpticalDisc>()) { - return new QAction(QIcon::fromTheme(QStringLiteral("media-eject")), i18nc("@item", "Eject"), 0); + return new QAction(QIcon::fromTheme(QStringLiteral("media-eject")), i18nc("@item", "Eject"), nullptr); } - return 0; + return nullptr; } QAction* PlacesItemModel::teardownAction(int index) const { const PlacesItem* item = placesItem(index); if (!item) { - return 0; + return nullptr; } Solid::Device device = item->device(); const bool providesTearDown = device.is<Solid::StorageAccess>() && device.as<Solid::StorageAccess>()->isAccessible(); if (!providesTearDown) { - return 0; + return nullptr; } Solid::StorageDrive* drive = device.as<Solid::StorageDrive>(); @@ -306,10 +267,10 @@ QAction* PlacesItemModel::teardownAction(int index) const } if (iconName.isEmpty()) { - return new QAction(text, 0); + return new QAction(text, nullptr); } - return new QAction(QIcon::fromTheme(iconName), text, 0); + return new QAction(QIcon::fromTheme(iconName), text, nullptr); } void PlacesItemModel::requestEject(int index) @@ -415,25 +376,8 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) QDataStream stream(&itemData, QIODevice::ReadOnly); int oldIndex; stream >> oldIndex; - if (oldIndex == index || oldIndex == index - 1) { - // No moving has been done - return; - } - PlacesItem* oldItem = placesItem(oldIndex); - if (!oldItem) { - return; - } - - PlacesItem* newItem = new PlacesItem(oldItem->bookmark()); - removeItem(oldIndex); - - if (oldIndex < index) { - --index; - } - - const int dropIndex = groupedDropIndex(index, newItem); - insertItem(dropIndex, newItem); + m_sourceModel->movePlace(oldIndex, index); } else if (mimeData->hasFormat(QStringLiteral("text/uri-list"))) { // One or more items must be added to the model const QList<QUrl> urls = KUrlMimeData::urlsFromMimeData(mimeData); @@ -451,152 +395,106 @@ void PlacesItemModel::dropMimeDataBefore(int index, const QMimeData* mimeData) continue; } - PlacesItem* newItem = createPlacesItem(text, url); - const int dropIndex = groupedDropIndex(index, newItem); - insertItem(dropIndex, newItem); + createPlacesItem(text, url, KIO::iconNameForUrl(url), qMax(0, index - 1)); } } + // will save bookmark alteration and fix sort if that is broken by the drag/drop operation + refresh(); } -QUrl PlacesItemModel::convertedUrl(const QUrl& url) -{ - QUrl newUrl = url; - if (url.scheme() == QLatin1String("timeline")) { - newUrl = createTimelineUrl(url); - } else if (url.scheme() == QLatin1String("search")) { - newUrl = createSearchUrl(url); - } - - return newUrl; -} - -void PlacesItemModel::onItemInserted(int index) +void PlacesItemModel::addItemFromSourceModel(const QModelIndex &index) { - const PlacesItem* insertedItem = placesItem(index); - if (insertedItem) { - // Take care to apply the PlacesItemModel-order of the inserted item - // also to the bookmark-manager. - const KBookmark insertedBookmark = insertedItem->bookmark(); - - const PlacesItem* previousItem = placesItem(index - 1); - KBookmark previousBookmark; - if (previousItem) { - previousBookmark = previousItem->bookmark(); - } - - m_bookmarkManager->root().moveBookmark(insertedBookmark, previousBookmark); + if (!m_hiddenItemsShown && m_sourceModel->isHidden(index)) { + return; } - if (index == count() - 1) { - // The item has been appended as last item to the list. In this - // case assure that it is also appended after the hidden items and - // not before (like done otherwise). - m_bookmarkedItems.append(0); - } else { - - int modelIndex = -1; - int bookmarkIndex = 0; - while (bookmarkIndex < m_bookmarkedItems.count()) { - if (!m_bookmarkedItems[bookmarkIndex]) { - ++modelIndex; - if (modelIndex + 1 == index) { - break; - } - } - ++bookmarkIndex; - } - m_bookmarkedItems.insert(bookmarkIndex, 0); + const KBookmark bookmark = m_sourceModel->bookmarkForIndex(index); + Q_ASSERT(!bookmark.isNull()); + PlacesItem *item = itemFromBookmark(bookmark); + if (!item) { + item = new PlacesItem(bookmark); } + updateItem(item, index); + insertSortedItem(item); -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Inserted item" << index; - showModelState(); -#endif -} - -void PlacesItemModel::onItemRemoved(int index, KStandardItem* removedItem) -{ - PlacesItem* placesItem = dynamic_cast<PlacesItem*>(removedItem); - if (placesItem) { - const KBookmark bookmark = placesItem->bookmark(); - m_bookmarkManager->root().deleteBookmark(bookmark); + if (m_sourceModel->isDevice(index)) { + connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, + this, &PlacesItemModel::storageTearDownExternallyRequested); } - - const int boomarkIndex = bookmarkIndex(index); - Q_ASSERT(!m_bookmarkedItems[boomarkIndex]); - m_bookmarkedItems.removeAt(boomarkIndex); - -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Removed item" << index; - showModelState(); -#endif } -void PlacesItemModel::onItemChanged(int index, const QSet<QByteArray>& changedRoles) +void PlacesItemModel::removeItemByIndex(const QModelIndex &sourceIndex) { - const PlacesItem* changedItem = placesItem(index); - if (changedItem) { - // Take care to apply the PlacesItemModel-order of the changed item - // also to the bookmark-manager. - const KBookmark insertedBookmark = changedItem->bookmark(); - - const PlacesItem* previousItem = placesItem(index - 1); - KBookmark previousBookmark; - if (previousItem) { - previousBookmark = previousItem->bookmark(); - } - - m_bookmarkManager->root().moveBookmark(insertedBookmark, previousBookmark); - } + QString id = bookmarkId(m_sourceModel->bookmarkForIndex(sourceIndex)); - if (changedRoles.contains("isHidden")) { - if (!m_hiddenItemsShown && changedItem->isHidden()) { - m_hiddenItemToRemove = index; - QTimer::singleShot(0, this, static_cast<void (PlacesItemModel::*)()>(&PlacesItemModel::hideItem)); + for (int i = 0, iMax = count(); i < iMax; ++i) { + if (bookmarkId(placesItem(i)->bookmark()) == id) { + removeItem(i); + return; } } } -void PlacesItemModel::slotDeviceAdded(const QString& udi) +QString PlacesItemModel::bookmarkId(const KBookmark &bookmark) const { - const Solid::Device device(udi); - - if (!m_predicate.matches(device)) { - return; + QString id = bookmark.metaDataItem(QStringLiteral("UDI")); + if (id.isEmpty()) { + id = bookmark.metaDataItem(QStringLiteral("ID")); } - - m_availableDevices << udi; - const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - - PlacesItem *item = new PlacesItem(bookmark); - appendItem(item); - connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, - this, &PlacesItemModel::storageTearDownExternallyRequested); + return id; } -void PlacesItemModel::slotDeviceRemoved(const QString& udi) +void PlacesItemModel::initializeDefaultViewProperties() const { - if (!m_availableDevices.contains(udi)) { - return; - } - - for (int i = 0; i < m_bookmarkedItems.count(); ++i) { - PlacesItem* item = m_bookmarkedItems[i]; - if (item && item->udi() == udi) { - m_bookmarkedItems.removeAt(i); - delete item; - return; + for(int i = 0, iMax = m_sourceModel->rowCount(); i < iMax; i++) { + const QModelIndex index = m_sourceModel->index(i, 0); + const PlacesItem *item = placesItem(mapFromSource(index)); + if (!item) { + continue; } - } - for (int i = 0; i < count(); ++i) { - if (placesItem(i)->udi() == udi) { - removeItem(i); - return; + // Create default view-properties for all "Search For" and "Recently Saved" bookmarks + // in case the user has not already created custom view-properties for a corresponding + // query yet. + const bool createDefaultViewProperties = item->isSearchOrTimelineUrl() && !GeneralSettings::self()->globalViewProps(); + if (createDefaultViewProperties) { + const QUrl itemUrl = item->url(); + ViewProperties props(KFilePlacesModel::convertedUrl(itemUrl)); + if (!props.exist()) { + const QString path = itemUrl.path(); + if (path == QLatin1String("/documents")) { + props.setViewMode(DolphinView::DetailsView); + props.setPreviewsShown(false); + props.setVisibleRoles({"text", "path"}); + } else if (path == QLatin1String("/images")) { + props.setViewMode(DolphinView::IconsView); + props.setPreviewsShown(true); + props.setVisibleRoles({"text", "imageSize"}); + } else if (path == QLatin1String("/audio")) { + props.setViewMode(DolphinView::DetailsView); + props.setPreviewsShown(false); + props.setVisibleRoles({"text", "artist", "album"}); + } else if (path == QLatin1String("/videos")) { + props.setViewMode(DolphinView::IconsView); + props.setPreviewsShown(true); + props.setVisibleRoles({"text"}); + } else if (itemUrl.scheme() == QLatin1String("timeline")) { + props.setViewMode(DolphinView::DetailsView); + props.setVisibleRoles({"text", "modificationtime"}); + } + props.save(); + } } } } +void PlacesItemModel::updateItem(PlacesItem *item, const QModelIndex &index) +{ + item->setGroup(index.data(KFilePlacesModel::GroupRole).toString()); + item->setIcon(index.data(KFilePlacesModel::IconNameRole).toString()); + item->setGroupHidden(index.data(KFilePlacesModel::GroupHiddenRole).toBool()); +} + void PlacesItemModel::slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData) { if (error && errorData.isValid()) { @@ -633,342 +531,133 @@ void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error, } } -void PlacesItemModel::hideItem() +void PlacesItemModel::onSourceModelRowsInserted(const QModelIndex &parent, int first, int last) { - hideItem(m_hiddenItemToRemove); - m_hiddenItemToRemove = -1; + for (int i = first; i <= last; i++) { + const QModelIndex index = m_sourceModel->index(i, 0, parent); + addItemFromSourceModel(index); + } } -void PlacesItemModel::updateBookmarks() +void PlacesItemModel::onSourceModelRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last) { - // Verify whether new bookmarks have been added or existing - // bookmarks have been changed. - KBookmarkGroup root = m_bookmarkManager->root(); - KBookmark newBookmark = root.first(); - while (!newBookmark.isNull()) { - if (acceptBookmark(newBookmark, m_availableDevices)) { - bool found = false; - int modelIndex = 0; - for (int i = 0; i < m_bookmarkedItems.count(); ++i) { - PlacesItem* item = m_bookmarkedItems[i]; - if (!item) { - item = placesItem(modelIndex); - ++modelIndex; - } - - const KBookmark oldBookmark = item->bookmark(); - if (equalBookmarkIdentifiers(newBookmark, oldBookmark)) { - // The bookmark has been found in the model or as - // a hidden item. The content of the bookmark might - // have been changed, so an update is done. - found = true; - if (newBookmark.metaDataItem(QStringLiteral("UDI")).isEmpty()) { - item->setBookmark(newBookmark); - item->setText(i18nc("KFile System Bookmarks", newBookmark.text().toUtf8().constData())); - } - break; - } - } - - if (!found) { - const QString udi = newBookmark.metaDataItem(QStringLiteral("UDI")); - - /* - * See Bug 304878 - * Only add a new places item, if the item text is not empty - * and if the device is available. Fixes the strange behaviour - - * add a places item without text in the Places section - when you - * remove a device (e.g. a usb stick) without unmounting. - */ - if (udi.isEmpty() || Solid::Device(udi).isValid()) { - PlacesItem* item = new PlacesItem(newBookmark); - if (item->isHidden() && !m_hiddenItemsShown) { - m_bookmarkedItems.append(item); - } else { - appendItemToGroup(item); - } - } - } + for(int r = first; r <= last; r++) { + const QModelIndex index = m_sourceModel->index(r, 0, parent); + int oldIndex = mapFromSource(index); + if (oldIndex != -1) { + removeItem(oldIndex); } - - newBookmark = root.next(newBookmark); } +} - // Remove items that are not part of the bookmark-manager anymore - int modelIndex = 0; - for (int i = m_bookmarkedItems.count() - 1; i >= 0; --i) { - PlacesItem* item = m_bookmarkedItems[i]; - const bool itemIsPartOfModel = (item == 0); - if (itemIsPartOfModel) { - item = placesItem(modelIndex); - } - - bool hasBeenRemoved = true; - const KBookmark oldBookmark = item->bookmark(); - KBookmark newBookmark = root.first(); - while (!newBookmark.isNull()) { - if (equalBookmarkIdentifiers(newBookmark, oldBookmark)) { - hasBeenRemoved = false; - break; - } - newBookmark = root.next(newBookmark); - } - - if (hasBeenRemoved) { - if (m_bookmarkedItems[i]) { - delete m_bookmarkedItems[i]; - m_bookmarkedItems.removeAt(i); - } else { - removeItem(modelIndex); - --modelIndex; - } - } +void PlacesItemModel::onSourceModelRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) +{ + Q_UNUSED(destination); + Q_UNUSED(row); - if (itemIsPartOfModel) { - ++modelIndex; - } + for(int r = start; r <= end; r++) { + const QModelIndex sourceIndex = m_sourceModel->index(r, 0, parent); + // remove moved item + removeItem(mapFromSource(sourceIndex)); } } -void PlacesItemModel::saveBookmarks() +void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) { - m_bookmarkManager->emitChanged(m_bookmarkManager->root()); -} + Q_UNUSED(destination); + Q_UNUSED(parent); -void PlacesItemModel::loadBookmarks() -{ - KBookmarkGroup root = m_bookmarkManager->root(); - KBookmark bookmark = root.first(); - QSet<QString> devices = m_availableDevices; + const int blockSize = (end - start) + 1; - QSet<QUrl> missingSystemBookmarks; - foreach (const SystemBookmarkData& data, m_systemBookmarks) { - missingSystemBookmarks.insert(data.url); - } + for (int r = start; r <= end; r++) { + // insert the moved item in the new position + const int targetRow = row + (start - r) - (r < row ? blockSize : 0); + const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination); - // The bookmarks might have a mixed order of places, devices and search-groups due - // to the compatibility with the KFilePlacesPanel. In Dolphin's places panel the - // items should always be collected in one group so the items are collected first - // in separate lists before inserting them. - QList<PlacesItem*> placesItems; - QList<PlacesItem*> recentlySavedItems; - QList<PlacesItem*> searchForItems; - QList<PlacesItem*> devicesItems; + addItemFromSourceModel(targetIndex); + } +} - while (!bookmark.isNull()) { - if (acceptBookmark(bookmark, devices)) { - PlacesItem* item = new PlacesItem(bookmark); - if (item->groupType() == PlacesItem::DevicesType) { - devices.remove(item->udi()); - devicesItems.append(item); - } else { - const QUrl url = bookmark.url(); - if (missingSystemBookmarks.contains(url)) { - missingSystemBookmarks.remove(url); +void PlacesItemModel::onSourceModelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) +{ + Q_UNUSED(roles); - // Try to retranslate the text of system bookmarks to have translated - // items when changing the language. In case if the user has applied a custom - // text, the retranslation will fail and the users custom text is still used. - // It is important to use "KFile System Bookmarks" as context (see - // createSystemBookmarks()). - item->setText(i18nc("KFile System Bookmarks", bookmark.text().toUtf8().constData())); - item->setSystemItem(true); - } + for (int r = topLeft.row(); r <= bottomRight.row(); r++) { + const QModelIndex sourceIndex = m_sourceModel->index(r, 0); + const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); + PlacesItem *placeItem = itemFromBookmark(bookmark); - switch (item->groupType()) { - case PlacesItem::PlacesType: placesItems.append(item); break; - case PlacesItem::RecentlySavedType: recentlySavedItems.append(item); break; - case PlacesItem::SearchForType: searchForItems.append(item); break; - case PlacesItem::DevicesType: - default: Q_ASSERT(false); break; - } - } + if (placeItem && (!m_hiddenItemsShown && m_sourceModel->isHidden(sourceIndex))) { + //hide item if it became invisible + removeItem(index(placeItem)); + return; } - bookmark = root.next(bookmark); - } - - if (!missingSystemBookmarks.isEmpty()) { - // The current bookmarks don't contain all system-bookmarks. Add the missing - // bookmarks. - foreach (const SystemBookmarkData& data, m_systemBookmarks) { - if (missingSystemBookmarks.contains(data.url)) { - PlacesItem* item = createSystemPlacesItem(data); - switch (item->groupType()) { - case PlacesItem::PlacesType: placesItems.append(item); break; - case PlacesItem::RecentlySavedType: recentlySavedItems.append(item); break; - case PlacesItem::SearchForType: searchForItems.append(item); break; - case PlacesItem::DevicesType: - default: Q_ASSERT(false); break; - } - } + if (!placeItem && (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) { + //show item if it became visible + addItemFromSourceModel(sourceIndex); + return; } - } - // Create items for devices that have not been stored as bookmark yet - devicesItems.reserve(devicesItems.count() + devices.count()); - foreach (const QString& udi, devices) { - const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - PlacesItem *item = new PlacesItem(bookmark); - devicesItems.append(item); - connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, - this, &PlacesItemModel::storageTearDownExternallyRequested); - } - - QList<PlacesItem*> items; - items.append(placesItems); - items.append(recentlySavedItems); - items.append(searchForItems); - items.append(devicesItems); - - foreach (PlacesItem* item, items) { - if (!m_hiddenItemsShown && item->isHidden()) { - m_bookmarkedItems.append(item); - } else { - appendItem(item); + if (placeItem && !m_sourceModel->isDevice(sourceIndex)) { + placeItem->setText(bookmark.text()); + placeItem->setIcon(sourceIndex.data(KFilePlacesModel::IconNameRole).toString()); + placeItem->setUrl(m_sourceModel->url(sourceIndex)); + placeItem->bookmark().setMetaDataItem(QStringLiteral("OnlyInApp"), + bookmark.metaDataItem(QStringLiteral("OnlyInApp"))); + // must update the bookmark object + placeItem->setBookmark(bookmark); } } - -#ifdef PLACESITEMMODEL_DEBUG - qCDebug(DolphinDebug) << "Loaded bookmarks"; - showModelState(); -#endif } -bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark, - const QSet<QString>& availableDevices) const +void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden) { - const QString udi = bookmark.metaDataItem(QStringLiteral("UDI")); - const QUrl url = bookmark.url(); - const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp")); - const bool deviceAvailable = availableDevices.contains(udi); - - if (balooURLs.contains(url) && appName.isEmpty()) { - // Does not accept baloo URLS with empty appName, this came from new KIO model and will cause duplications - qCWarning(DolphinDebug) << "Ignore KIO url:" << url; - return false; + for(const QModelIndex &sourceIndex : m_sourceModel->groupIndexes(group)) { + PlacesItem *item = placesItem(mapFromSource(sourceIndex)); + if (item) { + item->setGroupHidden(hidden); + } } - - const bool allowedHere = (appName.isEmpty() - || appName == KAboutData::applicationData().componentName() - || appName == KAboutData::applicationData().componentName() + AppNamePrefix) - && (m_fileIndexingEnabled || (url.scheme() != QLatin1String("timeline") && - url.scheme() != QLatin1String("search"))); - - return (udi.isEmpty() && allowedHere) || deviceAvailable; } -PlacesItem* PlacesItemModel::createSystemPlacesItem(const SystemBookmarkData& data) +void PlacesItemModel::cleanupBookmarks() { - KBookmark bookmark = PlacesItem::createBookmark(m_bookmarkManager, - data.text, - data.url, - data.icon); + // KIO model now provides support for baloo urls, and because of that we + // need to remove old URLs that were visible only in Dolphin to avoid duplication + int row = 0; + do { + const QModelIndex sourceIndex = m_sourceModel->index(row, 0); + const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex); + const QUrl url = bookmark.url(); + const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp")); - const QString protocol = data.url.scheme(); - if (protocol == QLatin1String("timeline") || protocol == QLatin1String("search")) { - // As long as the KFilePlacesView from kdelibs is available, the system-bookmarks - // for "Recently Saved" and "Search For" should be a setting available only - // in the Places Panel (see description of AppNamePrefix for more details). - const QString appName = KAboutData::applicationData().componentName() + AppNamePrefix; - bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), appName); - } - - PlacesItem* item = new PlacesItem(bookmark); - item->setSystemItem(true); - - // Create default view-properties for all "Search For" and "Recently Saved" bookmarks - // in case if the user has not already created custom view-properties for a corresponding - // query yet. - const bool createDefaultViewProperties = (item->groupType() == PlacesItem::SearchForType || - item->groupType() == PlacesItem::RecentlySavedType) && - !GeneralSettings::self()->globalViewProps(); - if (createDefaultViewProperties) { - ViewProperties props(convertedUrl(data.url)); - if (!props.exist()) { - const QString path = data.url.path(); - if (path == QLatin1String("/documents")) { - props.setViewMode(DolphinView::DetailsView); - props.setPreviewsShown(false); - props.setVisibleRoles({"text", "path"}); - } else if (path == QLatin1String("/images")) { - props.setViewMode(DolphinView::IconsView); - props.setPreviewsShown(true); - props.setVisibleRoles({"text", "imageSize"}); - } else if (path == QLatin1String("/audio")) { - props.setViewMode(DolphinView::DetailsView); - props.setPreviewsShown(false); - props.setVisibleRoles({"text", "artist", "album"}); - } else if (path == QLatin1String("/videos")) { - props.setViewMode(DolphinView::IconsView); - props.setPreviewsShown(true); - props.setVisibleRoles({"text"}); - } else if (data.url.scheme() == QLatin1String("timeline")) { - props.setViewMode(DolphinView::DetailsView); - props.setVisibleRoles({"text", "modificationtime"}); - } + if ((appName == KAboutData::applicationData().componentName() || + appName == KAboutData::applicationData().componentName() + AppNameSuffix) && balooURLs.contains(url)) { + qCDebug(DolphinDebug) << "Removing old baloo url:" << url; + m_sourceModel->removePlace(sourceIndex); + } else { + row++; } - } - - return item; + } while (row < m_sourceModel->rowCount()); } -void PlacesItemModel::createSystemBookmarks() +void PlacesItemModel::loadBookmarks() { - Q_ASSERT(m_systemBookmarks.isEmpty()); - Q_ASSERT(m_systemBookmarksIndexes.isEmpty()); - - // Note: The context of the I18N_NOOP2 must be "KFile System Bookmarks". The real - // i18nc call is done after reading the bookmark. The reason why the i18nc call is not - // done here is because otherwise switching the language would not result in retranslating the - // bookmarks. - m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile(QDir::homePath()), - QStringLiteral("user-home"), - I18N_NOOP2("KFile System Bookmarks", "Home"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("remote:/")), - QStringLiteral("network-workgroup"), - I18N_NOOP2("KFile System Bookmarks", "Network"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl::fromLocalFile(QStringLiteral("/")), - QStringLiteral("folder-red"), - I18N_NOOP2("KFile System Bookmarks", "Root"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("trash:/")), - QStringLiteral("user-trash"), - I18N_NOOP2("KFile System Bookmarks", "Trash"))); - - if (m_fileIndexingEnabled) { - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/today")), - QStringLiteral("go-jump-today"), - I18N_NOOP2("KFile System Bookmarks", "Today"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/yesterday")), - QStringLiteral("view-calendar-day"), - I18N_NOOP2("KFile System Bookmarks", "Yesterday"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/thismonth")), - QStringLiteral("view-calendar-month"), - I18N_NOOP2("KFile System Bookmarks", "This Month"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("timeline:/lastmonth")), - QStringLiteral("view-calendar-month"), - I18N_NOOP2("KFile System Bookmarks", "Last Month"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/documents")), - QStringLiteral("folder-text"), - I18N_NOOP2("KFile System Bookmarks", "Documents"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/images")), - QStringLiteral("folder-images"), - I18N_NOOP2("KFile System Bookmarks", "Images"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/audio")), - QStringLiteral("folder-sound"), - I18N_NOOP2("KFile System Bookmarks", "Audio Files"))); - m_systemBookmarks.append(SystemBookmarkData(QUrl(QStringLiteral("search:/videos")), - QStringLiteral("folder-videos"), - I18N_NOOP2("KFile System Bookmarks", "Videos"))); + for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) { + const QModelIndex sourceIndex = m_sourceModel->index(r, 0); + if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) { + addItemFromSourceModel(sourceIndex); + } } - for (int i = 0; i < m_systemBookmarks.count(); ++i) { - m_systemBookmarksIndexes.insert(m_systemBookmarks[i].url, i); - } +#ifdef PLACESITEMMODEL_DEBUG + qCDebug(DolphinDebug) << "Loaded bookmarks"; + showModelState(); +#endif } void PlacesItemModel::clear() { - m_bookmarkedItems.clear(); KStandardItemModel::clear(); } @@ -981,50 +670,16 @@ void PlacesItemModel::proceedWithTearDown() m_deviceToTearDown->teardown(); } -void PlacesItemModel::initializeAvailableDevices() +void PlacesItemModel::deleteItem(int index) { - QString predicate(QStringLiteral("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" - " OR " - "[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]" - " OR " - "OpticalDisc.availableContent & 'Audio' ]" - " OR " - "StorageAccess.ignored == false ]")); - - - if (KProtocolInfo::isKnownProtocol(QStringLiteral("mtp"))) { - predicate.prepend("["); - predicate.append(" OR PortableMediaPlayer.supportedProtocols == 'mtp']"); - } - - m_predicate = Solid::Predicate::fromString(predicate); - Q_ASSERT(m_predicate.isValid()); - - Solid::DeviceNotifier* notifier = Solid::DeviceNotifier::instance(); - connect(notifier, &Solid::DeviceNotifier::deviceAdded, this, &PlacesItemModel::slotDeviceAdded); - connect(notifier, &Solid::DeviceNotifier::deviceRemoved, this, &PlacesItemModel::slotDeviceRemoved); - - const QList<Solid::Device>& deviceList = Solid::Device::listFromQuery(m_predicate); - foreach (const Solid::Device& device, deviceList) { - m_availableDevices << device.udi(); - } + QModelIndex sourceIndex = mapToSource(index); + Q_ASSERT(sourceIndex.isValid()); + m_sourceModel->removePlace(sourceIndex); } -int PlacesItemModel::bookmarkIndex(int index) const +void PlacesItemModel::refresh() { - int bookmarkIndex = 0; - int modelIndex = 0; - while (bookmarkIndex < m_bookmarkedItems.count()) { - if (!m_bookmarkedItems[bookmarkIndex]) { - if (modelIndex == index) { - break; - } - ++modelIndex; - } - ++bookmarkIndex; - } - - return bookmarkIndex >= m_bookmarkedItems.count() ? -1 : bookmarkIndex; + m_sourceModel->refresh(); } void PlacesItemModel::hideItem(int index) @@ -1035,36 +690,6 @@ void PlacesItemModel::hideItem(int index) } shownItem->setHidden(true); - if (m_hiddenItemsShown) { - // Removing items from the model is not allowed if all hidden - // items should be shown. - return; - } - - const int newIndex = bookmarkIndex(index); - if (newIndex >= 0) { - const KBookmark hiddenBookmark = shownItem->bookmark(); - PlacesItem* hiddenItem = new PlacesItem(hiddenBookmark); - - const PlacesItem* previousItem = placesItem(index - 1); - KBookmark previousBookmark; - if (previousItem) { - previousBookmark = previousItem->bookmark(); - } - - const bool updateBookmark = (m_bookmarkManager->root().indexOf(hiddenBookmark) >= 0); - removeItem(index); - - if (updateBookmark) { - // removeItem() also removed the bookmark from m_bookmarkManager in - // PlacesItemModel::onItemRemoved(). However for hidden items the - // bookmark should still be remembered, so readd it again: - m_bookmarkManager->root().addBookmark(hiddenBookmark); - m_bookmarkManager->root().moveBookmark(hiddenBookmark, previousBookmark); - } - - m_bookmarkedItems.insert(newIndex, hiddenItem); - } } QString PlacesItemModel::internalMimeType() const @@ -1078,7 +703,7 @@ int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const Q_ASSERT(item); int dropIndex = index; - const PlacesItem::GroupType type = item->groupType(); + const QString group = item->group(); const int itemCount = count(); if (index < 0) { @@ -1088,7 +713,7 @@ int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const // Search nearest previous item with the same group int previousIndex = -1; for (int i = dropIndex - 1; i >= 0; --i) { - if (placesItem(i)->groupType() == type) { + if (placesItem(i)->group() == group) { previousIndex = i; break; } @@ -1097,7 +722,7 @@ int PlacesItemModel::groupedDropIndex(int index, const PlacesItem* item) const // Search nearest next item with the same group int nextIndex = -1; for (int i = dropIndex; i < count(); ++i) { - if (placesItem(i)->groupType() == type) { + if (placesItem(i)->group() == group) { nextIndex = i; break; } @@ -1128,52 +753,13 @@ bool PlacesItemModel::equalBookmarkIdentifiers(const KBookmark& b1, const KBookm } } -QUrl PlacesItemModel::createTimelineUrl(const QUrl& url) +int PlacesItemModel::mapFromSource(const QModelIndex &index) const { - // TODO: Clarify with the Baloo-team whether it makes sense - // provide default-timeline-URLs like 'yesterday', 'this month' - // and 'last month'. - QUrl timelineUrl; - - const QString path = url.toDisplayString(QUrl::PreferLocalFile); - if (path.endsWith(QLatin1String("yesterday"))) { - const QDate date = QDate::currentDate().addDays(-1); - const int year = date.year(); - const int month = date.month(); - const int day = date.day(); - timelineUrl = QUrl("timeline:/" + timelineDateString(year, month) + - '/' + timelineDateString(year, month, day)); - } else if (path.endsWith(QLatin1String("thismonth"))) { - const QDate date = QDate::currentDate(); - timelineUrl = QUrl("timeline:/" + timelineDateString(date.year(), date.month())); - } else if (path.endsWith(QLatin1String("lastmonth"))) { - const QDate date = QDate::currentDate().addMonths(-1); - timelineUrl = QUrl("timeline:/" + timelineDateString(date.year(), date.month())); - } else { - Q_ASSERT(path.endsWith(QLatin1String("today"))); - timelineUrl = url; + if (!index.isValid()) { + return -1; } - return timelineUrl; -} - -QString PlacesItemModel::timelineDateString(int year, int month, int day) -{ - QString date = QString::number(year) + '-'; - if (month < 10) { - date += '0'; - } - date += QString::number(month); - - if (day >= 1) { - date += '-'; - if (day < 10) { - date += '0'; - } - date += QString::number(day); - } - - return date; + return m_indexMap.indexOf(index); } bool PlacesItemModel::isDir(int index) const @@ -1182,39 +768,38 @@ bool PlacesItemModel::isDir(int index) const return true; } -QUrl PlacesItemModel::createSearchUrl(const QUrl& url) +KFilePlacesModel::GroupType PlacesItemModel::groupType(int row) const { - QUrl searchUrl; + return m_sourceModel->groupType(mapToSource(row)); +} -#ifdef HAVE_BALOO - const QString path = url.toDisplayString(QUrl::PreferLocalFile); - if (path.endsWith(QLatin1String("documents"))) { - searchUrl = searchUrlForType(QStringLiteral("Document")); - } else if (path.endsWith(QLatin1String("images"))) { - searchUrl = searchUrlForType(QStringLiteral("Image")); - } else if (path.endsWith(QLatin1String("audio"))) { - searchUrl = searchUrlForType(QStringLiteral("Audio")); - } else if (path.endsWith(QLatin1String("videos"))) { - searchUrl = searchUrlForType(QStringLiteral("Video")); - } else { - Q_ASSERT(false); - } -#else - Q_UNUSED(url); -#endif +bool PlacesItemModel::isGroupHidden(KFilePlacesModel::GroupType type) const +{ + return m_sourceModel->isGroupHidden(type); +} - return searchUrl; +void PlacesItemModel::setGroupHidden(KFilePlacesModel::GroupType type, bool hidden) +{ + return m_sourceModel->setGroupHidden(type, hidden); } -#ifdef HAVE_BALOO -QUrl PlacesItemModel::searchUrlForType(const QString& type) +QModelIndex PlacesItemModel::mapToSource(int row) const { - Baloo::Query query; - query.addType(type); + return m_indexMap.value(row); +} - return query.toSearchUrl(); +PlacesItem *PlacesItemModel::itemFromBookmark(const KBookmark &bookmark) const +{ + const QString id = bookmarkId(bookmark); + for (int i = 0, iMax = count(); i < iMax; i++) { + PlacesItem *item = placesItem(i); + const KBookmark itemBookmark = item->bookmark(); + if (bookmarkId(itemBookmark) == id) { + return item; + } + } + return nullptr; } -#endif #ifdef PLACESITEMMODEL_DEBUG void PlacesItemModel::showModelState() diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h index 7dd49bf5a..a1b23b220 100644 --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -20,9 +20,8 @@ #ifndef PLACESITEMMODEL_H #define PLACESITEMMODEL_H -#include <config-baloo.h> - #include <kitemviews/kstandarditemmodel.h> +#include <KFilePlacesModel> #include <QUrl> #include <QHash> @@ -35,7 +34,6 @@ class KBookmark; class KBookmarkManager; class PlacesItem; class QAction; -class QTimer; // #define PLACESITEMMODEL_DEBUG @@ -50,20 +48,27 @@ class PlacesItemModel: public KStandardItemModel Q_OBJECT public: - explicit PlacesItemModel(QObject* parent = 0); - virtual ~PlacesItemModel(); + explicit PlacesItemModel(QObject* parent = nullptr); + ~PlacesItemModel() override; /** - * @return A new instance of a places item with the given - * attributes. + * @brief Create a new place entry in the bookmark file + * and add it to the model */ - PlacesItem* createPlacesItem(const QString& text, - const QUrl& url, - const QString& iconName = QString()); + void createPlacesItem(const QString& text, + const QUrl& url, + const QString& iconName = QString(), + int after = -1); PlacesItem* placesItem(int index) const; /** + * @brief Mark an item as hiden + * @param index of the item to be hidden + */ + void hideItem(int index); + + /** * If set to true, all items that are marked as hidden * will be shown in the view. The items will * stay marked as hidden, which is visually indicated @@ -89,15 +94,6 @@ public: */ int closestItem(const QUrl& url) const; - /** - * Appends the item \a item as last element of the group - * the item belongs to. If no item with the same group is - * present, the item gets appended as last element of the - * model. PlacesItemModel takes the ownership - * of the item. - */ - void appendItemToGroup(PlacesItem* item); - QAction* ejectAction(int index) const; QAction* teardownAction(int index) const; @@ -107,9 +103,9 @@ public: bool storageSetupNeeded(int index) const; void requestStorageSetup(int index); - virtual QMimeData* createMimeData(const KItemSet& indexes) const Q_DECL_OVERRIDE; + QMimeData* createMimeData(const KItemSet& indexes) const override; - virtual bool supportsDropping(int index) const Q_DECL_OVERRIDE; + bool supportsDropping(int index) const override; void dropMimeDataBefore(int index, const QMimeData* mimeData); @@ -121,18 +117,32 @@ public: */ static QUrl convertedUrl(const QUrl& url); - virtual void clear() Q_DECL_OVERRIDE; + void clear() override; void proceedWithTearDown(); /** - * Saves the bookmarks and indicates to other applications that the - * state of the bookmarks has been changed. Is only called by the - * timeout of m_saveBookmarksTimer to prevent unnecessary savings. + * @brief Remove item from bookmark + * + * This function remove the index from bookmark file permanently + * + * @param index - the item to be removed */ - void saveBookmarks(); + void deleteItem(int index); + + /** + * Force a sync on the bookmarks and indicates to other applications that the + * state of the bookmarks has been changed. + */ + void refresh(); + + bool isDir(int index) const override; + + + KFilePlacesModel::GroupType groupType(int row) const; + bool isGroupHidden(KFilePlacesModel::GroupType type) const; + void setGroupHidden(KFilePlacesModel::GroupType type, bool hidden); - bool isDir(int index) const Q_DECL_OVERRIDE; signals: void errorMessage(const QString& message); void storageSetupDone(int index, bool success); @@ -140,26 +150,28 @@ signals: void storageTearDownExternallyRequested(const QString& mountPath); protected: - virtual void onItemInserted(int index) Q_DECL_OVERRIDE; - virtual void onItemRemoved(int index, KStandardItem* removedItem) Q_DECL_OVERRIDE; - virtual void onItemChanged(int index, const QSet<QByteArray>& changedRoles) Q_DECL_OVERRIDE; + void onItemInserted(int index) override; + void onItemRemoved(int index, KStandardItem* removedItem) override; + void onItemChanged(int index, const QSet<QByteArray>& changedRoles) override; private slots: - void slotDeviceAdded(const QString& udi); - void slotDeviceRemoved(const QString& udi); void slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData); void slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi); - void hideItem(); - /** - * Updates the bookmarks from the model corresponding to the changed - * bookmarks stored by the bookmark-manager. Is called whenever the bookmarks - * have been changed by another application. - */ - void updateBookmarks(); + // source model control + void onSourceModelRowsInserted(const QModelIndex &parent, int first, int last); + void onSourceModelRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last); + void onSourceModelRowsAboutToBeMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); + void onSourceModelRowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); + void onSourceModelDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles); + void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden); private: - struct SystemBookmarkData; + /** + * Remove bookmarks created by the previous version of dolphin that are + * not valid anymore + */ + void cleanupBookmarks(); /** * Loads the bookmarks from the bookmark-manager and creates items for @@ -167,43 +179,6 @@ private: */ void loadBookmarks(); - /** - * @return True, if the bookmark can be accepted in the context of the - * current application (e.g. bookmarks from other applications - * will be ignored). - */ - bool acceptBookmark(const KBookmark& bookmark, - const QSet<QString>& availableDevices) const; - - /** - * Creates a PlacesItem for a system-bookmark: - * - PlacesItem::isSystemItem() will return true - * - Default view-properties will be created for "Search For" items - * The item is not inserted to the model yet. - */ - PlacesItem* createSystemPlacesItem(const SystemBookmarkData& data); - - /** - * Creates system bookmarks that are shown per default and can - * only be hidden but not removed. The result will be stored - * in m_systemBookmarks. - */ - void createSystemBookmarks(); - - void initializeAvailableDevices(); - - /** - * @param index Item index related to the model. - * @return Corresponding index related to m_bookmarkedItems. - */ - int bookmarkIndex(int index) const; - - /** - * Marks the item with the index \a index as hidden and - * removes it from the model so that it gets invisible. - */ - void hideItem(int index); - QString internalMimeType() const; /** @@ -220,77 +195,41 @@ private: static bool equalBookmarkIdentifiers(const KBookmark& b1, const KBookmark& b2); /** - * @return URL using the timeline-protocol for searching (see convertedUrl()). - */ - static QUrl createTimelineUrl(const QUrl& url); - - /** - * Helper method for createTimelineUrl(). - * @return String that represents a date-path in the format that - * the timeline-protocol expects. - */ - static QString timelineDateString(int year, int month, int day = 0); - - /** - * @return URL that can be listed by KIO and results in searching - * for a given term. The URL \a url represents a places-internal - * URL like e.g. "search:/documents" (see convertedUrl()). - */ - static QUrl createSearchUrl(const QUrl& url); - -#ifdef HAVE_BALOO - /** - * Helper method for createSearchUrl() - * @return URL that can be listed by KIO and results in searching - * for the given type + * Appends the item \a item as last element of the group + * the item belongs to. If no item with the same group is + * present, the item gets appended as last element of the + * model. PlacesItemModel takes the ownership + * of the item. */ - static QUrl searchUrlForType(const QString& type); -#endif + void insertSortedItem(PlacesItem* item); #ifdef PLACESITEMMODEL_DEBUG void showModelState(); #endif -private: - bool m_fileIndexingEnabled; - bool m_hiddenItemsShown; + PlacesItem *itemFromBookmark(const KBookmark &bookmark) const; - QSet<QString> m_availableDevices; - Solid::Predicate m_predicate; - KBookmarkManager* m_bookmarkManager; + void addItemFromSourceModel(const QModelIndex &index); + void removeItemByIndex(const QModelIndex &mapToSource); - struct SystemBookmarkData - { - SystemBookmarkData(const QUrl& url, - const QString& icon, - const QString& text) : - url(url), icon(icon), text(text) {} - QUrl url; - QString icon; - QString text; - }; + QString bookmarkId(const KBookmark &bookmark) const; + void initializeDefaultViewProperties() const; - QList<SystemBookmarkData> m_systemBookmarks; - QHash<QUrl, int> m_systemBookmarksIndexes; + int mapFromSource(const QModelIndex &index) const; + QModelIndex mapToSource(int row) const; - // Contains hidden and unhidden items that are stored as - // bookmark (the model itself only contains items that - // are shown in the view). If an entry is 0, then the - // places-item is part of the model. If an entry is not - // 0, the item is hidden and not part of the model. - QList<PlacesItem*> m_bookmarkedItems; + static void updateItem(PlacesItem *item, const QModelIndex &index); - // Index of the hidden item that should be removed in - // removeHiddenItem(). The removing must be done - // asynchronously as in the scope of onItemChanged() - // removing an item is not allowed. - int m_hiddenItemToRemove; +private: + bool m_hiddenItemsShown; Solid::StorageAccess *m_deviceToTearDown; - QTimer* m_updateBookmarksTimer; - QHash<QObject*, int> m_storageSetupInProgress; + + QScopedPointer<KFilePlacesModel> m_sourceModel; + + QVector<QPersistentModelIndex> m_indexMap; }; #endif diff --git a/src/panels/places/placesitemsignalhandler.h b/src/panels/places/placesitemsignalhandler.h index 6110f717d..49c8e43c9 100644 --- a/src/panels/places/placesitemsignalhandler.h +++ b/src/panels/places/placesitemsignalhandler.h @@ -48,7 +48,7 @@ class PlacesItemSignalHandler: public QObject public: explicit PlacesItemSignalHandler(PlacesItem* item, QObject* parent = nullptr); - virtual ~PlacesItemSignalHandler(); + ~PlacesItemSignalHandler() override; public slots: /** diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 0b76f18d3..f7ca7d010 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -34,6 +34,7 @@ #include <KIO/DropJob> #include <KIO/EmptyTrashJob> #include <KIO/JobUiDelegate> +#include <KFilePlacesModel> #include <KJobWidgets> #include <KLocalizedString> #include <KIconLoader> @@ -170,10 +171,10 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) QMenu menu(this); - QAction* emptyTrashAction = 0; - QAction* editAction = 0; - QAction* teardownAction = 0; - QAction* ejectAction = 0; + QAction* emptyTrashAction = nullptr; + QAction* editAction = nullptr; + QAction* teardownAction = nullptr; + QAction* ejectAction = nullptr; const QString label = item->text(); @@ -213,7 +214,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) editAction = menu.addAction(QIcon::fromTheme("document-properties"), i18nc("@item:inmenu", "Edit...")); } - QAction* removeAction = 0; + QAction* removeAction = nullptr; if (!isDevice && !item->isSystemItem()) { removeAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18nc("@item:inmenu", "Remove")); } @@ -222,6 +223,8 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) hideAction->setCheckable(true); hideAction->setChecked(item->isHidden()); + buildGroupContextMenu(&menu, index); + QAction* action = menu.exec(pos.toPoint()); if (action) { if (action == emptyTrashAction) { @@ -239,13 +242,11 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) if (action == editAction) { editEntry(index); } else if (action == removeAction) { - m_model->removeItem(index); - m_model->saveBookmarks(); + m_model->deleteItem(index); } else if (action == hideAction) { item->setHidden(hideAction->isChecked()); - m_model->saveBookmarks(); } else if (action == openInNewWindowAction) { - Dolphin::openNewWindow({PlacesItemModel::convertedUrl(m_model->data(index).value("url").toUrl())}, this); + Dolphin::openNewWindow({KFilePlacesModel::convertedUrl(m_model->data(index).value("url").toUrl())}, this); } else if (action == openInNewTabAction) { // TriggerItem does set up the storage first and then it will // emit the slotItemMiddleClicked signal, because of Qt::MiddleButton. @@ -267,13 +268,15 @@ void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos) QAction* addAction = menu.addAction(QIcon::fromTheme(QStringLiteral("document-new")), i18nc("@item:inmenu", "Add Entry...")); - QAction* showAllAction = 0; + QAction* showAllAction = nullptr; if (m_model->hiddenCount() > 0) { showAllAction = menu.addAction(i18nc("@item:inmenu", "Show All Entries")); showAllAction->setCheckable(true); showAllAction->setChecked(m_model->hiddenItemsShown()); } + buildGroupContextMenu(&menu, m_controller->indexCloseToMousePressedPosition()); + QMenu* iconSizeSubMenu = new QMenu(i18nc("@item:inmenu", "Icon Size"), &menu); struct IconSizeInfo @@ -327,6 +330,24 @@ void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos) selectClosestItem(); } +QAction *PlacesPanel::buildGroupContextMenu(QMenu *menu, int index) +{ + if (index == -1) { + return nullptr; + } + + KFilePlacesModel::GroupType groupType = m_model->groupType(index); + QAction *hideGroupAction = menu->addAction(i18nc("@item:inmenu", "Hide Section '%1'", m_model->item(index)->group())); + hideGroupAction->setCheckable(true); + hideGroupAction->setChecked(m_model->isGroupHidden(groupType)); + + connect(hideGroupAction, &QAction::triggered, this, [this, groupType, hideGroupAction]{ + m_model->setGroupHidden(groupType, hideGroupAction->isChecked()); + }); + + return hideGroupAction; +} + void PlacesPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event) { if (index < 0) { @@ -334,8 +355,8 @@ void PlacesPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even } const PlacesItem* destItem = m_model->placesItem(index); - const PlacesItem::GroupType group = destItem->groupType(); - if (group == PlacesItem::SearchForType || group == PlacesItem::RecentlySavedType) { + + if (destItem->isSearchOrTimelineUrl()) { return; } @@ -388,15 +409,14 @@ void PlacesPanel::slotItemDropEventStorageSetupDone(int index, bool success) delete m_itemDropEvent; m_itemDropEventIndex = -1; - m_itemDropEventMimeData = 0; - m_itemDropEvent = 0; + m_itemDropEventMimeData = nullptr; + m_itemDropEvent = nullptr; } } void PlacesPanel::slotAboveItemDropEvent(int index, QGraphicsSceneDragDropEvent* event) { m_model->dropMimeDataBefore(index, event->mimeData()); - m_model->saveBookmarks(); } void PlacesPanel::slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget* parent) @@ -413,7 +433,7 @@ void PlacesPanel::slotTrashUpdated(KJob* job) emit errorMessage(job->errorString()); } // as long as KIO doesn't do this, do it ourselves - KNotification::event(QStringLiteral("Trash: emptied"), QString(), QPixmap(), 0, KNotification::DefaultEvent); + KNotification::event(QStringLiteral("Trash: emptied"), QString(), QPixmap(), nullptr, KNotification::DefaultEvent); } void PlacesPanel::slotStorageSetupDone(int index, bool success) @@ -456,9 +476,7 @@ void PlacesPanel::addEntry() dialog->setAllowGlobal(true); dialog->setUrl(url); if (dialog->exec() == QDialog::Accepted) { - PlacesItem* item = m_model->createPlacesItem(dialog->text(), dialog->url(), dialog->icon()); - m_model->appendItemToGroup(item); - m_model->saveBookmarks(); + m_model->createPlacesItem(dialog->text(), dialog->url(), dialog->icon()); } delete dialog; @@ -480,7 +498,7 @@ void PlacesPanel::editEntry(int index) oldItem->setText(dialog->text()); oldItem->setUrl(dialog->url()); oldItem->setIcon(dialog->icon()); - m_model->saveBookmarks(); + m_model->refresh(); } } @@ -517,9 +535,9 @@ void PlacesPanel::triggerItem(int index, Qt::MouseButton button) const QUrl url = m_model->data(index).value("url").toUrl(); if (!url.isEmpty()) { if (button == Qt::MiddleButton) { - emit placeMiddleClicked(PlacesItemModel::convertedUrl(url)); + emit placeMiddleClicked(KFilePlacesModel::convertedUrl(url)); } else { - emit placeActivated(PlacesItemModel::convertedUrl(url)); + emit placeActivated(KFilePlacesModel::convertedUrl(url)); } } } diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h index 4e525a037..444785888 100644 --- a/src/panels/places/placespanel.h +++ b/src/panels/places/placespanel.h @@ -31,6 +31,7 @@ class PlacesItemModel; class PlacesView; class QGraphicsSceneDragDropEvent; class KJob; +class QMenu; /** * @brief Combines bookmarks and mounted devices as list. */ @@ -40,7 +41,7 @@ class PlacesPanel : public Panel public: explicit PlacesPanel(QWidget* parent); - virtual ~PlacesPanel(); + ~PlacesPanel() override; void proceedWithTearDown(); signals: @@ -51,11 +52,11 @@ signals: void storageTearDownExternallyRequested(const QString& mountPath); protected: - virtual bool urlChanged() Q_DECL_OVERRIDE; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + bool urlChanged() override; + void showEvent(QShowEvent* event) override; public slots: - virtual void readSettings() Q_DECL_OVERRIDE; + void readSettings() override; private slots: void slotItemActivated(int index); @@ -82,6 +83,8 @@ private: void triggerItem(int index, Qt::MouseButton button); + QAction* buildGroupContextMenu(QMenu* menu, int index); + private: KItemListController* m_controller; PlacesItemModel* m_model; diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index b7d3605aa..849d3f8c9 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -38,11 +38,11 @@ TerminalPanel::TerminalPanel(QWidget* parent) : Panel(parent), m_clearTerminal(true), - m_mostLocalUrlJob(0), - m_layout(0), - m_terminal(0), - m_terminalWidget(0), - m_konsolePart(0), + m_mostLocalUrlJob(nullptr), + m_layout(nullptr), + m_terminal(nullptr), + m_terminalWidget(nullptr), + m_konsolePart(nullptr), m_konsolePartCurrentDirectory(), m_sendCdToTerminalHistory() { @@ -69,16 +69,23 @@ QString TerminalPanel::currentWorkingDirectory() void TerminalPanel::terminalExited() { - m_terminal = 0; + m_terminal = nullptr; emit hideTerminalPanel(); } +bool TerminalPanel::isHiddenInVisibleWindow() +{ + return parentWidget() + && parentWidget()->isHidden() + && m_terminal + && (m_terminal->foregroundProcessId() == -1); +} + void TerminalPanel::dockVisibilityChanged() { // Only react when the DockWidget itself (not some parent) is hidden. This way we don't // respond when e.g. Dolphin is minimized. - if (parentWidget() && parentWidget()->isHidden() && - m_terminal && (m_terminal->foregroundProcessId() == -1)) { + if (isHiddenInVisibleWindow()) { // Make sure that the following "cd /" command will not affect the view. disconnect(m_konsolePart, SIGNAL(currentDirectoryChanged(QString)), this, SLOT(slotKonsolePartCurrentDirectoryChanged(QString))); @@ -117,12 +124,12 @@ void TerminalPanel::showEvent(QShowEvent* event) if (!m_terminal) { m_clearTerminal = true; - KPluginFactory* factory = 0; + KPluginFactory* factory = nullptr; KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("konsolepart")); if (service) { factory = KPluginLoader(service->library()).factory(); } - m_konsolePart = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : 0; + m_konsolePart = factory ? (factory->create<KParts::ReadOnlyPart>(this)) : nullptr; if (m_konsolePart) { connect(m_konsolePart, &KParts::ReadOnlyPart::destroyed, this, &TerminalPanel::terminalExited); m_terminalWidget = m_konsolePart->widget(); @@ -144,7 +151,7 @@ void TerminalPanel::showEvent(QShowEvent* event) void TerminalPanel::changeDir(const QUrl& url) { delete m_mostLocalUrlJob; - m_mostLocalUrlJob = 0; + m_mostLocalUrlJob = nullptr; if (url.isLocalFile()) { sendCdToTerminal(url.toLocalFile()); @@ -198,7 +205,7 @@ void TerminalPanel::slotMostLocalUrlResult(KJob* job) sendCdToTerminal(url.toLocalFile()); } - m_mostLocalUrlJob = 0; + m_mostLocalUrlJob = nullptr; } void TerminalPanel::slotKonsolePartCurrentDirectoryChanged(const QString& dir) diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index db5658e53..edaa2a6f3 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -46,7 +46,7 @@ class TerminalPanel : public Panel public: explicit TerminalPanel(QWidget* parent = nullptr); - virtual ~TerminalPanel(); + ~TerminalPanel() override; /** * @brief This function is used to set the terminal panels's cwd to @@ -54,6 +54,7 @@ public: */ void goHome(); QString currentWorkingDirectory(); + bool isHiddenInVisibleWindow(); public slots: void terminalExited(); @@ -68,9 +69,9 @@ signals: void changeUrl(const QUrl& url); protected: - virtual bool urlChanged() Q_DECL_OVERRIDE; + bool urlChanged() override; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; private slots: void slotMostLocalUrlResult(KJob* job); diff --git a/src/search/dolphinfacetswidget.h b/src/search/dolphinfacetswidget.h index 996829ee3..1e8ab6cea 100644 --- a/src/search/dolphinfacetswidget.h +++ b/src/search/dolphinfacetswidget.h @@ -48,7 +48,7 @@ class DolphinFacetsWidget : public QWidget public: explicit DolphinFacetsWidget(QWidget* parent = nullptr); - virtual ~DolphinFacetsWidget(); + ~DolphinFacetsWidget() override; QString ratingTerm() const; QString facetType() const; diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index 345692008..44de97aa0 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -53,20 +53,20 @@ DolphinSearchBox::DolphinSearchBox(QWidget* parent) : QWidget(parent), m_startedSearching(false), m_active(true), - m_topLayout(0), - m_searchLabel(0), - m_searchInput(0), - m_saveSearchAction(0), - m_optionsScrollArea(0), - m_fileNameButton(0), - m_contentButton(0), - m_separator(0), - m_fromHereButton(0), - m_everywhereButton(0), - m_facetsToggleButton(0), - m_facetsWidget(0), + m_topLayout(nullptr), + m_searchLabel(nullptr), + m_searchInput(nullptr), + m_saveSearchAction(nullptr), + m_optionsScrollArea(nullptr), + m_fileNameButton(nullptr), + m_contentButton(nullptr), + m_separator(nullptr), + m_fromHereButton(nullptr), + m_everywhereButton(nullptr), + m_facetsToggleButton(nullptr), + m_facetsWidget(nullptr), m_searchPath(), - m_startSearchTimer(0) + m_startSearchTimer(nullptr) { } @@ -310,11 +310,9 @@ void DolphinSearchBox::slotSearchSaved() if (searchURL.isValid()) { PlacesItemModel model; const QString label = i18n("Search for %1 in %2", text(), searchPath().fileName()); - PlacesItem* item = model.createPlacesItem(label, - searchURL, - QStringLiteral("folder-saved-search-symbolic")); - model.appendItemToGroup(item); - model.saveBookmarks(); + model.createPlacesItem(label, + searchURL, + QStringLiteral("folder-saved-search-symbolic")); } } diff --git a/src/search/dolphinsearchbox.h b/src/search/dolphinsearchbox.h index f1ea49091..c138cfe7f 100644 --- a/src/search/dolphinsearchbox.h +++ b/src/search/dolphinsearchbox.h @@ -46,8 +46,8 @@ class DolphinSearchBox : public QWidget { Q_OBJECT public: - explicit DolphinSearchBox(QWidget* parent = 0); - virtual ~DolphinSearchBox(); + explicit DolphinSearchBox(QWidget* parent = nullptr); + ~DolphinSearchBox() override; /** * Sets the text that should be used as input for @@ -99,11 +99,11 @@ public: bool isActive() const; protected: - virtual bool event(QEvent* event) Q_DECL_OVERRIDE; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; - virtual void keyReleaseEvent(QKeyEvent* event) Q_DECL_OVERRIDE; - virtual bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE; + bool event(QEvent* event) override; + void showEvent(QShowEvent* event) override; + void hideEvent(QHideEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; + bool eventFilter(QObject* obj, QEvent* event) override; signals: /** diff --git a/src/settings/additionalinfodialog.cpp b/src/settings/additionalinfodialog.cpp index 4589b5d44..3eacd522f 100644 --- a/src/settings/additionalinfodialog.cpp +++ b/src/settings/additionalinfodialog.cpp @@ -41,7 +41,7 @@ AdditionalInfoDialog::AdditionalInfoDialog(QWidget* parent, const QList<QByteArray>& visibleRoles) : QDialog(parent), m_visibleRoles(visibleRoles), - m_listWidget(0) + m_listWidget(nullptr) { setWindowTitle(i18nc("@title:window", "Additional Information")); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); diff --git a/src/settings/additionalinfodialog.h b/src/settings/additionalinfodialog.h index fd72a7ce1..2a4cd7dba 100644 --- a/src/settings/additionalinfodialog.h +++ b/src/settings/additionalinfodialog.h @@ -34,11 +34,11 @@ class AdditionalInfoDialog : public QDialog public: AdditionalInfoDialog(QWidget* parent, const QList<QByteArray>& visibleRoles); - virtual ~AdditionalInfoDialog(); + ~AdditionalInfoDialog() override; QList<QByteArray> visibleRoles() const; public slots: - void accept() Q_DECL_OVERRIDE; + void accept() override; private: QList<QByteArray> m_visibleRoles; diff --git a/src/settings/applyviewpropsjob.cpp b/src/settings/applyviewpropsjob.cpp index 591966759..59f8c8eee 100644 --- a/src/settings/applyviewpropsjob.cpp +++ b/src/settings/applyviewpropsjob.cpp @@ -26,7 +26,7 @@ ApplyViewPropsJob::ApplyViewPropsJob(const QUrl& dir, const ViewProperties& viewProps) : KIO::Job(), - m_viewProps(0), + m_viewProps(nullptr), m_progress(0), m_dir(dir) { @@ -46,7 +46,7 @@ ApplyViewPropsJob::ApplyViewPropsJob(const QUrl& dir, ApplyViewPropsJob::~ApplyViewPropsJob() { delete m_viewProps; // the properties are written by the destructor - m_viewProps = 0; + m_viewProps = nullptr; } void ApplyViewPropsJob::slotEntries(KIO::Job*, const KIO::UDSEntryList& list) diff --git a/src/settings/applyviewpropsjob.h b/src/settings/applyviewpropsjob.h index ea9688718..aeb4a60c6 100644 --- a/src/settings/applyviewpropsjob.h +++ b/src/settings/applyviewpropsjob.h @@ -60,11 +60,11 @@ public: * sub directories. */ ApplyViewPropsJob(const QUrl& dir, const ViewProperties& viewProps); - virtual ~ApplyViewPropsJob(); + ~ApplyViewPropsJob() override; int progress() const; private slots: - virtual void slotResult(KJob* job) Q_DECL_OVERRIDE; + void slotResult(KJob* job) override; void slotEntries(KIO::Job*, const KIO::UDSEntryList&); private: diff --git a/src/settings/dolphin_directoryviewpropertysettings.kcfg b/src/settings/dolphin_directoryviewpropertysettings.kcfg index 9584fc8b3..6bcf3cd02 100644 --- a/src/settings/dolphin_directoryviewpropertysettings.kcfg +++ b/src/settings/dolphin_directoryviewpropertysettings.kcfg @@ -30,7 +30,7 @@ <entry name="PreviewsShown" type="Bool" > <label context="@label">Previews shown</label> <whatsthis context="@info:whatsthis">When this option is enabled, a preview of the file content is shown as an icon.</whatsthis> - <default>false</default> + <default>true</default> </entry> <entry name="GroupedSorting" type="Bool" > diff --git a/src/settings/dolphinsettingsdialog.h b/src/settings/dolphinsettingsdialog.h index 194af28fc..4c8768fde 100644 --- a/src/settings/dolphinsettingsdialog.h +++ b/src/settings/dolphinsettingsdialog.h @@ -36,8 +36,8 @@ class DolphinSettingsDialog : public KPageDialog Q_OBJECT public: - explicit DolphinSettingsDialog(const QUrl& url, QWidget* parent = 0); - virtual ~DolphinSettingsDialog(); + explicit DolphinSettingsDialog(const QUrl& url, QWidget* parent = nullptr); + ~DolphinSettingsDialog() override; signals: void settingsChanged(); diff --git a/src/settings/general/behaviorsettingspage.h b/src/settings/general/behaviorsettingspage.h index 96eaf3d64..16a3e95c2 100644 --- a/src/settings/general/behaviorsettingspage.h +++ b/src/settings/general/behaviorsettingspage.h @@ -37,13 +37,13 @@ class BehaviorSettingsPage : public SettingsPageBase public: BehaviorSettingsPage(const QUrl &url, QWidget* parent); - virtual ~BehaviorSettingsPage(); + ~BehaviorSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: void loadSettings(); diff --git a/src/settings/general/configurepreviewplugindialog.h b/src/settings/general/configurepreviewplugindialog.h index 620caeb51..e54fb464a 100644 --- a/src/settings/general/configurepreviewplugindialog.h +++ b/src/settings/general/configurepreviewplugindialog.h @@ -40,7 +40,7 @@ public: ConfigurePreviewPluginDialog(const QString& pluginName, const QString& desktopEntryName, QWidget* parent); - virtual ~ConfigurePreviewPluginDialog() = default; + ~ConfigurePreviewPluginDialog() override = default; }; #endif diff --git a/src/settings/general/confirmationssettingspage.cpp b/src/settings/general/confirmationssettingspage.cpp index 2419dc0f4..90dd0ad37 100644 --- a/src/settings/general/confirmationssettingspage.cpp +++ b/src/settings/general/confirmationssettingspage.cpp @@ -35,9 +35,9 @@ namespace { ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) : SettingsPageBase(parent), - m_confirmMoveToTrash(0), - m_confirmDelete(0), - m_confirmClosingMultipleTabs(0) + m_confirmMoveToTrash(nullptr), + m_confirmDelete(nullptr), + m_confirmClosingMultipleTabs(nullptr) { QVBoxLayout* topLayout = new QVBoxLayout(this); diff --git a/src/settings/general/confirmationssettingspage.h b/src/settings/general/confirmationssettingspage.h index e702fe8ae..f8e5e3540 100644 --- a/src/settings/general/confirmationssettingspage.h +++ b/src/settings/general/confirmationssettingspage.h @@ -32,13 +32,13 @@ class ConfirmationsSettingsPage : public SettingsPageBase public: ConfirmationsSettingsPage(QWidget* parent); - virtual ~ConfirmationsSettingsPage(); + ~ConfirmationsSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: void loadSettings(); diff --git a/src/settings/general/generalsettingspage.cpp b/src/settings/general/generalsettingspage.cpp index d8f61ef90..f9a2c67d0 100644 --- a/src/settings/general/generalsettingspage.cpp +++ b/src/settings/general/generalsettingspage.cpp @@ -65,7 +65,7 @@ GeneralSettingsPage::GeneralSettingsPage(const QUrl& url, QWidget* parent) : m_pages.append(confirmationsPage); m_pages.append(statusBarPage); - topLayout->addWidget(tabWidget, 0, 0); + topLayout->addWidget(tabWidget, 0, nullptr); } GeneralSettingsPage::~GeneralSettingsPage() diff --git a/src/settings/general/generalsettingspage.h b/src/settings/general/generalsettingspage.h index 7073258ff..a68fc933b 100644 --- a/src/settings/general/generalsettingspage.h +++ b/src/settings/general/generalsettingspage.h @@ -41,13 +41,13 @@ class GeneralSettingsPage : public SettingsPageBase public: GeneralSettingsPage(const QUrl& url, QWidget* parent); - virtual ~GeneralSettingsPage(); + ~GeneralSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: QList<SettingsPageBase*> m_pages; diff --git a/src/settings/general/previewssettingspage.cpp b/src/settings/general/previewssettingspage.cpp index 1a92cd16c..e579a572d 100644 --- a/src/settings/general/previewssettingspage.cpp +++ b/src/settings/general/previewssettingspage.cpp @@ -26,6 +26,7 @@ #include <KLocalizedString> #include <KServiceTypeTrader> #include <KService> +#include <KIO/PreviewJob> #include <settings/serviceitemdelegate.h> #include <settings/servicemodel.h> @@ -51,9 +52,9 @@ namespace { PreviewsSettingsPage::PreviewsSettingsPage(QWidget* parent) : SettingsPageBase(parent), m_initialized(false), - m_listView(0), + m_listView(nullptr), m_enabledPreviewPlugins(), - m_remoteFileSizeBox(0) + m_remoteFileSizeBox(nullptr) { QVBoxLayout* topLayout = new QVBoxLayout(this); @@ -172,11 +173,8 @@ void PreviewsSettingsPage::loadPreviewPlugins() void PreviewsSettingsPage::loadSettings() { - KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings"); - m_enabledPreviewPlugins = globalConfig.readEntry("Plugins", QStringList() - << QStringLiteral("directorythumbnail") - << QStringLiteral("imagethumbnail") - << QStringLiteral("jpegthumbnail")); + const KConfigGroup globalConfig(KSharedConfig::openConfig(), QStringLiteral("PreviewSettings")); + m_enabledPreviewPlugins = globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()); const qulonglong defaultRemotePreview = static_cast<qulonglong>(MaxRemotePreviewSize) * 1024 * 1024; const qulonglong maxRemoteByteSize = globalConfig.readEntry("MaximumRemoteSize", defaultRemotePreview); diff --git a/src/settings/general/previewssettingspage.h b/src/settings/general/previewssettingspage.h index 6e896f05e..0bac4da65 100644 --- a/src/settings/general/previewssettingspage.h +++ b/src/settings/general/previewssettingspage.h @@ -35,20 +35,20 @@ class PreviewsSettingsPage : public SettingsPageBase public: PreviewsSettingsPage(QWidget* parent); - virtual ~PreviewsSettingsPage(); + ~PreviewsSettingsPage() override; /** * Applies the general settings for the view modes * The settings are persisted automatically when * closing Dolphin. */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** Restores the settings to default values. */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; protected: - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; private slots: void configureService(const QModelIndex& index); diff --git a/src/settings/general/statusbarsettingspage.h b/src/settings/general/statusbarsettingspage.h index 608354371..d85f0aaa1 100644 --- a/src/settings/general/statusbarsettingspage.h +++ b/src/settings/general/statusbarsettingspage.h @@ -32,13 +32,13 @@ class StatusBarSettingsPage : public SettingsPageBase public: StatusBarSettingsPage(QWidget* parent); - virtual ~StatusBarSettingsPage(); + ~StatusBarSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: void loadSettings(); diff --git a/src/settings/kcm/kcmdolphingeneral.cpp b/src/settings/kcm/kcmdolphingeneral.cpp index f5ac4cd55..3aedf5075 100644 --- a/src/settings/kcm/kcmdolphingeneral.cpp +++ b/src/settings/kcm/kcmdolphingeneral.cpp @@ -65,7 +65,7 @@ DolphinGeneralConfigModule::DolphinGeneralConfigModule(QWidget* parent, const QV m_pages.append(previewsPage); m_pages.append(confirmationsPage); - topLayout->addWidget(tabWidget, 0, 0); + topLayout->addWidget(tabWidget, 0, nullptr); } DolphinGeneralConfigModule::~DolphinGeneralConfigModule() diff --git a/src/settings/kcm/kcmdolphingeneral.h b/src/settings/kcm/kcmdolphingeneral.h index 50331a75c..66e42009f 100644 --- a/src/settings/kcm/kcmdolphingeneral.h +++ b/src/settings/kcm/kcmdolphingeneral.h @@ -34,10 +34,10 @@ class DolphinGeneralConfigModule : public KCModule public: DolphinGeneralConfigModule(QWidget* parent, const QVariantList& args); - virtual ~DolphinGeneralConfigModule(); + ~DolphinGeneralConfigModule() override; - virtual void save() Q_DECL_OVERRIDE; - virtual void defaults() Q_DECL_OVERRIDE; + void save() override; + void defaults() override; private: QList<SettingsPageBase*> m_pages; diff --git a/src/settings/kcm/kcmdolphinnavigation.cpp b/src/settings/kcm/kcmdolphinnavigation.cpp index 9ec6ca166..54cf7ed3c 100644 --- a/src/settings/kcm/kcmdolphinnavigation.cpp +++ b/src/settings/kcm/kcmdolphinnavigation.cpp @@ -30,7 +30,7 @@ K_PLUGIN_FACTORY(KCMDolphinNavigationConfigFactory, registerPlugin<DolphinNaviga DolphinNavigationConfigModule::DolphinNavigationConfigModule(QWidget* parent, const QVariantList& args) : KCModule(parent), - m_navigation(0) + m_navigation(nullptr) { Q_UNUSED(args); @@ -41,7 +41,7 @@ DolphinNavigationConfigModule::DolphinNavigationConfigModule(QWidget* parent, co m_navigation = new NavigationSettingsPage(this); connect(m_navigation, &NavigationSettingsPage::changed, this, static_cast<void(DolphinNavigationConfigModule::*)()>(&DolphinNavigationConfigModule::changed)); - topLayout->addWidget(m_navigation, 0, 0); + topLayout->addWidget(m_navigation, 0, nullptr); } DolphinNavigationConfigModule::~DolphinNavigationConfigModule() diff --git a/src/settings/kcm/kcmdolphinnavigation.h b/src/settings/kcm/kcmdolphinnavigation.h index e8de0753e..2bcc7abab 100644 --- a/src/settings/kcm/kcmdolphinnavigation.h +++ b/src/settings/kcm/kcmdolphinnavigation.h @@ -33,10 +33,10 @@ class DolphinNavigationConfigModule : public KCModule public: DolphinNavigationConfigModule(QWidget* parent, const QVariantList& args); - virtual ~DolphinNavigationConfigModule(); + ~DolphinNavigationConfigModule() override; - virtual void save() Q_DECL_OVERRIDE; - virtual void defaults() Q_DECL_OVERRIDE; + void save() override; + void defaults() override; private: NavigationSettingsPage* m_navigation; diff --git a/src/settings/kcm/kcmdolphinservices.cpp b/src/settings/kcm/kcmdolphinservices.cpp index 39136724e..5d011c627 100644 --- a/src/settings/kcm/kcmdolphinservices.cpp +++ b/src/settings/kcm/kcmdolphinservices.cpp @@ -30,7 +30,7 @@ K_PLUGIN_FACTORY(KCMDolphinServicesConfigFactory, registerPlugin<DolphinServices DolphinServicesConfigModule::DolphinServicesConfigModule(QWidget* parent, const QVariantList& args) : KCModule(parent), - m_services(0) + m_services(nullptr) { Q_UNUSED(args); @@ -41,7 +41,7 @@ DolphinServicesConfigModule::DolphinServicesConfigModule(QWidget* parent, const m_services = new ServicesSettingsPage(this); connect(m_services, &ServicesSettingsPage::changed, this, static_cast<void(DolphinServicesConfigModule::*)()>(&DolphinServicesConfigModule::changed)); - topLayout->addWidget(m_services, 0, 0); + topLayout->addWidget(m_services, 0, nullptr); } DolphinServicesConfigModule::~DolphinServicesConfigModule() diff --git a/src/settings/kcm/kcmdolphinservices.h b/src/settings/kcm/kcmdolphinservices.h index 8a63bb045..6c6af6728 100644 --- a/src/settings/kcm/kcmdolphinservices.h +++ b/src/settings/kcm/kcmdolphinservices.h @@ -33,10 +33,10 @@ class DolphinServicesConfigModule : public KCModule public: DolphinServicesConfigModule(QWidget* parent, const QVariantList& args); - virtual ~DolphinServicesConfigModule(); + ~DolphinServicesConfigModule() override; - virtual void save() Q_DECL_OVERRIDE; - virtual void defaults() Q_DECL_OVERRIDE; + void save() override; + void defaults() override; private: ServicesSettingsPage* m_services; diff --git a/src/settings/kcm/kcmdolphinviewmodes.cpp b/src/settings/kcm/kcmdolphinviewmodes.cpp index 710ebc70b..af9b49026 100644 --- a/src/settings/kcm/kcmdolphinviewmodes.cpp +++ b/src/settings/kcm/kcmdolphinviewmodes.cpp @@ -66,7 +66,7 @@ DolphinViewModesConfigModule::DolphinViewModesConfigModule(QWidget* parent, cons m_tabs.append(compactTab); m_tabs.append(detailsTab); - topLayout->addWidget(tabWidget, 0, 0); + topLayout->addWidget(tabWidget, 0, nullptr); } DolphinViewModesConfigModule::~DolphinViewModesConfigModule() diff --git a/src/settings/kcm/kcmdolphinviewmodes.h b/src/settings/kcm/kcmdolphinviewmodes.h index 0a0b0ff10..c3775adff 100644 --- a/src/settings/kcm/kcmdolphinviewmodes.h +++ b/src/settings/kcm/kcmdolphinviewmodes.h @@ -33,10 +33,10 @@ class DolphinViewModesConfigModule : public KCModule public: DolphinViewModesConfigModule(QWidget* parent, const QVariantList& args); - virtual ~DolphinViewModesConfigModule(); + ~DolphinViewModesConfigModule() override; - virtual void save() Q_DECL_OVERRIDE; - virtual void defaults() Q_DECL_OVERRIDE; + void save() override; + void defaults() override; private: void reparseConfiguration(); diff --git a/src/settings/navigation/navigationsettingspage.cpp b/src/settings/navigation/navigationsettingspage.cpp index e37a35d8e..82015480a 100644 --- a/src/settings/navigation/navigationsettingspage.cpp +++ b/src/settings/navigation/navigationsettingspage.cpp @@ -28,8 +28,8 @@ NavigationSettingsPage::NavigationSettingsPage(QWidget* parent) : SettingsPageBase(parent), - m_openArchivesAsFolder(0), - m_autoExpandFolders(0) + m_openArchivesAsFolder(nullptr), + m_autoExpandFolders(nullptr) { QVBoxLayout* topLayout = new QVBoxLayout(this); QWidget* vBox = new QWidget(this); diff --git a/src/settings/navigation/navigationsettingspage.h b/src/settings/navigation/navigationsettingspage.h index 5410a4efa..d58a8e811 100644 --- a/src/settings/navigation/navigationsettingspage.h +++ b/src/settings/navigation/navigationsettingspage.h @@ -32,13 +32,13 @@ class NavigationSettingsPage : public SettingsPageBase public: NavigationSettingsPage(QWidget* parent); - virtual ~NavigationSettingsPage(); + ~NavigationSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: void loadSettings(); diff --git a/src/settings/serviceitemdelegate.h b/src/settings/serviceitemdelegate.h index 9f0ced40c..7b0d216db 100644 --- a/src/settings/serviceitemdelegate.h +++ b/src/settings/serviceitemdelegate.h @@ -33,20 +33,20 @@ class ServiceItemDelegate : public KWidgetItemDelegate Q_OBJECT public: - explicit ServiceItemDelegate(QAbstractItemView* itemView, QObject* parent = 0); - virtual ~ServiceItemDelegate(); + explicit ServiceItemDelegate(QAbstractItemView* itemView, QObject* parent = nullptr); + ~ServiceItemDelegate() override; - virtual QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const Q_DECL_OVERRIDE; + QSize sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const override; - virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, - const QModelIndex& index) const Q_DECL_OVERRIDE; + void paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const override; - virtual QList<QWidget*> createItemWidgets(const QModelIndex&) const Q_DECL_OVERRIDE; + QList<QWidget*> createItemWidgets(const QModelIndex&) const override; - virtual void updateItemWidgets(const QList<QWidget*> widgets, + void updateItemWidgets(const QList<QWidget*> widgets, const QStyleOptionViewItem& option, - const QPersistentModelIndex& index) const Q_DECL_OVERRIDE; + const QPersistentModelIndex& index) const override; signals: void requestServiceConfiguration(const QModelIndex& index); diff --git a/src/settings/servicemodel.h b/src/settings/servicemodel.h index f2b91c7e4..a08844b82 100644 --- a/src/settings/servicemodel.h +++ b/src/settings/servicemodel.h @@ -44,13 +44,13 @@ public: ConfigurableRole }; - explicit ServiceModel(QObject* parent = 0); - virtual ~ServiceModel(); + explicit ServiceModel(QObject* parent = nullptr); + ~ServiceModel() override; - virtual bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE; - virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) Q_DECL_OVERRIDE; - virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; - virtual int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE; + bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()) override; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; private: struct ServiceItem diff --git a/src/settings/services/servicessettingspage.cpp b/src/settings/services/servicessettingspage.cpp index 2b9b8f46f..a0d9effc8 100644 --- a/src/settings/services/servicessettingspage.cpp +++ b/src/settings/services/servicessettingspage.cpp @@ -58,9 +58,9 @@ namespace ServicesSettingsPage::ServicesSettingsPage(QWidget* parent) : SettingsPageBase(parent), m_initialized(false), - m_serviceModel(0), - m_sortModel(0), - m_listView(0), + m_serviceModel(nullptr), + m_sortModel(nullptr), + m_listView(nullptr), m_enabledVcsPlugins() { QVBoxLayout* topLayout = new QVBoxLayout(this); diff --git a/src/settings/services/servicessettingspage.h b/src/settings/services/servicessettingspage.h index a883aa947..c1239c9f5 100644 --- a/src/settings/services/servicessettingspage.h +++ b/src/settings/services/servicessettingspage.h @@ -36,16 +36,16 @@ class ServicesSettingsPage : public SettingsPageBase public: ServicesSettingsPage(QWidget* parent); - virtual ~ServicesSettingsPage(); + ~ServicesSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; protected: - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; private slots: /** diff --git a/src/settings/settingspagebase.h b/src/settings/settingspagebase.h index 05973d452..2bc1dfaaa 100644 --- a/src/settings/settingspagebase.h +++ b/src/settings/settingspagebase.h @@ -31,8 +31,8 @@ class SettingsPageBase : public QWidget Q_OBJECT public: - explicit SettingsPageBase(QWidget* parent = 0); - virtual ~SettingsPageBase(); + explicit SettingsPageBase(QWidget* parent = nullptr); + ~SettingsPageBase() override; /** * Must be implemented by a derived class to diff --git a/src/settings/startup/startupsettingspage.h b/src/settings/startup/startupsettingspage.h index 7a69cd3d6..da278e371 100644 --- a/src/settings/startup/startupsettingspage.h +++ b/src/settings/startup/startupsettingspage.h @@ -37,13 +37,13 @@ class StartupSettingsPage : public SettingsPageBase public: StartupSettingsPage(const QUrl& url, QWidget* parent); - virtual ~StartupSettingsPage(); + ~StartupSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private slots: void slotSettingsChanged(); diff --git a/src/settings/trash/trashsettingspage.h b/src/settings/trash/trashsettingspage.h index 5c88aeab7..57631b760 100644 --- a/src/settings/trash/trashsettingspage.h +++ b/src/settings/trash/trashsettingspage.h @@ -31,13 +31,13 @@ class TrashSettingsPage : public SettingsPageBase public: TrashSettingsPage(QWidget* parent); - virtual ~TrashSettingsPage(); + ~TrashSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: void loadSettings(); diff --git a/src/settings/viewmodes/dolphinfontrequester.cpp b/src/settings/viewmodes/dolphinfontrequester.cpp index b9c5d97cf..c185fc55d 100644 --- a/src/settings/viewmodes/dolphinfontrequester.cpp +++ b/src/settings/viewmodes/dolphinfontrequester.cpp @@ -29,8 +29,8 @@ DolphinFontRequester::DolphinFontRequester(QWidget* parent) : QWidget(parent), - m_modeCombo(0), - m_chooseFontButton(0), + m_modeCombo(nullptr), + m_chooseFontButton(nullptr), m_mode(SystemFont), m_customFont() { diff --git a/src/settings/viewmodes/dolphinfontrequester.h b/src/settings/viewmodes/dolphinfontrequester.h index 6ef6e3e72..3f355e314 100644 --- a/src/settings/viewmodes/dolphinfontrequester.h +++ b/src/settings/viewmodes/dolphinfontrequester.h @@ -41,7 +41,7 @@ public: }; DolphinFontRequester(QWidget* parent); - virtual ~DolphinFontRequester(); + ~DolphinFontRequester() override; void setMode(Mode mode); Mode mode() const; diff --git a/src/settings/viewmodes/viewsettingspage.cpp b/src/settings/viewmodes/viewsettingspage.cpp index 3ed57715a..ab87201e2 100644 --- a/src/settings/viewmodes/viewsettingspage.cpp +++ b/src/settings/viewmodes/viewsettingspage.cpp @@ -56,7 +56,7 @@ ViewSettingsPage::ViewSettingsPage(QWidget* parent) : m_tabs.append(compactTab); m_tabs.append(detailsTab); - topLayout->addWidget(tabWidget, 0, 0); + topLayout->addWidget(tabWidget, 0, nullptr); } ViewSettingsPage::~ViewSettingsPage() diff --git a/src/settings/viewmodes/viewsettingspage.h b/src/settings/viewmodes/viewsettingspage.h index 61671077e..4f57e5c19 100644 --- a/src/settings/viewmodes/viewsettingspage.h +++ b/src/settings/viewmodes/viewsettingspage.h @@ -37,13 +37,13 @@ class ViewSettingsPage : public SettingsPageBase public: ViewSettingsPage(QWidget* parent); - virtual ~ViewSettingsPage(); + ~ViewSettingsPage() override; /** @see SettingsPageBase::applySettings() */ - virtual void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; /** @see SettingsPageBase::restoreDefaults() */ - virtual void restoreDefaults() Q_DECL_OVERRIDE; + void restoreDefaults() override; private: QList<ViewSettingsTab*> m_tabs; diff --git a/src/settings/viewmodes/viewsettingstab.cpp b/src/settings/viewmodes/viewsettingstab.cpp index a673769ad..bfa3aa16e 100644 --- a/src/settings/viewmodes/viewsettingstab.cpp +++ b/src/settings/viewmodes/viewsettingstab.cpp @@ -40,12 +40,12 @@ ViewSettingsTab::ViewSettingsTab(Mode mode, QWidget* parent) : QWidget(parent), m_mode(mode), - m_defaultSizeSlider(0), - m_previewSizeSlider(0), - m_fontRequester(0), - m_widthBox(0), - m_maxLinesBox(0), - m_expandableFolders(0) + m_defaultSizeSlider(nullptr), + m_previewSizeSlider(nullptr), + m_fontRequester(nullptr), + m_widthBox(nullptr), + m_maxLinesBox(nullptr), + m_expandableFolders(nullptr) { QVBoxLayout* topLayout = new QVBoxLayout(this); @@ -202,7 +202,7 @@ void ViewSettingsTab::applySettings() void ViewSettingsTab::restoreDefaultSettings() { - KConfigSkeleton* settings = 0; + KConfigSkeleton* settings = nullptr; switch (m_mode) { case IconsMode: settings = IconsModeSettings::self(); break; case CompactMode: settings = CompactModeSettings::self(); break; diff --git a/src/settings/viewmodes/viewsettingstab.h b/src/settings/viewmodes/viewsettingstab.h index 6bea95b90..8b1ffc428 100644 --- a/src/settings/viewmodes/viewsettingstab.h +++ b/src/settings/viewmodes/viewsettingstab.h @@ -43,8 +43,8 @@ public: DetailsMode }; - explicit ViewSettingsTab(Mode mode, QWidget* parent = 0); - virtual ~ViewSettingsTab(); + explicit ViewSettingsTab(Mode mode, QWidget* parent = nullptr); + ~ViewSettingsTab() override; void applySettings(); void restoreDefaultSettings(); diff --git a/src/settings/viewpropertiesdialog.cpp b/src/settings/viewpropertiesdialog.cpp index c317ed052..980ab0bba 100644 --- a/src/settings/viewpropertiesdialog.cpp +++ b/src/settings/viewpropertiesdialog.cpp @@ -52,19 +52,19 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : QDialog(dolphinView), m_isDirty(false), m_dolphinView(dolphinView), - m_viewProps(0), - m_viewMode(0), - m_sortOrder(0), - m_sorting(0), - m_sortFoldersFirst(0), - m_previewsShown(0), - m_showInGroups(0), - m_showHiddenFiles(0), - m_additionalInfo(0), - m_applyToCurrentFolder(0), - m_applyToSubFolders(0), - m_applyToAllFolders(0), - m_useAsDefault(0) + m_viewProps(nullptr), + m_viewMode(nullptr), + m_sortOrder(nullptr), + m_sorting(nullptr), + m_sortFoldersFirst(nullptr), + m_previewsShown(nullptr), + m_showInGroups(nullptr), + m_showHiddenFiles(nullptr), + m_additionalInfo(nullptr), + m_applyToCurrentFolder(nullptr), + m_applyToSubFolders(nullptr), + m_applyToAllFolders(nullptr), + m_useAsDefault(nullptr) { Q_ASSERT(dolphinView); const bool useGlobalViewProps = GeneralSettings::globalViewProps(); @@ -217,7 +217,7 @@ ViewPropertiesDialog::~ViewPropertiesDialog() { m_isDirty = false; delete m_viewProps; - m_viewProps = 0; + m_viewProps = nullptr; KConfigGroup dialogConfig(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), "ViewPropertiesDialog"); KWindowConfig::saveWindowSize(windowHandle(), dialogConfig); diff --git a/src/settings/viewpropertiesdialog.h b/src/settings/viewpropertiesdialog.h index 5490be85b..35c18718e 100644 --- a/src/settings/viewpropertiesdialog.h +++ b/src/settings/viewpropertiesdialog.h @@ -45,10 +45,10 @@ class DOLPHIN_EXPORT ViewPropertiesDialog : public QDialog public: explicit ViewPropertiesDialog(DolphinView* dolphinView); - virtual ~ViewPropertiesDialog(); + ~ViewPropertiesDialog() override; public slots: - void accept() Q_DECL_OVERRIDE; + void accept() override; private slots: void slotApply(); diff --git a/src/settings/viewpropsprogressinfo.cpp b/src/settings/viewpropsprogressinfo.cpp index 56fee8027..1878c8137 100644 --- a/src/settings/viewpropsprogressinfo.cpp +++ b/src/settings/viewpropsprogressinfo.cpp @@ -39,12 +39,12 @@ ViewPropsProgressInfo::ViewPropsProgressInfo(QWidget* parent, const ViewProperties& viewProps) : QDialog(parent), m_dir(dir), - m_viewProps(0), - m_label(0), - m_progressBar(0), - m_dirSizeJob(0), - m_applyViewPropsJob(0), - m_timer(0) + m_viewProps(nullptr), + m_label(nullptr), + m_progressBar(nullptr), + m_dirSizeJob(nullptr), + m_applyViewPropsJob(nullptr), + m_timer(nullptr) { const QSize minSize = minimumSize(); setMinimumSize(QSize(320, minSize.height())); @@ -96,13 +96,13 @@ ViewPropsProgressInfo::ViewPropsProgressInfo(QWidget* parent, ViewPropsProgressInfo::~ViewPropsProgressInfo() { delete m_viewProps; - m_viewProps = 0; + m_viewProps = nullptr; } void ViewPropsProgressInfo::closeEvent(QCloseEvent* event) { m_timer->stop(); - m_applyViewPropsJob = 0; + m_applyViewPropsJob = nullptr; QDialog::closeEvent(event); } @@ -110,12 +110,12 @@ void ViewPropsProgressInfo::reject() { if (m_dirSizeJob) { m_dirSizeJob->kill(); - m_dirSizeJob = 0; + m_dirSizeJob = nullptr; } if (m_applyViewPropsJob) { m_applyViewPropsJob->kill(); - m_applyViewPropsJob = 0; + m_applyViewPropsJob = nullptr; } QDialog::reject(); @@ -144,7 +144,7 @@ void ViewPropsProgressInfo::applyViewProperties() m_label->setText(i18nc("@info:progress", "Folders: %1", subdirs)); m_progressBar->setMaximum(subdirs); - m_dirSizeJob = 0; + m_dirSizeJob = nullptr; m_applyViewPropsJob = new ApplyViewPropsJob(m_dir, *m_viewProps); connect(m_applyViewPropsJob, &ApplyViewPropsJob::result, diff --git a/src/settings/viewpropsprogressinfo.h b/src/settings/viewpropsprogressinfo.h index cd7aa50ce..e69de2976 100644 --- a/src/settings/viewpropsprogressinfo.h +++ b/src/settings/viewpropsprogressinfo.h @@ -53,13 +53,13 @@ public: const QUrl& dir, const ViewProperties& viewProps); - virtual ~ViewPropsProgressInfo(); + ~ViewPropsProgressInfo() override; protected: - virtual void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE; + void closeEvent(QCloseEvent* event) override; public slots: - void reject() Q_DECL_OVERRIDE; + void reject() override; private slots: void updateProgress(); diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 31d4ab81a..16683309d 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -23,6 +23,7 @@ #include <QIcon> #include <KLocalizedString> +#include <KSqueezedTextLabel> #include <QMenu> #include "statusbarspaceinfo.h" @@ -49,21 +50,20 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent) : QWidget(parent), m_text(), m_defaultText(), - m_label(0), - m_spaceInfo(0), - m_zoomSlider(0), - m_progressBar(0), - m_stopButton(0), + m_label(nullptr), + m_spaceInfo(nullptr), + m_zoomSlider(nullptr), + m_progressBar(nullptr), + m_stopButton(nullptr), m_progress(100), - m_showProgressBarTimer(0), - m_resetToDefaultTextTimer(0), + m_showProgressBarTimer(nullptr), + m_resetToDefaultTextTimer(nullptr), m_textTimestamp() { // Initialize text label - m_label = new QLabel(this); + m_label = new KSqueezedTextLabel(m_text, this); m_label->setWordWrap(true); m_label->setTextFormat(Qt::PlainText); - m_label->installEventFilter(this); // Initialize zoom widget m_zoomSlider = new QSlider(Qt::Horizontal, this); @@ -127,9 +127,9 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent) : QHBoxLayout* topLayout = new QHBoxLayout(this); topLayout->setContentsMargins(2, 0, 2, 0); topLayout->setSpacing(4); - topLayout->addWidget(m_label); - topLayout->addWidget(m_zoomSlider); - topLayout->addWidget(m_spaceInfo); + topLayout->addWidget(m_label, 1); + topLayout->addWidget(m_zoomSlider, 1); + topLayout->addWidget(m_spaceInfo, 1); topLayout->addWidget(m_stopButton); topLayout->addWidget(m_progressTextLabel); topLayout->addWidget(m_progressBar); @@ -282,14 +282,6 @@ void DolphinStatusBar::contextMenuEvent(QContextMenuEvent* event) } } -bool DolphinStatusBar::eventFilter(QObject* obj, QEvent* event) -{ - if (obj == m_label && event->type() == QEvent::Resize) { - updateLabelText(); - } - return QWidget::eventFilter(obj, event); -} - void DolphinStatusBar::showZoomSliderToolTip(int zoomLevel) { updateZoomSliderToolTip(zoomLevel); @@ -320,18 +312,7 @@ void DolphinStatusBar::updateProgressInfo() void DolphinStatusBar::updateLabelText() { const QString text = m_text.isEmpty() ? m_defaultText : m_text; - - // Set status bar text and elide it if too long - QFontMetrics fontMetrics(m_label->font()); - const QString elidedText = fontMetrics.elidedText(text, Qt::ElideRight, m_label->width()); - m_label->setText(elidedText); - - // If the text has been elided, set the original text as tooltip - if (text != elidedText) { - m_label->setToolTip(Qt::convertFromPlainText(text)); - } else { - m_label->setToolTip(QString()); - } + m_label->setText(text); } void DolphinStatusBar::slotResetToDefaultText() diff --git a/src/statusbar/dolphinstatusbar.h b/src/statusbar/dolphinstatusbar.h index 1a4ccf682..0b0004e47 100644 --- a/src/statusbar/dolphinstatusbar.h +++ b/src/statusbar/dolphinstatusbar.h @@ -30,6 +30,7 @@ class QProgressBar; class QToolButton; class QSlider; class QTimer; +class KSqueezedTextLabel; /** * @brief Represents the statusbar of a Dolphin view. @@ -43,7 +44,7 @@ class DolphinStatusBar : public QWidget public: DolphinStatusBar(QWidget* parent); - virtual ~DolphinStatusBar(); + ~DolphinStatusBar() override; QString text() const; @@ -101,8 +102,7 @@ signals: void zoomLevelChanged(int zoomLevel); protected: - virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE; - virtual bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE; + void contextMenuEvent(QContextMenuEvent* event) override; private slots: void showZoomSliderToolTip(int zoomLevel); @@ -140,7 +140,7 @@ private: private: QString m_text; QString m_defaultText; - QLabel* m_label; + KSqueezedTextLabel* m_label; StatusBarSpaceInfo* m_spaceInfo; QSlider* m_zoomSlider; diff --git a/src/statusbar/mountpointobserver.h b/src/statusbar/mountpointobserver.h index c3d2aa677..ea24c4eea 100644 --- a/src/statusbar/mountpointobserver.h +++ b/src/statusbar/mountpointobserver.h @@ -53,8 +53,8 @@ class MountPointObserver : public QObject { Q_OBJECT - explicit MountPointObserver(const QUrl& url, QObject* parent = 0); - virtual ~MountPointObserver() {} + explicit MountPointObserver(const QUrl& url, QObject* parent = nullptr); + ~MountPointObserver() override {} public: /** diff --git a/src/statusbar/mountpointobservercache.cpp b/src/statusbar/mountpointobservercache.cpp index 48796ac5a..bcdc0b61c 100644 --- a/src/statusbar/mountpointobservercache.cpp +++ b/src/statusbar/mountpointobservercache.cpp @@ -36,7 +36,7 @@ Q_GLOBAL_STATIC(MountPointObserverCacheSingleton, s_MountPointObserverCache) MountPointObserverCache::MountPointObserverCache() : m_observerForMountPoint(), m_mountPointForObserver(), - m_updateTimer(0) + m_updateTimer(nullptr) { m_updateTimer = new QTimer(this); } diff --git a/src/statusbar/mountpointobservercache.h b/src/statusbar/mountpointobservercache.h index 8a1496d89..74cef0674 100644 --- a/src/statusbar/mountpointobservercache.h +++ b/src/statusbar/mountpointobservercache.h @@ -31,7 +31,7 @@ class MountPointObserverCache : public QObject Q_OBJECT MountPointObserverCache(); - virtual ~MountPointObserverCache(); + ~MountPointObserverCache() override; public: static MountPointObserverCache* instance(); diff --git a/src/statusbar/spaceinfoobserver.cpp b/src/statusbar/spaceinfoobserver.cpp index 0fb018727..8f45c18f8 100644 --- a/src/statusbar/spaceinfoobserver.cpp +++ b/src/statusbar/spaceinfoobserver.cpp @@ -25,7 +25,7 @@ SpaceInfoObserver::SpaceInfoObserver(const QUrl& url, QObject* parent) : QObject(parent), - m_mountPointObserver(0), + m_mountPointObserver(nullptr), m_dataSize(0), m_dataAvailable(0) { @@ -39,7 +39,7 @@ SpaceInfoObserver::~SpaceInfoObserver() { if (m_mountPointObserver) { m_mountPointObserver->deref(); - m_mountPointObserver = 0; + m_mountPointObserver = nullptr; } } @@ -60,7 +60,7 @@ void SpaceInfoObserver::setUrl(const QUrl& url) if (m_mountPointObserver) { disconnect(m_mountPointObserver, &MountPointObserver::spaceInfoChanged, this, &SpaceInfoObserver::spaceInfoChanged); m_mountPointObserver->deref(); - m_mountPointObserver = 0; + m_mountPointObserver = nullptr; } m_mountPointObserver = newObserver; diff --git a/src/statusbar/spaceinfoobserver.h b/src/statusbar/spaceinfoobserver.h index e1311abde..144d11fa7 100644 --- a/src/statusbar/spaceinfoobserver.h +++ b/src/statusbar/spaceinfoobserver.h @@ -32,8 +32,8 @@ class SpaceInfoObserver : public QObject Q_OBJECT public: - explicit SpaceInfoObserver(const QUrl& url, QObject* parent = 0); - virtual ~SpaceInfoObserver(); + explicit SpaceInfoObserver(const QUrl& url, QObject* parent = nullptr); + ~SpaceInfoObserver() override; quint64 size() const; quint64 available() const; diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index f364fcf5b..6b6a6d610 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -31,7 +31,7 @@ StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : KCapacityBar(KCapacityBar::DrawTextInline, parent), - m_observer(0) + m_observer(nullptr) { setCursor(Qt::PointingHandCursor); } diff --git a/src/statusbar/statusbarspaceinfo.h b/src/statusbar/statusbarspaceinfo.h index 326c419ab..87e9f776b 100644 --- a/src/statusbar/statusbarspaceinfo.h +++ b/src/statusbar/statusbarspaceinfo.h @@ -40,16 +40,16 @@ class StatusBarSpaceInfo : public KCapacityBar Q_OBJECT public: - explicit StatusBarSpaceInfo(QWidget* parent = 0); - virtual ~StatusBarSpaceInfo(); + explicit StatusBarSpaceInfo(QWidget* parent = nullptr); + ~StatusBarSpaceInfo() override; void setUrl(const QUrl& url); QUrl url() const; protected: - void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; - void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; + void showEvent(QShowEvent* event) override; + void hideEvent(QHideEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; private slots: void slotValuesChanged(); diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 13bd963f9..c656173a8 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -58,4 +58,10 @@ ecm_add_test(dolphinmainwindowtest.cpp TEST_NAME dolphinmainwindowtest LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) -ecm_add_test(draganddrophelpertest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test)
\ No newline at end of file +ecm_add_test(draganddrophelpertest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) + +# PlacesItemModelTest +ecm_add_test(placesitemmodeltest.cpp +TEST_NAME placesitemmodeltest +LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) + diff --git a/src/tests/data/fakecomputer.xml b/src/tests/data/fakecomputer.xml new file mode 100644 index 000000000..48be0461b --- /dev/null +++ b/src/tests/data/fakecomputer.xml @@ -0,0 +1,387 @@ +<!-- Please note that in this file we indent more than necessary so that the + device tree is visible --> + +<machine> + <!-- This is a computer --> + <device udi="/org/kde/solid/fakehw/computer"> + <property key="name">Computer</property> + <property key="vendor">Solid</property> + </device> + + <!-- Two CPUs --> + <device udi="/org/kde/solid/fakehw/acpi_CPU0"> + <property key="name">Solid Processor #0</property> + <property key="interfaces">Processor</property> + <property key="vendor">Acme Corporation</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + <property key="number">0</property> + <property key="maxSpeed">3200</property> + <property key="canChangeFrequency">true</property> + <property key="instructionSets">mmx,sse</property> + </device> + <device udi="/org/kde/solid/fakehw/acpi_CPU1"> + <property key="name">Solid Processor #1</property> + <property key="interfaces">Processor</property> + <property key="vendor">Acme Corporation</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + <property key="number">1</property> + <property key="maxSpeed">3200</property> + <property key="canChangeFrequency">true</property> + </device> + + <!-- Platform Device for a floppy drive --> + <device udi="/org/kde/solid/fakehw/platform_floppy_0"> + <property key="name">Platform Device (floppy)</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + </device> + <!-- The actual floppy device --> + <device udi="/org/kde/solid/fakehw/platform_floppy_0_storage"> + <property key="name">PC Floppy Drive</property> + <property key="interfaces">StorageDrive,Block</property> + <property key="parent">/org/kde/solid/fakehw/platform_floppy_0</property> + + <property key="minor">0</property> + <property key="major">2</property> + <property key="device">/dev/fd0</property> + + <property key="bus">platform</property> + <property key="driveType">floppy</property> + <property key="isRemovable">true</property> + <property key="isEjectRequired">false</property> + <property key="isHotpluggable">false</property> + <property key="isMediaCheckEnabled">false</property> + </device> + <!-- A (generally) virtual volume tracking the floppy drive state --> + <device udi="/org/kde/solid/fakehw/platform_floppy_0_storage_virt_volume"> + <property key="name">Floppy Disk</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/platform_floppy_0_storage</property> + + <property key="minor">0</property> + <property key="major">2</property> + <property key="device">/dev/fd0</property> + + <property key="isIgnored">false</property> + <property key="isMounted">true</property> + <property key="mountPoint">/media/floppy0</property> + <property key="usage">filesystem</property> + </device> + + + + <!-- Primary IDE controller --> + <device udi="/org/kde/solid/fakehw/pci_001"> + <property key="name">99021 IDE Controller #1</property> + <property key="vendor">Acme Corporation</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + </device> + + <!-- Master device... --> + <device udi="/org/kde/solid/fakehw/pci_001_ide_0_0"> + <property key="name">IDE device (master)</property> + <property key="parent">/org/kde/solid/fakehw/pci_001</property> + </device> + <!-- ... is a 250GB disk... --> + <device udi="/org/kde/solid/fakehw/storage_serial_HD56890I"> + <property key="name">HD250GB</property> + <property key="vendor">Acme Corporation</property> + <property key="interfaces">StorageDrive,Block</property> + <property key="parent">/org/kde/solid/fakehw/pci_001_ide_0_0</property> + + <property key="minor">0</property> + <property key="major">3</property> + <property key="device">/dev/hda</property> + + <property key="bus">scsi</property> + <property key="driveType">disk</property> + <property key="isRemovable">false</property> + <property key="isEjectRequired">false</property> + <property key="isHotpluggable">false</property> + <property key="isMediaCheckEnabled">false</property> + <property key="product">HD250GBSATA</property> + </device> + <!-- ... with five partitions: + - one physical partition (the root /, ext3, 20GB) + - one extended containing three logical volumes: + - a swap volume (2GB) + - /home volume (xfs, 208GB) + - /foreign volume (ntfs, 20GB) + --> + <device udi="/org/kde/solid/fakehw/volume_uuid_feedface"> + <property key="name">/</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_HD56890I</property> + + <property key="minor">1</property> + <property key="major">3</property> + <property key="device">/dev/hda1</property> + + <property key="isIgnored">true</property> + <property key="isMounted">true</property> + <property key="mountPoint">/</property> + <property key="usage">filesystem</property> + <property key="fsType">ext3</property> + <property key="label">Root</property> + <property key="uuid">feedface</property> + <property key="size">21474836480</property> + </device> + <device udi="/org/kde/solid/fakehw/volume_uuid_c0ffee"> + <property key="name">/home</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_HD56890I</property> + + <property key="minor">6</property> + <property key="major">3</property> + <property key="device">/dev/hda6</property> + + <property key="isIgnored">true</property> + <property key="isMounted">true</property> + <property key="mountPoint">/home</property> + <property key="usage">filesystem</property> + <property key="fsType">xfs</property> + <property key="label">Home</property> + <property key="uuid">c0ffee</property> + <property key="size">223338299392</property> + </device> + <device udi="/org/kde/solid/fakehw/volume_uuid_f00ba7"> + <property key="name">/foreign</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_HD56890I</property> + + <property key="minor">7</property> + <property key="major">3</property> + <property key="device">/dev/hda7</property> + + <property key="isIgnored">false</property> + <property key="isMounted">true</property> + <property key="mountPoint">/foreign</property> + <property key="usage">filesystem</property> + <property key="fsType">ntfs</property> + <property key="label">Foreign</property> + <property key="uuid">f00ba7</property> + <property key="size">21474836480</property> + </device> + <device udi="/org/kde/solid/fakehw/volume_part2_size_1024"> + <property key="name">StorageVolume</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_HD56890I</property> + + <property key="minor">2</property> + <property key="major">3</property> + <property key="device">/dev/hda2</property> + + <property key="isIgnored">true</property> + <property key="isMounted">false</property> + <property key="usage">other</property> + <property key="size">1024</property> + </device> + <device udi="/org/kde/solid/fakehw/volume_part5_size_1048576"> + <property key="name">StorageVolume (swap)</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_HD56890I</property> + + <property key="minor">5</property> + <property key="major">3</property> + <property key="device">/dev/hda5</property> + + <property key="isIgnored">true</property> + <property key="isMounted">false</property> + <property key="usage">other</property> + <property key="fsType">swap</property> + <property key="size">2147483648</property> + </device> + + + <!-- Secondary IDE controller --> + <device udi="/org/kde/solid/fakehw/pci_002"> + <property key="name">99021 IDE Controller #2</property> + <property key="vendor">Acme Corporation</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + </device> + + <!-- Master device... --> + <device udi="/org/kde/solid/fakehw/pci_002_ide_1_0"> + <property key="name">IDE device (master)</property> + <property key="parent">/org/kde/solid/fakehw/pci_002</property> + </device> + <!-- ... is a DVD writer... --> + <device udi="/org/kde/solid/fakehw/storage_model_solid_writer"> + <property key="name">Solid IDE DVD Writer</property> + <property key="vendor">Acme Corporation</property> + <property key="interfaces">Block,StorageDrive,OpticalDrive</property> + <property key="parent">/org/kde/solid/fakehw/pci_002_ide_1_0</property> + + <property key="minor">0</property> + <property key="major">22</property> + <property key="device">/dev/hdc</property> + + <property key="bus">ide</property> + <property key="driveType">cdrom</property> + <property key="isRemovable">true</property> + <property key="isEjectRequired">true</property> + <property key="isHotpluggable">false</property> + <property key="isMediaCheckEnabled">true</property> + <property key="product">Solid DVD Writer</property> + + <property key="supportedMedia">cdr,cdrw,dvd,dvdr,dvdrw</property> + <property key="readSpeed">4234</property> + <property key="writeSpeed">4234</property> + <property key="writeSpeeds">4234,2822,2117,1411,706</property> + </device> + <!-- ... with a cd-r in it --> + <device udi="/org/kde/solid/fakehw/volume_uuid_5011"> + <property key="name">FooDistro i386</property> + <property key="interfaces">Block,StorageVolume,OpticalDisc,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_model_solid_writer</property> + + <property key="discType">cd_rw</property> + <property key="isAppendable">false</property> + <property key="isRewritable">true</property> + <property key="isBlank">false</property> + <property key="availableContent">data</property> + <property key="mountPoint">/media/cdrom</property> + + <property key="uuid">5011</property> + <property key="size">731047936</property> + <property key="label">FooDistro i386</property> + </device> + + <!-- Slave device... --> + <device udi="/org/kde/solid/fakehw/pci_002_ide_1_1"> + <property key="name">IDE device (slave)</property> + <property key="parent">/org/kde/solid/fakehw/pci_002</property> + </device> + <!-- ... is a DVD reader... --> + <device udi="/org/kde/solid/fakehw/storage_model_solid_reader"> + <property key="name">Solid IDE DVD Reader</property> + <property key="vendor">Acme Corporation</property> + <property key="interfaces">Block,StorageDrive,OpticalDrive</property> + <property key="parent">/org/kde/solid/fakehw/pci_002_ide_1_1</property> + + <property key="minor">0</property> + <property key="major">22</property> + <property key="device">/dev/hdc</property> + + <property key="bus">ide</property> + <property key="driveType">cdrom</property> + <property key="isRemovable">true</property> + <property key="isEjectRequired">true</property> + <property key="isHotpluggable">false</property> + <property key="isMediaCheckEnabled">true</property> + <property key="product">Solid DVD Reader</property> + + <property key="supportedMedia">cdr,cdrw,dvd,dvdr,dvdrw,dvdram,dvdplusr,dvdplusrw</property> + <property key="readSpeed">4234</property> + </device> + <!-- ... with a DVD Video in it --> + <device udi="/org/kde/solid/fakehw/volume_label_SOLIDMAN_BEGINS"> + <property key="name">SolidMan Begins</property> + <property key="interfaces">Block,StorageVolume,OpticalDisc</property> + <property key="parent">/org/kde/solid/fakehw/storage_model_solid_reader</property> + + <property key="discType">dvd_rom</property> + <property key="isAppendable">false</property> + <property key="isRewritable">false</property> + <property key="isBlank">false</property> + <property key="availableContent">dvdvideo</property> + + <property key="uuid">5012</property> + <property key="size">8033075200</property> + <property key="label">SolidMan Begins</property> + </device> + + + + <!-- First USB Controller --> + <device udi="/org/kde/solid/fakehw/pci_8086_265c"> + <property key="name">99021 USB2 EHCI Controller #1</property> + <property key="vendor">Acme Corporation</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + </device> + <!-- Host Controller --> + <device udi="/org/kde/solid/fakehw/usb_device_0_0_1d_7"> + <property key="name">EHCI Host Controller</property> + <property key="vendor">Kernel ehci_hcd</property> + <property key="parent">/org/kde/solid/fakehw/pci_8086_265c</property> + </device> + <!-- USB Device --> + <device udi="/org/kde/solid/fakehw/usb_device_4e8_5041"> + <property key="name">Acme XO-Y4</property> + <property key="parent">/org/kde/solid/fakehw/usb_device_0_0_1d_7</property> + </device> + <!-- Mass Storage Interface --> + <device udi="/org/kde/solid/fakehw/usb_device_4e8_5041_if0"> + <property key="name">USB Mass Storage Inferface</property> + <property key="parent">/org/kde/solid/fakehw/usb_device_4e8_5041</property> + </device> + <!-- SCSI Adapter --> + <device udi="/org/kde/solid/fakehw/usb_device_4e8_5041_if0_scsi_host"> + <property key="name">SCSI Host Adapter</property> + <property key="parent">/org/kde/solid/fakehw/usb_device_4e8_5041_if0</property> + </device> + <!-- SCSI Device --> + <device udi="/org/kde/solid/fakehw/usb_device_4e8_5041_if0_scsi_host_scsi_device_lun0"> + <property key="name">SCSI Device</property> + <property key="parent">/org/kde/solid/fakehw/usb_device_4e8_5041_if0_scsi_host</property> + </device> + <!-- We finally find the storage device, which is a portable media player... --> + <device udi="/org/kde/solid/fakehw/storage_serial_XOY4_5206"> + <property key="name">XO-Y4</property> + <property key="vendor">Acme Electronics</property> + <property key="interfaces">StorageDrive,Block,PortableMediaPlayer</property> + <property key="parent">/org/kde/solid/fakehw/usb_device_4e8_5041_if0_scsi_host_scsi_device_lun0</property> + + <property key="minor">0</property> + <property key="major">8</property> + <property key="device">/dev/sda</property> + + <property key="bus">usb</property> + <property key="driveType">disk</property> + <property key="isRemovable">true</property> + <property key="isEjectRequired">true</property> + <property key="isHotpluggable">true</property> + <property key="isMediaCheckEnabled">true</property> + <property key="product">XO-Y4</property> + + <property key="accessMethod">MassStorage</property> + <property key="outputFormats">audio/x-mp3</property> + <property key="inputFormats">audio/x-wav,audio/x-mp3,audio/vorbis</property> + <property key="playlistFormats">audio/x-mpegurl</property> + </device> + <!-- ... with a partition since it's a USB Mass Storage device --> + <device udi="/org/kde/solid/fakehw/volume_part1_size_993284096"> + <property key="name">StorageVolume (vfat)</property> + <property key="interfaces">Block,StorageVolume,StorageAccess</property> + <property key="parent">/org/kde/solid/fakehw/storage_serial_XOY4_5206</property> + + <property key="minor">1</property> + <property key="major">8</property> + <property key="device">/dev/sda1</property> + + <property key="isIgnored">false</property> + <property key="isMounted">true</property> + <property key="mountPoint">/media/XO-Y4</property> + <property key="usage">filesystem</property> + <property key="fsType">vfat</property> + <property key="size">993284096</property> + </device> + + <device udi="/org/kde/solid/fakehw/fstab"> + <property key="name">Network Shares</property> + <property key="product">Network Shares</property> + <property key="vendor">KDE</property> + <property key="parent">/org/kde/solid/fakehw/computer</property> + </device> + <device udi="/org/kde/solid/fakehw/fstab/thehost/solidpath"> + <property key="parent">/org/kde/solid/fstab</property> + <property key="interfaces">NetworkShare,StorageAccess</property> + <property key="vendor">/solidpath</property> + <property key="product">thehost</property> + <property key="type">nfs</property> + <property key="url">nfs://thehost/solid-path</property> + <property key="filePath">/media/nfs</property> + <property key="isIgnored">false</property> + <property key="isMounted">true</property> + <property key="mountPoint">/media/nfs</property> + </device> +</machine> diff --git a/src/tests/kfileitemlistviewtest.cpp b/src/tests/kfileitemlistviewtest.cpp index cac4f7a58..196018045 100644 --- a/src/tests/kfileitemlistviewtest.cpp +++ b/src/tests/kfileitemlistviewtest.cpp @@ -52,7 +52,7 @@ void KFileItemListViewTest::init() m_model->m_dirLister->setAutoUpdate(false); m_listView = new KFileItemListView(); - m_listView->onModelChanged(m_model, 0); + m_listView->onModelChanged(m_model, nullptr); m_graphicsView = new QGraphicsView(); m_graphicsView->show(); @@ -62,16 +62,16 @@ void KFileItemListViewTest::init() void KFileItemListViewTest::cleanup() { delete m_graphicsView; - m_graphicsView = 0; + m_graphicsView = nullptr; delete m_listView; - m_listView = 0; + m_listView = nullptr; delete m_model; - m_model = 0; + m_model = nullptr; delete m_testDir; - m_testDir = 0; + m_testDir = nullptr; } /** diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index b8e089530..471818d98 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -126,10 +126,10 @@ void KFileItemModelTest::init() void KFileItemModelTest::cleanup() { delete m_model; - m_model = 0; + m_model = nullptr; delete m_testDir; - m_testDir = 0; + m_testDir = nullptr; } void KFileItemModelTest::testDefaultRoles() diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index 92d05c4d4..926a78167 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -58,7 +58,7 @@ public: int styleHint(StyleHint hint, const QStyleOption* option = nullptr, const QWidget* widget = nullptr, - QStyleHintReturn* returnData = nullptr) const Q_DECL_OVERRIDE + QStyleHintReturn* returnData = nullptr) const override { switch (hint) { case QStyle::SH_ItemView_ActivateItemOnSingleClick: @@ -149,10 +149,10 @@ void KItemListControllerTest::initTestCase() void KItemListControllerTest::cleanupTestCase() { delete m_container; - m_container = 0; + m_container = nullptr; delete m_testDir; - m_testDir = 0; + m_testDir = nullptr; } /** Before each test, the current item, selection, and item size are reset to the defaults. */ diff --git a/src/tests/kitemlistselectionmanagertest.cpp b/src/tests/kitemlistselectionmanagertest.cpp index 48e8dce04..daa03ae20 100644 --- a/src/tests/kitemlistselectionmanagertest.cpp +++ b/src/tests/kitemlistselectionmanagertest.cpp @@ -30,8 +30,8 @@ class DummyModel : public KItemModelBase public: DummyModel(); void setCount(int count); - int count() const Q_DECL_OVERRIDE; - QHash<QByteArray, QVariant> data(int index) const Q_DECL_OVERRIDE; + int count() const override; + QHash<QByteArray, QVariant> data(int index) const override; private: int m_count; @@ -99,10 +99,10 @@ void KItemListSelectionManagerTest::init() void KItemListSelectionManagerTest::cleanup() { delete m_selectionManager; - m_selectionManager = 0; + m_selectionManager = nullptr; delete m_model; - m_model = 0; + m_model = nullptr; } void KItemListSelectionManagerTest::testConstructor() diff --git a/src/tests/kstandarditemmodeltest.cpp b/src/tests/kstandarditemmodeltest.cpp index 889748f35..daa8f1e56 100644 --- a/src/tests/kstandarditemmodeltest.cpp +++ b/src/tests/kstandarditemmodeltest.cpp @@ -51,7 +51,7 @@ void KStandardItemModelTest::init() void KStandardItemModelTest::cleanup() { delete m_model; - m_model = 0; + m_model = nullptr; } void KStandardItemModelTest::testNewItems() diff --git a/src/tests/placesitemmodeltest.cpp b/src/tests/placesitemmodeltest.cpp new file mode 100644 index 000000000..a74b3ea6c --- /dev/null +++ b/src/tests/placesitemmodeltest.cpp @@ -0,0 +1,850 @@ +/*************************************************************************** + * Copyright (C) 2017 by Renato Araujo Oliveira <[email protected]> * + * * + * 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 <QTest> +#include <QSignalSpy> +#include <QDebug> +#include <QList> +#include <QByteArray> +#include <QStandardPaths> +#include <QAction> +#include <QDBusInterface> +#include <QUrlQuery> + +#include <KBookmarkManager> +#include <KConfig> +#include <KConfigGroup> +#include <KAboutData> +#include <KFilePlacesModel> + +#include "panels/places/placesitemmodel.h" +#include "panels/places/placesitem.h" +#include "views/viewproperties.h" +#include "kitemviews/kitemrange.h" + +Q_DECLARE_METATYPE(KItemRangeList) +Q_DECLARE_METATYPE(KItemRange) + +#ifdef Q_OS_WIN +//c:\ as root for windows +#define KDE_ROOT_PATH "C:\\" +#else +#define KDE_ROOT_PATH "/" +#endif + +static QString bookmarksFile() +{ + return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/user-places.xbel"; +} + +class PlacesItemModelTest : public QObject +{ + Q_OBJECT + +private slots: + void init(); + void cleanup(); + + void initTestCase(); + void cleanupTestCase(); + + void testModelSort(); + void testGroups(); + void testDeletePlace(); + void testPlaceItem_data(); + void testPlaceItem(); + void testTearDownDevice(); + void testDefaultViewProperties_data(); + void testDefaultViewProperties(); + void testClear(); + void testHideItem(); + void testSystemItems(); + void testEditBookmark(); + void testEditAfterCreation(); + void testEditMetadata(); + void testRefresh(); + void testIcons_data(); + void testIcons(); + void testDragAndDrop(); + void testHideDevices(); + void testDuplicatedEntries(); + void renameAfterCreation(); + +private: + PlacesItemModel* m_model; + QSet<int> m_tobeRemoved; + QMap<QString, QDBusInterface *> m_interfacesMap; + + void setBalooEnabled(bool enabled); + int indexOf(const QUrl &url); + QDBusInterface *fakeManager(); + QDBusInterface *fakeDevice(const QString &udi); + 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 cancelPlaceRemoval(int index); + void removeTestUserData(); + QMimeData *createMimeData(const QList<int> &indexes) const; +}; + +#define CHECK_PLACES_URLS(urls) \ + { \ + QStringList places = placesUrls(); \ + if (places != urls) { \ + qWarning() << "Expected:" << urls; \ + qWarning() << "Got:" << places; \ + QCOMPARE(places, urls); \ + } \ + } + +void PlacesItemModelTest::setBalooEnabled(bool enabled) +{ + KConfig config(QStringLiteral("baloofilerc")); + KConfigGroup basicSettings = config.group("Basic Settings"); + basicSettings.writeEntry("Indexing-Enabled", enabled); + config.sync(); +} + +int PlacesItemModelTest::indexOf(const QUrl &url) +{ + for (int r = 0; r < m_model->count(); r++) { + if (m_model->placesItem(r)->url() == url) { + return r; + } + } + return -1; +} + +QDBusInterface *PlacesItemModelTest::fakeManager() +{ + return fakeDevice(QStringLiteral("/org/kde/solid/fakehw")); +} + +QDBusInterface *PlacesItemModelTest::fakeDevice(const QString &udi) +{ + if (m_interfacesMap.contains(udi)) { + return m_interfacesMap[udi]; + } + + QDBusInterface *iface = new QDBusInterface(QDBusConnection::sessionBus().baseService(), udi); + m_interfacesMap[udi] = iface; + + return iface; +} + +QStringList PlacesItemModelTest::placesUrls(PlacesItemModel *model) const +{ + QStringList urls; + if (!model) { + model = m_model; + } + + for (int row = 0; row < model->count(); ++row) { + urls << model->placesItem(row)->url().toDisplayString(QUrl::PreferLocalFile); + } + return urls; +} + +QStringList PlacesItemModelTest::initialUrls() const +{ + static QStringList urls; + if (urls.isEmpty()) { + urls << QDir::homePath() << QStringLiteral(KDE_ROOT_PATH) << QStringLiteral("trash:/") + << QStringLiteral("remote:/") + << QStringLiteral("timeline:/today") << QStringLiteral("timeline:/yesterday") << QStringLiteral("timeline:/thismonth") << QStringLiteral("timeline:/lastmonth") + << QStringLiteral("search:/documents") << QStringLiteral("search:/images") << QStringLiteral("search:/audio") << QStringLiteral("search:/videos") + << QStringLiteral("/media/nfs") << QStringLiteral("/foreign") + << QStringLiteral("/media/floppy0") << QStringLiteral("/media/XO-Y4") << QStringLiteral("/media/cdrom"); + } + return urls; +} + +void PlacesItemModelTest::createPlaceItem(const QString &text, const QUrl &url, const QString &icon) +{ + m_model->createPlacesItem(text, url, icon); +} + +void PlacesItemModelTest::removePlaceAfter(int index) +{ + m_tobeRemoved.insert(index); +} + +void PlacesItemModelTest::cancelPlaceRemoval(int index) +{ + m_tobeRemoved.remove(index); +} + +void PlacesItemModelTest::removeTestUserData() +{ + // user hardcoded path to avoid removal of any user personal data + QDir dir(QStringLiteral("/home/renato/.qttest/share/placesitemmodeltest")); + if (dir.exists()) { + QVERIFY(dir.removeRecursively()); + } +} + +QMimeData *PlacesItemModelTest::createMimeData(const QList<int> &indexes) const +{ + QByteArray itemData; + QDataStream stream(&itemData, QIODevice::WriteOnly); + QList<QUrl> urls; + + for (int index : indexes) { + const QUrl itemUrl = m_model->placesItem(index)->url(); + if (itemUrl.isValid()) { + urls << itemUrl; + } + stream << index; + } + + QMimeData* mimeData = new QMimeData(); + mimeData->setUrls(urls); + // copied from PlacesItemModel::internalMimeType() + const QString internalMimeType = "application/x-dolphinplacesmodel-" + + QString::number((qptrdiff)m_model); + mimeData->setData(internalMimeType, itemData); + return mimeData; +} + +void PlacesItemModelTest::init() +{ + m_model = new PlacesItemModel(); + // WORKAROUND: need to wait for bookmark to load, check: PlacesItemModel::updateBookmarks + QTest::qWait(300); + QCOMPARE(m_model->count(), 17); +} + +void PlacesItemModelTest::cleanup() +{ + for (int i : m_tobeRemoved) { + int before = m_model->count(); + m_model->deleteItem(i); + QTRY_COMPARE(m_model->count(), before - 1); + } + m_tobeRemoved.clear(); + delete m_model; + m_model = nullptr; + removeTestUserData(); +} + +void PlacesItemModelTest::initTestCase() +{ + QStandardPaths::setTestModeEnabled(true); + // remove test user data + removeTestUserData(); + + const QString fakeHw = QFINDTESTDATA("data/fakecomputer.xml"); + QVERIFY(!fakeHw.isEmpty()); + qputenv("SOLID_FAKEHW", QFile::encodeName(fakeHw)); + + setBalooEnabled(true); + const QString bookmarsFileName = bookmarksFile(); + if (QFileInfo::exists(bookmarsFileName)) { + // Ensure we'll have a clean bookmark file to start + QVERIFY(QFile::remove(bookmarsFileName)); + } + + qRegisterMetaType<KItemRangeList>(); + qRegisterMetaType<KItemRange>(); +} + +void PlacesItemModelTest::cleanupTestCase() +{ + qDeleteAll(m_interfacesMap); + QFile::remove(bookmarksFile()); + + // Remove any previous properties file + removeTestUserData(); +} + +void PlacesItemModelTest::testModelSort() +{ + CHECK_PLACES_URLS(initialUrls()); +} + +void PlacesItemModelTest::testGroups() +{ + const auto groups = m_model->groups(); + + QCOMPARE(groups.size(), 6); + + QCOMPARE(groups.at(0).first, 0); + QCOMPARE(groups.at(0).second.toString(), QStringLiteral("Places")); + + QCOMPARE(groups.at(1).first, 3); + QCOMPARE(groups.at(1).second.toString(), QStringLiteral("Remote")); + + QCOMPARE(groups.at(2).first, 4); + QCOMPARE(groups.at(2).second.toString(), QStringLiteral("Recently Saved")); + + QCOMPARE(groups.at(3).first, 8); + QCOMPARE(groups.at(3).second.toString(), QStringLiteral("Search For")); + + QCOMPARE(groups.at(4).first, 12); + QCOMPARE(groups.at(4).second.toString(), QStringLiteral("Devices")); + + QCOMPARE(groups.at(5).first, 14); + QCOMPARE(groups.at(5).second.toString(), QStringLiteral("Removable Devices")); +} + +void PlacesItemModelTest::testPlaceItem_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<bool>("expectedIsHidden"); + QTest::addColumn<bool>("expectedIsSystemItem"); + QTest::addColumn<QString>("expectedGroup"); + QTest::addColumn<bool>("expectedStorageSetupNeeded"); + + // places + QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << false << true << QStringLiteral("Places") << false; + + // baloo -search + QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << false << true << QStringLiteral("Search For") << false; + + // baloo - timeline + QTest::newRow("Baloo - Last Month") << QUrl("timeline:/lastmonth") << false << true << QStringLiteral("Recently Saved") << false; + + // devices + QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << false << false << QStringLiteral("Removable Devices") << false; +} + +void PlacesItemModelTest::testPlaceItem() +{ + QFETCH(QUrl, url); + QFETCH(bool, expectedIsHidden); + QFETCH(bool, expectedIsSystemItem); + QFETCH(QString, expectedGroup); + QFETCH(bool, expectedStorageSetupNeeded); + + const int index = indexOf(url); + PlacesItem *item = m_model->placesItem(index); + QCOMPARE(item->url(), url); + QCOMPARE(item->isHidden(), expectedIsHidden); + QCOMPARE(item->isSystemItem(), expectedIsSystemItem); + QCOMPARE(item->group(), expectedGroup); + QCOMPARE(item->storageSetupNeeded(), expectedStorageSetupNeeded); +} + +void PlacesItemModelTest::testDeletePlace() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QStringList urls = initialUrls(); + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); + + PlacesItemModel *model = new PlacesItemModel(); + + // create a new place + createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); + urls.insert(3, tempUrl.toLocalFile()); + + // check if the new entry was created + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + CHECK_PLACES_URLS(urls); + QTRY_COMPARE(model->count(), m_model->count()); + + // delete item + m_model->deleteItem(3); + + // make sure that the new item is removed + QTRY_COMPARE(itemsRemovedSpy.count(), 1); + QTRY_COMPARE(m_model->count(), 17); + CHECK_PLACES_URLS(initialUrls()); + QTRY_COMPARE(model->count(), m_model->count()); +} + +void PlacesItemModelTest::testTearDownDevice() +{ + const QUrl mediaUrl = QUrl::fromLocalFile(QStringLiteral("/media/XO-Y4")); + int index = indexOf(mediaUrl); + QVERIFY(index != -1); + + auto ejectAction = m_model->ejectAction(index); + QVERIFY(!ejectAction); + + auto teardownAction = m_model->teardownAction(index); + QVERIFY(teardownAction); + + QCOMPARE(m_model->count(), 17); + + QSignalSpy spyItemsRemoved(m_model, &PlacesItemModel::itemsRemoved); + fakeManager()->call(QStringLiteral("unplug"), "/org/kde/solid/fakehw/volume_part1_size_993284096"); + QTRY_COMPARE(m_model->count(), 16); + QCOMPARE(spyItemsRemoved.count(), 1); + const QList<QVariant> spyItemsRemovedArgs = spyItemsRemoved.takeFirst(); + const KItemRangeList removedRange = spyItemsRemovedArgs.at(0).value<KItemRangeList>(); + QCOMPARE(removedRange.size(), 1); + QCOMPARE(removedRange.first().index, index); + QCOMPARE(removedRange.first().count, 1); + + QCOMPARE(indexOf(mediaUrl), -1); + + QSignalSpy spyItemsInserted(m_model, &PlacesItemModel::itemsInserted); + fakeManager()->call(QStringLiteral("plug"), "/org/kde/solid/fakehw/volume_part1_size_993284096"); + QTRY_COMPARE(m_model->count(), 17); + QCOMPARE(spyItemsInserted.count(), 1); + index = indexOf(mediaUrl); + + const QList<QVariant> args = spyItemsInserted.takeFirst(); + const KItemRangeList insertedRange = args.at(0).value<KItemRangeList>(); + QCOMPARE(insertedRange.size(), 1); + QCOMPARE(insertedRange.first().index, index); + QCOMPARE(insertedRange.first().count, 1); +} + +void PlacesItemModelTest::testDefaultViewProperties_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<DolphinView::Mode>("expectedViewMode"); + QTest::addColumn<bool>("expectedPreviewShow"); + QTest::addColumn<QList<QByteArray> >("expectedVisibleRole"); + + // places + QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << DolphinView::IconsView << true << QList<QByteArray>({"text"}); + + // baloo -search + QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << DolphinView::DetailsView << false << QList<QByteArray>({"text", "path"}); + + // audio files + QTest::newRow("Places - Audio") << QUrl("search:/audio") << DolphinView::DetailsView << false << QList<QByteArray>({"text", "artist", "album"}); + + // baloo - timeline + QTest::newRow("Baloo - Last Month") << QUrl("timeline:/lastmonth") << DolphinView::DetailsView << true << QList<QByteArray>({"text", "modificationtime"}); + + // devices + QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << DolphinView::IconsView << true << QList<QByteArray>({"text"}); + +} + +void PlacesItemModelTest::testDefaultViewProperties() +{ + QFETCH(QUrl, url); + QFETCH(DolphinView::Mode, expectedViewMode); + QFETCH(bool, expectedPreviewShow); + QFETCH(QList<QByteArray>, expectedVisibleRole); + + ViewProperties properties(KFilePlacesModel::convertedUrl(url)); + QCOMPARE(properties.viewMode(), expectedViewMode); + QCOMPARE(properties.previewsShown(), expectedPreviewShow); + QCOMPARE(properties.visibleRoles(), expectedVisibleRole); +} + +void PlacesItemModelTest::testClear() +{ + QCOMPARE(m_model->count(), 17); + m_model->clear(); + QCOMPARE(m_model->count(), 0); + QCOMPARE(m_model->hiddenCount(), 0); + m_model->refresh(); + QTRY_COMPARE(m_model->count(), 17); +} + +void PlacesItemModelTest::testHideItem() +{ + const QUrl mediaUrl = QUrl::fromLocalFile(QStringLiteral("/media/XO-Y4")); + const int index = indexOf(mediaUrl); + + PlacesItem *item = m_model->placesItem(index); + + QSignalSpy spyItemsRemoved(m_model, &PlacesItemModel::itemsRemoved); + QList<QVariant> spyItemsRemovedArgs; + KItemRangeList removedRange; + + QSignalSpy spyItemsInserted(m_model, &PlacesItemModel::itemsInserted); + QList<QVariant> spyItemsInsertedArgs; + KItemRangeList insertedRange; + QVERIFY(item); + + // hide an item + item->setHidden(true); + + // check if items removed was fired + QTRY_COMPARE(m_model->count(), 16); + QCOMPARE(spyItemsRemoved.count(), 1); + spyItemsRemovedArgs = spyItemsRemoved.takeFirst(); + removedRange = spyItemsRemovedArgs.at(0).value<KItemRangeList>(); + QCOMPARE(removedRange.size(), 1); + QCOMPARE(removedRange.first().index, index); + QCOMPARE(removedRange.first().count, 1); + + // allow model to show hidden items + m_model->setHiddenItemsShown(true); + + // check if the items inserted was fired + spyItemsInsertedArgs = spyItemsInserted.takeFirst(); + insertedRange = spyItemsInsertedArgs.at(0).value<KItemRangeList>(); + QCOMPARE(insertedRange.size(), 1); + QCOMPARE(insertedRange.first().index, index); + QCOMPARE(insertedRange.first().count, 1); + + // mark item as visible + item = m_model->placesItem(index); + item->setHidden(false); + + // mark model to hide invisible items + m_model->setHiddenItemsShown(true); + + QTRY_COMPARE(m_model->count(), 17); +} + +void PlacesItemModelTest::testSystemItems() +{ + QCOMPARE(m_model->count(), 17); + for (int r = 0; r < m_model->count(); r++) { + QCOMPARE(m_model->placesItem(r)->isSystemItem(), !m_model->placesItem(r)->device().isValid()); + } + + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + + // create a new entry (non system item) + createPlaceItem(QStringLiteral("Temporary Dir"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)), QString()); + + // check if the new entry was created + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + + // make sure the new place get removed + removePlaceAfter(3); + + QList<QVariant> args = itemsInsertedSpy.takeFirst(); + KItemRangeList range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.first().index, 3); + QCOMPARE(range.first().count, 1); + QVERIFY(!m_model->placesItem(3)->isSystemItem()); + QCOMPARE(m_model->count(), 18); + + QTest::qWait(300); + // check if the removal signal is correct + QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); + m_model->deleteItem(3); + QTRY_COMPARE(itemsRemovedSpy.count(), 1); + args = itemsRemovedSpy.takeFirst(); + range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.first().index, 3); + QCOMPARE(range.first().count, 1); + QTRY_COMPARE(m_model->count(), 17); + + //cancel removal (it was removed above) + cancelPlaceRemoval(3); +} + +void PlacesItemModelTest::testEditBookmark() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QScopedPointer<PlacesItemModel> other(new PlacesItemModel()); + + createPlaceItem(QStringLiteral("Temporary Dir"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)), QString()); + + // make sure that the new item will be removed later + removePlaceAfter(3); + + QSignalSpy itemsChangedSply(m_model, &PlacesItemModel::itemsChanged); + + // modify place text + m_model->item(3)->setText(QStringLiteral("Renamed place")); + m_model->refresh(); + + // check if the correct signal was fired + QTRY_COMPARE(itemsChangedSply.count(), 1); + QList<QVariant> args = itemsChangedSply.takeFirst(); + KItemRangeList range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.first().index, 3); + QCOMPARE(range.first().count, 1); + QSet<QByteArray> roles = args.at(1).value<QSet<QByteArray> >(); + QCOMPARE(roles.size(), 1); + QCOMPARE(*roles.begin(), QByteArrayLiteral("text")); + QCOMPARE(m_model->item(3)->text(), QStringLiteral("Renamed place")); + + // check if the item was updated in the other model + QTRY_COMPARE(other->item(3)->text(), QStringLiteral("Renamed place")); +} + +void PlacesItemModelTest::testEditAfterCreation() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + + // create a new place + createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + + PlacesItemModel *model = new PlacesItemModel(); + QTRY_COMPARE(model->count(), m_model->count()); + + // make sure that the new item will be removed later + removePlaceAfter(3); + + // modify place text + PlacesItem *item = m_model->placesItem(3); + 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()); +} + +void PlacesItemModelTest::testEditMetadata() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + + // create a new place + createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + + // check if the new entry was created + PlacesItemModel *model = new PlacesItemModel(); + QTRY_COMPARE(model->count(), m_model->count()); + + // make sure that the new item will be removed later + removePlaceAfter(3); + + // modify place metadata + PlacesItem *item = m_model->placesItem(3); + 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")), + 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()); +} + +void PlacesItemModelTest::testRefresh() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + + // create a new place + createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + + PlacesItemModel *model = new PlacesItemModel(); + QTRY_COMPARE(model->count(), m_model->count()); + + // make sure that the new item will be removed later + removePlaceAfter(3); + + PlacesItem *item = m_model->placesItem(3); + PlacesItem *sameItem = model->placesItem(3); + QCOMPARE(item->text(), sameItem->text()); + + // modify place text + item->setText(QStringLiteral("Renamed place")); + + // item from another model is not affected at the moment + QVERIFY(item->text() != sameItem->text()); + + // propagate change + m_model->refresh(); + + // item must be equal + QTRY_COMPARE(item->text(), sameItem->text()); +} + +void PlacesItemModelTest::testIcons_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QString>("expectedIconName"); + + // places + QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << QStringLiteral("user-home"); + + // baloo -search + QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << QStringLiteral("folder-text"); + + // baloo - timeline + QTest::newRow("Baloo - Last Month") << QUrl("timeline:/lastmonth") << QStringLiteral("view-calendar-month"); + + // devices + QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << QStringLiteral("blockdevice"); +} + +void PlacesItemModelTest::testIcons() +{ + QFETCH(QUrl, url); + QFETCH(QString, expectedIconName); + + PlacesItem *item = m_model->placesItem(indexOf(url)); + QCOMPARE(item->icon(), expectedIconName); + + for (int r = 0; r < m_model->count(); r++) { + QVERIFY(!m_model->placesItem(r)->icon().isEmpty()); + } +} + +void PlacesItemModelTest::testDragAndDrop() +{ + QList<QVariant> args; + KItemRangeList range; + QStringList urls = initialUrls(); + QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); + QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); + + CHECK_PLACES_URLS(initialUrls()); + // Move the KDE_ROOT_PATH at the end of the places list will case it to be moved to the end of the places group + QMimeData *dropData = createMimeData(QList<int>() << 1); + m_model->dropMimeDataBefore(m_model->count() - 1, dropData); + urls.move(1, 2); + delete dropData; + + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + QTRY_COMPARE(itemsRemovedSpy.count(), 1); + + // remove item from actual position + args = itemsRemovedSpy.takeFirst(); + range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.size(), 1); + QCOMPARE(range.at(0).count, 1); + QCOMPARE(range.at(0).index, 1); + + // insert intem in his group + args = itemsInsertedSpy.takeFirst(); + range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.size(), 1); + QCOMPARE(range.at(0).count, 1); + QCOMPARE(range.at(0).index, 2); + + CHECK_PLACES_URLS(urls); + + itemsInsertedSpy.clear(); + itemsRemovedSpy.clear(); + + // Move the KDE_ROOT_PATH to his original position + dropData = createMimeData(QList<int>() << 2); + m_model->dropMimeDataBefore(1, dropData); + urls.move(2, 1); + delete dropData; + + QTRY_COMPARE(itemsInsertedSpy.count(), 1); + QTRY_COMPARE(itemsRemovedSpy.count(), 1); + + // remove item from actual position + args = itemsRemovedSpy.takeFirst(); + range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.size(), 1); + QCOMPARE(range.at(0).count, 1); + QCOMPARE(range.at(0).index, 2); + + // insert intem in the requested position + args = itemsInsertedSpy.takeFirst(); + range = args.at(0).value<KItemRangeList>(); + QCOMPARE(range.size(), 1); + QCOMPARE(range.at(0).count, 1); + QCOMPARE(range.at(0).index, 1); + + CHECK_PLACES_URLS(urls); +} + +void PlacesItemModelTest::testHideDevices() +{ + QSignalSpy itemsRemoved(m_model, &PlacesItemModel::itemsRemoved); + QStringList urls = initialUrls(); + + m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, true); + QTRY_VERIFY(m_model->isGroupHidden(KFilePlacesModel::RemovableDevicesType)); + QTRY_COMPARE(itemsRemoved.count(), 3); + + // remove removable-devices + urls.removeOne(QStringLiteral("/media/floppy0")); + urls.removeOne(QStringLiteral("/media/XO-Y4")); + urls.removeOne(QStringLiteral("/media/cdrom")); + + // check if the correct urls was removed + CHECK_PLACES_URLS(urls); + + delete m_model; + m_model = new PlacesItemModel(); + QTRY_COMPARE(m_model->count(), urls.count()); + CHECK_PLACES_URLS(urls); + + // revert changes + m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, false); + urls = initialUrls(); + QTRY_COMPARE(m_model->count(), urls.count()); + CHECK_PLACES_URLS(urls); +} + +void PlacesItemModelTest::testDuplicatedEntries() +{ + QStringList urls = initialUrls(); + // create a duplicated entry on bookmark + KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile(), QStringLiteral("kfilePlaces")); + KBookmarkGroup root = bookmarkManager->root(); + KBookmark bookmark = root.addBookmark(QStringLiteral("Duplicated Search Videos"), QUrl("search:/videos"), {}); + + const QString id = QUuid::createUuid().toString(); + bookmark.setMetaDataItem(QStringLiteral("ID"), id); + bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName()); + bookmarkManager->emitChanged(bookmarkManager->root()); + + PlacesItemModel *newModel = new PlacesItemModel(); + QTRY_COMPARE(placesUrls(newModel).count(QStringLiteral("search:/videos")), 1); + QTRY_COMPARE(urls, placesUrls(newModel)); + delete newModel; +} + +void PlacesItemModelTest::renameAfterCreation() +{ + const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QStringList urls = initialUrls(); + PlacesItemModel *model = new PlacesItemModel(); + + CHECK_PLACES_URLS(urls); + QTRY_COMPARE(model->count(), m_model->count()); + + // create a new place + createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); + urls.insert(3, tempUrl.toLocalFile()); + + // make sure that the new item will be removed later + removePlaceAfter(3); + + CHECK_PLACES_URLS(urls); + QCOMPARE(model->count(), m_model->count()); + + + // modify place text + QSignalSpy changedSpy(m_model, &PlacesItemModel::itemsChanged); + + PlacesItem *item = m_model->placesItem(3); + item->setText(QStringLiteral("New Temporary Dir")); + item->setUrl(item->url()); + item->setIcon(item->icon()); + m_model->refresh(); + + 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")); +} + +QTEST_MAIN(PlacesItemModelTest) + +#include "placesitemmodeltest.moc" diff --git a/src/tests/viewpropertiestest.cpp b/src/tests/viewpropertiestest.cpp index 114afdc33..5193bb35a 100644 --- a/src/tests/viewpropertiestest.cpp +++ b/src/tests/viewpropertiestest.cpp @@ -56,7 +56,7 @@ void ViewPropertiesTest::init() void ViewPropertiesTest::cleanup() { delete m_testDir; - m_testDir = 0; + m_testDir = nullptr; GeneralSettings::self()->setGlobalViewProps(m_globalViewProps); GeneralSettings::self()->save(); diff --git a/src/views/dolphinfileitemlistwidget.h b/src/views/dolphinfileitemlistwidget.h index af73ac937..a04bc6828 100644 --- a/src/views/dolphinfileitemlistwidget.h +++ b/src/views/dolphinfileitemlistwidget.h @@ -37,10 +37,10 @@ class DOLPHIN_EXPORT DolphinFileItemListWidget : public KFileItemListWidget public: DolphinFileItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~DolphinFileItemListWidget(); + ~DolphinFileItemListWidget() override; protected: - virtual void refreshCache() Q_DECL_OVERRIDE; + void refreshCache() override; private: static QPixmap overlayForState(KVersionControlPlugin::ItemVersion version, int size); diff --git a/src/views/dolphinitemlistview.cpp b/src/views/dolphinitemlistview.cpp index a3740cb26..a1472c661 100644 --- a/src/views/dolphinitemlistview.cpp +++ b/src/views/dolphinitemlistview.cpp @@ -30,6 +30,7 @@ #include <kitemviews/kitemlistcontroller.h> #include <kitemviews/kitemliststyleoption.h> +#include <KIO/PreviewJob> #include <views/viewmodecontroller.h> @@ -94,11 +95,7 @@ void DolphinItemListView::readSettings() updateGridSize(); const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings"); - const QStringList plugins = globalConfig.readEntry("Plugins", QStringList() - << QStringLiteral("directorythumbnail") - << QStringLiteral("imagethumbnail") - << QStringLiteral("jpegthumbnail")); - setEnabledPlugins(plugins); + setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins())); endTransaction(); } diff --git a/src/views/dolphinitemlistview.h b/src/views/dolphinitemlistview.h index 7eec6f17a..ff14fbe7c 100644 --- a/src/views/dolphinitemlistview.h +++ b/src/views/dolphinitemlistview.h @@ -39,8 +39,8 @@ class DOLPHIN_EXPORT DolphinItemListView : public KFileItemListView Q_OBJECT public: - explicit DolphinItemListView(QGraphicsWidget* parent = 0); - virtual ~DolphinItemListView(); + explicit DolphinItemListView(QGraphicsWidget* parent = nullptr); + ~DolphinItemListView() override; void setZoomLevel(int level); int zoomLevel() const; @@ -49,14 +49,14 @@ public: void writeSettings(); protected: - virtual KItemListWidgetCreatorBase* defaultWidgetCreator() const Q_DECL_OVERRIDE; - virtual bool itemLayoutSupportsItemExpanding(ItemLayout layout) const Q_DECL_OVERRIDE; - virtual void onItemLayoutChanged(ItemLayout current, ItemLayout previous) Q_DECL_OVERRIDE; - virtual void onPreviewsShownChanged(bool shown) Q_DECL_OVERRIDE; - virtual void onVisibleRolesChanged(const QList<QByteArray>& current, - const QList<QByteArray>& previous) Q_DECL_OVERRIDE; + KItemListWidgetCreatorBase* defaultWidgetCreator() const override; + bool itemLayoutSupportsItemExpanding(ItemLayout layout) const override; + void onItemLayoutChanged(ItemLayout current, ItemLayout previous) override; + void onPreviewsShownChanged(bool shown) override; + void onVisibleRolesChanged(const QList<QByteArray>& current, + const QList<QByteArray>& previous) override; - virtual void updateFont() Q_DECL_OVERRIDE; + void updateFont() override; private: void updateGridSize(); diff --git a/src/views/dolphinnewfilemenuobserver.cpp b/src/views/dolphinnewfilemenuobserver.cpp index 275e1c4fb..6379adb31 100644 --- a/src/views/dolphinnewfilemenuobserver.cpp +++ b/src/views/dolphinnewfilemenuobserver.cpp @@ -54,7 +54,7 @@ void DolphinNewFileMenuObserver::detach(const DolphinNewFileMenu* menu) } DolphinNewFileMenuObserver::DolphinNewFileMenuObserver() : - QObject(0) + QObject(nullptr) { } diff --git a/src/views/dolphinnewfilemenuobserver.h b/src/views/dolphinnewfilemenuobserver.h index df4621f17..2386bce1e 100644 --- a/src/views/dolphinnewfilemenuobserver.h +++ b/src/views/dolphinnewfilemenuobserver.h @@ -48,7 +48,7 @@ signals: private: DolphinNewFileMenuObserver(); - virtual ~DolphinNewFileMenuObserver(); + ~DolphinNewFileMenuObserver() override; friend class DolphinNewFileMenuObserverSingleton; }; diff --git a/src/views/dolphinremoteencoding.h b/src/views/dolphinremoteencoding.h index 28ff52cb3..ca1cea2c7 100644 --- a/src/views/dolphinremoteencoding.h +++ b/src/views/dolphinremoteencoding.h @@ -40,7 +40,7 @@ class DOLPHIN_EXPORT DolphinRemoteEncoding: public QObject Q_OBJECT public: DolphinRemoteEncoding(QObject* parent, DolphinViewActionHandler* actionHandler); - ~DolphinRemoteEncoding(); + ~DolphinRemoteEncoding() override; public Q_SLOTS: void slotAboutToOpenUrl(); diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index cd802eec1..e40e49d6e 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -87,19 +87,19 @@ DolphinView::DolphinView(const QUrl& url, QWidget* parent) : m_viewPropertiesContext(), m_mode(DolphinView::IconsView), m_visibleRoles(), - m_topLayout(0), - m_model(0), - m_view(0), - m_container(0), - m_toolTipManager(0), - m_selectionChangedTimer(0), + m_topLayout(nullptr), + m_model(nullptr), + m_view(nullptr), + m_container(nullptr), + m_toolTipManager(nullptr), + m_selectionChangedTimer(nullptr), m_currentItemUrl(), m_scrollToCurrentItem(false), m_restoredContentsPosition(), m_selectedUrls(), m_clearSelectionBeforeSelectingNewItems(false), m_markFirstNewlySelectedItemAsCurrent(false), - m_versionControlObserver(0), + m_versionControlObserver(nullptr), m_twoClicksRenamingTimer(nullptr) { m_topLayout = new QVBoxLayout(this); @@ -912,7 +912,7 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) #endif QString groupName; - QMenu* groupMenu = 0; + QMenu* groupMenu = nullptr; // Add all roles to the menu that can be shown or hidden by the user const QList<KFileItemModel::RoleInfo> rolesInfo = KFileItemModel::rolesInformation(); @@ -923,7 +923,7 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) } const QString text = m_model->roleDescription(info.role); - QAction* action = 0; + QAction* action = nullptr; if (info.group.isEmpty()) { action = menu->addAction(text); } else { @@ -1094,11 +1094,11 @@ void DolphinView::dropUrls(const QUrl &destUrl, QDropEvent *dropEvent, QWidget * void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous) { - if (previous != 0) { + if (previous != nullptr) { Q_ASSERT(qobject_cast<KFileItemModel*>(previous)); KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(previous); disconnect(fileItemModel, &KFileItemModel::directoryLoadingCompleted, this, &DolphinView::slotDirectoryLoadingCompleted); - m_versionControlObserver->setModel(0); + m_versionControlObserver->setModel(nullptr); } if (current) { @@ -1356,17 +1356,21 @@ void DolphinView::updateViewState() { if (m_currentItemUrl != QUrl()) { KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); - const int currentIndex = m_model->index(m_currentItemUrl); - if (currentIndex != -1) { - selectionManager->setCurrentItem(currentIndex); - // scroll to current item and reset the state - if (m_scrollToCurrentItem) { - m_view->scrollToItem(currentIndex); - m_scrollToCurrentItem = false; + // if there is a selection already, leave it that way + if (!selectionManager->hasSelection()) { + const int currentIndex = m_model->index(m_currentItemUrl); + if (currentIndex != -1) { + selectionManager->setCurrentItem(currentIndex); + + // scroll to current item and reset the state + if (m_scrollToCurrentItem) { + m_view->scrollToItem(currentIndex); + m_scrollToCurrentItem = false; + } + } else { + selectionManager->setCurrentItem(0); } - } else { - selectionManager->setCurrentItem(0); } m_currentItemUrl = QUrl(); @@ -1384,26 +1388,29 @@ void DolphinView::updateViewState() if (!m_selectedUrls.isEmpty()) { KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager(); - if (m_clearSelectionBeforeSelectingNewItems) { - selectionManager->clearSelection(); - m_clearSelectionBeforeSelectingNewItems = false; - } + // if there is a selection already, leave it that way + if (!selectionManager->hasSelection()) { + if (m_clearSelectionBeforeSelectingNewItems) { + selectionManager->clearSelection(); + m_clearSelectionBeforeSelectingNewItems = false; + } - KItemSet selectedItems = selectionManager->selectedItems(); + KItemSet selectedItems = selectionManager->selectedItems(); - QList<QUrl>::iterator it = m_selectedUrls.begin(); - while (it != m_selectedUrls.end()) { - const int index = m_model->index(*it); - if (index >= 0) { - selectedItems.insert(index); - it = m_selectedUrls.erase(it); - } else { - ++it; + QList<QUrl>::iterator it = m_selectedUrls.begin(); + while (it != m_selectedUrls.end()) { + const int index = m_model->index(*it); + if (index >= 0) { + selectedItems.insert(index); + it = m_selectedUrls.erase(it); + } else { + ++it; + } } - } - selectionManager->beginAnchoredSelection(selectionManager->currentItem()); - selectionManager->setSelectedItems(selectedItems); + selectionManager->beginAnchoredSelection(selectionManager->currentItem()); + selectionManager->setSelectedItems(selectedItems); + } } } diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 2df1cf9e4..61f6af1e2 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -93,7 +93,7 @@ public: */ DolphinView(const QUrl& url, QWidget* parent); - virtual ~DolphinView(); + ~DolphinView() override; /** * Returns the current active URL, where all actions are applied. @@ -370,7 +370,7 @@ public slots: void stopLoading(); /** Activates the view if the item list container gets focus. */ - virtual bool eventFilter(QObject* watched, QEvent* event) Q_DECL_OVERRIDE; + bool eventFilter(QObject* watched, QEvent* event) override; signals: /** @@ -552,10 +552,10 @@ signals: protected: /** Changes the zoom level if Control is pressed during a wheel event. */ - virtual void wheelEvent(QWheelEvent* event) Q_DECL_OVERRIDE; + void wheelEvent(QWheelEvent* event) override; - virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; - virtual bool event(QEvent* event) Q_DECL_OVERRIDE; + void hideEvent(QHideEvent* event) override; + bool event(QEvent* event) override; private slots: /** diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index 10aae11ce..9debd5173 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -49,7 +49,7 @@ DolphinViewActionHandler::DolphinViewActionHandler(KActionCollection* collection, QObject* parent) : QObject(parent), m_actionCollection(collection), - m_currentView(0), + m_currentView(nullptr), m_sortByActions(), m_visibleRoles() { @@ -62,7 +62,7 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) Q_ASSERT(view); if (m_currentView) { - disconnect(m_currentView, 0, this, 0); + disconnect(m_currentView, nullptr, this, nullptr); } m_currentView = view; @@ -233,8 +233,8 @@ QActionGroup* DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt } QString groupName; - KActionMenu* groupMenu = 0; - QActionGroup* groupMenuGroup = 0; + KActionMenu* groupMenu = nullptr; + QActionGroup* groupMenuGroup = nullptr; bool indexingEnabled = false; #ifdef HAVE_BALOO @@ -249,7 +249,7 @@ QActionGroup* DolphinViewActionHandler::createFileItemRolesActionGroup(const QSt continue; } - KToggleAction* action = 0; + KToggleAction* action = nullptr; const QString name = groupPrefix + info.role; if (info.group.isEmpty()) { action = m_actionCollection->add<KToggleAction>(name); @@ -590,7 +590,7 @@ void DolphinViewActionHandler::slotAdjustViewProperties() void DolphinViewActionHandler::slotProperties() { - KPropertiesDialog* dialog = 0; + KPropertiesDialog* dialog = nullptr; const KFileItemList list = m_currentView->selectedItems(); if (list.isEmpty()) { const QUrl url = m_currentView->url(); diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index 831a9d43e..e944227df 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -60,6 +60,6 @@ KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event return job; } - return 0; + return nullptr; } diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index 6309bfbdf..2e1fa8634 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -24,6 +24,7 @@ #include <KIO/CopyJob> #include <KIO/FileUndoManager> #include <KJobUiDelegate> +#include <KIO/BatchRenameJob> #include <QHBoxLayout> #include <QLabel> @@ -39,10 +40,10 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : QDialog(parent), m_renameOneItem(false), m_newName(), - m_lineEdit(0), + m_lineEdit(nullptr), m_items(items), m_allExtensionsDifferent(true), - m_spinBox(0) + m_spinBox(nullptr) { const QSize minSize = minimumSize(); setMinimumSize(QSize(320, minSize.height())); @@ -72,7 +73,7 @@ RenameDialog::RenameDialog(QWidget *parent, const KFileItemList& items) : QVBoxLayout* topLayout = new QVBoxLayout(page); - QLabel* editLabel = 0; + QLabel* editLabel = nullptr; if (m_renameOneItem) { m_newName = items.first().name(); editLabel = new QLabel(xi18nc("@label:textbox", "Rename the item <filename>%1</filename> to:", m_newName), @@ -148,38 +149,32 @@ RenameDialog::~RenameDialog() { } -void RenameDialog::renameItem(const KFileItem &item, const QString& newName) +void RenameDialog::slotAccepted() { - const QUrl oldUrl = item.url(); - QUrl newUrl = oldUrl.adjusted(QUrl::RemoveFilename); - newUrl.setPath(newUrl.path() + KIO::encodeFileName(newName)); - QWidget* widget = parentWidget(); if (!widget) { widget = this; } - KIO::Job * job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo); + KIO::FileUndoManager::CommandType cmdType; + if (m_renameOneItem) { + Q_ASSERT(m_items.count() == 1); + cmdType = KIO::FileUndoManager::Rename; + } else { + cmdType = KIO::FileUndoManager::BatchRename; + } + + const QList<QUrl> srcList = m_items.urlList(); + KIO::BatchRenameJob* job = KIO::batchRename(srcList, m_lineEdit->text(), m_spinBox->value(), QLatin1Char('#')); KJobWidgets::setWindow(job, widget); - KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job); + const QUrl parentUrl = srcList.first().adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash); + KIO::FileUndoManager::self()->recordJob(cmdType, srcList, parentUrl, job); - if (!job->error()) { - m_renamedItems << newUrl; - } + connect(job, &KIO::BatchRenameJob::fileRenamed, this, &RenameDialog::slotFileRenamed); + connect(job, &KIO::BatchRenameJob::result, this, &RenameDialog::slotResult); job->uiDelegate()->setAutoErrorHandlingEnabled(true); -} -void RenameDialog::slotAccepted() -{ - m_newName = m_lineEdit->text(); - - if (m_renameOneItem) { - Q_ASSERT(m_items.count() == 1); - renameItem(m_items.first(), m_newName); - } else { - renameItems(); - } accept(); } @@ -201,55 +196,22 @@ void RenameDialog::slotTextChanged(const QString& newName) m_okButton->setEnabled(enable); } -void RenameDialog::showEvent(QShowEvent* event) +void RenameDialog::slotFileRenamed(const QUrl &oldUrl, const QUrl &newUrl) { - m_lineEdit->setFocus(); - - QDialog::showEvent(event); + Q_UNUSED(oldUrl) + m_renamedItems << newUrl; } -void RenameDialog::renameItems() +void RenameDialog::slotResult(KJob *job) { - // Iterate through all items and rename them... - int index = m_spinBox->value(); - foreach (const KFileItem& item, m_items) { - QString newName = indexedName(m_newName, index, QLatin1Char('#')); - ++index; - - const QUrl oldUrl = item.url(); - QMimeDatabase db; - const QString extension = db.suffixForFileName(oldUrl.path().toLower()); - if (!extension.isEmpty()) { - newName.append(QLatin1Char('.')); - newName.append(extension); - } - - if (oldUrl.fileName() != newName) { - renameItem(item, newName); - } - } - - if (!m_items.empty()) { + if (!job->error()) { emit renamingFinished(m_renamedItems); } } -QString RenameDialog::indexedName(const QString& name, int index, const QChar& indexPlaceHolder) +void RenameDialog::showEvent(QShowEvent* event) { - QString newName = name; - - QString indexString = QString::number(index); - - // Insert leading zeros if necessary - const int minIndexLength = name.count(indexPlaceHolder); - while (indexString.length() < minIndexLength) { - indexString.prepend(QLatin1Char('0')); - } - - // Replace the index placeholders by the indexString - const int placeHolderStart = newName.indexOf(indexPlaceHolder); - newName.replace(placeHolderStart, minIndexLength, indexString); + m_lineEdit->setFocus(); - return newName; + QDialog::showEvent(event); } - diff --git a/src/views/renamedialog.h b/src/views/renamedialog.h index 7ead0ca9f..8da770895 100644 --- a/src/views/renamedialog.h +++ b/src/views/renamedialog.h @@ -29,7 +29,7 @@ class QLineEdit; class QSpinBox; class QPushButton; - +class KJob; /** * @brief Dialog for renaming a variable number of files. */ @@ -39,7 +39,7 @@ class DOLPHIN_EXPORT RenameDialog : public QDialog public: explicit RenameDialog(QWidget* parent, const KFileItemList& items); - virtual ~RenameDialog(); + ~RenameDialog() override; signals: void renamingFinished(const QList<QUrl>& urls); @@ -47,24 +47,13 @@ signals: private slots: void slotAccepted(); void slotTextChanged(const QString& newName); + void slotFileRenamed(const QUrl& oldUrl, const QUrl& newUrl); + void slotResult(KJob* job); protected: void showEvent(QShowEvent* event) override; private: - void renameItems(); - void renameItem(const KFileItem &item, const QString& newName); - - /** - * @return Returns the string \p name, where the characters represented by - * \p indexPlaceHolder get replaced by the index \p index. - * E. g. Calling indexedName("Test #.jpg", 12, '#') returns "Test 12.jpg". - * A connected sequence of placeholders results in leading zeros: - * indexedName("Test ####.jpg", 12, '#') returns "Test 0012.jpg". - */ - static QString indexedName(const QString& name, int index, const QChar& indexPlaceHolder); - -private: bool m_renameOneItem; QList<QUrl> m_renamedItems; QString m_newName; diff --git a/src/views/tooltips/dolphinfilemetadatawidget.cpp b/src/views/tooltips/dolphinfilemetadatawidget.cpp index 52eeb3b71..cabfc0617 100644 --- a/src/views/tooltips/dolphinfilemetadatawidget.cpp +++ b/src/views/tooltips/dolphinfilemetadatawidget.cpp @@ -41,9 +41,9 @@ DolphinFileMetaDataWidget::DolphinFileMetaDataWidget(QWidget* parent) : QWidget(parent), - m_preview(0), - m_name(0), - m_fileMetaDataWidget(0) + m_preview(nullptr), + m_name(nullptr), + m_fileMetaDataWidget(nullptr) { // Create widget for file preview m_preview = new QLabel(this); diff --git a/src/views/tooltips/dolphinfilemetadatawidget.h b/src/views/tooltips/dolphinfilemetadatawidget.h index c5c228766..6dcc5237c 100644 --- a/src/views/tooltips/dolphinfilemetadatawidget.h +++ b/src/views/tooltips/dolphinfilemetadatawidget.h @@ -45,8 +45,8 @@ class DolphinFileMetaDataWidget : public QWidget Q_OBJECT public: - DolphinFileMetaDataWidget(QWidget* parent = 0); - virtual ~DolphinFileMetaDataWidget(); + DolphinFileMetaDataWidget(QWidget* parent = nullptr); + ~DolphinFileMetaDataWidget() override; void setPreview(const QPixmap& pixmap); QPixmap preview() const; diff --git a/src/views/tooltips/tooltipmanager.cpp b/src/views/tooltips/tooltipmanager.cpp index 9375172eb..3d3598ff5 100644 --- a/src/views/tooltips/tooltipmanager.cpp +++ b/src/views/tooltips/tooltipmanager.cpp @@ -35,10 +35,10 @@ ToolTipManager::ToolTipManager(QWidget* parent) : QObject(parent), - m_showToolTipTimer(0), - m_contentRetrievalTimer(0), - m_transientParent(0), - m_fileMetaDataWidget(0), + m_showToolTipTimer(nullptr), + m_contentRetrievalTimer(nullptr), + m_transientParent(nullptr), + m_fileMetaDataWidget(nullptr), m_toolTipRequested(false), m_metaDataRequested(false), m_appliedWaitCursor(false), diff --git a/src/views/tooltips/tooltipmanager.h b/src/views/tooltips/tooltipmanager.h index 9f1f104f1..746d6cb67 100644 --- a/src/views/tooltips/tooltipmanager.h +++ b/src/views/tooltips/tooltipmanager.h @@ -43,7 +43,7 @@ class ToolTipManager : public QObject public: explicit ToolTipManager(QWidget* parent); - virtual ~ToolTipManager(); + ~ToolTipManager() override; /** * Triggers the showing of the tooltip for the item \p item diff --git a/src/views/versioncontrol/kversioncontrolplugin.h b/src/views/versioncontrol/kversioncontrolplugin.h index 1696f975c..a3be381f3 100644 --- a/src/views/versioncontrol/kversioncontrolplugin.h +++ b/src/views/versioncontrol/kversioncontrolplugin.h @@ -144,8 +144,8 @@ public: MissingVersion }; - KVersionControlPlugin(QObject* parent = 0); - virtual ~KVersionControlPlugin(); + KVersionControlPlugin(QObject* parent = nullptr); + ~KVersionControlPlugin() override; /** * Returns the name of the file which stores diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index e4413fabf..574402dcd 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -25,7 +25,7 @@ UpdateItemStatesThread::UpdateItemStatesThread(KVersionControlPlugin* plugin, const QMap<QString, QVector<VersionControlObserver::ItemState> >& itemStates) : QThread(), - m_globalPluginMutex(0), + m_globalPluginMutex(nullptr), m_plugin(plugin), m_itemStates(itemStates) { diff --git a/src/views/versioncontrol/updateitemstatesthread.h b/src/views/versioncontrol/updateitemstatesthread.h index 3dc03fc75..d33a64cc7 100644 --- a/src/views/versioncontrol/updateitemstatesthread.h +++ b/src/views/versioncontrol/updateitemstatesthread.h @@ -46,12 +46,12 @@ public: */ UpdateItemStatesThread(KVersionControlPlugin* plugin, const QMap<QString, QVector<VersionControlObserver::ItemState> >& itemStates); - virtual ~UpdateItemStatesThread(); + ~UpdateItemStatesThread() override; QMap<QString, QVector<VersionControlObserver::ItemState> > itemStates() const; protected: - virtual void run() Q_DECL_OVERRIDE; + void run() override; private: QMutex* m_globalPluginMutex; // Protects the m_plugin globally diff --git a/src/views/versioncontrol/versioncontrolobserver.cpp b/src/views/versioncontrol/versioncontrolobserver.cpp index c79440882..44dffac45 100644 --- a/src/views/versioncontrol/versioncontrolobserver.cpp +++ b/src/views/versioncontrol/versioncontrolobserver.cpp @@ -37,10 +37,10 @@ VersionControlObserver::VersionControlObserver(QObject* parent) : m_pendingItemStatesUpdate(false), m_versionedDirectory(false), m_silentUpdate(false), - m_model(0), - m_dirVerificationTimer(0), - m_plugin(0), - m_updateItemStatesThread(0) + m_model(nullptr), + m_dirVerificationTimer(nullptr), + m_plugin(nullptr), + m_updateItemStatesThread(nullptr) { // The verification timer specifies the timeout until the shown directory // is checked whether it is versioned. Per default it is assumed that users @@ -58,7 +58,7 @@ VersionControlObserver::~VersionControlObserver() { if (m_plugin) { m_plugin->disconnect(this); - m_plugin = 0; + m_plugin = nullptr; } } @@ -163,7 +163,7 @@ void VersionControlObserver::verifyDirectory() void VersionControlObserver::slotThreadFinished() { UpdateItemStatesThread* thread = m_updateItemStatesThread; - m_updateItemStatesThread = 0; // The thread deletes itself automatically (see updateItemStates()) + m_updateItemStatesThread = nullptr; // The thread deletes itself automatically (see updateItemStates()) if (!m_plugin || !thread) { return; @@ -266,7 +266,7 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const QUrl& director if (!pluginsAvailable) { // A searching for plugins has already been done, but no // plugins are installed - return 0; + return nullptr; } if (plugins.isEmpty()) { @@ -285,13 +285,13 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const QUrl& director } if (plugins.isEmpty()) { pluginsAvailable = false; - return 0; + return nullptr; } } // We use the number of upUrl() calls to find the best matching plugin // for the given directory. The smaller value, the better it is (0 is best). - KVersionControlPlugin* bestPlugin = 0; + KVersionControlPlugin* bestPlugin = nullptr; int bestScore = INT_MAX; // Verify whether the current directory contains revision information diff --git a/src/views/versioncontrol/versioncontrolobserver.h b/src/views/versioncontrol/versioncontrolobserver.h index c817c2187..2c2fe2940 100644 --- a/src/views/versioncontrol/versioncontrolobserver.h +++ b/src/views/versioncontrol/versioncontrolobserver.h @@ -50,8 +50,8 @@ class DOLPHIN_EXPORT VersionControlObserver : public QObject Q_OBJECT public: - explicit VersionControlObserver(QObject* parent = 0); - virtual ~VersionControlObserver(); + explicit VersionControlObserver(QObject* parent = nullptr); + ~VersionControlObserver() override; void setModel(KFileItemModel* model); KFileItemModel* model() const; diff --git a/src/views/viewmodecontroller.h b/src/views/viewmodecontroller.h index 4b1ff2083..6fa43c38b 100644 --- a/src/views/viewmodecontroller.h +++ b/src/views/viewmodecontroller.h @@ -38,8 +38,8 @@ class DOLPHIN_EXPORT ViewModeController : public QObject Q_OBJECT public: - explicit ViewModeController(QObject* parent = 0); - virtual ~ViewModeController(); + explicit ViewModeController(QObject* parent = nullptr); + ~ViewModeController() override; /** * @return URL that is shown by the view mode implementation. diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index ca52be890..e2be18819 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -50,7 +50,7 @@ namespace { ViewProperties::ViewProperties(const QUrl& url) : m_changedProps(false), m_autoSave(true), - m_node(0) + m_node(nullptr) { GeneralSettings* settings = GeneralSettings::self(); const bool useGlobalViewProps = settings->globalViewProps() || url.isEmpty(); @@ -140,7 +140,7 @@ ViewProperties::~ViewProperties() } delete m_node; - m_node = 0; + m_node = nullptr; } void ViewProperties::setViewMode(DolphinView::Mode mode) |
