[processing] drop WebView dependency (follow up 38f6ace4c0)

This commit is contained in:
Alexander Bruy 2016-05-27 19:04:25 +03:00
parent dd69a59655
commit cc7eb27a27
23 changed files with 147 additions and 222 deletions

View File

@ -29,10 +29,11 @@ import os
from processing.core.Processing import Processing
class ProcessingExampleScriptsPlugin:
def initGui(self):
Processing.addScripts(os.path.join(os.path.dirname(__file__), "scripts"))
def unload(self):
Processing.removeScripts(os.path.join(os.path.dirname(__file__), "scripts"))

View File

@ -1,3 +1,3 @@
##text=string
print text
print text

View File

@ -55,8 +55,8 @@ class GrassAlgorithmProvider(AlgorithmProvider):
GrassUtils.grassPath(), valuetype=Setting.FOLDER))
if isWindows():
ProcessingConfig.addSetting(Setting(self.getDescription(),
GrassUtils.GRASS_WIN_SHELL, self.tr('Msys folder'),
GrassUtils.grassWinShell(), valuetype=Setting.FOLDER))
GrassUtils.GRASS_WIN_SHELL, self.tr('Msys folder'),
GrassUtils.grassWinShell(), valuetype=Setting.FOLDER))
ProcessingConfig.addSetting(Setting(self.getDescription(),
GrassUtils.GRASS_LOG_COMMANDS,
self.tr('Log execution commands'), False))

View File

@ -161,7 +161,7 @@ def executeOtb(commands, progress, addToLog=True):
os.putenv('ITK_AUTOLOAD_PATH', otbLibPath())
fused_command = ''.join(['"%s" ' % re.sub(r'^"|"$', '', c) for c in commands])
proc = subprocess.Popen(fused_command, shell=True, stdout=subprocess.PIPE, stdin=open(os.devnull), stderr=subprocess.STDOUT, universal_newlines=True).stdout
if isMac(): #This trick avoids having an uninterrupted system call exception if OTB is not installed
if isMac(): # This trick avoids having an uninterrupted system call exception if OTB is not installed
time.sleep(1)
for line in iter(proc.readline, ""):
if "[*" in line:

View File

@ -222,8 +222,8 @@ class QGISAlgorithmProvider(AlgorithmProvider):
from .ExecuteSQL import ExecuteSQL
self.alglist.extend([ExecuteSQL()])
self.externalAlgs = [] #to store algs added by 3rd party plugins as scripts
self.externalAlgs = [] # to store algs added by 3rd party plugins as scripts
folder = os.path.join(os.path.dirname(__file__), 'scripts')
scripts = ScriptUtils.loadFromFolder(folder)
for script in scripts:

View File

@ -134,7 +134,7 @@ def getSagaInstalledVersion(runSaga=False):
stderr=subprocess.STDOUT,
universal_newlines=True,
).stdout
if isMac(): #This trick avoids having an uninterrupted system call exception if SAGA is not installed
if isMac(): # This trick avoids having an uninterrupted system call exception if SAGA is not installed
time.sleep(1)
try:
lines = proc.readlines()

View File

@ -64,11 +64,11 @@ from processing.script.ScriptAlgorithmProvider import ScriptAlgorithmProvider
from processing.algs.taudem.TauDEMAlgorithmProvider import TauDEMAlgorithmProvider
from processing.preconfigured.PreconfiguredAlgorithmProvider import PreconfiguredAlgorithmProvider
class Processing:
providers = []
# Same structure as algs in algList
actions = {}
@ -134,8 +134,8 @@ class Processing:
ProcessingConfig.initialize()
ProcessingConfig.readSettings()
RenderingStyles.loadStyles()
@staticmethod
@staticmethod
def addScripts(folder):
Processing.initialize()
provider = Processing.getProviderFromName("qgis")
@ -145,19 +145,17 @@ class Processing:
script.allowEdit = False
script._icon = provider._icon
script.provider = provider
provider.externalAlgs.extend(scripts)
provider.externalAlgs.extend(scripts)
Processing.reloadProvider("qgis")
@staticmethod
def removeScripts(folder):
provider = Processing.getProviderFromName("qgis")
for alg in provider.externalAlgs[::-1]:
path = os.path.dirname(alg.descriptionFile)
if path == folder:
provider.externalAlgs.remove(alg)
provider.externalAlgs.remove(alg)
Processing.reloadProvider("qgis")
@staticmethod
def updateAlgsList():

View File

@ -27,6 +27,7 @@ __revision__ = '$Format:%H$'
from qgis.PyQt.QtCore import QObject, pyqtSignal
class AlgorithmList(QObject):
providerAdded = pyqtSignal(str)
@ -76,4 +77,4 @@ class AlgorithmList(QObject):
if alg.name == name:
return alg
algList = AlgorithmList()
algList = AlgorithmList()

View File

@ -26,7 +26,6 @@ __copyright__ = '(C) 2016, Victor Olaya'
__revision__ = '$Format:%H$'
def loadDefaultProviders():
# this is here just to "trigger" the above imports so providers are loaded
# and can be found by the Processing.initialize() method

View File

@ -31,6 +31,7 @@ import webbrowser
from qgis.PyQt import uic
from qgis.PyQt.QtCore import QCoreApplication, QSettings, QByteArray, QUrl
from qgis.PyQt.QtWidgets import QApplication, QDialogButtonBox, QDesktopWidget
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
from qgis.utils import iface
from qgis.core import QgsNetworkAccessManager
@ -63,9 +64,9 @@ class AlgorithmDialogBase(BASE, WIDGET):
self.setWindowTitle(self.alg.displayName())
desktop = QDesktopWidget()
if desktop.physicalDpiX() > 96:
self.textHelp.setZoomFactor(desktop.physicalDpiX() / 96)
#~ desktop = QDesktopWidget()
#~ if desktop.physicalDpiX() > 96:
#~ self.txtHelp.setZoomFactor(desktop.physicalDpiX() / 96)
algHelp = self.alg.shortHelp()
if algHelp is None:
@ -83,20 +84,22 @@ class AlgorithmDialogBase(BASE, WIDGET):
def linkClicked(url):
webbrowser.open(url.toString())
self.textShortHelp.anchorClicked.connect(linkClicked)
self.textHelp.page().setNetworkAccessManager(QgsNetworkAccessManager.instance())
self.textShortHelp.anchorClicked.connect(linkClicked)
isText, algHelp = self.alg.help()
if algHelp is not None:
algHelp = algHelp if isText else QUrl(algHelp)
try:
if isText:
self.textHelp.setHtml(algHelp)
self.txtHelp.setHtml(algHelp)
else:
self.textHelp.settings().clearMemoryCaches()
self.textHelp.load(algHelp)
except:
html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
self.txtHelp.setHtml(html)
rq = QNetworkRequest(algHelp)
self.reply = QgsNetworkAccessManager.instance().get(rq)
self.reply.finished.connect(self.requestFinished)
except Exception, e:
self.tabWidget.removeTab(2)
else:
self.tabWidget.removeTab(2)
@ -104,6 +107,16 @@ class AlgorithmDialogBase(BASE, WIDGET):
self.showDebug = ProcessingConfig.getSetting(
ProcessingConfig.SHOW_DEBUG_IN_DIALOG)
def requestFinished(self):
"""Change the webview HTML content"""
reply = self.sender()
if reply.error() != QNetworkReply.NoError:
html = self.tr('<h2>No help available for this algorithm</h2><p>{}</p>'.format(reply.errorString()))
else:
html = unicode(reply.readAll())
reply.deleteLater()
self.txtHelp.setHtml(html)
def closeEvent(self, evt):
self.settings.setValue("/Processing/dialogBase", self.saveGeometry())
super(AlgorithmDialogBase, self).closeEvent(evt)

View File

@ -35,6 +35,7 @@ from processing.algs.r.RAlgorithm import RAlgorithm
from processing.script.ScriptAlgorithm import ScriptAlgorithm
from processing.core.alglist import algList
class DeleteScriptAction(ContextAction):
SCRIPT_PYTHON = 0

View File

@ -31,6 +31,7 @@ from processing.algs.r.RAlgorithm import RAlgorithm
from processing.script.ScriptAlgorithm import ScriptAlgorithm
from processing.core.alglist import algList
class EditScriptAction(ContextAction):
SCRIPT_PYTHON = 0

View File

@ -208,10 +208,10 @@ class GetScriptsAndModelsDialog(BASE, WIDGET):
self.tree.addTopLevelItem(self.notinstalledItem)
self.tree.addTopLevelItem(self.uptodateItem)
self.webView.setHtml(self.HELP_TEXT)
self.txtHelp.setHtml(self.HELP_TEXT)
def setHelp(self, reply, item):
"""Change the webview HTML content"""
"""Change the HTML content"""
QApplication.restoreOverrideCursor()
if reply.error() != QNetworkReply.NoError:
html = self.tr('<h2>No detailed description available for this script</h2>')
@ -223,14 +223,14 @@ class GetScriptsAndModelsDialog(BASE, WIDGET):
html += self.tr('<p><b>Created by:</b> %s') % getDescription(ALG_CREATOR, descriptions)
html += self.tr('<p><b>Version:</b> %s') % getDescription(ALG_VERSION, descriptions)
reply.deleteLater()
self.webView.setHtml(html)
self.txtHelp.setHtml(html)
def currentItemChanged(self, item, prev):
if isinstance(item, TreeItem):
url = self.urlBase + item.filename.replace(' ', '%20') + '.help'
self.grabHTTP(url, self.setHelp, item)
else:
self.webView.setHtml(self.HELP_TEXT)
self.txtHelp.setHtml(self.HELP_TEXT)
def getTreeBranchForState(self, filename, version):
if not os.path.exists(os.path.join(self.folder, filename)):

View File

@ -16,8 +16,6 @@
* *
***************************************************************************
"""
from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
@ -34,6 +32,7 @@ from qgis.PyQt import uic
from qgis.PyQt.QtWidgets import QDialog, QTreeWidgetItem
from processing.core.ProcessingLog import ProcessingLog
from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
pluginPath = os.path.split(os.path.dirname(__file__))[0]
WIDGET, BASE = uic.loadUiType(
@ -138,7 +137,7 @@ class HelpEditionDialog(BASE, WIDGET):
self.updateHtmlView()
def updateHtmlView(self):
self.webView.setHtml(self.getHtml())
self.txtPreview.setHtml(self.getHtml())
def getDescription(self, name):
if name in self.descriptions:

View File

@ -26,6 +26,7 @@ __copyright__ = '(C) 2012, Victor Olaya'
__revision__ = '$Format:%H$'
import os
import codecs
from qgis.PyQt import uic
from qgis.PyQt.QtCore import QUrl
@ -53,7 +54,7 @@ class ResultsDialog(BASE, WIDGET):
self.fillTree()
if self.lastUrl:
self.webView.load(self.lastUrl)
self.txtResults.setHtml(self.loadResults(self.lastUrl))
def fillTree(self):
elements = ProcessingResults.getResults()
@ -64,13 +65,17 @@ class ResultsDialog(BASE, WIDGET):
item = TreeResultItem(element)
item.setIcon(0, self.keyIcon)
self.tree.addTopLevelItem(item)
self.lastUrl = QUrl(elements[-1].filename)
self.lastUrl = elements[-1].filename
def changeResult(self):
item = self.tree.currentItem()
if isinstance(item, TreeResultItem):
url = QUrl(item.filename)
self.webView.load(url)
self.txtResults.setHtml(self.loadResults(item.filename))
def loadResults(self, fileName):
with codecs.open(fileName, encoding='utf-8') as f:
content = f.read()
return content
class TreeResultItem(QTreeWidgetItem):

View File

@ -31,6 +31,7 @@ from processing.gui.ContextAction import ContextAction
from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
from processing.core.alglist import algList
class DeleteModelAction(ContextAction):
def __init__(self):

View File

@ -30,6 +30,7 @@ from processing.modeler.ModelerAlgorithm import ModelerAlgorithm
from processing.modeler.ModelerDialog import ModelerDialog
from processing.core.alglist import algList
class EditModelAction(ContextAction):
def __init__(self):

View File

@ -26,8 +26,13 @@ __copyright__ = '(C) 2012, Victor Olaya'
__revision__ = '$Format:%H$'
from qgis.PyQt.QtCore import Qt, QUrl, QMetaObject
from qgis.PyQt.QtWidgets import QDialog, QDialogButtonBox, QLabel, QLineEdit, QFrame, QPushButton, QSizePolicy, QVBoxLayout, QHBoxLayout, QTabWidget, QWidget, QScrollArea, QComboBox, QTableWidgetItem, QMessageBox
from qgis.core import QgsWebView
from qgis.PyQt.QtWidgets import (QDialog, QDialogButtonBox, QLabel, QLineEdit,
QFrame, QPushButton, QSizePolicy, QVBoxLayout,
QHBoxLayout, QTabWidget, QWidget, QScrollArea,
QComboBox, QTableWidgetItem, QMessageBox)
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
from qgis.core import QgsNetworkAccessManager
from processing.gui.CrsSelectionPanel import CrsSelectionPanel
from processing.gui.MultipleInputPanel import MultipleInputPanel
@ -194,27 +199,27 @@ class ModelerParametersDialog(QDialog):
self.scrollArea.setWidget(self.paramPanel)
self.scrollArea.setWidgetResizable(True)
self.tabWidget.addTab(self.scrollArea, self.tr('Parameters'))
self.webView = QgsWebView()
self.txtHelp = QTextBrowser()
html = None
url = None
isText, help = self._alg.help()
if help is not None:
if isText:
html = help
else:
url = QUrl(help)
else:
html = self.tr('<h2>Sorry, no help is available for this '
'algorithm.</h2>')
try:
if html:
self.webView.setHtml(html)
elif url:
self.webView.load(url)
except:
self.webView.setHtml(self.tr('<h2>Could not open help file :-( </h2>'))
self.tabWidget.addTab(self.webView, 'Help')
isText, algHelp = self._alg.help()
if algHelp is not None:
algHelp = algHelp if isText else QUrl(algHelp)
try:
if isText:
self.txtHelp.setHtml(algHelp)
else:
html = self.tr('<p>Downloading algorithm help... Please wait.</p>')
self.txtHelp.setHtml(html)
self.reply = QgsNetworkAccessManager.instance().get(QNetworkRequest(algHelp))
self.reply.finished.connect(self.requestFinished)
except:
self.txtHelp.setHtml(self.tr('<h2>No help available for this algorithm</h2>'))
self.tabWidget.addTab(self.txtHelp, 'Help')
self.verticalLayout2.addWidget(self.tabWidget)
self.verticalLayout2.addWidget(self.buttonBox)
self.setLayout(self.verticalLayout2)
@ -222,6 +227,16 @@ class ModelerParametersDialog(QDialog):
self.buttonBox.rejected.connect(self.cancelPressed)
QMetaObject.connectSlotsByName(self)
def requestFinished(self):
"""Change the webview HTML content"""
reply = self.sender()
if reply.error() != QNetworkReply.NoError:
html = self.tr('<h2>No help available for this algorithm</h2><p>{}</p>'.format(reply.errorString()))
else:
html = unicode(reply.readAll())
reply.deleteLater()
self.txtHelp.setHtml(html)
def getAvailableDependencies(self):
if self._algName is None:
dependent = []

View File

@ -31,6 +31,7 @@ from processing.gui.ContextAction import ContextAction
from processing.preconfigured.PreconfiguredAlgorithm import PreconfiguredAlgorithm
from processing.core.alglist import algList
class DeletePreconfiguredAlgorithmAction(ContextAction):
def __init__(self):

View File

@ -47,9 +47,6 @@
</property>
<item>
<widget class="QTextEdit" name="txtLog">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -69,13 +66,7 @@
<number>0</number>
</property>
<item>
<widget class="QgsWebView" name="textHelp">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
<widget class="QTextBrowser" name="txtHelp"/>
</item>
</layout>
</widget>
@ -131,13 +122,6 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsWebView</class>
<extends>QWidget</extends>
<header>qgis.core</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>

View File

@ -6,32 +6,20 @@
<rect>
<x>0</x>
<y>0</y>
<width>826</width>
<height>520</height>
<width>504</width>
<height>523</height>
</rect>
</property>
<property name="windowTitle">
<string>Get scripts and models</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeWidget" name="tree">
<property name="minimumSize">
<size>
<width>350</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100000</width>
<height>100000</height>
</size>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
@ -59,96 +47,55 @@
</property>
</column>
</widget>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QgsWebView" name="webView">
<property name="maximumSize">
<size>
<width>10000</width>
<height>10000</height>
</size>
</property>
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QTextEdit" name="txtHelp"/>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QProgressBar" name="progressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
<item row="1" column="0">
<widget class="QProgressBar" name="progressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="value">
<number>0</number>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsWebView</class>
<extends>QWidget</extends>
<header>qgis.core</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -20,18 +20,14 @@
<property name="margin">
<number>9</number>
</property>
<item>
<widget class="QTextEdit" name="txtPreview"/>
</item>
<item>
<widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QgsWebView" name="webView">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -110,13 +106,6 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsWebView</class>
<extends>QWidget</extends>
<header>qgis.core</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>

View File

@ -14,24 +14,12 @@
<string>Results</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>9</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeWidget" name="tree">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
@ -41,19 +29,7 @@
</property>
</column>
</widget>
<widget class="QgsWebView" name="webView">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
<widget class="QTextEdit" name="txtResults"/>
</widget>
</item>
<item>
@ -68,13 +44,6 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsWebView</class>
<extends>QWidget</extends>
<header>qgis.core</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>