Added: Dragging bee files onto empty scenes to open

This commit is contained in:
Rebecca Breu 2021-09-01 18:25:37 +02:00
parent e35a6e5390
commit 3ee5f65407
6 changed files with 61 additions and 4 deletions

View file

@ -8,6 +8,7 @@ Added
* You can now add plain text notes and paste text from the clipboard
* You can now open bee files from finder on MacOS (by David Andrs)
* You can now drag bee files onto an empty scene to open them
Changed

View file

@ -20,11 +20,12 @@ from PyQt6 import QtCore
from beeref import commands
from beeref.fileio.errors import BeeFileIOError
from beeref.fileio.image import load_image
from beeref.fileio.sql import SQLiteIO
from beeref.fileio.sql import SQLiteIO, is_bee_file
from beeref.items import BeePixmapItem
__all__ = [
'is_bee_file',
'load_bee',
'save_bee',
'load_images',

View file

@ -42,6 +42,13 @@ from .schema import SCHEMA, USER_VERSION, MIGRATIONS, APPLICATION_ID
logger = logging.getLogger(__name__)
def is_bee_file(path):
"""Check wether the file at the given path is a bee file."""
print(os.path.splitext(path)[1])
return os.path.splitext(path)[1] == '.bee'
def handle_sqlite_errors(func):
def wrapper(self, *args, **kwargs):
try:

View file

@ -676,6 +676,14 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin):
pos = QtCore.QPoint(round(event.position().x()),
round(event.position().y()))
if mimedata.hasUrls():
logger.debug(f'Found dropped urls: {mimedata.urls()}')
if not self.scene.items():
# Check if we have a bee file we can open directly
path = mimedata.urls()[0]
if (path.isLocalFile()
and fileio.is_bee_file(path.toLocalFile())):
self.open_from_file(path.toLocalFile())
return
self.do_insert_images(mimedata.urls(), pos)
elif mimedata.hasImage():
img = QtGui.QImage(mimedata.imageData())

View file

@ -7,12 +7,20 @@ from unittest.mock import MagicMock, patch
from PyQt6 import QtGui
import pytest
from beeref.fileio import schema
from beeref.fileio import schema, is_bee_file
from beeref.fileio.errors import BeeFileIOError
from beeref.fileio.sql import SQLiteIO
from beeref.items import BeePixmapItem, BeeTextItem
@pytest.mark.parametrize('filename,expected',
[(os.path.join('foo', 'bar.bee'), True),
(os.path.join('foo', 'bar.png'), False),
(os.path.join('foo', 'bar'), False)])
def test_is_bee_file(filename, expected):
assert is_bee_file(filename) is expected
def test_sqliteio_migrate_does_nothing_when_version_ok(tmpfile):
io = SQLiteIO(tmpfile, MagicMock(), create_new=True)
io.ex('PRAGMA user_version=%s' % schema.USER_VERSION)

View file

@ -811,8 +811,7 @@ def test_drag_move(view):
@patch('beeref.view.BeeGraphicsView.do_insert_images')
def test_drop_when_url(insert_mock, view, imgfilename3x3):
url = QtCore.QUrl()
url.fromLocalFile(imgfilename3x3)
url = QtCore.QUrl.fromLocalFile(imgfilename3x3)
mimedata = QtCore.QMimeData()
mimedata.setUrls([url])
event = MagicMock()
@ -823,6 +822,39 @@ def test_drop_when_url(insert_mock, view, imgfilename3x3):
insert_mock.assert_called_once_with([url], QtCore.QPoint(10, 20))
@patch('beeref.view.BeeGraphicsView.open_from_file')
def test_drop_when_url_beefile_and_scene_empty(open_mock, view):
root = os.path.dirname(__file__)
filename = os.path.join(root, 'assets', 'test1item.bee')
url = QtCore.QUrl.fromLocalFile(filename)
mimedata = QtCore.QMimeData()
mimedata.setUrls([url])
event = MagicMock()
event.mimeData.return_value = mimedata
event.position.return_value = QtCore.QPointF(10, 20)
view.dropEvent(event)
open_mock.assert_called_once_with(filename)
@patch('beeref.view.BeeGraphicsView.do_insert_images')
@patch('beeref.view.BeeGraphicsView.open_from_file')
def test_drop_when_url_beefile_and_scene_not_empty(
open_mock, insert_mock, view, item):
view.scene.addItem(item)
root = os.path.dirname(__file__)
filename = os.path.join(root, 'assets', 'test1item.bee')
url = QtCore.QUrl.fromLocalFile(filename)
mimedata = QtCore.QMimeData()
mimedata.setUrls([url])
event = MagicMock()
event.mimeData.return_value = mimedata
event.position.return_value = QtCore.QPointF(10, 20)
view.dropEvent(event)
open_mock.assert_not_called()
def test_drop_when_img(view, imgfilename3x3):
mimedata = QtCore.QMimeData()
mimedata.setImageData(QtGui.QImage(imgfilename3x3))