Skip to content

Commit

Permalink
Merge pull request #223 from gee-community/feature/cleanup-menus
Browse files Browse the repository at this point in the history
Fix menu icons, add toolbar
  • Loading branch information
alukach authored Feb 10, 2025
2 parents 56b35bd + d524f7a commit 3586290
Showing 1 changed file with 75 additions and 41 deletions.
116 changes: 75 additions & 41 deletions ee_plugin/ee_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,34 @@
import os.path
import webbrowser
from builtins import object
from typing import cast

import requests # type: ignore
from qgis import gui
from qgis.core import QgsProject
from qgis.PyQt.QtCore import QCoreApplication, QSettings, QTranslator, qVersion
from qgis.PyQt import QtWidgets
from qgis.PyQt.QtCore import QCoreApplication, QSettings, QTranslator, qVersion, Qt
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction


PLUGIN_DIR = os.path.dirname(__file__)

# read the plugin version from metadata
cfg = configparser.ConfigParser()
cfg.read(os.path.join(os.path.dirname(__file__), "metadata.txt"))
cfg.read(os.path.join(PLUGIN_DIR, "metadata.txt"))
VERSION = cfg.get("general", "version")
version_checked = False


def icon(icon_name: str) -> QIcon:
"""Helper function to return an icon from the plugin directory."""
return QIcon(os.path.join(PLUGIN_DIR, "icons", icon_name))


class GoogleEarthEnginePlugin(object):
"""QGIS Plugin Implementation."""

def __init__(self, iface):
def __init__(self, iface: gui.QgisInterface):
"""Constructor.
:param iface: An interface instance that will be passed to this class
Expand All @@ -40,24 +50,21 @@ def __init__(self, iface):
# Save reference to the QGIS interface
self.iface = iface

# initialize plugin directory
self.plugin_dir = os.path.dirname(__file__)
self.menu = None
self.toolButton = None

# initialize locale
locale = QSettings().value("locale/userLocale")[0:2]
locale_path = os.path.join(
self.plugin_dir, "i18n", "GoogleEarthEnginePlugin_{}.qm".format(locale)
PLUGIN_DIR, "i18n", "GoogleEarthEnginePlugin_{}.qm".format(locale)
)

if os.path.exists(locale_path):
self.translator = QTranslator()
self.translator.load(locale_path)

if qVersion() > "4.3.3":
QCoreApplication.installTranslator(self.translator)

self.menu_name_plugin = self.tr("Google Earth Engine")

# Create and register the EE data providers
provider.register_data_provider()

Expand All @@ -77,39 +84,72 @@ def tr(self, message):
return QCoreApplication.translate("GoogleEarthEngine", message)

def initGui(self):
### Main dockwidget menu
# Create action that will start plugin configuration
ee_icon_path = ":/plugins/ee_plugin/icons/earth-engine.svg"
self.cmd_ee_user_guide = QAction(
QIcon(ee_icon_path), "User Guide", self.iface.mainWindow()
"""Initialize the plugin GUI."""
# Build actions
ee_user_guide_action = QtWidgets.QAction(
icon=icon("earth-engine.svg"),
text=self.tr("User Guide"),
parent=self.iface.mainWindow(),
triggered=self._run_cmd_ee_user_guide,
)
self.cmd_ee_user_guide.triggered.connect(self.run_cmd_ee_user_guide)

gcp_icon_path = ":/plugins/ee_plugin/icons/google-cloud.svg"
self.cmd_sign_in = QAction(
QIcon(gcp_icon_path), "Sign-in", self.iface.mainWindow()
sign_in_action = QtWidgets.QAction(
icon=icon("google-cloud.svg"),
text=self.tr("Sign-in"),
parent=self.iface.mainWindow(),
triggered=self._run_cmd_sign_in,
)
self.cmd_sign_in.triggered.connect(self.run_cmd_sign_in)

gcp_project_icon_path = ":/plugins/ee_plugin/icons/google-cloud-project.svg"
self.cmd_set_cloud_project = QAction(
QIcon(gcp_project_icon_path), "Set Project", self.iface.mainWindow()
set_cloud_project_action = QtWidgets.QAction(
icon=icon("google-cloud-project.svg"),
text=self.tr("Set Project"),
parent=self.iface.mainWindow(),
triggered=self._run_cmd_set_cloud_project,
)
self.cmd_set_cloud_project.triggered.connect(self.run_cmd_set_cloud_project)

# Add menu item
self.iface.addPluginToMenu(self.menu_name_plugin, self.cmd_ee_user_guide)
self.iface.addPluginToMenu(self.menu_name_plugin, self.cmd_sign_in)
self.iface.addPluginToMenu(self.menu_name_plugin, self.cmd_set_cloud_project)
# Build plugin menu
plugin_menu = cast(QtWidgets.QMenu, self.iface.pluginMenu())
ee_menu = plugin_menu.addMenu(
icon("earth-engine.svg"),
self.tr("&Google Earth Engine"),
)
self.menu = ee_menu
ee_menu.addAction(ee_user_guide_action)
ee_menu.addSeparator()
ee_menu.addAction(sign_in_action)
ee_menu.addAction(set_cloud_project_action)

# Build toolbar
toolButton = QtWidgets.QToolButton()
toolButton.setToolButtonStyle(
Qt.ToolButtonStyle.ToolButtonIconOnly
# Qt.ToolButtonStyle.ToolButtonTextBesideIcon
)
toolButton.setPopupMode(
QtWidgets.QToolButton.ToolButtonPopupMode.MenuButtonPopup
)
toolButton.setMenu(QtWidgets.QMenu())
toolButton.setDefaultAction(ee_user_guide_action)
toolButton.menu().addAction(ee_user_guide_action)
toolButton.menu().addSeparator()
toolButton.menu().addAction(sign_in_action)
toolButton.menu().addAction(set_cloud_project_action)
self.iface.pluginToolBar().addWidget(toolButton)
self.toolButton = toolButton

# Register signal to initialize EE layers on project load
self.iface.projectRead.connect(self.updateLayers)
self.iface.projectRead.connect(self._updateLayers)

def unload(self):
if self.menu:
self.iface.pluginMenu().removeAction(self.menu.menuAction())

if self.toolButton:
self.toolButton.deleteLater()

def run_cmd_ee_user_guide(self):
def _run_cmd_ee_user_guide(self):
# open user guide in external web browser
webbrowser.open_new("http://qgis-ee-plugin.appspot.com/user-guide")

def run_cmd_sign_in(self):
def _run_cmd_sign_in(self):
import ee

from ee_plugin import ee_auth # type: ignore
Expand All @@ -120,7 +160,7 @@ def run_cmd_sign_in(self):
# after resetting authentication, select Google Cloud project again
ee_auth.select_project()

def run_cmd_set_cloud_project(self):
def _run_cmd_set_cloud_project(self):
from ee_plugin import ee_auth # type: ignore

ee_auth.select_project()
Expand Down Expand Up @@ -156,13 +196,7 @@ def check_version(self):
finally:
version_checked = True

def unload(self):
# Remove the plugin menu item and icon
self.iface.removePluginMenu(self.menu_name_plugin, self.cmd_ee_user_guide)
self.iface.removePluginMenu(self.menu_name_plugin, self.cmd_sign_in)
self.iface.removePluginMenu(self.menu_name_plugin, self.cmd_set_cloud_project)

def updateLayers(self):
def _updateLayers(self):
import ee

from .utils import add_or_update_ee_layer
Expand Down

0 comments on commit 3586290

Please sign in to comment.