QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsbrowserdockwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsbrowserdockwidget.cpp
3  ---------------------
4  begin : July 2011
5  copyright : (C) 2011 by Martin Dobias
6  email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 #include "qgsbrowserdockwidget.h"
16 #include "qgsbrowserdockwidget_p.h"
17 
18 #include <QAbstractTextDocumentLayout>
19 #include <QHeaderView>
20 #include <QTreeView>
21 #include <QMenu>
22 #include <QToolButton>
23 #include <QFileDialog>
24 #include <QPlainTextDocumentLayout>
25 #include <QSortFilterProxyModel>
26 
27 #include "qgsbrowserguimodel.h"
28 #include "qgsbrowsertreeview.h"
29 #include "qgslogger.h"
30 #include "qgsrasterlayer.h"
31 #include "qgsvectorlayer.h"
32 #include "qgsproject.h"
33 #include "qgssettings.h"
34 #include "qgsnewnamedialog.h"
35 #include "qgsbrowserproxymodel.h"
36 #include "qgsgui.h"
38 #include "qgsnative.h"
40 #include "qgsdataitemguiprovider.h"
41 
42 // browser layer properties dialog
43 #include "qgsapplication.h"
44 #include "qgsmapcanvas.h"
45 
46 #include <QDragEnterEvent>
47 
48 QgsBrowserDockWidget::QgsBrowserDockWidget( const QString &name, QgsBrowserGuiModel *browserModel, QWidget *parent )
49  : QgsDockWidget( parent )
50  , mModel( browserModel )
51  , mPropertiesWidgetEnabled( false )
52  , mPropertiesWidgetHeight( 0 )
53 {
54  setupUi( this );
55 
56  mContents->layout()->setContentsMargins( 0, 0, 0, 0 );
57  static_cast< QVBoxLayout * >( mContents->layout() )->setSpacing( 0 );
58 
59  setWindowTitle( name );
60 
61  mBrowserView = new QgsDockBrowserTreeView( this );
62  mLayoutBrowser->addWidget( mBrowserView );
63 
64  mWidgetFilter->hide();
65  mLeFilter->setPlaceholderText( tr( "Type here to filter visible items…" ) );
66  // icons from http://www.fatcow.com/free-icons License: CC Attribution 3.0
67 
68  QMenu *menu = new QMenu( this );
69  menu->setSeparatorsCollapsible( false );
70  mBtnFilterOptions->setMenu( menu );
71  QAction *action = new QAction( tr( "Case Sensitive" ), menu );
72  action->setData( "case" );
73  action->setCheckable( true );
74  action->setChecked( false );
75  connect( action, &QAction::toggled, this, &QgsBrowserDockWidget::setCaseSensitive );
76  menu->addAction( action );
77  QActionGroup *group = new QActionGroup( menu );
78  action = new QAction( tr( "Filter Pattern Syntax" ), group );
79  action->setSeparator( true );
80  menu->addAction( action );
81  action = new QAction( tr( "Normal" ), group );
82  action->setData( QgsBrowserProxyModel::Normal );
83  action->setCheckable( true );
84  action->setChecked( true );
85  menu->addAction( action );
86  action = new QAction( tr( "Wildcard(s)" ), group );
87  action->setData( QgsBrowserProxyModel::Wildcards );
88  action->setCheckable( true );
89  menu->addAction( action );
90  action = new QAction( tr( "Regular Expression" ), group );
91  action->setData( QgsBrowserProxyModel::RegularExpression );
92  action->setCheckable( true );
93  menu->addAction( action );
94 
95  mBrowserView->setExpandsOnDoubleClick( false );
96 
97  connect( mActionRefresh, &QAction::triggered, this, &QgsBrowserDockWidget::refresh );
98  connect( mActionAddLayers, &QAction::triggered, this, &QgsBrowserDockWidget::addSelectedLayers );
99  connect( mActionCollapse, &QAction::triggered, mBrowserView, &QgsDockBrowserTreeView::collapseAll );
100  connect( mActionShowFilter, &QAction::triggered, this, &QgsBrowserDockWidget::showFilterWidget );
101  connect( mActionPropertiesWidget, &QAction::triggered, this, &QgsBrowserDockWidget::enablePropertiesWidget );
102  connect( mLeFilter, &QgsFilterLineEdit::returnPressed, this, &QgsBrowserDockWidget::setFilter );
103  connect( mLeFilter, &QgsFilterLineEdit::cleared, this, &QgsBrowserDockWidget::setFilter );
104  connect( mLeFilter, &QgsFilterLineEdit::textChanged, this, &QgsBrowserDockWidget::setFilter );
105  connect( group, &QActionGroup::triggered, this, &QgsBrowserDockWidget::setFilterSyntax );
106  connect( mBrowserView, &QgsDockBrowserTreeView::customContextMenuRequested, this, &QgsBrowserDockWidget::showContextMenu );
107  connect( mBrowserView, &QgsDockBrowserTreeView::doubleClicked, this, &QgsBrowserDockWidget::itemDoubleClicked );
108  connect( mSplitter, &QSplitter::splitterMoved, this, &QgsBrowserDockWidget::splitterMoved );
109 }
110 
112 {
113  QgsSettings settings;
114  settings.setValue( settingsSection() + "/propertiesWidgetEnabled", mPropertiesWidgetEnabled );
115  //settings.setValue(settingsSection() + "/propertiesWidgetHeight", mPropertiesWidget->size().height() );
116  settings.setValue( settingsSection() + "/propertiesWidgetHeight", mPropertiesWidgetHeight );
117 }
118 
119 void QgsBrowserDockWidget::showEvent( QShowEvent *e )
120 {
121  // delayed initialization of the model
122  if ( !mModel->initialized( ) )
123  {
124  mModel->initialize();
125  }
126  if ( ! mProxyModel )
127  {
128  mProxyModel = new QgsBrowserProxyModel( this );
129  mProxyModel->setBrowserModel( mModel );
130  mProxyModel->setHiddenDataItemProviderKeyFilter( mDisabledDataItemsKeys );
131  mBrowserView->setSettingsSection( objectName().toLower() ); // to distinguish 2 or more instances of the browser
132  mBrowserView->setBrowserModel( mModel );
133  mBrowserView->setModel( mProxyModel );
134  mBrowserView->setSortingEnabled( true );
135  mBrowserView->sortByColumn( 0, Qt::AscendingOrder );
136  // provide a horizontal scroll bar instead of using ellipse (...) for longer items
137  mBrowserView->setTextElideMode( Qt::ElideNone );
138  mBrowserView->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents );
139  mBrowserView->header()->setStretchLastSection( false );
140 
141  // selectionModel is created when model is set on tree
142  connect( mBrowserView->selectionModel(), &QItemSelectionModel::selectionChanged,
144 
145  // Forward the model changed signals to the widget
146  connect( mModel, &QgsBrowserModel::connectionsChanged,
148 
149 
150  // objectName used by settingsSection() is not yet set in constructor
151  QgsSettings settings;
152  mPropertiesWidgetEnabled = settings.value( settingsSection() + "/propertiesWidgetEnabled", false ).toBool();
153  mActionPropertiesWidget->setChecked( mPropertiesWidgetEnabled );
154  mPropertiesWidget->setVisible( false ); // false until item is selected
155 
156  mPropertiesWidgetHeight = settings.value( settingsSection() + "/propertiesWidgetHeight" ).toFloat();
157  QList<int> sizes = mSplitter->sizes();
158  int total = sizes.value( 0 ) + sizes.value( 1 );
159  int height = static_cast<int>( total * mPropertiesWidgetHeight );
160  sizes.clear();
161  sizes << total - height << height;
162  mSplitter->setSizes( sizes );
163  }
164 
166 }
167 
168 void QgsBrowserDockWidget::itemDoubleClicked( const QModelIndex &index )
169 {
170  QgsDataItem *item = mModel->dataItem( mProxyModel->mapToSource( index ) );
171  if ( !item )
172  return;
173 
174  QgsDataItemGuiContext context = createContext();
175 
176  const QList< QgsDataItemGuiProvider * > providers = QgsGui::instance()->dataItemGuiProviderRegistry()->providers();
177  for ( QgsDataItemGuiProvider *provider : providers )
178  {
179  if ( provider->handleDoubleClick( item, context ) )
180  return;
181  }
182 
183  // if no providers overrode the double-click handling for this item, we give the item itself a chance
184  if ( !item->handleDoubleClick() )
185  {
186  // double-click not handled by browser model, so use as default view expand behavior
187  if ( mBrowserView->isExpanded( index ) )
188  mBrowserView->collapse( index );
189  else
190  mBrowserView->expand( index );
191  }
192 }
193 
195 {
196  QModelIndex index = mProxyModel->mapToSource( mBrowserView->indexAt( pt ) );
197  QgsDataItem *item = mModel->dataItem( index );
198  if ( !item )
199  return;
200 
201  const QModelIndexList selection = mBrowserView->selectionModel()->selectedIndexes();
202  QList< QgsDataItem * > selectedItems;
203  selectedItems.reserve( selection.size() );
204  for ( const QModelIndex &selectedIndex : selection )
205  {
206  QgsDataItem *selectedItem = mProxyModel->dataItem( selectedIndex );
207  if ( selectedItem )
208  selectedItems << selectedItem;
209  }
210 
211  QMenu *menu = new QMenu( this );
212 
213  const QList<QMenu *> menus = item->menus( menu );
214  QList<QAction *> actions = item->actions( menu );
215 
216  if ( !menus.isEmpty() )
217  {
218  for ( QMenu *mn : menus )
219  {
220  menu->addMenu( mn );
221  }
222  }
223 
224  if ( !actions.isEmpty() )
225  {
226  if ( !menu->actions().isEmpty() )
227  menu->addSeparator();
228  // add action to the menu
229  menu->addActions( actions );
230  }
231 
232  QgsDataItemGuiContext context = createContext();
233 
234  const QList< QgsDataItemGuiProvider * > providers = QgsGui::instance()->dataItemGuiProviderRegistry()->providers();
235  for ( QgsDataItemGuiProvider *provider : providers )
236  {
237  provider->populateContextMenu( item, menu, selectedItems, context );
238  }
239 
240  if ( menu->actions().isEmpty() )
241  {
242  delete menu;
243  return;
244  }
245 
246  menu->popup( mBrowserView->mapToGlobal( pt ) );
247 }
248 
250 {
251  QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
252  QgsDataItem *item = mModel->dataItem( index );
253  if ( !item )
254  return;
255 
256  QgsDirectoryItem *dirItem = qobject_cast<QgsDirectoryItem *>( item );
257  if ( !dirItem )
258  return;
259 
261  addFavoriteDirectory( dirItem->dirPath() );
263 }
264 
266 {
267  QString directory = QFileDialog::getExistingDirectory( this, tr( "Add directory to favorites" ) );
268  if ( !directory.isEmpty() )
269  {
271  addFavoriteDirectory( directory );
273  }
274 }
275 
276 void QgsBrowserDockWidget::addFavoriteDirectory( const QString &favDir, const QString &name )
277 {
278  mModel->addFavoriteDirectory( favDir, name );
279 }
280 
282 {
283  mMessageBar = bar;
284  mModel->setMessageBar( bar );
285 }
286 
288 {
289  return mMessageBar;
290 }
291 
292 void QgsBrowserDockWidget::setDisabledDataItemsKeys( const QStringList &filter )
293 {
294  mDisabledDataItemsKeys = filter;
295 
296  if ( !mProxyModel )
297  return;
298 
299  mProxyModel->setHiddenDataItemProviderKeyFilter( mDisabledDataItemsKeys );
300 }
301 
303 {
304  mModel->removeFavorite( mProxyModel->mapToSource( mBrowserView->currentIndex() ) );
305 }
306 
308 {
309  refreshModel( QModelIndex() );
310 }
311 
312 void QgsBrowserDockWidget::refreshModel( const QModelIndex &index )
313 {
314  if ( mModel && mProxyModel )
315  {
316  QgsDataItem *item = mModel->dataItem( index );
317  if ( item )
318  {
319  QgsDebugMsgLevel( "path = " + item->path(), 4 );
320  }
321  else
322  {
323  QgsDebugMsgLevel( QStringLiteral( "invalid item" ), 4 );
324  }
325 
326  if ( item && ( item->capabilities2() & QgsDataItem::Fertile ) )
327  {
328  mModel->refresh( index );
329  }
330 
331  for ( int i = 0; i < mModel->rowCount( index ); i++ )
332  {
333  QModelIndex idx = mModel->index( i, 0, index );
334  QModelIndex proxyIdx = mProxyModel->mapFromSource( idx );
335  QgsDataItem *child = mModel->dataItem( idx );
336 
337  // Check also expanded descendants so that the whole expanded path does not get collapsed if one item is collapsed.
338  // Fast items (usually root items) are refreshed so that when collapsed, it is obvious they are if empty (no expand symbol).
339  if ( mBrowserView->isExpanded( proxyIdx ) || mBrowserView->hasExpandedDescendant( proxyIdx ) || ( child && child->capabilities2() & QgsDataItem::Fast ) )
340  {
341  refreshModel( idx );
342  }
343  else
344  {
345  if ( child && ( child->capabilities2() & QgsDataItem::Fertile ) )
346  {
347  child->depopulate();
348  }
349  }
350  }
351  }
352 }
353 
354 void QgsBrowserDockWidget::addLayer( QgsLayerItem *layerItem )
355 {
356  if ( !layerItem )
357  return;
358 
359  emit handleDropUriList( layerItem->mimeUris() );
360 }
361 
362 bool QgsBrowserDockWidget::addLayerAtIndex( const QModelIndex &index )
363 {
364  QgsDebugMsg( QStringLiteral( "rowCount() = %1" ).arg( mModel->rowCount( mProxyModel->mapToSource( index ) ) ) );
365  QgsDataItem *item = mModel->dataItem( mProxyModel->mapToSource( index ) );
366 
367  if ( item && item->type() == QgsDataItem::Project )
368  {
369  QgsProjectItem *projectItem = qobject_cast<QgsProjectItem *>( item );
370  if ( projectItem )
371  {
372  QApplication::setOverrideCursor( Qt::WaitCursor );
373  emit openFile( projectItem->path(), QStringLiteral( "project" ) );
374  QApplication::restoreOverrideCursor();
375  }
376  return true;
377  }
378  else if ( item && item->type() == QgsDataItem::Layer )
379  {
380  QgsLayerItem *layerItem = qobject_cast<QgsLayerItem *>( item );
381  if ( layerItem )
382  {
383  QApplication::setOverrideCursor( Qt::WaitCursor );
384  addLayer( layerItem );
385  QApplication::restoreOverrideCursor();
386  }
387  return true;
388  }
389  return false;
390 }
391 
393 {
394  QApplication::setOverrideCursor( Qt::WaitCursor );
395 
396  // get a sorted list of selected indexes
397  QModelIndexList list = mBrowserView->selectionModel()->selectedIndexes();
398  std::sort( list.begin(), list.end() );
399 
400  // If any of the layer items are QGIS we just open and exit the loop
401  const auto constList = list;
402  for ( const QModelIndex &index : constList )
403  {
404  QgsDataItem *item = mModel->dataItem( mProxyModel->mapToSource( index ) );
405  if ( item && item->type() == QgsDataItem::Project )
406  {
407  QgsProjectItem *projectItem = qobject_cast<QgsProjectItem *>( item );
408  if ( projectItem )
409  emit openFile( projectItem->path(), QStringLiteral( "project" ) );
410 
411  QApplication::restoreOverrideCursor();
412  return;
413  }
414  }
415 
416  // add items in reverse order so they are in correct order in the layers dock
417  for ( int i = list.size() - 1; i >= 0; i-- )
418  {
419  QgsDataItem *item = mModel->dataItem( mProxyModel->mapToSource( list[i] ) );
420  if ( item && item->type() == QgsDataItem::Layer )
421  {
422  QgsLayerItem *layerItem = qobject_cast<QgsLayerItem *>( item );
423  if ( layerItem )
424  addLayer( layerItem );
425  }
426  }
427 
428  QApplication::restoreOverrideCursor();
429 }
430 
432 {
433  QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
434  QgsDataItem *item = mModel->dataItem( index );
435  if ( ! item )
436  return;
437 
438  if ( item->type() == QgsDataItem::Directory )
439  {
440  mModel->hidePath( item );
441  }
442 }
443 
445 {
446  QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
447  QgsDataItem *item = mModel->dataItem( index );
448  if ( ! item )
449  return;
450 
451  if ( item->type() == QgsDataItem::Layer || item->type() == QgsDataItem::Directory )
452  {
453  QgsBrowserPropertiesDialog *dialog = new QgsBrowserPropertiesDialog( settingsSection(), this );
454  dialog->setAttribute( Qt::WA_DeleteOnClose );
455  dialog->setItem( item, createContext() );
456  dialog->show();
457  }
458 }
459 
461 {
462  QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
463  QgsDataItem *item = mModel->dataItem( index );
464  if ( ! item )
465  return;
466 
467  if ( item->type() == QgsDataItem::Directory )
468  {
469  QgsSettings settings;
470  QStringList fastScanDirs = settings.value( QStringLiteral( "qgis/scanItemsFastScanUris" ),
471  QStringList() ).toStringList();
472  int idx = fastScanDirs.indexOf( item->path() );
473  if ( idx != -1 )
474  {
475  fastScanDirs.removeAt( idx );
476  }
477  else
478  {
479  fastScanDirs << item->path();
480  }
481  settings.setValue( QStringLiteral( "qgis/scanItemsFastScanUris" ), fastScanDirs );
482  }
483 }
484 
486 {
487  mWidgetFilter->setVisible( visible );
488  if ( ! visible )
489  {
490  mLeFilter->setText( QString() );
491  setFilter();
492  }
493  else
494  {
495  mLeFilter->setFocus();
496  }
497 }
498 
500 {
501  QString filter = mLeFilter->text();
502  if ( mProxyModel )
503  mProxyModel->setFilterString( filter );
504 }
505 
507 {
508  if ( mModel )
509  mModel->updateProjectHome();
510 }
511 
513 {
514  if ( !action || ! mProxyModel )
515  return;
516 
517  mProxyModel->setFilterSyntax( static_cast< QgsBrowserProxyModel::FilterSyntax >( action->data().toInt() ) );
518 }
519 
520 void QgsBrowserDockWidget::setCaseSensitive( bool caseSensitive )
521 {
522  if ( ! mProxyModel )
523  return;
524  mProxyModel->setFilterCaseSensitivity( caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive );
525 }
526 
527 int QgsBrowserDockWidget::selectedItemsCount()
528 {
529  QItemSelectionModel *selectionModel = mBrowserView->selectionModel();
530  if ( selectionModel )
531  {
532  return selectionModel->selectedIndexes().size();
533  }
534  return 0;
535 }
536 
537 QgsDataItemGuiContext QgsBrowserDockWidget::createContext()
538 {
539  QgsDataItemGuiContext context;
540  context.setMessageBar( mMessageBar );
541  return context;
542 }
543 
544 void QgsBrowserDockWidget::selectionChanged( const QItemSelection &selected, const QItemSelection &deselected )
545 {
546  Q_UNUSED( selected )
547  Q_UNUSED( deselected )
548  if ( mPropertiesWidgetEnabled )
549  {
550  setPropertiesWidget();
551  }
552 }
553 
554 void QgsBrowserDockWidget::clearPropertiesWidget()
555 {
556  while ( mPropertiesLayout->count() > 0 )
557  {
558  delete mPropertiesLayout->itemAt( 0 )->widget();
559  }
560  mPropertiesWidget->setVisible( false );
561 }
562 
563 void QgsBrowserDockWidget::setPropertiesWidget()
564 {
565  clearPropertiesWidget();
566  QItemSelectionModel *selectionModel = mBrowserView->selectionModel();
567  if ( selectionModel )
568  {
569  QModelIndexList indexes = selectionModel->selectedIndexes();
570  if ( indexes.size() == 1 )
571  {
572  QModelIndex index = mProxyModel->mapToSource( indexes.value( 0 ) );
573  QgsDataItem *item = mModel->dataItem( index );
574  QgsDataItemGuiContext context = createContext();
575  QgsBrowserPropertiesWidget *propertiesWidget = QgsBrowserPropertiesWidget::createWidget( item, context, mPropertiesWidget );
576  if ( propertiesWidget )
577  {
578  propertiesWidget->setCondensedMode( true );
579  mPropertiesLayout->addWidget( propertiesWidget );
580  }
581  }
582  }
583  mPropertiesWidget->setVisible( mPropertiesLayout->count() > 0 );
584 }
585 
587 {
588  mPropertiesWidgetEnabled = enable;
589  if ( enable && selectedItemsCount() == 1 )
590  {
591  setPropertiesWidget();
592  }
593  else
594  {
595  clearPropertiesWidget();
596  }
597 }
598 
599 void QgsBrowserDockWidget::setActiveIndex( const QModelIndex &index )
600 {
601  if ( index.isValid() )
602  {
603  QModelIndex proxyIndex = mProxyModel->mapFromSource( index );
604  mBrowserView->expand( proxyIndex );
605  mBrowserView->setCurrentIndex( proxyIndex );
606  }
607 }
608 
610 {
611  QList<int> sizes = mSplitter->sizes();
612  float total = sizes.value( 0 ) + sizes.value( 1 );
613  mPropertiesWidgetHeight = total > 0 ? sizes.value( 1 ) / total : 0;
614 }
void refresh()
Refresh browser view model (and view)
void enablePropertiesWidget(bool enable)
Enable/disable properties widget.
void addSelectedLayers()
Add selected layers to the project.
Q_DECL_DEPRECATED void toggleFastScan()
Toggle fast scan.
QgsBrowserDockWidget(const QString &name, QgsBrowserGuiModel *browserModel, QWidget *parent=nullptr)
Constructor for QgsBrowserDockWidget.
void connectionsChanged()
Connections changed in the browser.
Q_DECL_DEPRECATED void addFavoriteDirectory()
Add directory from file dialog to favorite.
void showContextMenu(QPoint)
Show context menu.
void showProperties()
Show the layer properties.
void setActiveIndex(const QModelIndex &index)
Sets the selection to index and expand it.
Q_DECL_DEPRECATED void removeFavorite()
Remove from favorite.
void setFilter()
Apply filter to the model.
QgsMessageBar * messageBar()
Returns the message bar associated with the dock.
void handleDropUriList(const QgsMimeDataUtils::UriList &)
Emitted when drop uri list needs to be handled.
void setCaseSensitive(bool caseSensitive)
Sets filter case sensitivity.
void showEvent(QShowEvent *event) override
Show event override.
void hideItem()
Hide current item.
void setMessageBar(QgsMessageBar *bar)
Sets a message bar to use alongside the dock widget.
Q_DECL_DEPRECATED void addFavorite()
Add current item to favorite.
void showFilterWidget(bool visible)
Show/hide filter widget.
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
Selection has changed.
void setFilterSyntax(QAction *)
Sets filter syntax.
void updateProjectHome()
Update project home directory.
void openFile(const QString &fileName, const QString &fileTypeHint=QString())
Emitted when a file needs to be opened.
void splitterMoved()
Splitter has been moved.
Q_DECL_DEPRECATED bool addLayerAtIndex(const QModelIndex &index)
Adds the layer corresponding to the specified model index.
void setDisabledDataItemsKeys(const QStringList &filter)
Sets the customization for data items based on item's data provider key.
A model for showing available data sources and other items in a structured tree.
void setMessageBar(QgsMessageBar *bar)
Sets message bar that will be passed in QgsDataItemGuiContext to data items.
void connectionsChanged(const QString &providerKey)
Emitted when connections for the specified providerKey have changed in the browser.
QgsDataItem * dataItem(const QModelIndex &idx) const
Returns the data item at the specified index, or nullptr if no item exists at the index.
void hidePath(QgsDataItem *item)
Hide the given path in the browser model.
void refresh(const QString &path)
Refresh item specified by path.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void initialize()
Delayed initialization, needed because the provider registry must be already populated.
void addFavoriteDirectory(const QString &directory, const QString &name=QString())
Adds a directory to the favorites group.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
bool initialized() const
Returns true if the model has been initialized.
void removeFavorite(const QModelIndex &index)
Removes a favorite directory from its corresponding model index.
A QSortFilterProxyModel subclass for filtering and sorting browser model items.
FilterSyntax
Filter syntax options.
@ RegularExpression
Regular expression filtering.
@ Wildcards
Wildcard filtering.
@ Normal
Standard string filtering.
void setHiddenDataItemProviderKeyFilter(const QStringList &hiddenItemsFilter)
Sets a filter to hide data items based on QgsDataItem::providerKey() associated with the item.
void setFilterString(const QString &filter)
Sets the filter string to use when filtering items in the model.
QgsDataItem * dataItem(const QModelIndex &index) const
Returns the data item at the specified proxy index, or nullptr if no item exists at the index.
void setFilterCaseSensitivity(Qt::CaseSensitivity sensitivity)
Sets whether item filtering should be case sensitive.
void setFilterSyntax(FilterSyntax syntax)
Sets the filter syntax.
void setBrowserModel(QgsBrowserModel *model)
Sets the underlying browser model.
Encapsulates the context in which a QgsDataItem is shown within the application GUI.
void setMessageBar(QgsMessageBar *bar)
Sets the associated message bar.
QList< QgsDataItemGuiProvider * > providers() const
Returns the list of available providers.
Abstract base class for providers which affect how QgsDataItem items behave within the application GU...
Base class for all items in the model.
Definition: qgsdataitem.h:52
virtual Capabilities capabilities2() const
Returns the capabilities for the data item.
Definition: qgsdataitem.h:323
virtual QList< QMenu * > menus(QWidget *parent)
Returns the list of menus available for this item.
virtual bool handleDoubleClick()
Called when a user double clicks on the item.
Type type() const
Definition: qgsdataitem.h:339
@ Fertile
Can create children. Even items without this capability may have children, but cannot create them,...
Definition: qgsdataitem.h:282
@ Fast
CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms,...
Definition: qgsdataitem.h:283
virtual QList< QAction * > actions(QWidget *parent)
Returns the list of actions available for this item.
@ Project
Represents a QGIS project.
Definition: qgsdataitem.h:85
QString path() const
Definition: qgsdataitem.h:369
virtual void depopulate()
Remove children recursively and set as not populated. This is used when refreshing collapsed items.
A directory: contains subdirectories and layers.
Definition: qgsdataitem.h:804
QString dirPath() const
Returns the full path to the directory the item represents.
Definition: qgsdataitem.h:849
QgsDockWidget subclass with more fine-grained control over how the widget is closed or opened.
Definition: qgsdockwidget.h:32
void showEvent(QShowEvent *event) override
void cleared()
Emitted when the widget is cleared.
static QgsGui * instance()
Returns a pointer to the singleton instance.
Definition: qgsgui.cpp:65
static QgsDataItemGuiProviderRegistry * dataItemGuiProviderRegistry()
Returns the global data item GUI provider registry, used for tracking providers which affect the brow...
Definition: qgsgui.cpp:141
Item that represents a layer that can be opened with one of the providers.
Definition: qgsdataitem.h:554
QgsMimeDataUtils::UriList mimeUris() const override
Returns mime URIs for the data item, most data providers will only return a single URI but some data ...
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:61
Data item that can be used to represent QGIS projects.
Definition: qgsdataitem.h:879
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
#define Q_NOWARN_DEPRECATED_POP
Definition: qgis.h:798
#define Q_NOWARN_DEPRECATED_PUSH
Definition: qgis.h:797
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
#define QgsDebugMsg(str)
Definition: qgslogger.h:38