Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if not self.item_list:
return
x = origin.x() + left
y = origin.y() + top
for n, item in enumerate(self.item_list):
i, j = n % columns, n // columns
item.setGeometry(QtCore.QRect(
QtCore.QPoint(x + (i * item_w), y + (j * item_h)), item_size))
self.scroll_area.set_multi_row(multi_row)
class ImageList(QtWidgets.QWidget):
image_list_changed = QtCore.pyqtSignal()
new_metadata = QtCore.pyqtSignal(bool)
selection_changed = QtCore.pyqtSignal(list)
sort_order_changed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(ImageList, self).__init__(parent)
self.app = QtWidgets.QApplication.instance()
self.drag_icon = None
self.images = []
self.last_selected = None
self.selection_anchor = None
self.thumb_size = int(
self.app.config_store.get('controls', 'thumb_size', '80'))
layout = QtWidgets.QGridLayout()
layout.setSpacing(0)
layout.setRowStretch(0, 1)
layout.setColumnStretch(3, 1)
self.setLayout(layout)
layout.setContentsMargins(0, 0, 0, 0)
def read(self, size):
if self._callback:
self._callback(self._f.tell() * 100 // self.len)
if self._closing.is_set():
raise UploadAborted()
return self._f.read(size)
# delegate all other attributes to file object
def __getattr__(self, name):
return getattr(self._f, name)
class UploadWorker(QtCore.QObject):
finished = QtCore.pyqtSignal()
upload_error = QtCore.pyqtSignal(six.text_type, six.text_type)
upload_progress = QtCore.pyqtSignal(float, six.text_type)
def __init__(self, session_factory, upload_list, *args, **kwds):
super(UploadWorker, self).__init__(*args, **kwds)
self.session_factory = session_factory
self.upload_list = upload_list
self.fileobj = None
@QtCore.pyqtSlot()
@catch_all
def start(self):
session = self.session_factory()
session.connect()
upload_count = 0
while upload_count < len(self.upload_list):
image, convert, params = self.upload_list[upload_count]
name = os.path.basename(image.path)
width_hint += columns * item_w
height_hint += rows * item_h
self.size_hint = QtCore.QSize(width_hint, height_hint)
if not self.item_list:
return
x = origin.x() + left
y = origin.y() + top
for n, item in enumerate(self.item_list):
i, j = n % columns, n // columns
item.setGeometry(QtCore.QRect(
QtCore.QPoint(x + (i * item_w), y + (j * item_h)), item_size))
self.scroll_area.set_multi_row(multi_row)
class ImageList(QtWidgets.QWidget):
image_list_changed = QtCore.pyqtSignal()
new_metadata = QtCore.pyqtSignal(bool)
selection_changed = QtCore.pyqtSignal(list)
sort_order_changed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(ImageList, self).__init__(parent)
self.app = QtWidgets.QApplication.instance()
self.drag_icon = None
self.images = []
self.last_selected = None
self.selection_anchor = None
self.thumb_size = int(
self.app.config_store.get('controls', 'thumb_size', '80'))
layout = QtWidgets.QGridLayout()
layout.setSpacing(0)
layout.setRowStretch(0, 1)
self.fileno = self.stream.fileno
def write(self, msg):
self.stream.write(msg)
msg = msg.strip()
if 'WARNING' in msg:
self.logger.warning(msg)
elif msg:
self.logger.info(msg)
class StreamProxy(QtCore.QObject):
# only the GUI thread is allowed to write messages in the
# LoggerWindow, so this class acts as a proxy, passing messages
# over Qt signal/slot for thread safety
flush_text = QtCore.pyqtSignal()
write_text = QtCore.pyqtSignal(str)
def write(self, msg):
msg = msg.strip()
if msg:
self.write_text.emit(msg)
def flush(self):
self.flush_text.emit()
class LoggerFilter(object):
def __init__(self, threshold):
self.threshold = threshold
def filter(self, record):
def get_value(self):
new_value = {}
for key in self.members:
if self.members[key].is_multiple():
continue
new_value[key] = self.members[key].get_value().strip() or None
return new_value
@QtCore.pyqtSlot()
@catch_all
def editing_finished(self):
self.new_value.emit(self, self.get_value())
class QTabBar(QtWidgets.QTabBar):
context_menu = QtCore.pyqtSignal(QtGui.QContextMenuEvent)
@catch_all
def contextMenuEvent(self, event):
self.context_menu.emit(event)
class TabWidget(QtWidgets.QWidget):
@staticmethod
def tab_name():
return translate('AddressTab', '&Address')
def __init__(self, image_list, parent=None):
super(TabWidget, self).__init__(parent)
self.app = QtWidgets.QApplication.instance()
self.geocoder = self.app.open_cage
self.image_list = image_list
import re
import six
from photini.metadata import LensSpec
from photini.pyqt import (
catch_all, ComboBox, multiple, multiple_values, Qt, QtCore, QtGui,
QtWidgets, scale_font, set_symbol_font, Slider, SquareButton,
width_for_text)
logger = logging.getLogger(__name__)
translate = QtCore.QCoreApplication.translate
class DropdownEdit(ComboBox):
new_value = QtCore.pyqtSignal(object)
def __init__(self, *arg, **kw):
super(DropdownEdit, self).__init__(*arg, **kw)
self.addItem(translate('TechnicalTab', ''), None)
self.addItem('', None)
self.setItemData(1, 0, Qt.UserRole - 1)
self.addItem(multiple_values(), None)
self.setItemData(2, 0, Qt.UserRole - 1)
self.currentIndexChanged.connect(self.current_index_changed)
@QtCore.pyqtSlot(int)
@catch_all
def current_index_changed(self, int):
self.new_value.emit(self.get_value())
def add_item(self, text, data):
@QtCore.pyqtSlot(float, float)
def marker_drag(self, lat, lng):
self.parent().marker_drag(lat, lng)
@QtCore.pyqtSlot(float, float, int)
def marker_drag_end(self, lat, lng, marker_id):
self.parent().marker_drag_end(lat, lng, marker_id)
@QtCore.pyqtSlot(float, float)
def marker_drop(self, lat, lng):
self.parent().marker_drop(lat, lng)
class MapWebView(QWebView):
drop_text = QtCore.pyqtSignal(int, int, six.text_type)
def __init__(self, call_handler, *args, **kwds):
super(MapWebView, self).__init__(*args, **kwds)
# set view's page
if using_qtwebengine:
self.setPage(MapWebEnginePage(parent=self))
self.page().set_call_handler(call_handler)
self.settings().setAttribute(
QWebSettings.Accelerated2dCanvasEnabled, False)
else:
self.setPage(MapWebKitPage(call_handler, parent=self))
self.settings().setAttribute(
QWebSettings.LocalContentCanAccessRemoteUrls, True)
self.settings().setAttribute(
QWebSettings.LocalContentCanAccessFileUrls, True)
if 'status' in rsp:
if rsp['status']['message'] != 'Success':
return str(rsp['status'])
media_id = rsp['mediaItem']['id']
# 4/ add media item to more albums
if len(params['albums']) > 1:
body = {'mediaItemIds': [media_id]}
for album_id in params['albums'][1:]:
url = (self.photos_url + 'v1/albums/' +
album_id + ':batchAddMediaItems')
rsp = self.check_response(self.api.post(url, json=body))
return ''
class GoogleUploadConfig(QtWidgets.QWidget):
new_set = QtCore.pyqtSignal()
def __init__(self, *arg, **kw):
super(GoogleUploadConfig, self).__init__(*arg, **kw)
self.setLayout(QtWidgets.QGridLayout())
self.layout().setContentsMargins(0, 0, 0, 0)
# create new set
new_set_button = QtWidgets.QPushButton(
translate('GooglePhotosTab', 'New album'))
new_set_button.clicked.connect(self.new_set)
self.layout().addWidget(new_set_button, 2, 1)
# list of sets widget
sets_group = QtWidgets.QGroupBox(
translate('GooglePhotosTab', 'Add to albums'))
sets_group.setLayout(QtWidgets.QVBoxLayout())
scrollarea = QtWidgets.QScrollArea()
scrollarea.setFrameStyle(QtWidgets.QFrame.NoFrame)
return None
if tag in ('Exif.Image.RatingPercent', 'Xmp.MicrosoftPhoto.Rating'):
value = 1.0 + (float(file_value) / 25.0)
else:
value = min(max(float(file_value), -1.0), 5.0)
return cls(value)
def write(self, handler, tag):
if handler.is_exif_tag(tag):
handler.set_string(tag, six.text_type(int(self + 1.5) - 1))
else:
handler.set_string(tag, six.text_type(self))
class Metadata(QtCore.QObject):
unsaved = QtCore.pyqtSignal(bool)
# type of each Photini data field's data
_data_type = {
'altitude' : Altitude,
'aperture' : Aperture,
'camera_model' : CameraModel,
'copyright' : MD_String,
'creator' : MultiString,
'date_digitised' : DateTime,
'date_modified' : DateTime,
'date_taken' : DateTime,
'description' : MD_String,
'dimension_x' : MD_Int,
'dimension_y' : MD_Int,
'focal_length' : MD_Rational,
'focal_length_35': MD_Int,