From 9340f6a5665f45fb9bb67a639945def0e28633d4 Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Sun, 7 Apr 2019 18:51:51 +0300 Subject: [PATCH] First Commit --- .gitignore | 2 + QLocklayers.py | 229 ++++++++ README.md | 9 + __init__.py | 36 ++ lock.png | Bin 0 -> 11841 bytes metadata.txt | 39 ++ resources.py | 1374 ++++++++++++++++++++++++++++++++++++++++++++++++ resources.qrc | 6 + runuifiles.bat | 1 + unlock.png | Bin 0 -> 8963 bytes 10 files changed, 1696 insertions(+) create mode 100644 .gitignore create mode 100644 QLocklayers.py create mode 100644 README.md create mode 100644 __init__.py create mode 100644 lock.png create mode 100644 metadata.txt create mode 100644 resources.py create mode 100644 resources.qrc create mode 100644 runuifiles.bat create mode 100644 unlock.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd20fdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.pyc diff --git a/QLocklayers.py b/QLocklayers.py new file mode 100644 index 0000000..423da76 --- /dev/null +++ b/QLocklayers.py @@ -0,0 +1,229 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + QLocklayers + A QGIS plugin + This tool can be used to copy the map canvas and place it in the clipboard. + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2019-04-07 + git sha : $Format:%H$ + copyright : (C) 2019 by Marios S. Kyriakou, KIOS Research and Innovation Center of Excellence (KIOS CoE) + email : mariosmsk@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" +from PyQt5.QtCore import (QSettings, QTranslator, qVersion, QCoreApplication, Qt, QTimer) +from PyQt5.QtGui import (QIcon, QImage, QFont, QKeySequence) +from PyQt5.QtWidgets import (QAction, QApplication, QMessageBox, QWidget) +from qgis.core import (QgsProject) + +# Initialize Qt resources from file resources.py +from .resources import * +# Import the code for the dialog +import os.path + + +class QLocklayers: + """QGIS Plugin Implementation.""" + + def __init__(self, iface): + """Constructor. + + :param iface: An interface instance that will be passed to this class + which provides the hook by which you can manipulate the QGIS + application at run time. + :type iface: QgsInterface + """ + # Save reference to the QGIS interface + self.iface = iface + # initialize plugin directory + self.plugin_dir = os.path.dirname(__file__) + # initialize locale + locale = QSettings().value('locale/userLocale')[0:2] + locale_path = os.path.join( + self.plugin_dir, + 'i18n', + 'QLocklayers_{}.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) + + # Declare instance attributes + self.actions = [] + self.menu = self.tr(u'&QLocklayers') + + # Check if plugin was started the first time in current QGIS session + # Must be set in initGui() to survive plugin reloads + self.first_start = None + + # noinspection PyMethodMayBeStatic + def tr(self, message): + """Get the translation for a string using Qt translation API. + + We implement this ourselves since we do not inherit QObject. + + :param message: String for translation. + :type message: str, QString + + :returns: Translated version of message. + :rtype: QString + """ + # noinspection PyTypeChecker,PyArgumentList,PyCallByClass + return QCoreApplication.translate('QLocklayers', message) + + + def add_action( + self, + icon_path, + text, + callback, + enabled_flag=True, + add_to_menu=True, + add_to_toolbar=True, + status_tip=None, + whats_this=None, + shortcut=None, + parent=None): + """Add a toolbar icon to the toolbar. + + :param icon_path: Path to the icon for this action. Can be a resource + path (e.g. ':/plugins/foo/bar.png') or a normal file system path. + :type icon_path: str + + :param text: Text that should be shown in menu items for this action. + :type text: str + + :param callback: Function to be called when the action is triggered. + :type callback: function + + :param enabled_flag: A flag indicating if the action should be enabled + by default. Defaults to True. + :type enabled_flag: bool + + :param add_to_menu: Flag indicating whether the action should also + be added to the menu. Defaults to True. + :type add_to_menu: bool + + :param add_to_toolbar: Flag indicating whether the action should also + be added to the toolbar. Defaults to True. + :type add_to_toolbar: bool + + :param status_tip: Optional text to show in a popup when mouse pointer + hovers over the action. + :type status_tip: str + + :param parent: Parent widget for the new action. Defaults None. + :type parent: QWidget + + :param whats_this: Optional text to show in the status bar when the + mouse pointer hovers over the action. + + :returns: The action that was created. Note that the action is also + added to self.actions list. + :rtype: QAction + """ + + icon = QIcon(icon_path) + action = QAction(icon, text, parent) + action.triggered.connect(callback) + action.setEnabled(enabled_flag) + + if status_tip is not None: + action.setStatusTip(status_tip) + + if whats_this is not None: + action.setWhatsThis(whats_this) + + if shortcut is not None: + action.setShortcut(QKeySequence(shortcut)) + + if add_to_toolbar: + # Adds plugin icon to Plugins toolbar + self.iface.addToolBarIcon(action) + + if add_to_menu: + self.iface.addPluginToMenu( + self.menu, + action) + + self.actions.append(action) + + return action + + + def initGui(self): + """Create the menu entries and toolbar icons inside the QGIS GUI.""" + + icon_path = ':/plugins/QLocklayers/lock.png' + self.add_action( + icon_path, + text=self.tr(u'Lock layers'), + shortcut="Ctrl+R", + callback=self.lock, + parent=self.iface.mainWindow()) + icon_path = ':/plugins/QLocklayers/unlock.png' + self.clickPhotos = self.add_action( + icon_path, + text=self.tr(u'Unlock layers'), + shortcut="Ctrl+U", + callback=self.unlock, + parent=self.iface.mainWindow()) + + def unload(self): + """Removes the plugin menu item and icon from QGIS GUI.""" + for action in self.actions: + self.iface.removePluginMenu( + self.tr(u'&QLocklayers'), + action) + self.iface.removeToolBarIcon(action) + + def showMessage(self, title, msg, button): + msgBox = QMessageBox() + msgBox.setIcon(QMessageBox.Information) + msgBox.setWindowTitle(title) + msgBox.setText(msg) + msgBox.setStandardButtons(QMessageBox.Ok) + font = QFont() + font.setPointSize(9) + msgBox.setFont(font) + msgBox.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint) + buttonY = msgBox.button(QMessageBox.Ok) + buttonY.setText(button) + buttonY.setFont(font) + msgBox.exec_() + + def lock(self): + """Run method that performs all the real work""" + + # Create the dialog with elements (after translation) and keep reference + # Only create GUI ONCE in callback, so that it will only load when the plugin is started + selectedLayers = self.iface.layerTreeView().selectedLayers() + requieredLayers = QgsProject.instance().requiredLayers() + selectedLayers.extend(requieredLayers) + QgsProject.instance().setRequiredLayers(selectedLayers) + self.showMessage(title='QLocklayers', msg='Lock selected layers succesfull.', button='OK') + + def unlock(self): + selectedLayers = self.iface.layerTreeView().selectedLayers() + requieredLayers = QgsProject.instance().requiredLayers() + + for lyr in selectedLayers: + try: + requieredLayers.remove(lyr) + except: + pass + QgsProject.instance().setRequiredLayers(requieredLayers) + self.showMessage(title='QLocklayers', msg='Unlock selected layers succesfull.', button='OK') diff --git a/README.md b/README.md new file mode 100644 index 0000000..819b03d --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ + + +# QLockLayers + +QGIS 3 plugin + +This tool can be used to lock/unlock selected layers on the project. Using button or shortcut `Ctrl-R` to lock selected layers and using `Ctrl-U` to unlock selected layers. + +* [QGIS Cyprus](https://www.facebook.com/qgiscyprus/) diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..168e2e3 --- /dev/null +++ b/__init__.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + QCopycanvas + A QGIS plugin + This tool can be used to copy the map canvas and place it in the clipboard. + Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ + ------------------- + begin : 2019-04-07 + copyright : (C) 2019 by Marios S. Kyriakou, KIOS Research and Innovation Center of Excellence (KIOS CoE) + email : mariosmsk@gmail.com + git sha : $Format:%H$ + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + This script initializes the plugin, making it known to QGIS. +""" + + +# noinspection PyPep8Naming +def classFactory(iface): # pylint: disable=invalid-name + """Load QCopycanvas class from file QCopycanvas. + + :param iface: A QGIS interface instance. + :type iface: QgsInterface + """ + # + from .QLocklayers import QLocklayers + return QLocklayers(iface) diff --git a/lock.png b/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecc8f072d642dbaa4d13b9f3fced135de15ec36 GIT binary patch literal 11841 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 D)Q?Z$VctjD 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 + + lock.png + unlock.png + + diff --git a/runuifiles.bat b/runuifiles.bat new file mode 100644 index 0000000..3417aba --- /dev/null +++ b/runuifiles.bat @@ -0,0 +1 @@ +C:\Users\mkiria01\AppData\Local\Programs\Python\Python37\Scripts\pyrcc5 resources.qrc -o resources.py \ No newline at end of file diff --git a/unlock.png b/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..fb80fab96ab4cf3a84016c950ae753f951143308 GIT binary patch literal 8963 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