Skip to content

Commit dde1107

Browse files
committed
OWPythonScript: dropping and pasting of python scripts
The current script is replaced (in an undoable way) with the pasted script.
1 parent 8186dd6 commit dde1107

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

Orange/widgets/data/owpythonscript.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
)
1818
from AnyQt.QtCore import Qt, QRegExp, QByteArray, QItemSelectionModel
1919

20+
from Orange.canvas.gui.utils import OSX_NSURL_toLocalFile
2021
from Orange.data import Table
2122
from Orange.base import Learner, Model
2223
from Orange.widgets import widget, gui
@@ -35,6 +36,20 @@ def text_format(foreground=Qt.black, weight=QFont.Normal):
3536
return fmt
3637

3738

39+
def to_local_file(url):
40+
return OSX_NSURL_toLocalFile(url) or url.toLocalFile()
41+
42+
43+
def read_file_content(url, limit=None):
44+
filename = to_local_file(url)
45+
try:
46+
with open(filename, encoding="utf-8", errors='strict') as f:
47+
text = f.read(limit)
48+
return text
49+
except (OSError, UnicodeDecodeError):
50+
return None
51+
52+
3853
class PythonSyntaxHighlighter(QSyntaxHighlighter):
3954
def __init__(self, parent=None):
4055

@@ -138,6 +153,24 @@ def keyPressEvent(self, event):
138153
else:
139154
super().keyPressEvent(event)
140155

156+
def insertFromMimeData(self, source):
157+
"""
158+
Reimplemented from QPlainTextEdit.insertFromMimeData.
159+
"""
160+
urls = source.urls()
161+
if urls:
162+
self.pasteFile(urls[0])
163+
else:
164+
super().insertFromMimeData(source)
165+
166+
def pasteFile(self, url):
167+
new = read_file_content(url)
168+
if new:
169+
# inserting text like this allows undo
170+
cursor = QTextCursor(self.document())
171+
cursor.select(QTextCursor.Document)
172+
cursor.insertText(new)
173+
141174

142175
class PythonConsole(QPlainTextEdit, code.InteractiveConsole):
143176
def __init__(self, locals=None, parent=None):
@@ -524,6 +557,8 @@ def __init__(self):
524557
if self.splitterState is not None:
525558
self.splitCanvas.restoreState(QByteArray(self.splitterState))
526559

560+
self.setAcceptDrops(True)
561+
527562
self.splitCanvas.splitterMoved[int, int].connect(self.onSpliterMoved)
528563
self.controlArea.layout().addStretch(1)
529564
self.resize(800, 600)
@@ -708,6 +743,20 @@ def commit(self):
708743
out_var = None
709744
getattr(self.Outputs, signal).send(out_var)
710745

746+
def dragEnterEvent(self, event):
747+
urls = event.mimeData().urls()
748+
if urls:
749+
# try reading the file as text
750+
c = read_file_content(urls[0], limit=1000)
751+
if c is not None:
752+
event.acceptProposedAction()
753+
754+
def dropEvent(self, event):
755+
"""Handle file drops"""
756+
urls = event.mimeData().urls()
757+
if urls:
758+
self.text.pasteFile(urls[0])
759+
711760

712761
if __name__ == "__main__": # pragma: no cover
713762
WidgetPreview(OWPythonScript).run()

0 commit comments

Comments
 (0)