192 changes: 192 additions & 0 deletions python/plugins/processing/gui/ScriptEditorDialog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
# -*- coding: utf-8 -*-

"""
***************************************************************************
EditScriptDialog.py
---------------------
Date : December 2012
Copyright : (C) 2012 by Alexander Bruy
Email : alexander dot bruy at gmail dot 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. *
* *
***************************************************************************
"""

__author__ = 'Alexander Bruy'
__date__ = 'December 2012'
__copyright__ = '(C) 2012, Alexander Bruy'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

import pickle

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.Qsci import *

from qgis.core import *

from processing.core.QGisLayers import QGisLayers

from processing.gui.ParametersDialog import ParametersDialog
from processing.gui.HelpEditionDialog import HelpEditionDialog
from processing.gui.ScriptEdit import ScriptEdit

from sextante.modeler.Providers import Providers

from processing.r.RAlgorithm import RAlgorithm
from processing.r.RUtils import RUtils
from processing.script.ScriptAlgorithm import ScriptAlgorithm
from processing.script.ScriptUtils import ScriptUtils

from processing.ui.ui_DlgScriptEditor import Ui_DlgScriptEditor

import processing.resources_rc

class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):

SCRIPT_PYTHON = 0
SCRIPT_R = 1

def __init__(self, algType, alg):
QDialog.__init__(self)
self.setupUi(self)

# set icons
self.btnSave.setIcon(QgsApplication.getThemeIcon("/mActionFileSave.png"))
self.btnSaveAs.setIcon(QgsApplication.getThemeIcon("/mActionFileSaveAs.png"))
self.btnEditHelp.setIcon(QIcon(":/processing/images/edithelp.png"))
self.btnRun.setIcon(QIcon(":/processing/images/runalgorithm.png"))
self.btnCut.setIcon(QgsApplication.getThemeIcon("/mActionEditCut.png"))
self.btnCopy.setIcon(QgsApplication.getThemeIcon("/mActionEditCopy.png"))
self.btnPaste.setIcon(QgsApplication.getThemeIcon("/mActionEditPaste.png"))
self.btnUndo.setIcon(QgsApplication.getThemeIcon("/mActionUndo.png"))
self.btnRedo.setIcon(QgsApplication.getThemeIcon("/mActionRedo.png"))

# connect signals and slots
self.btnSave.clicked.connect(self.save)
self.btnSaveAs.clicked.connect(self.saveAs)
self.btnEditHelp.clicked.connect(self.editHelp)
self.btnRun.clicked.connect(self.runAlgorithm)
self.btnCut.clicked.connect(self.editor.cut)
self.btnCopy.clicked.connect(self.editor.copy)
self.btnPaste.clicked.connect(self.editor.paste)
self.btnUndo.clicked.connect(self.editor.undo)
self.btnRedo.clicked.connect(self.editor.redo)

self.alg = alg
self.algType = algType

if self.alg is not None:
self.filename = self.alg.descriptionFile
self.editor.setText(self.alg.script)
else:
self.filename = None

self.update = False
self.help = None

self.editor.setLexerType(self.algType)

def editHelp(self):
if self.alg is None:
if self.algType == self.SCRIPT_PYTHON:
alg = ScriptAlgorithm(None, unicode(self.editor.toPlainText()))
elif self.algType == self.SCRIPT_R:
alg = RAlgorithm(None, unicode(self.editor.toPlainText()))
else:
alg = self.alg

dlg = HelpEditionDialog(alg)
dlg.exec_()

# we store the description string in case there were not saved because
# there was no filename defined yet
if self.alg is None and dlg.descriptions:
self.help = dlg.descriptions

def save(self):
self.saveScript(False)

def saveAs(self):
self.saveScript(True)

def saveScript(self, saveAs):
if self.filename is None or saveAs:
if self.algType == self.SCRIPT_PYTHON:
scriptDir = ScriptUtils.scriptsFolder()
filterName = self.tr("Python scripts (*.py)")
elif self.algType == self.SCRIPT_R:
scriptDir = RUtils.RScriptsFolder()
filterName = self.tr("SEXTANTE R script (*.rsx)")

self.filename = unicode(QFileDialog.getSaveFileName(self,
self.tr("Save script"),
scriptDir,
filterName
))

if self.filename:
if self.algType == self.SCRIPT_PYTHON and not self.filename.lower().endswith(".py"):
self.filename += ".py"
if self.algType == self.SCRIPT_R and not self.filename.lower().endswith(".rsx"):
self.filename += ".rsx"

text = unicode(self.editor.text())
if self.alg is not None:
self.alg.script = text
try:
fout = open(self.filename, "w")
fout.write(text)
fout.close()
except IOError:
QMessageBox.warning(self,
self.tr("I/O error"),
self.tr("Unable to save edits. Reason:\n %1").arg(unicode(sys.exc_info()[1]))
)
return
self.update = True

# if help strings were defined before saving the script for the first
# time, we do it here
if self.help:
f = open(self.filename + ".help", "wb")
pickle.dump(self.help, f)
f.close()
self.help = None
QMessageBox.information(self,
self.tr("Script saving"),
self.tr("Script was correctly saved.")
)
else:
self.filename = None

def runAlgorithm(self):
if self.algType == self.SCRIPT_PYTHON:
alg = ScriptAlgorithm(None, unicode(self.editor.text()))
alg.provider = Providers.providers['script']
if self.algType == self.SCRIPT_R:
alg = RAlgorithm(None, unicode(self.editor.text()))
alg.provider = Providers.providers['r']

dlg = alg.getCustomParametersDialog()
if not dlg:
dlg = ParametersDialog(alg)

canvas = QGisLayers.iface.mapCanvas()
prevMapTool = canvas.mapTool()

dlg.show()
dlg.exec_()

if canvas.mapTool() != prevMapTool:
try:
canvas.mapTool().reset()
except:
pass
canvas.setMapTool(prevMapTool)
Binary file added python/plugins/processing/images/edithelp.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added python/plugins/processing/images/runalgorithm.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 0 additions & 45 deletions python/plugins/processing/r/CreateNewRScriptAction.py

This file was deleted.

45 changes: 0 additions & 45 deletions python/plugins/processing/r/DeleteRScriptAction.py

This file was deleted.

43 changes: 0 additions & 43 deletions python/plugins/processing/r/EditRScriptAction.py

This file was deleted.

175 changes: 0 additions & 175 deletions python/plugins/processing/r/EditRScriptDialog.py

This file was deleted.

35 changes: 22 additions & 13 deletions python/plugins/processing/r/RAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,28 +23,38 @@
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

import os.path

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os.path
from processing.script.WrongScriptException import WrongScriptException
from processing.r.DeleteRScriptAction import DeleteRScriptAction

from processing.core.ProcessingConfig import ProcessingConfig, Setting
from processing.core.ProcessingLog import ProcessingLog
from processing.core.AlgorithmProvider import AlgorithmProvider
from PyQt4 import QtGui
from processing.core.ProcessingUtils import ProcessingUtils

from processing.core.SextanteUtils import SextanteUtils

from processing.gui.EditScriptAction import EditScriptAction
from processing.gui.DeleteScriptAction import DeleteScriptAction
from processing.gui.CreateNewScriptAction import CreateNewScriptAction
p
from processing.r.RUtils import RUtils
from processing.r.RAlgorithm import RAlgorithm
from processing.r.CreateNewRScriptAction import CreateNewRScriptAction
from processing.r.EditRScriptAction import EditRScriptAction

from processing.script.WrongScriptException import WrongScriptException
from processing.tools.system import *
import processing.resources_rc

class RAlgorithmProvider(AlgorithmProvider):

def __init__(self):
AlgorithmProvider.__init__(self)
self.activate = False
self.actions.append(CreateNewRScriptAction())
self.contextMenuActions = [EditRScriptAction(), DeleteRScriptAction()]
#self.actions.append(CreateNewScriptAction("Create new R script", CreateNewScriptAction.SCRIPT_R))
self.contextMenuActions = [EditScriptAction(EditScriptAction.SCRIPT_R),
DeleteScriptAction(DeleteScriptAction.SCRIPT_R)
]

def initializeSettings(self):
AlgorithmProvider.initializeSettings(self)
Expand All @@ -61,8 +71,7 @@ def unload(self):
ProcessingConfig.removeSetting(RUtils.R_USE64)

def getIcon(self):
return QtGui.QIcon(os.path.dirname(__file__) + "/../images/r.png")

return QIcon(":/sextante/images/r.png")

def getDescription(self):
return "R scripts"
Expand All @@ -87,10 +96,10 @@ def loadFromFolder(self, folder):
alg = RAlgorithm(fullpath)
if alg.name.strip() != "":
self.algs.append(alg)
except WrongScriptException,e:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,e.msg)
except WrongScriptException, e:
ProcessingLog.addToLog(SextanteLog.LOG_ERROR, e.msg)
except Exception, e:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,"Could not load R script:" + descriptionFile + "\n" + str(e))
ProcessingLog.addToLog(SextanteLog.LOG_ERROR, "Could not load R script:" + descriptionFile + "\n" + unicode(e))



2 changes: 2 additions & 0 deletions python/plugins/processing/resources.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@
<file>images/taudem.png</file>
<file>images/tool.png</file>
<file>images/commander.png</file>
<file>images/edithelp.png</file>
<file>images/runalgorithm.png</file>
</qresource>
</RCC>
156 changes: 0 additions & 156 deletions python/plugins/processing/script/EditScriptDialog.py

This file was deleted.

2 changes: 1 addition & 1 deletion python/plugins/processing/script/ScriptAlgorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ def processAlgorithm(self, progress):
out.setValue(ns[out.name])

def helpFile(self):
helpfile = self.descriptionFile + ".help"
helpfile = unicode(self.descriptionFile) + ".help"
if os.path.exists(helpfile):
h2h = Help2Html()
return h2h.getHtmlFile(self, helpfile)
Expand Down
38 changes: 22 additions & 16 deletions python/plugins/processing/script/ScriptAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,33 @@
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

from processing.script.CreateNewScriptAction import CreateNewScriptAction
from processing.script.EditScriptAction import EditScriptAction
import os.path

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os.path
from processing.script.DeleteScriptAction import DeleteScriptAction
from processing.script.ScriptAlgorithm import ScriptAlgorithm
from processing.script.ScriptUtils import ScriptUtils
from processing.script.WrongScriptException import WrongScriptException

from processing.core.ProcessingConfig import ProcessingConfig, Setting
from processing.core.ProcessingLog import ProcessingLog
from processing.core.AlgorithmProvider import AlgorithmProvider
from PyQt4 import QtGui

from processing.gui.EditScriptAction import EditScriptAction
from processing.gui.DeleteScriptAction import DeleteScriptAction
from processing.gui.CreateNewScriptAction import CreateNewScriptAction

from processing.script.ScriptAlgorithm import ScriptAlgorithm
from processing.script.ScriptUtils import ScriptUtils
from processing.script.WrongScriptException import WrongScriptException

import processing.resources_rc

class ScriptAlgorithmProvider(AlgorithmProvider):

def __init__(self):
AlgorithmProvider.__init__(self)
self.actions.append(CreateNewScriptAction())
self.contextMenuActions = [EditScriptAction(), DeleteScriptAction()]
#self.actions.append(CreateNewScriptAction("Create new script", CreateNewScriptAction.SCRIPT_PYTHON))
self.contextMenuActions = [EditScriptAction(EditScriptAction.SCRIPT_PYTHON),
DeleteScriptAction(DeleteScriptAction.SCRIPT_PYTHON)
]

def initializeSettings(self):
AlgorithmProvider.initializeSettings(self)
Expand All @@ -53,7 +60,7 @@ def unload(self):
ProcessingConfig.addSetting(ScriptUtils.SCRIPTS_FOLDER)

def getIcon(self):
return QtGui.QIcon(os.path.dirname(__file__) + "/../images/script.png")
return QIcon(":/sextante/images/script.png")

def getName(self):
return "script"
Expand All @@ -77,8 +84,7 @@ def loadFromFolder(self, folder):
alg = ScriptAlgorithm(fullpath)
if alg.name.strip() != "":
self.algs.append(alg)
except WrongScriptException,e:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,e.msg)



except WrongScriptException, e:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, e.msg)
except Exception, e:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, "Could not load script:" + descriptionFile + "\n" + unicode(e))
190 changes: 190 additions & 0 deletions python/plugins/processing/ui/DlgScriptEditor.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DlgScriptEditor</class>
<widget class="QDialog" name="DlgScriptEditor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>720</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>Script editor</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>2</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>-1</number>
</property>
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<item>
<widget class="QToolButton" name="btnSave">
<property name="toolTip">
<string>Save</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSaveAs">
<property name="toolTip">
<string>Save as...</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnEditHelp">
<property name="toolTip">
<string>Edit script help</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRun">
<property name="toolTip">
<string>Run algorithm</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnCut">
<property name="toolTip">
<string>Cut</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnCopy">
<property name="toolTip">
<string>Copy</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnPaste">
<property name="toolTip">
<string>Paste</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnUndo">
<property name="toolTip">
<string>Undo</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRedo">
<property name="toolTip">
<string>Redo</string>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="ScriptEdit" name="editor"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ScriptEdit</class>
<extends>QTextEdit</extends>
<header>processing.gui.ScriptEdit</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>btnSave</tabstop>
<tabstop>btnSaveAs</tabstop>
<tabstop>btnEditHelp</tabstop>
<tabstop>btnRun</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>