From f93cdff57fdd1384921455959298bba0a35bf010 Mon Sep 17 00:00:00 2001 From: Salvatore Larosa Date: Wed, 26 Sep 2012 02:02:05 +0200 Subject: [PATCH 1/3] Update help for console - header icon changed - re-organized text --- python/helpConsole/help.htm | 60 +++++++++++++++++++++------ python/iconConsole/imgHelpDialog.png | Bin 3643 -> 5625 bytes 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/python/helpConsole/help.htm b/python/helpConsole/help.htm index 1914ff8d24e..fa3a891183a 100644 --- a/python/helpConsole/help.htm +++ b/python/helpConsole/help.htm @@ -8,10 +8,14 @@ /*font-family:Verdana,Geneva,sans-serif;*/ font-size : 12px; } + #header{ + background: #c6c6c6; + width: 100%; + } - +

- Now you can use auto-completion and highlighting for syntax in console!!! -
- (Thanks to Larry Shaffer who provided the API files) + Python Console based on pyScintilla. (Developed by Salvatore Larosa)

To access Quantum GIS environment from this console use qgis.utils.iface object (instance of QgisInterface class). To import the class QgisInterface can also use the dedicated button on the toolbar on the left. -

- To save history commands type '_save' in console or close this widget. -

- To clear history commands type '_clear' in console. -

- The following is a description of the tools in the toolbar:

- +
+ + + + +

+

  • Auto-completion and highlighting syntax for the following APIs: +
      +
    1. Python
    2. +
    3. PyQGIS-master
    4. +
    5. PyQt4
    6. +
    7. QScintilla2
    8. +
    9. osgeo-gdal-ogr
    10. +
    +
  • +
  • Saves command history by typing _save or closing the widget.
  • +
    +
  • Clears command history by typing _clear.
  • +

    + + + + + +

    The following is a description of the tools in the toolbar:

    + @@ -67,5 +92,16 @@
    Tool to clear python consoleRun command (like Enter key pressed)
    +
    + + + + + +

    + Thanks to Larry Shaffer who provided the API files. +

    - + \ No newline at end of file diff --git a/python/iconConsole/imgHelpDialog.png b/python/iconConsole/imgHelpDialog.png index bdfe1f6d0c05f6642a7b30bef7bffb94efb385db..95a1ef97e216bc8b573c35f797c2a76f05fe6294 100644 GIT binary patch literal 5625 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 Tl7Nyg00000NkvXXu0mjf>!-!g delta 3630 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 Date: Thu, 27 Sep 2012 00:13:25 +0200 Subject: [PATCH 2/3] Added keys binding to view the command history - added new command to clear completely the command history - fixed copy,cut command in keyPressEvent more minor problems - update for help - update for Italian translate --- i18n/qgis_it.ts | 6 ++ python/console_sci.py | 143 ++++++++++++++++++------------------ python/helpConsole/help.htm | 19 ++++- 3 files changed, 94 insertions(+), 74 deletions(-) diff --git a/i18n/qgis_it.ts b/i18n/qgis_it.ts index cd958ab2777..be718c6f79d 100644 --- a/i18n/qgis_it.ts +++ b/i18n/qgis_it.ts @@ -6281,6 +6281,12 @@ Cambiare questa situazione prima, perché il plugin OSM non quale layer è la de Run command Esegui comando + + Are you sure you want to completely +delete the command history ? + Sei sicuro di voler concellare completamente +la cronologia dei comandi ? + ## History saved successfully ## ## Storia comandi salvata con successo ## diff --git a/python/console_sci.py b/python/console_sci.py index 7f38f64f52e..9970468302e 100755 --- a/python/console_sci.py +++ b/python/console_sci.py @@ -114,7 +114,12 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): self.newShortcutCS = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_Space), self) self.newShortcutCAS = QShortcut(QKeySequence(Qt.CTRL + Qt.ALT + Qt.Key_Space), self) self.newShortcutCS.activated.connect(self.autoComplete) - self.newShortcutCAS.activated.connect(self.autoComplete) + self.newShortcutCAS.activated.connect(self.showHistory) + self.connect(self, SIGNAL('userListActivated(int, const QString)'), + self.completion_list_selected) + + def showHistory(self): + self.showUserList(1, QStringList(self.history)) def autoComplete(self): self.autoCompleteFromAll() @@ -161,8 +166,6 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): self.setMarginsFont(font) self.lexer = QsciLexerPython() self.lexer.setDefaultFont(font) - #self.lexer.setDefaultFont(QFont('Mono', 10, 0, False)) - #self.lexer.setDefaultColor(Qt.darkGray) self.lexer.setColor(Qt.red, 1) self.lexer.setColor(Qt.darkGreen, 5) self.lexer.setColor(Qt.darkBlue, 15) @@ -171,44 +174,25 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): self.lexer.setFont(font, 4) self.api = QsciAPIs(self.lexer) self.api.loadPrepared(QString(os.path.dirname(__file__) + "/api/pyqgis_master.pap")) -# self.api.load(os.path.dirname(__file__) + "/api/PyQGIS_1.8.api") -# self.api.load(os.path.dirname(__file__) + "/api/osgeo_gdal-ogr_1.9.1-1.api") -# self.api.load("qgis.networkanalysis.api") -# self.api.load("qgis.gui.api") -# self.api.load("qgis.core.api") -# self.api.load("qgis.analysis.api") - -# self.api.prepare() -# self.lexer.setAPIs(self.api) self.setLexer(self.lexer) - ## TODO: show completion list for file and directory -# def show_completion_list(self, completions, text): -# """Private method to display the possible completions""" -# if len(completions) == 0: -# return -# if len(completions) > 1: -# self.showUserList(1, QStringList(sorted(completions))) -# self.completion_chars = 1 -# else: -# txt = completions[0] -# if text != "": -# txt = txt.replace(text, "") -# self.insert(txt) -# self.completion_chars = 0 -# -# def show_file_completion(self): -# """Display a completion list for files and directories""" -# cwd = os.getcwdu() -# self.show_completion_list(self.listdir_fullpath('/'), cwd) -# -# def listdir_fullpath(self, d): -# return [os.path.join(d, f) for f in os.listdir(d)] + ## TODO: show completion list for file and directory + + def completion_list_selected(self, id, txt): + if id == 1: + txt = unicode(txt) + # get current cursor position + line, pos = self.getCurLine() + selCmd= self.text(line).length() + # select typed text + self.setSelection(line, 4, line, selCmd) + self.removeSelectedText() + self.insert(txt) - def insertInitText(self): #self.setLexers(False) - txtInit = QCoreApplication.translate("PythonConsole","## To access Quantum GIS environment from this console\n" + txtInit = QCoreApplication.translate("PythonConsole", + "## To access Quantum GIS environment from this console\n" "## use qgis.utils.iface object (instance of QgisInterface class). Read help for more info.\n\n") initText = self.setText(txtInit) @@ -379,7 +363,39 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): self.entered() elif e.modifiers() & Qt.ControlModifier: if e.key() == Qt.Key_V: - self.paste() + self.paste() + elif e.key() == Qt.Key_C: + self.copy() + elif e.key() == Qt.Key_X: + self.cut() + elif e.key() == Qt.Key_Left: + e.accept() + if e.modifiers() & Qt.ShiftModifier: + if index > 4: + if e.modifiers() & Qt.ControlModifier: + self.SendScintilla(QsciScintilla.SCI_WORDLEFTEXTEND) + else: + self.SendScintilla(QsciScintilla.SCI_CHARLEFTEXTEND) + else: + if index > 4: + if e.modifiers() & Qt.ControlModifier: + self.SendScintilla(QsciScintilla.SCI_WORDLEFT) + else: + self.SendScintilla(QsciScintilla.SCI_CHARLEFT) + elif e.key() == Qt.Key_Right: + e.accept() + if e.modifiers() & Qt.ShiftModifier: + if index >= 4: + if e.modifiers() & Qt.ControlModifier: + self.SendScintilla(QsciScintilla.SCI_WORDRIGHTEXTEND) + else: + self.SendScintilla(QsciScintilla.SCI_CHARRIGHTEXTEND) + else: + if index >= 4: + if e.modifiers() & Qt.ControlModifier: + self.SendScintilla(QsciScintilla.SCI_WORDRIGHT) + else: + self.SendScintilla(QsciScintilla.SCI_CHARRIGHT) elif e.key() == Qt.Key_Backspace: curPos, pos = self.getCursorPosition() line = self.lines() -1 @@ -401,39 +417,7 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): self.showPrevious() elif e.key() == Qt.Key_Up and not self.isListActive(): self.showNext() - elif e.key() == Qt.Key_Left: - e.accept() - if e.modifiers() & Qt.ShiftModifier: - if index > 4: - if e.modifiers() & Qt.ControlModifier: - self.SendScintilla(QsciScintilla.SCI_WORDLEFTEXTEND) - else: - self.SendScintilla(QsciScintilla.SCI_CHARLEFTEXTEND) - else: - if index > 4: - if e.modifiers() & Qt.ControlModifier: - self.SendScintilla(QsciScintilla.SCI_WORDLEFT) - else: - self.SendScintilla(QsciScintilla.SCI_CHARLEFT) - elif e.key() == Qt.Key_Right: - e.accept() - if e.modifiers() & Qt.ShiftModifier: - if index >= 4: - if e.modifiers() & Qt.ControlModifier: - self.SendScintilla(QsciScintilla.SCI_WORDRIGHTEXTEND) - else: - self.SendScintilla(QsciScintilla.SCI_CHARRIGHTEXTEND) - else: - if index >= 4: - if e.modifiers() & Qt.ControlModifier: - self.SendScintilla(QsciScintilla.SCI_WORDRIGHT) - else: - self.SendScintilla(QsciScintilla.SCI_CHARRIGHT) ## TODO: press event for auto-completion file directory - #elif e.key() == Qt.Key_Tab: - #self.show_file_completion() - #else: - #self.on_new_line() else: QsciScintilla.keyPressEvent(self, e) @@ -499,13 +483,28 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): def runCommand(self, cmd): self.updateHistory(cmd) self.SendScintilla(QsciScintilla.SCI_NEWLINE) - if cmd in ('_save', '_clear'): + if cmd in ('_save', '_clear', '_clearAll'): if cmd == '_save': self.writeHistoryFile() - print QCoreApplication.translate("PythonConsole", "## History saved successfully ##") + print QCoreApplication.translate("PythonConsole", + "## History saved successfully ##") elif cmd == '_clear': self.clearHistoryFile() - print QCoreApplication.translate("PythonConsole", "## History cleared successfully ##") + print QCoreApplication.translate("PythonConsole", + "## History cleared successfully ##") + elif cmd == '_clearAll': + res = QMessageBox.question(self, "Python Console", + QCoreApplication.translate("PythonConsole", + "Are you sure you want to completely\n" + "delete the command history ?"), + QMessageBox.Yes | QMessageBox.No) + if res == QMessageBox.No: + self.SendScintilla(QsciScintilla.SCI_DELETEBACK) + return + self.history = QStringList() + self.clearHistoryFile() + print QCoreApplication.translate("PythonConsole", + "## History cleared successfully ##") output = sys.stdout.get_and_clean_data() if output: self.append(output) diff --git a/python/helpConsole/help.htm b/python/helpConsole/help.htm index fa3a891183a..5163a6aabe3 100644 --- a/python/helpConsole/help.htm +++ b/python/helpConsole/help.htm @@ -41,6 +41,7 @@

    +

    • Auto-completion and highlighting syntax for the following APIs:
      1. Python
      2. @@ -50,9 +51,23 @@
      3. osgeo-gdal-ogr
    • -
    • Saves command history by typing _save or closing the widget.

    • -
    • Clears command history by typing _clear.
    • +
    • CTRL+SPACE to view the auto-completion list.
    • +
      +
    • CTRL+ALT+SPACE to view the command history list.
    • +
      +
    • Saves command history by typing _save or closing the widget.
      + This command saves the history command in the file ~/.qgis/console_history.txt +
    • +
      +
    • Clears command history by typing _clear.
      + This command clears the history command from file ~/.qgis/console_history.txt +
    • +
      +
    • Clears completely command history by typing _clearAll.
      + This command clears completely the history command. It has an irreversible effect. +
    • +

    From 630a02153f04da84cee9dc55075c4a4f6b76903b Mon Sep 17 00:00:00 2001 From: Salvatore Larosa Date: Thu, 27 Sep 2012 17:14:10 +0200 Subject: [PATCH 3/3] Improved the console toolbar - added menu for class import - added menu for open/save script - update help and Italian translate --- i18n/qgis_it.ts | 8 +++++ python/console.py | 45 ++++++++++++++++++++---- python/console_sci.py | 1 + python/helpConsole/help.htm | 2 +- python/iconConsole/CMakeLists.txt | 2 ++ python/iconConsole/iconClassConsole.png | Bin 0 -> 1357 bytes python/iconConsole/iconIfaceConsole.png | Bin 0 -> 1262 bytes 7 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 python/iconConsole/iconClassConsole.png create mode 100644 python/iconConsole/iconIfaceConsole.png diff --git a/i18n/qgis_it.ts b/i18n/qgis_it.ts index be718c6f79d..18b15cd9f35 100644 --- a/i18n/qgis_it.ts +++ b/i18n/qgis_it.ts @@ -6253,6 +6253,14 @@ Cambiare questa situazione prima, perché il plugin OSM non quale layer è la de Python Console Console python + + Import Class + Importa Modulo + + + Manage Script + Gestione Script + Clear console Pulisci console diff --git a/python/console.py b/python/console.py index 538d0c5b6eb..1a7842b4f33 100755 --- a/python/console.py +++ b/python/console.py @@ -113,6 +113,26 @@ class PythonConsole(QDockWidget): # self.currentLayerButton.setIcon(QIcon("icon/iconTempConsole.png")) # self.currentLayerButton.setMenuRole(QAction.PreferencesRole) # self.currentLayerButton.setIconVisibleInMenu(True) + ## Action menu for class + actionClassBt = QCoreApplication.translate("PythonConsole", "Import Class") + self.actionClass = QAction(parent) + self.actionClass.setCheckable(False) + self.actionClass.setEnabled(True) + self.actionClass.setIcon(QIcon(os.path.dirname(__file__) + "/iconConsole/iconClassConsole.png")) + self.actionClass.setMenuRole(QAction.PreferencesRole) + self.actionClass.setIconVisibleInMenu(True) + self.actionClass.setToolTip(actionClassBt) + self.actionClass.setText(actionClassBt) + ## Action menu Open/Save script + actionScriptBt = QCoreApplication.translate("PythonConsole", "Manage Script") + self.actionScript = QAction(parent) + self.actionScript.setCheckable(False) + self.actionScript.setEnabled(True) + self.actionScript.setIcon(QIcon(os.path.dirname(__file__) + "/iconConsole/iconTempConsole.png")) + self.actionScript.setMenuRole(QAction.PreferencesRole) + self.actionScript.setIconVisibleInMenu(True) + self.actionScript.setToolTip(actionScriptBt) + self.actionScript.setText(actionScriptBt) ## Import Sextante class loadSextanteBt = QCoreApplication.translate("PythonConsole", "Import sextante class") self.loadSextanteButton = QAction(parent) @@ -128,7 +148,7 @@ class PythonConsole(QDockWidget): self.loadIfaceButton = QAction(parent) self.loadIfaceButton.setCheckable(False) self.loadIfaceButton.setEnabled(True) - self.loadIfaceButton.setIcon(QIcon(os.path.dirname(__file__) + "/iconConsole/iconTempConsole.png")) + self.loadIfaceButton.setIcon(QIcon(os.path.dirname(__file__) + "/iconConsole/iconIfaceConsole.png")) self.loadIfaceButton.setMenuRole(QAction.PreferencesRole) self.loadIfaceButton.setIconVisibleInMenu(True) self.loadIfaceButton.setToolTip(loadIfaceBt) @@ -175,13 +195,24 @@ class PythonConsole(QDockWidget): self.helpButton.setText(helpBt) self.toolBar.addAction(self.clearButton) - #self.toolBar.addAction(self.currentLayerButton) - self.toolBar.addAction(self.loadIfaceButton) - self.toolBar.addAction(self.loadSextanteButton) - self.toolBar.addAction(self.openFileButton) - self.toolBar.addAction(self.saveFileButton) + self.toolBar.addAction(self.actionClass) + self.toolBar.addAction(self.actionScript) self.toolBar.addAction(self.helpButton) self.toolBar.addAction(self.runButton) + ## Menu Import Class + self.classMenu = QMenu(self) + self.classMenu.addAction(self.loadIfaceButton) + self.classMenu.addAction(self.loadSextanteButton) + cM = self.toolBar.widgetForAction(self.actionClass) + cM.setMenu(self.classMenu) + cM.setPopupMode(QToolButton.InstantPopup) + ## Menu Manage Script + self.scriptMenu = QMenu(self) + self.scriptMenu.addAction(self.openFileButton) + self.scriptMenu.addAction(self.saveFileButton) + sM = self.toolBar.widgetForAction(self.actionScript) + sM.setMenu(self.scriptMenu) + sM.setPopupMode(QToolButton.InstantPopup) self.b.addWidget(self.toolBar) self.edit = PythonEdit() @@ -192,7 +223,7 @@ class PythonConsole(QDockWidget): self.e.addWidget(self.edit) self.edit.setFocus() - + self.setWindowTitle(QCoreApplication.translate("PythonConsole", "Python Console")) self.clearButton.triggered.connect(self.edit.clearConsole) #self.currentLayerButton.triggered.connect(self.cLayer) diff --git a/python/console_sci.py b/python/console_sci.py index 9970468302e..f204f5940df 100755 --- a/python/console_sci.py +++ b/python/console_sci.py @@ -97,6 +97,7 @@ class PythonEdit(QsciScintilla, code.InteractiveInterpreter): # not too small #self.setMinimumSize(500, 300) + self.setMinimumHeight(125) self.SendScintilla(QsciScintilla.SCI_SETWRAPMODE, 1) self.SendScintilla(QsciScintilla.SCI_EMPTYUNDOBUFFER) diff --git a/python/helpConsole/help.htm b/python/helpConsole/help.htm index 5163a6aabe3..9c92e55a05f 100644 --- a/python/helpConsole/help.htm +++ b/python/helpConsole/help.htm @@ -83,7 +83,7 @@ - + diff --git a/python/iconConsole/CMakeLists.txt b/python/iconConsole/CMakeLists.txt index 043b7b215f2..fe35df0ac86 100644 --- a/python/iconConsole/CMakeLists.txt +++ b/python/iconConsole/CMakeLists.txt @@ -7,6 +7,8 @@ iconSextanteConsole.png iconSaveConsole.png iconHelpConsole.png imgHelpDialog.png +iconIfaceConsole.png +iconClassConsole.png ) FILE(GLOB ICON_FILES *.png) diff --git a/python/iconConsole/iconClassConsole.png b/python/iconConsole/iconClassConsole.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ef3087d9ff8b601050801de7cc25a6a13b8ce3 GIT binary patch literal 1357 zcmV-T1+w~yP)1Y0A$2( z0S5$tA0a;(Z+&|Xo%gf`5*4V5p0Nr83Q+jIq`$w4`uZ%M7eoevh)_o;ZNk?|X`#PPS$EmL$j8xj9!azw? zR8S-@8c48r?<#&c@e*~b(#(1t=1rrbDV(ik^nNWjzFNYD4eMCG{1`iS93!1JfB}3X zrPKwjyy!@h5mIz^cF_A^HO=orqK?NlA)$H>tk?<lHR`oX_FIJBh~?ppBGL z21=>Yt|7tp?d|m3TTSzpiR4~km|3EmWz}bxA+I5vDSeyX1S>Ydoja@8y!qwm9)uG@ z=s-yoc}x|TFVCW@YaL791TS4Cf42G@FEm_4VoRPgkWcW%?N=FhwE)aq0n-=3rAsf; z*LQ@*#xVdLD5)cliE-e-8mi|gY8IEt>+~(!8-6Q#M)3lvix0A9#v#7%f1B*z2LEA( zXIg$|cI#=9$&xy4!{7c&A659yS0^}-W*S*&(qO* znwZK*1_XeV&V^Yqk;v1~aFa~;MB!ZzS4O?!PRlqmu#(|m9-?sxebe9IwGTh1y}gsO zXKMlN1W0XcF&h?WYdgo_Ef~I8HZV|_%dx*&uq6c{t_(GDX=r_EUXX*{6IEm~jkL53 zm5xYRYk>k#prhjoCr@^B^UzY7-zi7))!|ldj5JY~xJQ*7BjeZdAU}VC(w?uu&%*lk zM~KJEZW;@W599~~B*)I3`-z*oT>W^Wl5tnVo$OM2MxT3xy!RXU^G8^`_$Rh)`z5*~ zE1Yvu2gXp2z#O%;|FUP#F6K<_;_@eO;~%EaZLBFO$W9_JE-DxO*47aoE&4u>7X6YDFEB<|XY(zazWdqvTB(9oI#5da zS}7x?3Y3sWN@b;#E^<2n;hYnIwARY-m&JO<2HF_o1>tW?+z*1(c%k(_eY_fxC8CIT P00000NkvXXu0mjfg^zcC literal 0 HcmV?d00001 diff --git a/python/iconConsole/iconIfaceConsole.png b/python/iconConsole/iconIfaceConsole.png new file mode 100644 index 0000000000000000000000000000000000000000..3aab833cd97b704f424a446616f0223a052f1441 GIT binary patch literal 1262 zcmVIrD)2I3iDrH5yB zmUeYnc$)P`d37F|3EoMDCPW8Znn_`%`GY*lj8n;q+)*k@DyTS8&h%_6E*RFoIJgXeQgn{v4BM9tDrq}D^wOVZ)$8mgfbF=yS z_3I`8&Vq`(#dV#AbC=~CCKpI%-m*P73|A|E8i0LR01=4~9?sjQpM5F&@WD&=k2acL z0q_d|f9a>TsVDwOJ^1?a=+cB)i8oJ;W^rfg|AHu*VBPQe3V?UOCu|Ogh`z7PS(QBd zO18z)g7UJ?TmU~Z#+-~Xx7X`!%+2Pq%=RRllyI7widyT9^=_SYkM|t_O^h)%BtWH7 z$rFg$|#bDOs^co6`ZI%7=cuI?uE)HUL}l^QhwSKn!GIemFVXRUFinF=`rYbsb8j~JB@i(VY_5&#ymk?;V$eoE4PPdfm> z?}G&ZA23&@zLmJnH@9o+#T~Z_p6JzoE)mNC05kQ{BmflZ^*;a+(cJm|M4oW~0G`PWg&tGFcCi2ms*oG1)@_7-Q`CQDGxd1OPxJA^`x^Q!C;> z7N$9Ko3?jubJY5_GsYZJsZ`9E4*=lk^SJ=9P`|L()MzyR^KwKqJiGX0U7`RW1>o!M5?>h~D}rd$4fX!LJ;w8A`*YYpGC~xbgUER~`Vvlc zcY$kCx3<}O8Ew0`55y)7KXaCE-JGZ8uYLJVqFSkZ%p;Ze>Hy%UO6!fCrJb1ox``-a zphOP_@YWPw$N^BO&WbFEP*AG-Hh<{rvKAZ4um?a&N~$bHqqVBiGIZjMc}Ra@iE?t$ zCmo6t)rD)$o~!Z@QC=wIKS1CH+#@2V^?>IKWrm0Y&>MJ}cL4kzXs9~2HJ9i}dQ=pU zUpQ$?Y@B^g@5z=+L*^g|!~hr_wcZT~s*1rXEv~8P=^ASWfW=D{ORpM#9@p@<`zQi0 zey}47hTI9)KOlp_aJ%7oWqNuBR*7W-MP-Hk1b~{*Iy5L?I0cMM0P+9;hX$WZBmHgp Y7kSq4M=(xjmH+?%07*qoM6N<$f