Skip to content

Commit

Permalink
Minor code improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
dynobo committed Mar 14, 2022
1 parent 1972c2e commit e0b7252
Show file tree
Hide file tree
Showing 8 changed files with 267 additions and 169 deletions.
341 changes: 223 additions & 118 deletions poetry.lock

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions src/normcap/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import sys
from importlib import metadata, resources

# TODO: Manual test multi screen

# Workaround for older tesseract version 4.0.0 on e.g. Debian Buster
locale.setlocale(locale.LC_ALL, "C")

Expand Down
2 changes: 2 additions & 0 deletions src/normcap/gui/downloader_requests.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
"""Find new version on github or pypi."""
# TODO: Can be removed?

import logging

import requests
Expand Down
20 changes: 11 additions & 9 deletions src/normcap/gui/notifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,28 +49,30 @@ def compose_notification(capture) -> tuple[str, str]:
text = "Please try again."

# Message title
title = ""
count = 0
if len(capture.ocr_text) < 1:
title += "Nothing!"
title = "Nothing!"
elif capture.ocr_applied_magic == "ParagraphMagic":
count = capture.ocr_text.count(os.linesep * 2) + 1
title += f"{count} paragraph"
title = f"{count} paragraph"
elif capture.ocr_applied_magic == "EmailMagic":
count = capture.ocr_text.count("@")
title += f"{count} email"
title = f"{count} email"
elif capture.ocr_applied_magic == "SingleLineMagic":
count = capture.ocr_text.count(" ") + 1
title += f"{count} word"
title = f"{count} word"
elif capture.ocr_applied_magic == "MultiLineMagic":
count = capture.ocr_text.count("\n") + 1
title += f"{count} line"
title = f"{count} line"
elif capture.ocr_applied_magic == "UrlMagic":
count = capture.ocr_text.count("\n") + 1
title += f"{count} URL"
title = f"{count} URL"
elif capture.mode == CaptureMode.RAW:
count = len(capture.ocr_text)
title += f"{count} char"
title = f"{count} char"
else:
count = 0
title = ""

title += f"{'s' if count > 1 else ''} captured"

return title, text
33 changes: 18 additions & 15 deletions src/normcap/gui/settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
from typing import Optional

from PySide6 import QtCore

Expand All @@ -10,34 +11,36 @@
class Settings(QtCore.QSettings):
"""Customized settings."""

def __init__(self, *args, initial: dict, reset=False):
default_settings = DEFAULT_SETTINGS
init_settings = Optional[dict]

def __init__(self, *args, init_settings: dict):
super().__init__(*args)
self.setFallbacksEnabled(False)

# Do nicer?
if reset:
self.reset()

self._set_missing_to_default(DEFAULT_SETTINGS)
self._update_from_dict(initial)

self.sync()
self.init_settings = init_settings
self._prepare_and_sync()

def reset(self):
"""Remove all existing settings and values."""
logger.info("Remove existing settings")
logger.info("Reset settings to defaults")
for key in self.allKeys():
self.remove(key)
self._prepare_and_sync()

def _prepare_and_sync(self):
self._set_missing_to_default()
self._update_from_init_settings()
self.sync()

def _set_missing_to_default(self, defaults):
for d in defaults:
def _set_missing_to_default(self):
for d in self.default_settings:
key, value = d.key, d.value
if key not in self.allKeys() or (self.value(key) is None):
logger.debug("Reset settings to (%s: %s)", key, value)
self.setValue(key, value)

def _update_from_dict(self, settings_dict):
for key, value in settings_dict.items():
def _update_from_init_settings(self):
for key, value in self.init_settings.items():
if self.contains(key):
if value is not None:
self.setValue(key, value)
Expand Down
11 changes: 5 additions & 6 deletions src/normcap/gui/tray.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,9 @@ def __init__(self, parent, args):
super().__init__(parent)

self.com = Communicate()
self.settings = Settings(
"normcap",
"settings",
initial=args,
reset=args.get("reset", False),
)
self.settings = Settings("normcap", "settings", init_settings=args)
if args.get("reset", False):
self.settings.reset()

self.capture.mode = (
CaptureMode.PARSE
Expand Down Expand Up @@ -104,6 +101,7 @@ def _add_notifier(self):
)

def _update_screenshots(self):
"""Get new screenshots and cache them."""
screens = grab_screens()
for idx, screenshot in enumerate(screens):
utils.save_image_in_tempfolder(screenshot, postfix=f"_raw_screen{idx}")
Expand Down Expand Up @@ -151,6 +149,7 @@ def _create_window(self, index: int):
if index == 0:
new_window.add_settings_menu(self)

new_window.set_fullscreen()
self.windows[index] = new_window

#####################
Expand Down
25 changes: 7 additions & 18 deletions src/normcap/gui/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ class Window(QtWidgets.QMainWindow):
"""Used for child windows and as base class for MainWindow."""

settings_menu: Optional[QtWidgets.QToolButton] = None
ui_layer_css: str = ""

def __init__(self, screen_idx: int, color: str, parent=None):
"""Initialize window."""
super().__init__()
self.screen_idx: int = screen_idx
self.color: QtGui.QColor = QtGui.QColor(color)
self.tray: QtWidgets.QMainWindow = parent or self
self.ui_layer_css = f"#ui_layer {{border: 3px solid {self.color.name()};}}"
self.is_positioned: bool = False

# Window properties
self.setObjectName(f"window-{self.screen_idx}")
Expand All @@ -39,29 +42,27 @@ def __init__(self, screen_idx: int, color: str, parent=None):

# Prepare selection rectangle
self.selection: Selection = Selection()
self.is_positioned: bool = False
self.pen_width: int = 2
self.is_selecting: bool = False
self.mode_indicator: QtGui.QIcon = QtGui.QIcon()
self.pen_width: int = 2

# Setup widgets and show
logger.debug("Create window for screen %s", self.screen_idx)
self._add_image_layer()
self._add_ui_layer()
self.set_fullscreen()

def _add_image_layer(self):
"""Add widget showing screenshot."""
self.image_layer = QtWidgets.QLabel()
self.image_layer.setObjectName("central_widget")
self.image_layer.setScaledContents(True)
self.setCentralWidget(self.image_layer)

def _add_ui_layer(self):
"""Add widget for showing selection rectangle and settings button."""
self.ui_layer = QtWidgets.QLabel(self)
self.ui_layer.setObjectName("ui_layer")
self.ui_layer.setStyleSheet(
f"#ui_layer {{border: 3px solid {self.color.name()};}}"
)
self.ui_layer.setStyleSheet(self.ui_layer_css)
self.ui_layer.setCursor(QtCore.Qt.CrossCursor)
self.ui_layer.setScaledContents(True)
self.ui_layer.setGeometry(self.image_layer.geometry())
Expand Down Expand Up @@ -189,18 +190,6 @@ def showEvent(self, event: QtGui.QShowEvent) -> None:
self.draw_background_image()
return super().showEvent(event)

def hide(self):
"""Patch for MacOS to avoid blank full screen."""
if sys.platform == "darwin":
# Workaround to avoid black screen in MacOS.
# TODO: replace by using tray as main application and close windows instead hide
# Root cause: https://bugreports.qt.io/browse/QTBUG-46701
self.showNormal()
QtCore.QTimer.singleShot(800, super().hide)
return True

return super().hide()

##################
# Adjust UI
##################
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def test_argparser_help_is_complete():


def test_all_argparser_attributes_in_settings(argparser_defaults):
settings = Settings("normcap", "settings", initial={}, reset=False)
settings = Settings("normcap", "settings", init_settings={})

for arg in argparser_defaults:
if arg in ["verbose", "very_verbose", "reset"]:
Expand Down

0 comments on commit e0b7252

Please sign in to comment.