From 7a0c398fd73f27ba7e3207317c6885e22621e69e Mon Sep 17 00:00:00 2001 From: Rebecca Breu Date: Tue, 23 Mar 2021 16:31:55 +0100 Subject: [PATCH] Add setup.py file and structure Python files correctly --- README.md | 3 - README.rst | 38 +++++ beeref.py => beeref/__main__.py | 15 +- {assets => beeref/assets}/logo.png | Bin {assets => beeref/assets}/logo.svg | 171 +++++++++++++++++++-- beeref/view.py | 19 ++- requirements/app.txt | 1 - setup.py | 23 +++ {beeref/tests => tests}/__init__.py | 0 {beeref/tests => tests}/assets/test3x3.png | Bin {beeref/tests => tests}/base.py | 0 {beeref/tests => tests}/test_bee_json.py | 5 +- {beeref/tests => tests}/test_items.py | 8 +- {beeref/tests => tests}/test_scene.py | 2 +- 14 files changed, 252 insertions(+), 33 deletions(-) delete mode 100644 README.md create mode 100644 README.rst rename beeref.py => beeref/__main__.py (83%) rename {assets => beeref/assets}/logo.png (100%) rename {assets => beeref/assets}/logo.svg (69%) delete mode 100644 requirements/app.txt create mode 100644 setup.py rename {beeref/tests => tests}/__init__.py (100%) rename {beeref/tests => tests}/assets/test3x3.png (100%) rename {beeref/tests => tests}/base.py (100%) rename {beeref/tests => tests}/test_bee_json.py (85%) rename {beeref/tests => tests}/test_items.py (90%) rename {beeref/tests => tests}/test_scene.py (97%) diff --git a/README.md b/README.md deleted file mode 100644 index 59b9a66..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# BeeRef — A Simple Reference Image Viewer - -View your references while you art! diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..24472c3 --- /dev/null +++ b/README.rst @@ -0,0 +1,38 @@ +BeeRef — A Simple Reference Image Viewer +======================================== + +View your references while you art! + + +Installation via Python & pip +----------------------------- + +At the moment, you need to have a working Python 3 environment to install BeeRef. + + pip install git+https://github.com/rbreu/beeref.git + +Then run ``beeref`` or ``beeref filename.bee``. + + +Notes for developers +-------------------- + +BeeRef is written in Python and PyQt6. + +Clone the repository and install beeref and its dependencies: + + git clone https://github.com/rbreu/beeref.git + pip install -e beeref + +Install additional development requirements: + + cd beeref + pip install -r requirements/dev.txt + +Run unittests with: + + pytest . + +Run codechecks with: + + flake8 . diff --git a/beeref.py b/beeref/__main__.py similarity index 83% rename from beeref.py rename to beeref/__main__.py index d83c98e..4623ef3 100755 --- a/beeref.py +++ b/beeref/__main__.py @@ -15,10 +15,13 @@ logger = logging.getLogger('BeeRef') class BeeRefMainWindow(QtWidgets.QWidget): - def __init__(self, filename=None): + def __init__(self, app, filename=None): super().__init__() self.setWindowTitle('BeeRef') - self.setWindowIcon(QtGui.QIcon(os.path.join('assets', 'logo.png'))) + root = os.path.dirname(__file__) + logo = os.path.join(root, 'assets', 'logo.png') + logger.debug(f'Loading icon {logo}') + self.setWindowIcon(QtGui.QIcon(logo)) view = BeeGraphicsView(app, self, filename) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(QtCore.QMargins(0, 0, 0, 0)) @@ -46,13 +49,13 @@ def handle_sigint(signum, frame): QtWidgets.QApplication.quit() -if __name__ == '__main__': +def main(): logger = logging.getLogger('BeeRef') logging.basicConfig(level=logging.DEBUG) app = QtWidgets.QApplication(sys.argv) filename = sys.argv[1] if len(sys.argv) > 1 else None - bee = BeeRefMainWindow(filename) + bee = BeeRefMainWindow(app, filename) signal.signal(signal.SIGINT, handle_sigint) # Repeatedly run python-noop to give the interpreter time to @@ -60,3 +63,7 @@ if __name__ == '__main__': safe_timer(50, lambda: None) app.exec() + + +if __name__ == '__main__': + main() diff --git a/assets/logo.png b/beeref/assets/logo.png similarity index 100% rename from assets/logo.png rename to beeref/assets/logo.png diff --git a/assets/logo.svg b/beeref/assets/logo.svg similarity index 69% rename from assets/logo.svg rename to beeref/assets/logo.svg index 9595239..1efa52c 100644 --- a/assets/logo.svg +++ b/beeref/assets/logo.svg @@ -20,6 +20,97 @@ inkscape:export-ydpi="196.74001"> + + + + + + + @@ -142,11 +233,11 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="3.1946385" - inkscape:cx="73.261656" - inkscape:cy="71.727629" + inkscape:zoom="3.0010034" + inkscape:cx="85.093164" + inkscape:cy="73.317598" inkscape:document-units="mm" - inkscape:current-layer="layer3" + inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1280" inkscape:window-height="720" @@ -176,8 +267,9 @@ inkscape:groupmode="layer" id="layer3" inkscape:label="combs" - style="display:inline" - transform="translate(-56.958071,-139.8279)"> + style="display:none" + transform="translate(-56.958071,-139.8279)" + sodipodi:insensitive="true"> + style="display:none;opacity:1" + inkscape:groupmode="layer" + sodipodi:insensitive="true"> + + + + + + + + diff --git a/beeref/view.py b/beeref/view.py index 5725ffe..f562235 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -186,13 +186,13 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): self.scene.addItem(item) def save_to_file(self, filename): - logging.info(f'Saving to file {filename}') + logger.info(f'Saving to file {filename}') with open(filename, 'w') as f: f.write(bee_json.dumps({'items': self.scene.items_for_export()})) self.filename = filename def open_from_file(self, filename): - logging.info(f'Opening file {filename}') + logger.info(f'Opening file {filename}') with open(filename, 'r') as f: items = bee_json.loads(f.read())['items'] self.scene.clear() @@ -263,11 +263,11 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): msg + errornames) def on_action_paste_images(self): - logging.info('Pasting image from clipboard...') + logger.info('Pasting image from clipboard...') clipboard = QtWidgets.QApplication.clipboard() img = clipboard.image() if img.isNull(): - logging.info('No image data in clipboard') + logger.info('No image data in clipboard') else: self.scene.clearSelection() pos = self.mapToScene( @@ -277,7 +277,6 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): def on_selection_changed(self): for action in self.actions_active_when_selection: action.setEnabled(self.scene.has_selection()) - self.viewport().repaint() def recalc_scene_rect(self): """Resize the scene rectangle so that it is always one view width @@ -330,12 +329,12 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): if self.get_zoom_size(max) < 10000000: self.scale(factor, factor) else: - logging.debug('Maximum zoom size reached') + logger.debug('Maximum zoom size reached') else: if self.get_zoom_size(min) > 50: self.scale(1/factor, 1/factor) else: - logging.debug('Minimum zoom size reached') + logger.debug('Minimum zoom size reached') event.accept() def mouseMoveEvent(self, event): @@ -378,7 +377,7 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): self.welcome_overlay.resize(self.size()) def dragEnterEvent(self, event): - logging.debug('Received drag enter event') + logger.debug('Received drag enter event') # tbd: always empty??? print(event.mimeData().formats()) @@ -386,12 +385,12 @@ class BeeGraphicsView(QtWidgets.QGraphicsView): if event.mimeData().hasImage(): event.acceptProposedAction() else: - logging.info('Attempted drop not an image') + logger.info('Attempted drop not an image') def dragMoveEvent(self, event): event.acceptProposedAction() def dropEvent(self, event): - logging.info('Handling file drop...') + logger.info('Handling file drop...') print(event.mimeData().formats()) # tbd diff --git a/requirements/app.txt b/requirements/app.txt deleted file mode 100644 index 86eab23..0000000 --- a/requirements/app.txt +++ /dev/null @@ -1 +0,0 @@ -pyQt6==6.0.3 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2ad71e4 --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +from setuptools import setup + +setup( + name='BeeRef', + version='0.0.1', + author='Rebecca Breu', + author_email='rebecca@rbreu.de', + url='https://github.com/rbreu/beeref', + license='LICENSE', + description='A simple reference image viewer', + install_requires=[ + 'pyQt6', + ], + packages=['beeref'], + entry_points={ + 'gui_scripts': [ + 'beeref = beeref.__main__:main' + ] + }, + package_data = { + 'assets': ['*.png', '*.svg'], + }, +) diff --git a/beeref/tests/__init__.py b/tests/__init__.py similarity index 100% rename from beeref/tests/__init__.py rename to tests/__init__.py diff --git a/beeref/tests/assets/test3x3.png b/tests/assets/test3x3.png similarity index 100% rename from beeref/tests/assets/test3x3.png rename to tests/assets/test3x3.png diff --git a/beeref/tests/base.py b/tests/base.py similarity index 100% rename from beeref/tests/base.py rename to tests/base.py diff --git a/beeref/tests/test_bee_json.py b/tests/test_bee_json.py similarity index 85% rename from beeref/tests/test_bee_json.py rename to tests/test_bee_json.py index 9496972..400a765 100644 --- a/beeref/tests/test_bee_json.py +++ b/tests/test_bee_json.py @@ -5,13 +5,14 @@ from PyQt6 import QtGui from beeref import bee_json from beeref.items import BeePixmapItem from beeref.scene import BeeGraphicsScene -from beeref.tests.base import BeeTestCase +from .base import BeeTestCase class BeeJsonTestCase(BeeTestCase): def test_dumps_loads(self): - filename = os.path.join('lib', 'tests', 'assets', 'test3x3.png') + root = os.path.dirname(__file__) + filename = os.path.join(root, 'assets', 'test3x3.png') item = BeePixmapItem(QtGui.QImage(filename), filename) item.setScale(2) item.setPos(100, 200) diff --git a/beeref/tests/test_items.py b/tests/test_items.py similarity index 90% rename from beeref/tests/test_items.py rename to tests/test_items.py index f4594f7..8bccdfb 100644 --- a/beeref/tests/test_items.py +++ b/tests/test_items.py @@ -3,13 +3,14 @@ import os.path from PyQt6 import QtGui, QtWidgets from beeref.items import BeePixmapItem -from beeref.tests.base import BeeTestCase +from .base import BeeTestCase class BeePixmapItemTestCase(BeeTestCase): def test_init(self): - filename = os.path.join('beeref', 'tests', 'assets', 'test3x3.png') + root = os.path.dirname(__file__) + filename = os.path.join(root, 'assets', 'test3x3.png') item = BeePixmapItem(QtGui.QImage(filename), filename) assert item.width == 3 assert item.height == 3 @@ -52,7 +53,8 @@ class BeePixmapItemToBeeJsonTestCase(BeeTestCase): assert beejson['z'] == 3.0 def test_pixmap(self): - filename = os.path.join('beeref', 'tests', 'assets', 'test3x3.png') + root = os.path.dirname(__file__) + filename = os.path.join(root, 'assets', 'test3x3.png') item = BeePixmapItem(QtGui.QImage(filename)) beejson = item.to_bee_json() assert len(beejson['pixmap']) > 0 diff --git a/beeref/tests/test_scene.py b/tests/test_scene.py similarity index 97% rename from beeref/tests/test_scene.py rename to tests/test_scene.py index 4be81de..5796c9c 100644 --- a/beeref/tests/test_scene.py +++ b/tests/test_scene.py @@ -5,7 +5,7 @@ from PyQt6 import QtGui from beeref.items import BeePixmapItem from beeref.scene import BeeGraphicsScene -from beeref.tests.base import BeeTestCase +from .base import BeeTestCase class BeeGraphicsSceneNormalizeTestCase(BeeTestCase):