@@ -62,17 +62,16 @@ class ProjectView final : public QTreeView
6262 */
6363 QSize sizeHint () const override ;
6464
65- void setModel (QAbstractItemModel *model) override ;
66- ProjectModel *model () const { return mProjectModel ; }
67-
68- // TODO: Add 'select by file name'
65+ ProjectModel *projectModel () const { return mProjectModel ; }
6966
7067 QStringList expandedPaths () const { return mExpandedPaths .values (); }
7168 void setExpandedPaths (const QStringList &paths);
7269 void addExpandedPath (const QString &path);
7370
7471 void selectPath (const QString &path);
7572
73+ QString filePath (const QModelIndex &index) const ;
74+
7675protected:
7776 void contextMenuEvent (QContextMenuEvent *event) override ;
7877
@@ -83,6 +82,7 @@ class ProjectView final : public QTreeView
8382 void restoreExpanded (const QModelIndex &parent);
8483
8584 ProjectModel *mProjectModel ;
85+ ProjectProxyModel *mProxyModel ;
8686 QSet<QString> mExpandedPaths ;
8787 QString mSelectedPath ;
8888 int mScrollBarValue = 0 ;
@@ -111,8 +111,10 @@ ProjectDock::ProjectDock(QWidget *parent)
111111 connect (mProjectView ->selectionModel (), &QItemSelectionModel::currentRowChanged,
112112 this , &ProjectDock::onCurrentRowChanged);
113113
114- connect (mProjectView ->model (), &ProjectModel::folderAdded, this , &ProjectDock::folderAdded);
115- connect (mProjectView ->model (), &ProjectModel::folderRemoved, this , &ProjectDock::folderRemoved);
114+ // Forwarding signals
115+ auto projectModel = mProjectView ->projectModel ();
116+ connect (projectModel, &ProjectModel::folderAdded, this , &ProjectDock::folderAdded);
117+ connect (projectModel, &ProjectModel::folderRemoved, this , &ProjectDock::folderRemoved);
116118}
117119
118120void ProjectDock::addFolderToProject ()
@@ -134,15 +136,15 @@ void ProjectDock::addFolderToProject()
134136 if (folder.isEmpty ())
135137 return ;
136138
137- mProjectView ->model ()->addFolder (folder);
139+ mProjectView ->projectModel ()->addFolder (folder);
138140 mProjectView ->addExpandedPath (folder);
139141
140142 project.save ();
141143}
142144
143145void ProjectDock::refreshProjectFolders ()
144146{
145- mProjectView ->model ()->refreshFolders ();
147+ mProjectView ->projectModel ()->refreshFolders ();
146148}
147149
148150void ProjectDock::setExpandedPaths (const QStringList &expandedPaths)
@@ -167,7 +169,7 @@ void ProjectDock::onCurrentRowChanged(const QModelIndex ¤t)
167169 if (!current.isValid ())
168170 return ;
169171
170- const auto filePath = mProjectView ->model ()-> filePath (current);
172+ const auto filePath = mProjectView ->filePath (current);
171173 if (QFileInfo { filePath }.isFile ())
172174 emit fileSelected (filePath);
173175}
@@ -193,27 +195,29 @@ ProjectView::ProjectView(QWidget *parent)
193195 setDefaultDropAction (Qt::MoveAction);
194196 setDragDropMode (QAbstractItemView::DragOnly);
195197
196- auto model = ProjectManager::instance ()->projectModel ();
197- setModel (model);
198+ mProjectModel = ProjectManager::instance ()->projectModel ();
199+ mProxyModel = new ProjectProxyModel (this );
200+ mProxyModel ->setSourceModel (mProjectModel );
201+ setModel (mProxyModel );
198202
199203 connect (this , &QAbstractItemView::activated,
200204 this , &ProjectView::onActivated);
201205
202- connect (model , &QAbstractItemModel::rowsInserted,
206+ connect (mProxyModel , &QAbstractItemModel::rowsInserted,
203207 this , &ProjectView::onRowsInserted);
204208
205209 connect (this , &QTreeView::expanded,
206- this , [=] (const QModelIndex &index) { mExpandedPaths .insert (model-> filePath (index)); });
210+ this , [=] (const QModelIndex &index) { mExpandedPaths .insert (filePath (index)); });
207211 connect (this , &QTreeView::collapsed,
208- this , [=] (const QModelIndex &index) { mExpandedPaths .remove (model-> filePath (index)); });
212+ this , [=] (const QModelIndex &index) { mExpandedPaths .remove (filePath (index)); });
209213
210214 // Reselect a previously selected path and restore scrollbar after refresh
211- connect (model , &ProjectModel::aboutToRefresh,
215+ connect (mProjectModel , &ProjectModel::aboutToRefresh,
212216 this , [=] {
213- mSelectedPath = model-> filePath (currentIndex ());
217+ mSelectedPath = filePath (currentIndex ());
214218 mScrollBarValue = verticalScrollBar ()->value ();
215219 });
216- connect (model , &ProjectModel::refreshed,
220+ connect (mProjectModel , &ProjectModel::refreshed,
217221 this , [=] {
218222 selectPath (mSelectedPath );
219223 verticalScrollBar ()->setValue (mScrollBarValue );
@@ -225,13 +229,6 @@ QSize ProjectView::sizeHint() const
225229 return Utils::dpiScaled (QSize (250 , 200 ));
226230}
227231
228- void ProjectView::setModel (QAbstractItemModel *model)
229- {
230- mProjectModel = qobject_cast<ProjectModel*>(model);
231- Q_ASSERT (mProjectModel );
232- QTreeView::setModel (model);
233- }
234-
235232void ProjectView::setExpandedPaths (const QStringList &paths)
236233{
237234 mExpandedPaths = QSet<QString>(paths.begin (), paths.end ());
@@ -244,38 +241,44 @@ void ProjectView::addExpandedPath(const QString &path)
244241
245242void ProjectView::selectPath (const QString &path)
246243{
247- auto index = model ()->index (path);
248- if (index.isValid ())
249- setCurrentIndex (index);
244+ const auto sourceIndex = mProjectModel ->index (path);
245+ const auto proxyIndex = mProxyModel ->mapFromSource (sourceIndex);
246+ if (proxyIndex.isValid ())
247+ setCurrentIndex (proxyIndex);
248+ }
249+
250+ QString ProjectView::filePath (const QModelIndex &index) const
251+ {
252+ return mProjectModel ->filePath (mProxyModel ->mapToSource (index));
250253}
251254
252255void ProjectView::contextMenuEvent (QContextMenuEvent *event)
253256{
254- const QModelIndex index = indexAt (event->pos ());
257+ const auto index = indexAt (event->pos ());
255258
256259 QMenu menu;
257260
258261 if (index.isValid ()) {
259- const auto filePath = model ()-> filePath (index);
262+ const auto path = filePath (index);
260263
261- Utils::addFileManagerActions (menu, filePath );
264+ Utils::addFileManagerActions (menu, path );
262265
263- if (QFileInfo { filePath }.isFile ()) {
264- Utils::addOpenWithSystemEditorAction (menu, filePath );
266+ if (QFileInfo { path }.isFile ()) {
267+ Utils::addOpenWithSystemEditorAction (menu, path );
265268
266269 auto mapDocumentActionHandler = MapDocumentActionHandler::instance ();
267270 auto mapDocument = mapDocumentActionHandler->mapDocument ();
268271
269272 // Add template-specific actions
270- auto objectTemplate = TemplateManager::instance ()->loadObjectTemplate (filePath );
273+ auto objectTemplate = TemplateManager::instance ()->loadObjectTemplate (path );
271274 if (objectTemplate->object ()) {
272275 menu.addSeparator ();
273276 menu.addAction (tr (" Select Template Instances" ), [=] {
274277 mapDocumentActionHandler->selectAllInstances (objectTemplate);
275278 })->setEnabled (mapDocument != nullptr );
276279 }
277280 // Add tileset-specific actions
278- else if (auto tileset = TilesetManager::instance ()->loadTileset (filePath )) {
281+ else if (auto tileset = TilesetManager::instance ()->loadTileset (path )) {
279282 if (mapDocument) {
280283 auto documentManager = DocumentManager::instance ();
281284 auto mapEditor = static_cast <MapEditor*>(documentManager->editor (Document::MapDocumentType));
@@ -301,8 +304,8 @@ void ProjectView::contextMenuEvent(QContextMenuEvent *event)
301304 if (!index.parent ().isValid ()) {
302305 menu.addSeparator ();
303306 auto removeFolder = menu.addAction (tr (" &Remove Folder from Project" ), [=] {
304- model ()->removeFolder (index.row ());
305- model ()->project ().save ();
307+ projectModel ()->removeFolder (index.row ());
308+ projectModel ()->project ().save ();
306309 });
307310 Utils::setThemeIcon (removeFolder, " list-remove" );
308311 }
@@ -319,7 +322,7 @@ void ProjectView::contextMenuEvent(QContextMenuEvent *event)
319322
320323void ProjectView::onActivated (const QModelIndex &index)
321324{
322- const QString path = model ()-> filePath (index);
325+ const QString path = filePath (index);
323326 if (QFileInfo (path).isFile ())
324327 DocumentManager::instance ()->openFile (path);
325328}
@@ -332,7 +335,7 @@ void ProjectView::onRowsInserted(const QModelIndex &parent)
332335
333336void ProjectView::restoreExpanded (const QModelIndex &parent)
334337{
335- const QString path = model ()-> filePath (parent);
338+ const QString path = filePath (parent);
336339
337340 if (mExpandedPaths .contains (path)) {
338341 setExpanded (parent, true );
0 commit comments