Show More
@@ -268,7 +268,6 b' class ConsoleWidget(LoggingConfigurable, QtGui.QWidget):' | |||
|
268 | 268 | self._continuation_prompt = '> ' |
|
269 | 269 | self._continuation_prompt_html = None |
|
270 | 270 | self._executing = False |
|
271 | self._filter_drag = False | |
|
272 | 271 | self._filter_resize = False |
|
273 | 272 | self._html_exporter = HtmlExporter(self._control) |
|
274 | 273 | self._input_buffer_executing = '' |
@@ -343,7 +342,51 b' class ConsoleWidget(LoggingConfigurable, QtGui.QWidget):' | |||
|
343 | 342 | triggered=self.reset_font) |
|
344 | 343 | self.addAction(self.reset_font_size) |
|
345 | 344 | |
|
345 | # Accept drag and drop events here. Drops were already turned off | |
|
346 | # in self._control when that widget was created. | |
|
347 | self.setAcceptDrops(True) | |
|
346 | 348 | |
|
349 | #--------------------------------------------------------------------------- | |
|
350 | # Drag and drop support | |
|
351 | #--------------------------------------------------------------------------- | |
|
352 | ||
|
353 | def dragEnterEvent(self, e): | |
|
354 | if e.mimeData().hasUrls(): | |
|
355 | # The link action should indicate to that the drop will insert | |
|
356 | # the file anme. | |
|
357 | e.setDropAction(QtCore.Qt.LinkAction) | |
|
358 | e.accept() | |
|
359 | elif e.mimeData().hasText(): | |
|
360 | # By changing the action to copy we don't need to worry about | |
|
361 | # the user accidentally moving text around in the widget. | |
|
362 | e.setDropAction(QtCore.Qt.CopyAction) | |
|
363 | e.accept() | |
|
364 | ||
|
365 | def dragMoveEvent(self, e): | |
|
366 | if e.mimeData().hasUrls(): | |
|
367 | pass | |
|
368 | elif e.mimeData().hasText(): | |
|
369 | cursor = self._control.cursorForPosition(e.pos()) | |
|
370 | if self._in_buffer(cursor.position()): | |
|
371 | e.setDropAction(QtCore.Qt.CopyAction) | |
|
372 | self._control.setTextCursor(cursor) | |
|
373 | else: | |
|
374 | e.setDropAction(QtCore.Qt.IgnoreAction) | |
|
375 | e.accept() | |
|
376 | ||
|
377 | def dropEvent(self, e): | |
|
378 | if e.mimeData().hasUrls(): | |
|
379 | self._keep_cursor_in_buffer() | |
|
380 | cursor = self._control.textCursor() | |
|
381 | filenames = [url.toLocalFile() for url in e.mimeData().urls()] | |
|
382 | text = ', '.join("'" + f.replace("'", "'\"'\"'") + "'" | |
|
383 | for f in filenames) | |
|
384 | self._insert_plain_text_into_buffer(cursor, text) | |
|
385 | elif e.mimeData().hasText(): | |
|
386 | cursor = self._control.cursorForPosition(e.pos()) | |
|
387 | if self._in_buffer(cursor.position()): | |
|
388 | text = e.mimeData().text() | |
|
389 | self._insert_plain_text_into_buffer(cursor, text) | |
|
347 | 390 | |
|
348 | 391 | def eventFilter(self, obj, event): |
|
349 | 392 | """ Reimplemented to ensure a console-like behavior in the underlying |
@@ -392,39 +435,6 b' class ConsoleWidget(LoggingConfigurable, QtGui.QWidget):' | |||
|
392 | 435 | event.key() in self._shortcuts: |
|
393 | 436 | event.accept() |
|
394 | 437 | |
|
395 | # Ensure that drags are safe. The problem is that the drag starting | |
|
396 | # logic, which determines whether the drag is a Copy or Move, is locked | |
|
397 | # down in QTextControl. If the widget is editable, which it must be if | |
|
398 | # we're not executing, the drag will be a Move. The following hack | |
|
399 | # prevents QTextControl from deleting the text by clearing the selection | |
|
400 | # when a drag leave event originating from this widget is dispatched. | |
|
401 | # The fact that we have to clear the user's selection is unfortunate, | |
|
402 | # but the alternative--trying to prevent Qt from using its hardwired | |
|
403 | # drag logic and writing our own--is worse. | |
|
404 | elif etype == QtCore.QEvent.DragEnter and \ | |
|
405 | obj == self._control.viewport() and \ | |
|
406 | event.source() == self._control.viewport(): | |
|
407 | self._filter_drag = True | |
|
408 | elif etype == QtCore.QEvent.DragLeave and \ | |
|
409 | obj == self._control.viewport() and \ | |
|
410 | self._filter_drag: | |
|
411 | cursor = self._control.textCursor() | |
|
412 | cursor.clearSelection() | |
|
413 | self._control.setTextCursor(cursor) | |
|
414 | self._filter_drag = False | |
|
415 | ||
|
416 | # Ensure that drops are safe. | |
|
417 | elif etype == QtCore.QEvent.Drop and obj == self._control.viewport(): | |
|
418 | cursor = self._control.cursorForPosition(event.pos()) | |
|
419 | if self._in_buffer(cursor.position()): | |
|
420 | text = event.mimeData().text() | |
|
421 | self._insert_plain_text_into_buffer(cursor, text) | |
|
422 | ||
|
423 | # Qt is expecting to get something here--drag and drop occurs in its | |
|
424 | # own event loop. Send a DragLeave event to end it. | |
|
425 | QtGui.qApp.sendEvent(obj, QtGui.QDragLeaveEvent()) | |
|
426 | return True | |
|
427 | ||
|
428 | 438 | # Handle scrolling of the vsplit pager. This hack attempts to solve |
|
429 | 439 | # problems with tearing of the help text inside the pager window. This |
|
430 | 440 | # happens only on Mac OS X with both PySide and PyQt. This fix isn't |
@@ -1035,8 +1045,12 b' class ConsoleWidget(LoggingConfigurable, QtGui.QWidget):' | |||
|
1035 | 1045 | control.setAcceptRichText(False) |
|
1036 | 1046 | control.setMouseTracking(True) |
|
1037 | 1047 | |
|
1048 | # Prevent the widget from handling drops, as we already provide | |
|
1049 | # the logic in this class. | |
|
1050 | control.setAcceptDrops(False) | |
|
1051 | ||
|
1038 | 1052 | # Install event filters. The filter on the viewport is needed for |
|
1039 |
# mouse events |
|
|
1053 | # mouse events. | |
|
1040 | 1054 | control.installEventFilter(self) |
|
1041 | 1055 | control.viewport().installEventFilter(self) |
|
1042 | 1056 |
General Comments 0
You need to be logged in to leave comments.
Login now