18 #include <QAbstractTextDocumentLayout> 19 #include <QHeaderView> 22 #include <QToolButton> 23 #include <QFileDialog> 24 #include <QPlainTextDocumentLayout> 25 #include <QSortFilterProxyModel> 38 #include "qgsnative.h" 46 #include <QDragEnterEvent> 50 , mModel( browserModel )
51 , mPropertiesWidgetEnabled( false )
52 , mPropertiesWidgetHeight( 0 )
56 mContents->layout()->setContentsMargins( 0, 0, 0, 0 );
57 mContents->layout()->setMargin( 0 );
58 static_cast< QVBoxLayout *
>( mContents->layout() )->setSpacing( 0 );
60 setWindowTitle( name );
62 mBrowserView =
new QgsDockBrowserTreeView(
this );
63 mLayoutBrowser->addWidget( mBrowserView );
65 mWidgetFilter->hide();
66 mLeFilter->setPlaceholderText( tr(
"Type here to filter visible items…" ) );
69 QMenu *menu =
new QMenu(
this );
70 menu->setSeparatorsCollapsible(
false );
71 mBtnFilterOptions->setMenu( menu );
72 QAction *action =
new QAction( tr(
"Case Sensitive" ), menu );
73 action->setData(
"case" );
74 action->setCheckable(
true );
75 action->setChecked(
false );
77 menu->addAction( action );
78 QActionGroup *group =
new QActionGroup( menu );
79 action =
new QAction( tr(
"Filter Pattern Syntax" ), group );
80 action->setSeparator(
true );
81 menu->addAction( action );
82 action =
new QAction( tr(
"Normal" ), group );
84 action->setCheckable(
true );
85 action->setChecked(
true );
86 menu->addAction( action );
87 action =
new QAction( tr(
"Wildcard(s)" ), group );
89 action->setCheckable(
true );
90 menu->addAction( action );
91 action =
new QAction( tr(
"Regular Expression" ), group );
93 action->setCheckable(
true );
94 menu->addAction( action );
96 mBrowserView->setExpandsOnDoubleClick(
false );
100 connect( mActionCollapse, &QAction::triggered, mBrowserView, &QgsDockBrowserTreeView::collapseAll );
108 connect( mBrowserView, &QgsDockBrowserTreeView::doubleClicked,
this, &QgsBrowserDockWidget::itemDoubleClicked );
115 settings.
setValue( settingsSection() +
"/propertiesWidgetEnabled", mPropertiesWidgetEnabled );
117 settings.
setValue( settingsSection() +
"/propertiesWidgetHeight", mPropertiesWidgetHeight );
132 mBrowserView->setSettingsSection( objectName().toLower() );
133 mBrowserView->setBrowserModel( mModel );
134 mBrowserView->setModel( mProxyModel );
135 mBrowserView->setSortingEnabled(
true );
136 mBrowserView->sortByColumn( 0, Qt::AscendingOrder );
138 mBrowserView->setTextElideMode( Qt::ElideNone );
139 mBrowserView->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents );
140 mBrowserView->header()->setStretchLastSection(
false );
143 connect( mBrowserView->selectionModel(), &QItemSelectionModel::selectionChanged,
153 mPropertiesWidgetEnabled = settings.
value( settingsSection() +
"/propertiesWidgetEnabled",
false ).toBool();
154 mActionPropertiesWidget->setChecked( mPropertiesWidgetEnabled );
155 mPropertiesWidget->setVisible(
false );
157 mPropertiesWidgetHeight = settings.
value( settingsSection() +
"/propertiesWidgetHeight" ).toFloat();
158 QList<int> sizes = mSplitter->sizes();
159 int total = sizes.value( 0 ) + sizes.value( 1 );
160 int height =
static_cast<int>( total * mPropertiesWidgetHeight );
162 sizes << total - height << height;
163 mSplitter->setSizes( sizes );
169 void QgsBrowserDockWidget::itemDoubleClicked(
const QModelIndex &index )
180 if ( provider->handleDoubleClick( item, context ) )
188 if ( mBrowserView->isExpanded( index ) )
189 mBrowserView->collapse( index );
191 mBrowserView->expand( index );
197 QModelIndex index = mProxyModel->mapToSource( mBrowserView->indexAt( pt ) );
202 const QModelIndexList selection = mBrowserView->selectionModel()->selectedIndexes();
203 QList< QgsDataItem * > selectedItems;
204 selectedItems.reserve( selection.size() );
205 for (
const QModelIndex &selectedIndex : selection )
209 selectedItems << selectedItem;
212 QMenu *menu =
new QMenu(
this );
214 const QList<QMenu *> menus = item->
menus( menu );
215 QList<QAction *> actions = item->
actions( menu );
217 if ( !menus.isEmpty() )
219 for ( QMenu *mn : menus )
225 if ( !actions.isEmpty() )
227 if ( !menu->actions().isEmpty() )
228 menu->addSeparator();
230 menu->addActions( actions );
238 provider->populateContextMenu( item, menu, selectedItems, context );
241 if ( menu->actions().isEmpty() )
247 menu->popup( mBrowserView->mapToGlobal( pt ) );
252 QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
268 QString directory = QFileDialog::getExistingDirectory(
this, tr(
"Add directory to favorites" ) );
269 if ( !directory.isEmpty() )
295 mDisabledDataItemsKeys = filter;
305 mModel->
removeFavorite( mProxyModel->mapToSource( mBrowserView->currentIndex() ) );
310 refreshModel( QModelIndex() );
313 void QgsBrowserDockWidget::refreshModel(
const QModelIndex &index )
315 if ( mModel && mProxyModel )
332 for (
int i = 0; i < mModel->
rowCount( index ); i++ )
334 QModelIndex idx = mModel->
index( i, 0, index );
335 QModelIndex proxyIdx = mProxyModel->mapFromSource( idx );
340 if ( mBrowserView->isExpanded( proxyIdx ) || mBrowserView->hasExpandedDescendant( proxyIdx ) || ( child && child->
capabilities2() &
QgsDataItem::Fast ) )
355 void QgsBrowserDockWidget::addLayer(
QgsLayerItem *layerItem )
367 QgsDebugMsg( QStringLiteral(
"rowCount() = %1" ).arg( mModel->
rowCount( mProxyModel->mapToSource( index ) ) ) );
375 QApplication::setOverrideCursor( Qt::WaitCursor );
376 emit
openFile( projectItem->
path(), QStringLiteral(
"project" ) );
377 QApplication::restoreOverrideCursor();
386 QApplication::setOverrideCursor( Qt::WaitCursor );
387 addLayer( layerItem );
388 QApplication::restoreOverrideCursor();
397 QApplication::setOverrideCursor( Qt::WaitCursor );
400 QModelIndexList list = mBrowserView->selectionModel()->selectedIndexes();
401 std::sort( list.begin(), list.end() );
404 const auto constList = list;
405 for (
const QModelIndex &index : constList )
412 emit
openFile( projectItem->
path(), QStringLiteral(
"project" ) );
414 QApplication::restoreOverrideCursor();
420 for (
int i = list.size() - 1; i >= 0; i-- )
427 addLayer( layerItem );
431 QApplication::restoreOverrideCursor();
436 QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
449 QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
456 QgsBrowserPropertiesDialog *dialog =
new QgsBrowserPropertiesDialog( settingsSection(),
this );
457 dialog->setAttribute( Qt::WA_DeleteOnClose );
458 dialog->setItem( item, createContext() );
465 QModelIndex index = mProxyModel->mapToSource( mBrowserView->currentIndex() );
473 QStringList fastScanDirs = settings.
value( QStringLiteral(
"qgis/scanItemsFastScanUris" ),
474 QStringList() ).toStringList();
475 int idx = fastScanDirs.indexOf( item->
path() );
478 fastScanDirs.removeAt( idx );
482 fastScanDirs << item->
path();
484 settings.
setValue( QStringLiteral(
"qgis/scanItemsFastScanUris" ), fastScanDirs );
490 mWidgetFilter->setVisible( visible );
493 mLeFilter->setText( QString() );
498 mLeFilter->setFocus();
504 QString filter = mLeFilter->text();
517 if ( !action || ! mProxyModel )
520 mProxyModel->
setFilterSyntax( static_cast< QgsBrowserProxyModel::FilterSyntax >( action->data().toInt() ) );
530 int QgsBrowserDockWidget::selectedItemsCount()
532 QItemSelectionModel *selectionModel = mBrowserView->selectionModel();
533 if ( selectionModel )
535 return selectionModel->selectedIndexes().size();
550 Q_UNUSED( deselected )
551 if ( mPropertiesWidgetEnabled )
553 setPropertiesWidget();
557 void QgsBrowserDockWidget::clearPropertiesWidget()
559 while ( mPropertiesLayout->count() > 0 )
561 delete mPropertiesLayout->itemAt( 0 )->widget();
563 mPropertiesWidget->setVisible(
false );
566 void QgsBrowserDockWidget::setPropertiesWidget()
568 clearPropertiesWidget();
569 QItemSelectionModel *selectionModel = mBrowserView->selectionModel();
570 if ( selectionModel )
572 QModelIndexList indexes = selectionModel->selectedIndexes();
573 if ( indexes.size() == 1 )
575 QModelIndex index = mProxyModel->mapToSource( indexes.value( 0 ) );
578 QgsBrowserPropertiesWidget *propertiesWidget = QgsBrowserPropertiesWidget::createWidget( item, context, mPropertiesWidget );
579 if ( propertiesWidget )
581 propertiesWidget->setCondensedMode(
true );
582 mPropertiesLayout->addWidget( propertiesWidget );
586 mPropertiesWidget->setVisible( mPropertiesLayout->count() > 0 );
591 mPropertiesWidgetEnabled = enable;
592 if ( enable && selectedItemsCount() == 1 )
594 setPropertiesWidget();
598 clearPropertiesWidget();
604 if ( index.isValid() )
606 QModelIndex proxyIndex = mProxyModel->mapFromSource( index );
607 mBrowserView->expand( proxyIndex );
608 mBrowserView->setCurrentIndex( proxyIndex );
614 QList<int> sizes = mSplitter->sizes();
615 float total = sizes.value( 0 ) + sizes.value( 1 );
616 mPropertiesWidgetHeight = total > 0 ? sizes.value( 1 ) / total : 0;
virtual QList< QMenu * > menus(QWidget *parent)
Returns the list of menus available for this item.
void connectionsChanged()
Connections changed in the browser, forwarded to the widget and used to notify the provider dialogs o...
void hidePath(QgsDataItem *item)
Hide the given path in the browser model.
This class is a composition of two QSettings instances:
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setDataItemProviderKeyFilter(const QStringList &filter)
Sets the customization filters for data items based on item's data provider key.
static QgsDataItemGuiProviderRegistry * dataItemGuiProviderRegistry()
Returns the global data item GUI provider registry, used for tracking providers which affect the brow...
#define Q_NOWARN_DEPRECATED_PUSH
A bar for displaying non-blocking messages to the user.
void setBrowserModel(QgsBrowserModel *model)
Sets the underlying browser model.
virtual void depopulate()
Remove children recursively and set as not populated. This is used when refreshing collapsed items...
A model for showing available data sources and other items in a structured tree.
QList< QgsDataItemGuiProvider * > providers() const
Returns the list of available providers.
static QgsGui * instance()
Returns a pointer to the singleton instance.
void setFilterSyntax(FilterSyntax syntax)
Sets the filter syntax.
bool initialized() const
Returns true if the model has been initialized.
#define QgsDebugMsgLevel(str, level)
Regular expression filtering.
virtual bool handleDoubleClick()
Called when a user double clicks on the item.
void setFilterString(const QString &filter)
Sets the filter string to use when filtering items in the model.
void initialize()
Delayed initialization, needed because the provider registry must be already populated.
QgsDataItem * dataItem(const QModelIndex &idx) const
Returns the data item at the specified index, or nullptr if no item exists at the index...
void removeFavorite(const QModelIndex &index)
Removes a favorite directory from its corresponding model index.
Abstract base class for providers which affect how QgsDataItem items behave within the application GU...
void setFilterCaseSensitivity(Qt::CaseSensitivity sensitivity)
Sets whether item filtering should be case sensitive.
A directory: contains subdirectories and layers.
Base class for all items in the model.
Encapsulates the context in which a QgsDataItem is shown within the application GUI.
Can create children. Even items without this capability may have children, but cannot create them...
#define Q_NOWARN_DEPRECATED_POP
void addFavoriteDirectory(const QString &directory, const QString &name=QString())
Adds a directory to the favorites group.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
QgsMimeDataUtils::Uri mimeUri() const override
Returns mime URI for the data item.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void setMessageBar(QgsMessageBar *bar)
Sets the associated message bar.
void cleared()
Emitted when the widget is cleared.
virtual QList< QAction * > actions(QWidget *parent)
Returns the list of actions available for this item.
QString dirPath() const
Returns the full path to the directory the item represents.
void refresh(const QString &path)
Refresh item specified by path.
Standard string filtering.
A QSortFilterProxyModel subclass for filtering and sorting browser model items.
QList< QgsMimeDataUtils::Uri > UriList
Represents a QGIS project.
Item that represents a layer that can be opened with one of the providers.
Data item that can be used to represent QGIS projects.
QgsDataItem * dataItem(const QModelIndex &index) const
Returns the data item at the specified proxy index, or nullptr if no item exists at the index...
CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms...
void setMessageBar(QgsMessageBar *bar)
Sets message bar that will be passed in QgsDataItemGuiContext to data items.
virtual Capabilities capabilities2() const
Returns the capabilities for the data item.