diff --git a/addons/tabswitcher/tabswitcher.cpp b/addons/tabswitcher/tabswitcher.cpp --- a/addons/tabswitcher/tabswitcher.cpp +++ b/addons/tabswitcher/tabswitcher.cpp @@ -33,7 +33,6 @@ #include #include -#include #include #include @@ -122,11 +121,6 @@ m_treeView->addAction(aPrev); } -static QIcon iconForDocument(KTextEditor::Document * doc) -{ - return QIcon::fromTheme(QMimeDatabase().mimeTypeForUrl(doc->url()).iconName()); -} - void TabSwitcherPluginView::setupModel() { // initial fill of model @@ -141,12 +135,7 @@ m_documents.insert(document); // add to model - auto item = new detail::FilenameListItem( - iconForDocument(document), - document->documentName(), - document->url().toLocalFile()); - item->setData(QVariant::fromValue(document)); - m_model->insertRow(0, item); + m_model->insertRow(0, detail::FilenameListItem(document)); // track document name changes connect(document, &KTextEditor::Document::documentNameChanged, this, &TabSwitcherPluginView::updateDocumentName); @@ -163,7 +152,7 @@ // remove from model const auto rowCount = m_model->rowCount(); for (int i = 0; i < rowCount; ++i) { - auto doc = m_model->item(i)->data().value(); + auto doc = m_model->item(i)->document; if (doc == document) { m_model->removeRow(i); @@ -183,7 +172,7 @@ const auto rowCount = m_model->rowCount(); for (int i = 0; i < rowCount; ++i) { - auto doc = m_model->item(i)->data().value(); + auto doc = m_model->item(i)->document; if (doc == document) { m_model->updateItem(m_model->item(i), document->documentName(), document->url().toLocalFile()); //m_model->item(i)->setText(document->documentName()); @@ -280,7 +269,7 @@ const int row = m_treeView->selectionModel()->selectedRows().first().row(); - auto doc = m_model->item(row)->data().value(); + auto doc = m_model->item(row)->document; m_mainWindow->activateView(doc); m_treeView->hide(); diff --git a/addons/tabswitcher/tabswitcherfilesmodel.h b/addons/tabswitcher/tabswitcherfilesmodel.h --- a/addons/tabswitcher/tabswitcherfilesmodel.h +++ b/addons/tabswitcher/tabswitcherfilesmodel.h @@ -18,27 +18,28 @@ Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef KTEXTEDITOR_TAB_SWITCHER_FILE_MODEL_H +#define KTEXTEDITOR_TAB_SWITCHER_FILE_MODEL_H #include #include -#include +#include + +namespace KTextEditor { + class Document; +} namespace detail { /** - * The implementation is close to QStandardItem but not all aspects are supported. - * Probably it would be better not to derive from QStandardItem. + * Represents one item in the table view of the tab switcher. */ -struct FilenameListItem : public QStandardItem +class FilenameListItem { - FilenameListItem(const QIcon & icon, const QString & documentName, const QString & fullPath) - { - this->icon = icon; - this->documentName = documentName; - this->fullPath = fullPath; - } +public: + FilenameListItem(KTextEditor::Document* doc); + KTextEditor::Document *document; QIcon icon; QString documentName; QString fullPath; @@ -57,7 +58,7 @@ explicit TabswitcherFilesModel(QObject *parent = nullptr); virtual ~TabswitcherFilesModel() = default; TabswitcherFilesModel(const FilenameList & data); - bool insertRow(int row, FilenameListItem const * const item); + bool insertRow(int row, const FilenameListItem & item); bool removeRow(int row); /** * Clears all data from the model @@ -87,3 +88,5 @@ QString longestCommonPrefix(std::vector const & strs); } + +#endif // KTEXTEDITOR_TAB_SWITCHER_FILE_MODEL_H diff --git a/addons/tabswitcher/tabswitcherfilesmodel.cpp b/addons/tabswitcher/tabswitcherfilesmodel.cpp --- a/addons/tabswitcher/tabswitcherfilesmodel.cpp +++ b/addons/tabswitcher/tabswitcherfilesmodel.cpp @@ -21,11 +21,29 @@ #include "tabswitcherfilesmodel.h" #include +#include #include +#include + +#include #include -namespace detail { +namespace detail +{ + static QIcon iconForDocument(KTextEditor::Document * doc) + { + return QIcon::fromTheme(QMimeDatabase().mimeTypeForUrl(doc->url()).iconName()); + } + + FilenameListItem::FilenameListItem(KTextEditor::Document* doc) + : document(doc) + , icon(iconForDocument(doc)) + , documentName(doc->documentName()) + , fullPath(doc->url().toLocalFile()) + { + } + /** * adapted from https://helloacm.com/c-coding-exercise-longest-common-prefix/ * see also http://www.cplusplus.com/forum/beginner/83540/ @@ -99,10 +117,10 @@ post_process(data_); } -bool detail::TabswitcherFilesModel::insertRow(int row, FilenameListItem const * const item) +bool detail::TabswitcherFilesModel::insertRow(int row, const FilenameListItem & item) { beginInsertRows(QModelIndex(), row, row + 1); - data_.insert(data_.begin() + row, *item); + data_.insert(data_.begin() + row, item); post_process(data_); endInsertRows(); return true; diff --git a/addons/tabswitcher/tests/CMakeLists.txt b/addons/tabswitcher/tests/CMakeLists.txt --- a/addons/tabswitcher/tests/CMakeLists.txt +++ b/addons/tabswitcher/tests/CMakeLists.txt @@ -15,5 +15,8 @@ ) add_executable(tstestapp ${SRC}) -target_link_libraries(tstestapp Qt5::Widgets) +target_link_libraries(tstestapp + Qt5::Widgets + KF5::TextEditor +) diff --git a/addons/tabswitcher/tests/tstestapp.cpp b/addons/tabswitcher/tests/tstestapp.cpp --- a/addons/tabswitcher/tests/tstestapp.cpp +++ b/addons/tabswitcher/tests/tstestapp.cpp @@ -14,14 +14,22 @@ #include #include -// https://www.fluentcpp.com/2017/09/22/make-pimpl-using-unique_ptr/ +#include +#include + +static KTextEditor::Document * addDoc(const QString & path) +{ + auto doc = KTextEditor::Editor::instance()->createDocument(nullptr); + doc->openUrl(QUrl::fromLocalFile(path)); + return doc; +} + class TsTestApp::Impl { public: void insert_1_item() { - auto icon = QIcon::fromTheme(QLatin1String("blurimage")); - model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("abc.d"), QLatin1String("/home/user2/folder1/abc.d"))); + model.insertRow(0, detail::FilenameListItem(addDoc(QLatin1String("/home/user2/folder1/abc.d")))); treeview1->resizeColumnToContents(0); } @@ -36,15 +44,13 @@ model.clear(); auto icon = QIcon::fromTheme(QLatin1String("document-export")); -#define INS__(a, b) model.insertRow(model.rowCount(), new detail::FilenameListItem(icon, QLatin1String(a), QLatin1String(b))); - - INS__("multimedia-system.log", "/home/gregor/logs/notifications/multimedia-system.log") - INS__("servicemenueditor", "/home/gregor/dev/src/kservicemenueditor-0.2a/servicemenueditor") - INS__("kdesrc-build", "/home/gregor/kde/src/kdesrc-build/kdesrc-build") - INS__("README.md (3)", "/home/gregor/node_modules/autolinker/README.md") - INS__("package.json (3)", "/home/gregor/node_modules/autolinker/package.json") - INS__("LICENSE (3)", "/home/gregor/node_modules/autolinker/LICENSE") - INS__("package.json (2)", "/home/gregor/node_modules/asynckit/package.json") + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/logs/notifications/multimedia-system.log")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/dev/src/kservicemenueditor-0.2a/servicemenueditor")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/kde/src/kdesrc-build/kdesrc-build")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/node_modules/autolinker/README.md")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/node_modules/autolinker/package.json")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/node_modules/autolinker/LICENSE")))); + model.insertRow(model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gregor/node_modules/asynckit/package.json")))); treeview1->resizeColumnToContents(0); } @@ -84,11 +90,11 @@ impl_->treeview1->setRootIsDecorated(false); auto icon = QIcon::fromTheme(QLatin1String("edit-undo")); - impl_->model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("file1.h"), QLatin1String("/home/gm/projects/proj1/src/file1.h"))); - impl_->model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("file2.cpp"), QLatin1String("/home/gm/projects/proj1/src/file2.cpp"))); - impl_->model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("file3.py"), QLatin1String("/home/gm/dev/file3.py"))); - impl_->model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("file3kjaskdfkljasdfklj089asdfkjklasdjf90asdfsdfkj.py"), QLatin1String("/home/gm/dev/file3kjaskdfkljasdfklj089asdfkjklasdjf90asdfsdfkj.py"))); - impl_->model.insertRow(0, new detail::FilenameListItem(icon, QLatin1String("file3.py"), QLatin1String("/home/gm/dev/proj2/asldfkjasdfk/asdlfkjasd;faf/;ajsdkfgjaskdfgasdf/file3.py"))); + impl_->model.insertRow(impl_->model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gm/projects/proj1/src/file1.h")))); + impl_->model.insertRow(impl_->model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gm/projects/proj1/src/file2.cpp")))); + impl_->model.insertRow(impl_->model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gm/dev/file3.py")))); + impl_->model.insertRow(impl_->model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gm/dev/file3kjaskdfkljasdfklj089asdfkjklasdjf90asdfsdfkj.py")))); + impl_->model.insertRow(impl_->model.rowCount(), detail::FilenameListItem(addDoc(QLatin1String("/home/gm/dev/proj2/asldfkjasdfk/asdlfkjasd;faf/;ajsdkfgjaskdfgasdf/file3.py")))); //impl_->insert_a_item(); //impl_->remove_a_item();