diff --git a/python/console/console_sci.py b/python/console/console_sci.py
index 5f1087ce604a..1c6068112c8c 100644
--- a/python/console/console_sci.py
+++ b/python/console/console_sci.py
@@ -478,9 +478,8 @@ def showApiDocumentation(self, text, force_search=False):
pythonSettingsTreeNode = QgsSettingsTree.node("gui").childNode("code-editor").childNode("python")
embedded = pythonSettingsTreeNode.childSetting('context-help-embedded').value()
- api = "pyqgis" if pythonSettingsTreeNode.childSetting('context-help-pyqgis').value() else "qgis"
- self._interpreter.execCommandImpl(f'_help({repr(text)}, api="{api}", embedded={embedded}, force_search={force_search})', show_input=False)
+ self._interpreter.execCommandImpl(f'_help({repr(text)}, api="pyqgis", embedded={embedded}, force_search={force_search})', show_input=False)
def showApi(self, api):
pythonSettingsTreeNode = QgsSettingsTree.node("gui").childNode("code-editor").childNode("python")
diff --git a/python/console/console_settings.py b/python/console/console_settings.py
index 93af15b063a6..39ecc7e14b74 100644
--- a/python/console/console_settings.py
+++ b/python/console/console_settings.py
@@ -211,7 +211,8 @@ def saveSettings(self):
settings.setValue("pythonConsole/formatOnSave", self.formatOnSave.isChecked())
- pythonSettingsTreeNode = QgsSettingsTree.node("gui").childNode("code-editor").childNode("python")
+ codeEditorTreeNode = QgsSettingsTree.node("gui").childNode("code-editor")
+ pythonSettingsTreeNode = codeEditorTreeNode.childNode("python")
pythonSettingsTreeNode.childSetting("sort-imports").setValue(self.sortImports.isChecked())
pythonSettingsTreeNode.childSetting("formatter").setValue(self.formatter.currentText())
pythonSettingsTreeNode.childSetting("autopep8-level").setValue(self.autopep8Level.value())
@@ -219,7 +220,7 @@ def saveSettings(self):
pythonSettingsTreeNode.childSetting("max-line-length").setValue(self.maxLineLength.value())
pythonSettingsTreeNode.childSetting('external-editor').setValue(self.externalEditor.text())
pythonSettingsTreeNode.childSetting('context-help-embedded').setValue(self.contextHelpBrowser.currentIndex() == 0)
- pythonSettingsTreeNode.childSetting('context-help-pyqgis').setValue(self.contextHelpApi.currentIndex() == 0)
+ codeEditorTreeNode.childSetting('context-help-hover').setValue(self.contextHelpHover.isChecked())
def restoreSettings(self):
settings = QgsSettings()
@@ -245,7 +246,8 @@ def restoreSettings(self):
self.autoSurround.setChecked(settings.value("pythonConsole/autoSurround", True, type=bool))
self.autoInsertImport.setChecked(settings.value("pythonConsole/autoInsertImport", False, type=bool))
- pythonSettingsTreeNode = QgsSettingsTree.node("gui").childNode("code-editor").childNode("python")
+ codeEditorTreeNode = QgsSettingsTree.node("gui").childNode("code-editor")
+ pythonSettingsTreeNode = codeEditorTreeNode.childNode("python")
self.formatOnSave.setChecked(settings.value("pythonConsole/formatOnSave", False, type=bool))
self.sortImports.setChecked(pythonSettingsTreeNode.childSetting("sort-imports").value())
@@ -254,7 +256,7 @@ def restoreSettings(self):
self.blackNormalizeQuotes.setChecked(pythonSettingsTreeNode.childSetting("black-normalize-quotes").value())
self.maxLineLength.setValue(pythonSettingsTreeNode.childSetting("max-line-length").value())
self.contextHelpBrowser.setCurrentIndex(0 if pythonSettingsTreeNode.childSetting('context-help-embedded').value() else 1)
- self.contextHelpApi.setCurrentIndex(0 if pythonSettingsTreeNode.childSetting('context-help-pyqgis').value() else 1)
+ self.contextHelpHover.setChecked(codeEditorTreeNode.childSetting('context-help-hover').value())
if settings.value("pythonConsole/autoCompleteSource") == 'fromDoc':
self.autoCompFromDoc.setChecked(True)
diff --git a/python/console/console_settings.ui b/python/console/console_settings.ui
index 501f7de33810..c8e1c3c81e23 100644
--- a/python/console/console_settings.ui
+++ b/python/console/console_settings.ui
@@ -55,7 +55,7 @@
0
0
739
- 1242
+ 1240
@@ -619,27 +619,13 @@
- -
-
+
-
+
- API
+ F1 works on hovered words
- -
-
-
-
-
- PyQGIS
-
-
- -
-
- C++ QGIS
-
-
-
-
@@ -677,7 +663,6 @@
autoSurround
autoInsertImport
contextHelpBrowser
- contextHelpApi
formatOnSave
sortImports
maxLineLength
diff --git a/src/app/devtools/documentation/qgsdocumentationpanelwidget.cpp b/src/app/devtools/documentation/qgsdocumentationpanelwidget.cpp
index 81cefc3c92e3..0fe86ddb81a2 100644
--- a/src/app/devtools/documentation/qgsdocumentationpanelwidget.cpp
+++ b/src/app/devtools/documentation/qgsdocumentationpanelwidget.cpp
@@ -27,8 +27,7 @@ QgsDocumentationPanelWidget::QgsDocumentationPanelWidget( QWidget *parent )
{
setupUi( this );
- connect( mPythonHomeButton, &QToolButton::clicked, this, [] {QgisApp::instance()->showApiDocumentation( QStringLiteral( "pyqgis" ), true );} );
- connect( mCppHomeButton, &QToolButton::clicked, this, [] {QgisApp::instance()->showApiDocumentation( QStringLiteral( "qgis" ), true );} );
+ connect( mPyQgisHomeButton, &QToolButton::clicked, this, [] {QgisApp::instance()->showApiDocumentation( QStringLiteral( "pyqgis" ), true );} );
connect( mQtHomeButton, &QToolButton::clicked, this, [] {QgisApp::instance()->showApiDocumentation( QStringLiteral( "qt" ), true );} );
connect( mOpenUrlButton, &QToolButton::clicked, this, [this] {QgisApp::instance()->openURL( mWebView->url().toString(), false );} );
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index 82d9884f9c8e..fc08846da471 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -571,6 +571,44 @@ class QTreeWidgetItem;
class QgsUserProfileManager;
class QgsUserProfile;
+
+
+class TestAction: public QWidgetAction
+{
+ public:
+ TestAction( QObject *parent = nullptr ): QWidgetAction( parent ) {};
+ virtual QToolButton *createToolButton() = 0;
+
+ QWidget *createWidget( QWidget *parent )
+ {
+ auto widget = createToolButton();
+ widget->setParent( parent );
+ if ( dynamic_cast( parent ) )
+ {
+
+ widget->setText( QStringLiteral( " " ) + widget->text() );
+ widget->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
+ }
+ return widget;
+ }
+};
+
+class MapThemeAction: public TestAction
+{
+ public:
+ MapThemeAction( QObject *parent = nullptr ): TestAction( parent ) {};
+ QToolButton *createToolButton() override
+ {
+ QToolButton *btnVisibilityPresets = new QToolButton();
+ btnVisibilityPresets->setAutoRaise( true );
+ btnVisibilityPresets->setText( tr( "Manage Map Themes" ) );
+ btnVisibilityPresets->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ) );
+ btnVisibilityPresets->setPopupMode( QToolButton::InstantPopup );
+ btnVisibilityPresets->setMenu( QgsMapThemes::instance()->menu() );
+ return btnVisibilityPresets;
+ }
+};
+
/**
* Set the application title bar text
*/
@@ -4960,12 +4998,15 @@ void QgisApp::initLayerTreeView()
connect( actionAddGroup, &QAction::triggered, mLayerTreeView->defaultActions(), &QgsLayerTreeViewDefaultActions::addGroup );
// visibility groups tool button
+
+ QWidgetAction *btnVisibilityPresetsAction = new QWidgetAction( this );
QToolButton *btnVisibilityPresets = new QToolButton;
btnVisibilityPresets->setAutoRaise( true );
btnVisibilityPresets->setToolTip( tr( "Manage Map Themes" ) );
btnVisibilityPresets->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionShowAllLayers.svg" ) ) );
btnVisibilityPresets->setPopupMode( QToolButton::InstantPopup );
btnVisibilityPresets->setMenu( QgsMapThemes::instance()->menu() );
+ btnVisibilityPresetsAction->setDefaultWidget( btnVisibilityPresets );
// filter legend actions
mFilterLegendToolButton = new QToolButton( this );
@@ -5015,7 +5056,9 @@ void QgisApp::initLayerTreeView()
toolbar->setIconSize( iconSize( true ) );
toolbar->addAction( mActionStyleDock );
toolbar->addAction( actionAddGroup );
- toolbar->addWidget( btnVisibilityPresets );
+ toolbar->addAction( btnVisibilityPresetsAction );
+ auto aa = new MapThemeAction( this );
+ toolbar->addAction( aa );
toolbar->addWidget( mFilterLegendToolButton );
toolbar->addWidget( mLegendExpressionFilterButton );
toolbar->addAction( actionExpandAll );
@@ -12943,7 +12986,7 @@ void QgisApp::apiDocumentation()
showApiDocumentation( "qgis", false );
}
-void QgisApp::pyQgisApiDocumentation()
+void QgisApp::pyQgisApiDocumentation( )
{
showApiDocumentation( "pyqgis", false );
}
diff --git a/src/gui/codeeditors/qgscodeeditor.cpp b/src/gui/codeeditors/qgscodeeditor.cpp
index 5a5a273b5bcf..c0c7a844aabe 100644
--- a/src/gui/codeeditors/qgscodeeditor.cpp
+++ b/src/gui/codeeditors/qgscodeeditor.cpp
@@ -23,6 +23,7 @@
#include "qgscodeeditorhistorydialog.h"
#include "qgsstringutils.h"
#include "qgsfontutils.h"
+#include "qgssettingsentryimpl.h"
#include
#include
@@ -36,6 +37,12 @@
#include
#include
+///@cond PRIVATE
+const QgsSettingsEntryBool *QgsCodeEditor::settingContextHelpHover = new QgsSettingsEntryBool( QStringLiteral( "context-help-hover" ), sTreeCodeEditor, false, QStringLiteral( "Whether the context help should works on hovered words" ) );
+///@endcond PRIVATE
+
+
+
QMap< QgsCodeEditorColorScheme::ColorRole, QString > QgsCodeEditor::sColorRoleToSettingsKey
{
{QgsCodeEditorColorScheme::ColorRole::Default, QStringLiteral( "defaultFontColor" ) },
@@ -198,7 +205,7 @@ void QgsCodeEditor::keyPressEvent( QKeyEvent *event )
QString text = selectedText();
// Check if mouse is hovering over a word
- if ( text.isEmpty() )
+ if ( text.isEmpty() && settingContextHelpHover->value() )
{
text = wordAtPoint( mapFromGlobal( QCursor::pos() ) );
}
diff --git a/src/gui/codeeditors/qgscodeeditor.h b/src/gui/codeeditors/qgscodeeditor.h
index f63a5fb907f7..7de200fd035d 100644
--- a/src/gui/codeeditors/qgscodeeditor.h
+++ b/src/gui/codeeditors/qgscodeeditor.h
@@ -33,6 +33,7 @@
class QgsFilterLineEdit;
class QToolButton;
class QCheckBox;
+class QgsSettingsEntryBool;
SIP_IF_MODULE( HAVE_QSCI_SIP )
@@ -107,6 +108,7 @@ class GUI_EXPORT QgsCodeEditor : public QsciScintilla
#ifndef SIP_RUN
static inline QgsSettingsTreeNode *sTreeCodeEditor = QgsSettingsTree::sTreeGui->createChildNode( QStringLiteral( "code-editor" ) );
+ static const QgsSettingsEntryBool *settingContextHelpHover;
#endif
/**
diff --git a/src/gui/codeeditors/qgscodeeditorpython.cpp b/src/gui/codeeditors/qgscodeeditorpython.cpp
index 17e7bb57c842..fc13256d9a48 100644
--- a/src/gui/codeeditors/qgscodeeditorpython.cpp
+++ b/src/gui/codeeditors/qgscodeeditorpython.cpp
@@ -52,7 +52,6 @@ const QgsSettingsEntryInteger *QgsCodeEditorPython::settingAutopep8Level = new Q
const QgsSettingsEntryBool *QgsCodeEditorPython::settingBlackNormalizeQuotes = new QgsSettingsEntryBool( QStringLiteral( "black-normalize-quotes" ), sTreePythonCodeEditor, true, QStringLiteral( "Whether quotes should be normalized when auto-formatting code using black" ) );
const QgsSettingsEntryString *QgsCodeEditorPython::settingExternalPythonEditorCommand = new QgsSettingsEntryString( QStringLiteral( "external-editor" ), sTreePythonCodeEditor, QString(), QStringLiteral( "Command to launch an external Python code editor. Use the token to insert the filename, to insert line number, and to insert the column number." ) );
const QgsSettingsEntryBool *QgsCodeEditorPython::settingContextHelpEmbedded = new QgsSettingsEntryBool( QStringLiteral( "context-help-embedded" ), sTreePythonCodeEditor, true, QStringLiteral( "Whether the context help should be displayed in an embedded webview in the devtools panel" ) );
-const QgsSettingsEntryBool *QgsCodeEditorPython::settingContextHelpPyQgis = new QgsSettingsEntryBool( QStringLiteral( "context-help-pyqgis" ), sTreePythonCodeEditor, true, QStringLiteral( "Whether the context help should use the PyQGIS api instead of the C++ API" ) );
///@endcond PRIVATE
@@ -741,34 +740,17 @@ void QgsCodeEditorPython::showApiDocumentation( const QString &text )
{
QString searchText = text;
searchText = searchText.replace( QLatin1String( ">>> " ), QString() ).replace( QLatin1String( "... " ), QString() ).trimmed(); // removing prompts
- QRegularExpression qgisExpression( "^Qgs[A-Z][a-zA-Z]" );
QRegularExpression qtExpression( "^Q[A-Z][a-zA-Z]" );
- bool pyQgis = QgsCodeEditorPython::settingContextHelpPyQgis->value();
-
- const QString qgisVersion = QString( Qgis::version() ).split( '.' ).mid( 0, 2 ).join( '.' );
- const QString qtVersion = QString( qVersion() ).split( '.' ).mid( 0, 2 ).join( '.' );
-
- QgsSettings settings;
-
- if ( qgisExpression.match( searchText ).hasMatch() )
- {
- if ( !pyQgis )
- {
-
- QString baseUrl = settings.value( QStringLiteral( "qgis/QgisApiUrl" ),
- QString( "https://qgis.org/api/%1" ).arg( qgisVersion ) ).toString();
- QDesktopServices::openUrl( QUrl( QString( "%1/class%2.html" ).arg( baseUrl, searchText ) ) );
- return;
- }
- }
- else if ( qtExpression.match( searchText ).hasMatch() )
+ if ( qtExpression.match( searchText ).hasMatch() )
{
+ const QString qtVersion = QString( qVersion() ).split( '.' ).mid( 0, 2 ).join( '.' );
QString baseUrl = QString( "https://doc.qt.io/qt-%1" ).arg( qtVersion );
QDesktopServices::openUrl( QUrl( QStringLiteral( "%1/%2.html" ).arg( baseUrl, searchText.toLower() ) ) );
return;
}
+ const QString qgisVersion = QString( Qgis::version() ).split( '.' ).mid( 0, 2 ).join( '.' );
QDesktopServices::openUrl( QUrl( QStringLiteral( "https://qgis.org/pyqgis/%1/search.html?q=%2" ).arg( qgisVersion, searchText ) ) );
}
diff --git a/src/gui/codeeditors/qgscodeeditorpython.h b/src/gui/codeeditors/qgscodeeditorpython.h
index 50d3a2e4c369..fc125410c6c2 100644
--- a/src/gui/codeeditors/qgscodeeditorpython.h
+++ b/src/gui/codeeditors/qgscodeeditorpython.h
@@ -63,7 +63,6 @@ class GUI_EXPORT QgsCodeEditorPython : public QgsCodeEditor
static const QgsSettingsEntryBool *settingBlackNormalizeQuotes;
static const QgsSettingsEntryString *settingExternalPythonEditorCommand;
static const QgsSettingsEntryBool *settingContextHelpEmbedded;
- static const QgsSettingsEntryBool *settingContextHelpPyQgis;
///@endcond PRIVATE
#endif
diff --git a/src/ui/qgsdocumentationpanelbase.ui b/src/ui/qgsdocumentationpanelbase.ui
index a32d940998a9..288d4dee34d1 100644
--- a/src/ui/qgsdocumentationpanelbase.ui
+++ b/src/ui/qgsdocumentationpanelbase.ui
@@ -21,27 +21,10 @@
-
-
-
+
PyQGIS API Documentation
-
-
- :/images/themes/default/mIconPythonFile.svg:/images/themes/default/mIconPythonFile.svg
-
-
-
- 24
- 24
-
-
-
-
- -
-
-
- C++ API documentation
-
:/images/icons/qgis_icon.svg:/images/icons/qgis_icon.svg