1717)
1818from AnyQt .QtCore import Qt , QRegExp , QByteArray , QItemSelectionModel
1919
20+ from Orange .canvas .gui .utils import OSX_NSURL_toLocalFile
2021from Orange .data import Table
2122from Orange .base import Learner , Model
2223from 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+
3853class 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
142175class 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
712761if __name__ == "__main__" : # pragma: no cover
713762 WidgetPreview (OWPythonScript ).run ()
0 commit comments