示例#1
0
 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)
     # thumbnail display
     self.scroll_area = ScrollArea()
     self.scroll_area.dropped_images.connect(self.open_file_list)
     self.scroll_area.multi_row_changed.connect(
         self._ensure_selected_visible)
     layout.addWidget(self.scroll_area, 0, 0, 1, 6)
     QtWidgets.QShortcut(QtGui.QKeySequence.MoveToPreviousChar,
                         self.scroll_area, self.move_to_prev_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.MoveToNextChar,
                         self.scroll_area, self.move_to_next_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.MoveToStartOfLine,
                         self.scroll_area, self.move_to_first_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.MoveToEndOfLine,
                         self.scroll_area, self.move_to_last_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.SelectPreviousChar,
                         self.scroll_area, self.select_prev_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.SelectNextChar,
                         self.scroll_area, self.select_next_thumb)
     QtWidgets.QShortcut(QtGui.QKeySequence.SelectAll, self.scroll_area,
                         self.select_all)
     # sort key selector
     layout.addWidget(QtWidgets.QLabel(self.tr('sort by: ')), 1, 0)
     self.sort_name = QtWidgets.QRadioButton(self.tr('file name'))
     self.sort_name.clicked.connect(self._new_sort_order)
     layout.addWidget(self.sort_name, 1, 1)
     self.sort_date = QtWidgets.QRadioButton(self.tr('date taken'))
     layout.addWidget(self.sort_date, 1, 2)
     self.sort_date.clicked.connect(self._new_sort_order)
     if eval(self.app.config_store.get('controls', 'sort_date', 'False')):
         self.sort_date.setChecked(True)
     else:
         self.sort_name.setChecked(True)
     # size selector
     layout.addWidget(QtWidgets.QLabel(self.tr('thumbnail size: ')), 1, 4)
     self.size_slider = QtWidgets.QSlider(Qt.Horizontal)
     self.size_slider.setTracking(False)
     self.size_slider.setRange(4, 9)
     self.size_slider.setPageStep(1)
     self.size_slider.setValue(self.thumb_size // 20)
     self.size_slider.setTickPosition(QtWidgets.QSlider.TicksBelow)
     width = self.size_slider.sizeHint().width()
     self.size_slider.setMinimumWidth(width * 7 // 4)
     self.size_slider.valueChanged.connect(self._new_thumb_size)
     layout.addWidget(self.size_slider, 1, 5)
示例#2
0
 def __init__(self, *arg, **kw):
     super(LensSpecWidget, self).__init__(*arg, **kw)
     self.setLayout(QtWidgets.QGridLayout())
     self.layout().setContentsMargins(6, 0, 6, 0)
     self.layout().setVerticalSpacing(0)
     for text, col in (self.tr('min'), 1), (self.tr('max'), 2):
         label = QtWidgets.QLabel(text)
         label.setMinimumWidth(50)
         label.setAlignment(Qt.AlignHCenter)
         self.layout().addWidget(label, 0, col)
     self.layout().addWidget(QtWidgets.QLabel(self.tr('Focal length')), 1,
                             0)
     self.layout().addWidget(QtWidgets.QLabel(self.tr('Max aperture')), 2,
                             0)
     self.multiple = QtWidgets.QLabel(multiple_values())
     self.layout().addWidget(self.multiple, 1, 1, 2, 2)
     self.multiple.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
     self.multiple.hide()
     self.values = {
         'min_fl': QtWidgets.QLabel(),
         'max_fl': QtWidgets.QLabel(),
         'min_fl_fn': QtWidgets.QLabel(),
         'max_fl_fn': QtWidgets.QLabel(),
     }
     for key in self.values:
         self.values[key].setAlignment(Qt.AlignHCenter)
     self.layout().addWidget(self.values['min_fl'], 1, 1)
     self.layout().addWidget(self.values['max_fl'], 1, 2)
     self.layout().addWidget(self.values['min_fl_fn'], 2, 1)
     self.layout().addWidget(self.values['max_fl_fn'], 2, 2)
示例#3
0
 def __init__(self, upload_config_widget, image_list, *arg, **kw):
     super(PhotiniUploader, self).__init__(*arg, **kw)
     self.app = QtWidgets.QApplication.instance()
     self.app.aboutToQuit.connect(self.shutdown)
     logger.debug('using %s', keyring.get_keyring().__module__)
     self.image_list = image_list
     self.setLayout(QtWidgets.QGridLayout())
     self.session = self.session_factory()
     self.session.connection_changed.connect(self.connection_changed)
     self.upload_worker = None
     # user details
     self.user = {}
     user_group = QtWidgets.QGroupBox(translate('UploaderTabsAll', 'User'))
     user_group.setLayout(QtWidgets.QVBoxLayout())
     self.user_photo = QtWidgets.QLabel()
     self.user_photo.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
     user_group.layout().addWidget(self.user_photo)
     self.user_name = QtWidgets.QLabel()
     self.user_name.setWordWrap(True)
     self.user_name.setFixedWidth(80)
     user_group.layout().addWidget(self.user_name)
     user_group.layout().addStretch(1)
     self.layout().addWidget(user_group, 0, 0, 1, 2)
     # connect / disconnect button
     self.user_connect = StartStopButton(
         translate('UploaderTabsAll', 'Log in'),
         translate('UploaderTabsAll', 'Log out'))
     self.user_connect.click_start.connect(self.log_in)
     self.user_connect.click_stop.connect(self.session.log_out)
     self.layout().addWidget(self.user_connect, 1, 0, 1, 2)
     # 'service' specific widget
     self.layout().addWidget(upload_config_widget, 0, 2, 2, 2)
     # upload button
     self.upload_button = StartStopButton(
         translate('UploaderTabsAll', 'Start upload'),
         translate('UploaderTabsAll', 'Stop upload'))
     self.upload_button.setEnabled(False)
     self.upload_button.click_start.connect(self.start_upload)
     self.upload_button.click_stop.connect(self.stop_upload)
     self.layout().addWidget(self.upload_button, 2, 3)
     # progress bar
     self.layout().addWidget(
         QtWidgets.QLabel(translate('UploaderTabsAll', 'Progress')), 2, 0)
     self.total_progress = QtWidgets.QProgressBar()
     self.layout().addWidget(self.total_progress, 2, 1, 1, 2)
     # adjust spacing
     self.layout().setColumnStretch(2, 1)
     self.layout().setRowStretch(0, 1)
     # initialise as not connected
     self.connection_changed(False)
示例#4
0
 def __init__(self, path, image_list, thumb_size=80, *arg, **kw):
     super(Image, self).__init__(*arg, **kw)
     self.path = path
     self.image_list = image_list
     self.name, ext = os.path.splitext(os.path.basename(self.path))
     self.selected = False
     self.thumb_size = thumb_size
     # read metadata
     self.metadata = Metadata(self.path)
     self.metadata.unsaved.connect(self.show_status)
     self.file_times = (os.path.getatime(self.path),
                        os.path.getmtime(self.path))
     # set file type
     self.file_type = self.metadata.get_mime_type()
     if not self.file_type:
         self.file_type = mimetypes.guess_type(self.path)[0]
     if not self.file_type:
         self.file_type = imghdr.what(self.path)
         if self.file_type:
             self.file_type = 'image/' + self.file_type
     # anything not recognised is assumed to be 'raw'
     if not self.file_type:
         self.file_type = 'image/raw'
     # sub widgets
     layout = QtWidgets.QGridLayout()
     layout.setSpacing(0)
     layout.setContentsMargins(3, 3, 3, 3)
     self.setLayout(layout)
     self.setToolTip(self.path)
     # label to display image
     self.image = QtWidgets.QLabel()
     self.image.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
     layout.addWidget(self.image, 0, 0, 1, 2)
     # label to display file name
     self.label = QtWidgets.QLabel()
     self.label.setAlignment(Qt.AlignRight)
     scale_font(self.label, 80)
     layout.addWidget(self.label, 1, 1)
     # label to display status
     self.status = QtWidgets.QLabel()
     self.status.setAlignment(Qt.AlignLeft)
     set_symbol_font(self.status)
     scale_font(self.status, 80)
     layout.addWidget(self.status, 1, 0)
     self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Plain)
     self.setObjectName("thumbnail")
     self.set_selected(False)
     self.show_status(False)
     self._set_thumb_size(self.thumb_size)
示例#5
0
 def search_terms(self):
     widget = QtWidgets.QLabel(
         translate('MapTabBing',
                   'Search and altitude lookup\nprovided by Bing'))
     widget.setAlignment(Qt.AlignRight)
     scale_font(widget, 80)
     return [widget]
示例#6
0
 def __init__(self, *args, **kw):
     super(LocationInfo, self).__init__(*args, **kw)
     layout = QtWidgets.QGridLayout()
     self.setLayout(layout)
     layout.setContentsMargins(0, 0, 0, 0)
     self.members = {}
     for key in ('sublocation', 'city', 'province_state', 'country_name',
                 'country_code', 'world_region'):
         self.members[key] = SingleLineEdit()
         self.members[key].editingFinished.connect(self.editing_finished)
     self.members['country_code'].setMaximumWidth(40)
     for j, text in enumerate((
             translate('AddressTab', 'Street'),
             translate('AddressTab', 'City'),
             translate('AddressTab', 'Province'),
             translate('AddressTab', 'Country'),
             translate('AddressTab', 'Region'),
     )):
         label = QtWidgets.QLabel(text)
         label.setAlignment(Qt.AlignRight)
         layout.addWidget(label, j, 0)
     layout.addWidget(self.members['sublocation'], 0, 1, 1, 2)
     layout.addWidget(self.members['city'], 1, 1, 1, 2)
     layout.addWidget(self.members['province_state'], 2, 1, 1, 2)
     layout.addWidget(self.members['country_name'], 3, 1)
     layout.addWidget(self.members['country_code'], 3, 2)
     layout.addWidget(self.members['world_region'], 4, 1, 1, 2)
     layout.setRowStretch(5, 1)
示例#7
0
 def new_set(self):
     dialog = QtWidgets.QDialog(parent=self)
     dialog.setWindowTitle(self.tr('Create new Flickr album'))
     dialog.setLayout(QtWidgets.QFormLayout())
     title = SingleLineEdit(spell_check=True)
     dialog.layout().addRow(self.tr('Title'), title)
     description = MultiLineEdit(spell_check=True)
     dialog.layout().addRow(self.tr('Description'), description)
     dialog.layout().addRow(QtWidgets.QLabel(
         self.tr('Album will be created when photos are uploaded')))
     button_box = QtWidgets.QDialogButtonBox(
         QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
     button_box.accepted.connect(dialog.accept)
     button_box.rejected.connect(dialog.reject)
     dialog.layout().addRow(button_box)
     if dialog.exec_() != QtWidgets.QDialog.Accepted:
         return
     title = title.toPlainText()
     if not title:
         return
     description = description.toPlainText()
     widget = self.upload_config.add_set(title, description, index=0)
     widget.setChecked(True)
     self.photosets.insert(0, {
         'id'          : None,
         'title'       : title,
         'description' : description,
         'widget'      : widget,
         })
示例#8
0
 def search_terms(self):
     widget = QtWidgets.QLabel(
         translate('MapTabGoogle', 'Search and altitude lookup') +
         '\npowered by Google')
     widget.setAlignment(Qt.AlignRight)
     scale_font(widget, 80)
     return [widget]
示例#9
0
 def _replace_dialog(self, image):
     # has image already been uploaded?
     for keyword in image.metadata.keywords or []:
         name_pred, sep, photo_id = keyword.partition('=')
         if name_pred == ID_TAG:
             break
     else:
         # new upload
         return {
             'set_metadata'  : True,
             'set_visibility': True,
             'set_type'      : True,
             'set_albums'    : True,
             'replace_image' : False,
             'new_photo'     : True,
             }, None
     # get user preferences
     dialog = QtWidgets.QDialog(parent=self)
     dialog.setWindowTitle(self.tr('Replace photo'))
     dialog.setLayout(QtWidgets.QVBoxLayout())
     message = QtWidgets.QLabel(self.tr(
         'File {0} has already been uploaded to Flickr.' +
         ' How would you like to update it?').format(
             os.path.basename(image.path)))
     message.setWordWrap(True)
     dialog.layout().addWidget(message)
     widget = {}
     widget['set_metadata'] = QtWidgets.QCheckBox(
         self.tr('Replace metadata'))
     widget['set_visibility'] = QtWidgets.QCheckBox(
         self.tr('Change who can see it'))
     widget['set_type'] = QtWidgets.QCheckBox(
         self.tr('Change content type'))
     widget['set_albums'] = QtWidgets.QCheckBox(
         self.tr('Change album membership'))
     widget['replace_image'] = QtWidgets.QCheckBox(
         self.tr('Replace image'))
     widget['new_photo'] = QtWidgets.QCheckBox(
         self.tr('Upload as new photo'))
     no_upload = QtWidgets.QCheckBox(self.tr('No image upload'))
     no_upload.setChecked(True)
     button_group = QtWidgets.QButtonGroup()
     button_group.addButton(widget['replace_image'])
     button_group.addButton(widget['new_photo'])
     button_group.addButton(no_upload)
     for key in ('set_metadata', 'set_visibility', 'set_type',
                 'set_albums', 'replace_image', 'new_photo'):
         dialog.layout().addWidget(widget[key])
         widget[key].setChecked(self.replace_prefs[key])
     dialog.layout().addWidget(no_upload)
     button_box = QtWidgets.QDialogButtonBox(
         QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
     button_box.accepted.connect(dialog.accept)
     button_box.rejected.connect(dialog.reject)
     dialog.layout().addWidget(button_box)
     if dialog.exec_() != QtWidgets.QDialog.Accepted:
         return None, photo_id
     for key in self.replace_prefs:
         self.replace_prefs[key] = widget[key].isChecked()
     return dict(self.replace_prefs), photo_id
示例#10
0
 def __init__(self, name, *arg, **kw):
     super(DateAndTimeWidget, self).__init__(*arg, **kw)
     self.name = name
     self.setVerticalSpacing(0)
     self.setColumnStretch(3, 1)
     self.members = {}
     # date & time
     self.members['datetime'] = DateTimeEdit()
     self.addWidget(self.members['datetime'], 0, 0, 1, 2)
     # time zone
     self.members['tz_offset'] = TimeZoneWidget()
     self.addWidget(self.members['tz_offset'], 0, 2)
     # precision
     self.addWidget(
         QtWidgets.QLabel(translate('TechnicalTab', 'Precision:')), 1, 0)
     self.members['precision'] = PrecisionSlider(Qt.Horizontal)
     self.members['precision'].setRange(1, 6)
     self.members['precision'].setValue(6)
     self.members['precision'].setPageStep(1)
     self.addWidget(self.members['precision'], 1, 1)
     # connections
     self.members['precision'].value_changed.connect(
         self.members['datetime'].set_precision)
     self.members['datetime'].editingFinished.connect(self.editing_finished)
     self.members['tz_offset'].editingFinished.connect(self.editing_finished)
     self.members['precision'].editing_finished.connect(self.editing_finished)
示例#11
0
 def __init__(self, image_list, *args, **kwds):
     super(LatLongDisplay, self).__init__(*args, **kwds)
     self.image_list = image_list
     self.label = QtWidgets.QLabel(translate('MapTabsAll', 'Lat, long'))
     self.label.setAlignment(Qt.AlignRight)
     self.setFixedWidth(width_for_text(self, '8' * 23))
     self.setEnabled(False)
     self.editingFinished.connect(self.editing_finished)
示例#12
0
 def __init__(self, *args, **kw):
     super(LocationInfo, self).__init__(*args, **kw)
     layout = QtWidgets.QGridLayout()
     self.setLayout(layout)
     layout.setContentsMargins(0, 0, 0, 0)
     self.members = {
         'taken': LocationWidgets(self),
         'shown': LocationWidgets(self)
     }
     self.swap = SquareButton(six.unichr(0x21c4))
     self.swap.setStyleSheet('QPushButton { font-size: 10px }')
     set_symbol_font(self.swap)
     layout.addWidget(self.swap, 0, 4)
     label = QtWidgets.QLabel(translate('PhotiniMap', 'camera'))
     layout.addWidget(label, 0, 1, 1, 2)
     label = QtWidgets.QLabel(translate('PhotiniMap', 'subject'))
     layout.addWidget(label, 0, 3)
     layout.addWidget(QtWidgets.QLabel(translate('PhotiniMap', 'Street:')),
                      1, 0)
     layout.addWidget(QtWidgets.QLabel(translate('PhotiniMap', 'City:')), 2,
                      0)
     layout.addWidget(
         QtWidgets.QLabel(translate('PhotiniMap', 'Province:')), 3, 0)
     layout.addWidget(QtWidgets.QLabel(translate('PhotiniMap', 'Country:')),
                      4, 0)
     layout.addWidget(QtWidgets.QLabel(translate('PhotiniMap', 'Region:')),
                      5, 0)
     for ts, col in (('taken', 1), ('shown', 3)):
         layout.addWidget(self.members[ts]['sublocation'], 1, col, 1, 2)
         layout.addWidget(self.members[ts]['city'], 2, col, 1, 2)
         layout.addWidget(self.members[ts]['province_state'], 3, col, 1, 2)
         layout.addWidget(self.members[ts]['country_name'], 4, col)
         layout.addWidget(self.members[ts]['country_code'], 4, col + 1)
         layout.addWidget(self.members[ts]['world_region'], 5, col, 1, 2)
示例#13
0
 def __init__(self, upload_config_widget, image_list, *arg, **kw):
     super(PhotiniUploader, self).__init__(*arg, **kw)
     QtWidgets.QApplication.instance().aboutToQuit.connect(self.shutdown)
     self.logger = logging.getLogger(self.__class__.__name__)
     self.image_list = image_list
     self.setLayout(QtWidgets.QGridLayout())
     self.session = self.session_factory()
     self.upload_worker = None
     self.connected = False
     # user details
     self.user = {}
     user_group = QtWidgets.QGroupBox(self.tr('User'))
     user_group.setLayout(QtWidgets.QVBoxLayout())
     self.user_photo = QtWidgets.QLabel()
     self.user_photo.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
     user_group.layout().addWidget(self.user_photo)
     self.user_name = QtWidgets.QLabel()
     self.user_name.setWordWrap(True)
     self.user_name.setFixedWidth(80)
     user_group.layout().addWidget(self.user_name)
     user_group.layout().addStretch(1)
     self.layout().addWidget(user_group, 0, 0, 1, 2)
     # connect / disconnect button
     self.user_connect = QtWidgets.QPushButton()
     self.user_connect.setCheckable(True)
     self.user_connect.clicked.connect(self.connect_user)
     self.layout().addWidget(self.user_connect, 1, 0, 1, 2)
     # 'service' specific widget
     self.layout().addWidget(upload_config_widget, 0, 2, 2, 2)
     # upload button
     self.upload_button = StartStopButton(self.tr('Start upload'),
                                          self.tr('Stop upload'))
     self.upload_button.setEnabled(False)
     self.upload_button.click_start.connect(self.start_upload)
     self.upload_button.click_stop.connect(self.stop_upload)
     self.layout().addWidget(self.upload_button, 2, 3)
     # progress bar
     self.layout().addWidget(QtWidgets.QLabel(self.tr('Progress')), 2, 0)
     self.total_progress = QtWidgets.QProgressBar()
     self.layout().addWidget(self.total_progress, 2, 1, 1, 2)
     # adjust spacing
     self.layout().setColumnStretch(2, 1)
     self.layout().setRowStretch(0, 1)
示例#14
0
 def __init__(self, path, image_list, thumb_size=80, *arg, **kw):
     super(Image, self).__init__(*arg, **kw)
     self.app = QtWidgets.QApplication.instance()
     self.path = path
     self.image_list = image_list
     self.name, ext = os.path.splitext(os.path.basename(self.path))
     self.selected = False
     self.thumb_size = thumb_size
     # read metadata
     self.metadata = Metadata(self.path,
                              notify=self.show_status,
                              utf_safe=self.app.options.utf_safe)
     self.file_times = (os.path.getatime(self.path),
                        os.path.getmtime(self.path))
     # set file type
     self.file_type = self.metadata.mime_type
     # sub widgets
     layout = QtWidgets.QGridLayout()
     layout.setSpacing(0)
     layout.setContentsMargins(3, 3, 3, 3)
     self.setLayout(layout)
     self.setToolTip(self.path)
     # label to display image
     self.image = QtWidgets.QLabel()
     self.image.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
     layout.addWidget(self.image, 0, 0, 1, 2)
     # label to display file name
     self.label = QtWidgets.QLabel()
     self.label.setAlignment(Qt.AlignRight)
     scale_font(self.label, 80)
     layout.addWidget(self.label, 1, 1)
     # label to display status
     self.status = QtWidgets.QLabel()
     self.status.setAlignment(Qt.AlignLeft)
     set_symbol_font(self.status)
     scale_font(self.status, 80)
     layout.addWidget(self.status, 1, 0)
     self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Plain)
     self.setObjectName("thumbnail")
     self.set_selected(False)
     self.show_status(False)
     self._set_thumb_size(self.thumb_size)
示例#15
0
 def show_terms(self):
     # return widget to display map terms and conditions
     layout = QtWidgets.QVBoxLayout()
     widget = QtWidgets.QLabel(self.tr('Search powered by Google'))
     widget.setStyleSheet('QLabel { font-size: 10px }')
     layout.addWidget(widget)
     widget = QtWidgets.QPushButton(self.tr('Terms of Use'))
     widget.clicked.connect(self.load_tou)
     widget.setStyleSheet('QPushButton { font-size: 10px }')
     layout.addWidget(widget)
     return layout
示例#16
0
 def __init__(self, *args, **kw):
     super(LocationInfo, self).__init__(*args, **kw)
     layout = QtWidgets.QGridLayout()
     self.setLayout(layout)
     layout.setContentsMargins(0, 0, 0, 0)
     self.members = {}
     for key in ('SubLocation', 'City', 'ProvinceState', 'CountryName',
                 'CountryCode', 'WorldRegion'):
         self.members[key] = SingleLineEdit(
             length_check=ImageMetadata.max_bytes(key))
         self.members[key].editingFinished.connect(self.editing_finished)
     self.members['CountryCode'].setMaximumWidth(
         width_for_text(self.members['CountryCode'], 'W' * 4))
     self.members['SubLocation'].setToolTip(
         translate('AddressTab', 'Enter the name of the sublocation.'))
     self.members['City'].setToolTip(
         translate('AddressTab', 'Enter the name of the city.'))
     self.members['ProvinceState'].setToolTip(
         translate('AddressTab',
                   'Enter the name of the province or state.'))
     self.members['CountryName'].setToolTip(
         translate('AddressTab', 'Enter the name of the country.'))
     self.members['CountryCode'].setToolTip(
         translate(
             'AddressTab',
             'Enter the 2 or 3 letter ISO 3166 country code of the country.'
         ))
     self.members['WorldRegion'].setToolTip(
         translate('AddressTab', 'Enter the name of the world region.'))
     for j, text in enumerate((
             translate('AddressTab', 'Street'),
             translate('AddressTab', 'City'),
             translate('AddressTab', 'Province'),
             translate('AddressTab', 'Country'),
             translate('AddressTab', 'Region'),
     )):
         label = QtWidgets.QLabel(text)
         label.setAlignment(Qt.AlignRight)
         layout.addWidget(label, j, 0)
     layout.addWidget(self.members['SubLocation'], 0, 1, 1, 2)
     layout.addWidget(self.members['City'], 1, 1, 1, 2)
     layout.addWidget(self.members['ProvinceState'], 2, 1, 1, 2)
     layout.addWidget(self.members['CountryName'], 3, 1)
     layout.addWidget(self.members['CountryCode'], 3, 2)
     layout.addWidget(self.members['WorldRegion'], 4, 1, 1, 2)
     layout.setRowStretch(5, 1)
示例#17
0
 def __init__(self, *arg, **kw):
     super(DateAndTimeWidget, self).__init__(*arg, **kw)
     self.setContentsMargins(0, 0, 0, 0)
     self.setColumnStretch(3, 1)
     # date & time
     self.datetime = DateTimeEdit()
     self.datetime.setCalendarPopup(True)
     self.addWidget(self.datetime, 0, 0, 1, 2)
     # time zone
     self.time_zone = TimeZoneWidget()
     self.addWidget(self.time_zone, 0, 2)
     # precision
     self.addWidget(QtWidgets.QLabel(self.tr('Precision:')), 1, 0)
     self.precision = Slider(Qt.Horizontal)
     self.precision.setRange(0, 7)
     self.precision.setPageStep(1)
     self.addWidget(self.precision, 1, 1)
     # connections
     self.datetime.editingFinished.connect(self.new_datetime)
     self.time_zone.editingFinished.connect(self.new_time_zone)
     self.precision.valueChanged.connect(self.datetime.set_precision)
     self.precision.editing_finished.connect(self.new_precision)
示例#18
0
 def _find_local(self, photo, unknowns):
     granularity = int(photo['datetakengranularity'])
     min_taken_date = datetime.strptime(
         photo['datetaken'], '%Y-%m-%d %H:%M:%S')
     if granularity <= 0:
         max_taken_date = min_taken_date + timedelta(seconds=1)
     elif granularity <= 4:
         max_taken_date = min_taken_date + timedelta(days=31)
     else:
         max_taken_date = min_taken_date + timedelta(days=366)
     candidates = []
     for candidate in unknowns:
         if not candidate.metadata.date_taken:
             continue
         date_taken = candidate.metadata.date_taken['datetime']
         if date_taken < min_taken_date or date_taken > max_taken_date:
             continue
         candidates.append(candidate)
     if not candidates:
         return None
     rsp = requests.get(photo['url_t'])
     if rsp.status_code == 200:
         flickr_icon = rsp.content
     else:
         logger.error('HTTP error %d (%s)', rsp.status_code, photo['url_t'])
         return None
     # get user to choose matching image file
     dialog = QtWidgets.QDialog(parent=self)
     dialog.setWindowTitle(translate('FlickrTab', 'Select an image'))
     dialog.setLayout(QtWidgets.QFormLayout())
     dialog.layout().setFieldGrowthPolicy(
         QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     pixmap = QtGui.QPixmap()
     pixmap.loadFromData(flickr_icon)
     label = QtWidgets.QLabel()
     label.setPixmap(pixmap)
     dialog.layout().addRow(label, QtWidgets.QLabel(translate(
         'FlickrTab', 'Which image file matches\nthis picture on Flickr?')))
     divider = QtWidgets.QFrame()
     divider.setFrameStyle(QtWidgets.QFrame.HLine)
     dialog.layout().addRow(divider)
     buttons = {}
     for candidate in candidates:
         label = QtWidgets.QLabel()
         pixmap = candidate.image.pixmap()
         if pixmap:
             label.setPixmap(pixmap)
         else:
             label.setText(candidate.image.text())
         button = QtWidgets.QPushButton(
             os.path.basename(candidate.path))
         button.setToolTip(candidate.path)
         button.setCheckable(True)
         button.clicked.connect(dialog.accept)
         dialog.layout().addRow(label, button)
         buttons[button] = candidate
     button = QtWidgets.QPushButton(translate('FlickrTab', 'No match'))
     button.setDefault(True)
     button.clicked.connect(dialog.reject)
     dialog.layout().addRow('', button)
     if dialog.exec_() == QtWidgets.QDialog.Accepted:
         for button, candidate in buttons.items():
             if button.isChecked():
                 return candidate
     return None
示例#19
0
 def __init__(self, image_list, parent=None):
     super(TabWidget, self).__init__(parent)
     app = QtWidgets.QApplication.instance()
     app.aboutToQuit.connect(self.shutdown)
     if gp and app.test_mode:
         self.gp_log = gp.check_result(gp.use_python_logging())
     self.config_store = app.config_store
     self.image_list = image_list
     self.setLayout(QtWidgets.QGridLayout())
     form = QtWidgets.QFormLayout()
     form.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     self.nm = NameMangler()
     self.file_data = {}
     self.file_list = []
     self.source = None
     self.file_copier = None
     # source selector
     box = QtWidgets.QHBoxLayout()
     box.setContentsMargins(0, 0, 0, 0)
     self.source_selector = QtWidgets.QComboBox()
     self.source_selector.currentIndexChanged.connect(self.new_source)
     box.addWidget(self.source_selector)
     refresh_button = QtWidgets.QPushButton(self.tr('refresh'))
     refresh_button.clicked.connect(self.refresh)
     box.addWidget(refresh_button)
     box.setStretch(0, 1)
     form.addRow(self.tr('Source'), box)
     # path format
     self.path_format = QtWidgets.QLineEdit()
     self.path_format.setValidator(PathFormatValidator())
     self.path_format.textChanged.connect(self.nm.new_format)
     self.path_format.editingFinished.connect(self.path_format_finished)
     form.addRow(self.tr('Target format'), self.path_format)
     # path example
     self.path_example = QtWidgets.QLabel()
     self.nm.new_example.connect(self.path_example.setText)
     form.addRow('=>', self.path_example)
     self.layout().addLayout(form, 0, 0)
     # file list
     self.file_list_widget = QtWidgets.QListWidget()
     self.file_list_widget.setSelectionMode(
         QtWidgets.QAbstractItemView.ExtendedSelection)
     self.file_list_widget.itemSelectionChanged.connect(
         self.selection_changed)
     self.layout().addWidget(self.file_list_widget, 1, 0)
     # selection buttons
     buttons = QtWidgets.QVBoxLayout()
     buttons.addStretch(1)
     self.selected_count = QtWidgets.QLabel()
     buttons.addWidget(self.selected_count)
     select_all = QtWidgets.QPushButton(self.tr('Select\nall'))
     select_all.clicked.connect(self.select_all)
     buttons.addWidget(select_all)
     select_new = QtWidgets.QPushButton(self.tr('Select\nnew'))
     select_new.clicked.connect(self.select_new)
     buttons.addWidget(select_new)
     # copy buttons
     self.move_button = StartStopButton(self.tr('Move\nphotos'),
                                        self.tr('Stop\nmove'))
     self.move_button.click_start.connect(self.move_selected)
     self.move_button.click_stop.connect(self.stop_copy)
     buttons.addWidget(self.move_button)
     self.copy_button = StartStopButton(self.tr('Copy\nphotos'),
                                        self.tr('Stop\ncopy'))
     self.copy_button.click_start.connect(self.copy_selected)
     self.copy_button.click_stop.connect(self.stop_copy)
     buttons.addWidget(self.copy_button)
     self.layout().addLayout(buttons, 0, 1, 2, 1)
     self.selection_changed()
     # final initialisation
     self.image_list.sort_order_changed.connect(self.sort_file_list)
     if qt_version_info >= (5, 0):
         path = QtCore.QStandardPaths.writableLocation(
             QtCore.QStandardPaths.PicturesLocation)
     else:
         path = QtGui.QDesktopServices.storageLocation(
             QtGui.QDesktopServices.PicturesLocation)
     self.path_format.setText(os.path.join(path, '%Y', '%Y_%m_%d',
                                           '{name}'))
     self.refresh()
     self.list_files()
示例#20
0
 def search_terms(self):
     widget = QtWidgets.QLabel(self.tr('Search powered by Google'))
     scale_font(widget, 80)
     return '', widget
示例#21
0
 def __init__(self, image_list, parent=None):
     super(TabWidget, self).__init__(parent)
     app = QtWidgets.QApplication.instance()
     app.aboutToQuit.connect(self.shutdown)
     if gp and app.test_mode:
         self.gp_log = gp.check_result(gp.use_python_logging())
     self.config_store = app.config_store
     self.image_list = image_list
     self.setLayout(QtWidgets.QGridLayout())
     form = QtWidgets.QFormLayout()
     form.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     self.nm = NameMangler()
     self.file_data = {}
     self.file_list = []
     self.source = None
     self.file_reader = None
     self.file_writer = None
     # source selector
     box = QtWidgets.QHBoxLayout()
     box.setContentsMargins(0, 0, 0, 0)
     self.source_selector = QtWidgets.QComboBox()
     self.source_selector.currentIndexChanged.connect(self.new_source)
     box.addWidget(self.source_selector)
     refresh_button = QtWidgets.QPushButton(self.tr('refresh'))
     refresh_button.clicked.connect(self.refresh)
     box.addWidget(refresh_button)
     box.setStretch(0, 1)
     form.addRow(self.tr('Source'), box)
     # path format
     self.path_format = QtWidgets.QLineEdit()
     self.path_format.setValidator(PathFormatValidator())
     self.path_format.textChanged.connect(self.nm.new_format)
     self.path_format.editingFinished.connect(self.path_format_finished)
     form.addRow(self.tr('Target format'), self.path_format)
     # path example
     self.path_example = QtWidgets.QLabel()
     self.nm.new_example.connect(self.path_example.setText)
     form.addRow('=>', self.path_example)
     self.layout().addLayout(form, 0, 0)
     # file list
     self.file_list_widget = QtWidgets.QListWidget()
     self.file_list_widget.setSelectionMode(
         QtWidgets.QAbstractItemView.ExtendedSelection)
     self.file_list_widget.itemSelectionChanged.connect(self.selection_changed)
     self.layout().addWidget(self.file_list_widget, 1, 0)
     # selection buttons
     buttons = QtWidgets.QVBoxLayout()
     buttons.addStretch(1)
     self.selected_count = QtWidgets.QLabel()
     self.selection_changed()
     buttons.addWidget(self.selected_count)
     select_all = QtWidgets.QPushButton(self.tr('Select\nall'))
     select_all.clicked.connect(self.select_all)
     buttons.addWidget(select_all)
     select_new = QtWidgets.QPushButton(self.tr('Select\nnew'))
     select_new.clicked.connect(self.select_new)
     buttons.addWidget(select_new)
     self.copy_button = StartStopButton(self.tr('Copy\nphotos'),
                                        self.tr('Stop\nimport'))
     self.copy_button.click_start.connect(self.copy_selected)
     self.copy_button.click_stop.connect(self.stop_copy)
     buttons.addWidget(self.copy_button)
     self.layout().addLayout(buttons, 0, 1, 2, 1)
     # final initialisation
     self.image_list.sort_order_changed.connect(self.sort_file_list)
     path = os.path.expanduser('~/Pictures')
     if not os.path.isdir(path) and sys.platform == 'win32':
         try:
             import win32com.shell as ws
             path = ws.shell.SHGetFolderPath(
                 0, ws.shellcon.CSIDL_MYPICTURES, None, 0)
         except ImportError:
             pass
     self.path_format.setText(
         os.path.join(path, '%Y', '%Y_%m_%d', '{name}'))
     self.refresh()
     self.list_files()
示例#22
0
 def __init__(self, image_list, parent=None):
     super(PhotiniMap, self).__init__(parent)
     self.logger = logging.getLogger(self.__class__.__name__)
     self.app = QtWidgets.QApplication.instance()
     self.config_store = self.app.config_store
     self.image_list = image_list
     self.script_dir = pkg_resources.resource_filename(
         'photini', 'data/' + self.__class__.__name__.lower() + '/')
     self.drag_icon = QtGui.QPixmap(
         os.path.join(self.script_dir, 'grey_marker.png'))
     self.search_string = None
     self.map_loaded = False
     self.marker_images = {}
     self.map_status = {}
     self.setChildrenCollapsible(False)
     left_side = QtWidgets.QWidget()
     self.addWidget(left_side)
     self.grid = QtWidgets.QGridLayout()
     self.grid.setContentsMargins(0, 0, 0, 0)
     self.grid.setRowStretch(6, 1)
     self.grid.setColumnStretch(1, 1)
     left_side.setLayout(self.grid)
     # map
     self.map = WebView()
     self.map.setPage(WebPage(parent=self.map))
     if QtWebEngineWidgets:
         self.web_channel = QtWebChannel.QWebChannel()
         self.map.page().setWebChannel(self.web_channel)
         self.web_channel.registerObject('python', self)
     else:
         self.map.page().setLinkDelegationPolicy(
             QtWebKitWidgets.QWebPage.DelegateAllLinks)
         self.map.page().linkClicked.connect(self.link_clicked)
         self.map.page().mainFrame().javaScriptWindowObjectCleared.connect(
             self.java_script_window_object_cleared)
     self.map.setAcceptDrops(False)
     self.map.drop_text.connect(self.drop_text)
     self.addWidget(self.map)
     # search
     self.grid.addWidget(
         QtWidgets.QLabel(translate('PhotiniMap', 'Search:')), 0, 0)
     self.edit_box = QtWidgets.QComboBox()
     self.edit_box.setMinimumWidth(200)
     self.edit_box.setEditable(True)
     self.edit_box.setInsertPolicy(QtWidgets.QComboBox.NoInsert)
     self.edit_box.lineEdit().setPlaceholderText(
         translate('PhotiniMap', '<new search>'))
     self.edit_box.lineEdit().returnPressed.connect(self.search)
     self.edit_box.activated.connect(self.goto_search_result)
     self.clear_search()
     self.edit_box.setEnabled(False)
     self.grid.addWidget(self.edit_box, 0, 1)
     # latitude & longitude
     self.grid.addWidget(
         QtWidgets.QLabel(translate('PhotiniMap', 'Lat, long:')), 1, 0)
     self.coords = SingleLineEdit()
     self.coords.editingFinished.connect(self.new_coords)
     self.coords.setEnabled(False)
     self.grid.addWidget(self.coords, 1, 1)
     # convert lat/lng to location info
     self.auto_location = QtWidgets.QPushButton(
         translate('PhotiniMap', 'Lat, long -> location'))
     self.auto_location.setEnabled(False)
     self.auto_location.clicked.connect(self.get_address)
     self.grid.addWidget(self.auto_location, 2, 1)
     # location info
     self.location_info = LocationInfo()
     self.location_info['taken'].new_value.connect(self.new_location_taken)
     self.location_info['shown'].new_value.connect(self.new_location_shown)
     self.location_info.swap.clicked.connect(self.swap_locations)
     self.location_info.setEnabled(False)
     self.grid.addWidget(self.location_info, 3, 0, 1, 2)
     # load map button
     self.load_map = QtWidgets.QPushButton(
         translate('PhotiniMap', '\nLoad map\n'))
     self.load_map.clicked.connect(self.initialise)
     self.grid.addWidget(self.load_map, 7, 0, 1, 2)
     # other init
     self.image_list.image_list_changed.connect(self.image_list_changed)
     self.splitterMoved.connect(self.new_split)
示例#23
0
 def __init__(self, image_list, parent=None):
     super(TabWidget, self).__init__(parent)
     self.app = QtWidgets.QApplication.instance()
     self.app.aboutToQuit.connect(self.stop_copy)
     if gp and self.app.options.test:
         self.gp_log = gp.check_result(gp.use_python_logging())
     self.config_store = self.app.config_store
     self.image_list = image_list
     self.setLayout(QtWidgets.QGridLayout())
     form = QtWidgets.QFormLayout()
     form.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     self.nm = NameMangler()
     self.file_data = {}
     self.file_list = []
     self.source = None
     self.file_copier = None
     self.updating = QtCore.QMutex()
     # source selector
     box = QtWidgets.QHBoxLayout()
     box.setContentsMargins(0, 0, 0, 0)
     self.source_selector = QtWidgets.QComboBox()
     self.source_selector.currentIndexChanged.connect(self.new_source)
     self.source_selector.setContextMenuPolicy(Qt.CustomContextMenu)
     self.source_selector.customContextMenuRequested.connect(
         self.remove_folder)
     box.addWidget(self.source_selector)
     refresh_button = QtWidgets.QPushButton(
         translate('ImporterTab', 'refresh'))
     refresh_button.clicked.connect(self.refresh)
     box.addWidget(refresh_button)
     box.setStretch(0, 1)
     form.addRow(translate('ImporterTab', 'Source'), box)
     # update config
     self.config_store.delete('importer', 'folders')
     for section in self.config_store.config.sections():
         if not section.startswith('importer'):
             continue
         path_format = self.config_store.get(section, 'path_format')
         if not (path_format and '(' in path_format):
             continue
         path_format = path_format.replace('(', '{').replace(')', '}')
         self.config_store.set(section, 'path_format', path_format)
     # path format
     self.path_format = QtWidgets.QLineEdit()
     self.path_format.setValidator(PathFormatValidator())
     self.path_format.textChanged.connect(self.nm.new_format)
     self.path_format.editingFinished.connect(self.path_format_finished)
     form.addRow(translate('ImporterTab', 'Target format'),
                 self.path_format)
     # path example
     self.path_example = QtWidgets.QLabel()
     self.nm.new_example.connect(self.path_example.setText)
     form.addRow('=>', self.path_example)
     self.layout().addLayout(form, 0, 0)
     # file list
     self.file_list_widget = QtWidgets.QListWidget()
     self.file_list_widget.setSelectionMode(
         QtWidgets.QAbstractItemView.ExtendedSelection)
     self.file_list_widget.itemSelectionChanged.connect(
         self.selection_changed)
     self.layout().addWidget(self.file_list_widget, 1, 0)
     # selection buttons
     buttons = QtWidgets.QVBoxLayout()
     buttons.addStretch(1)
     self.selected_count = QtWidgets.QLabel()
     buttons.addWidget(self.selected_count)
     select_all = QtWidgets.QPushButton(
         translate('ImporterTab', 'Select\nall'))
     select_all.clicked.connect(self.select_all)
     buttons.addWidget(select_all)
     select_new = QtWidgets.QPushButton(
         translate('ImporterTab', 'Select\nnew'))
     select_new.clicked.connect(self.select_new)
     buttons.addWidget(select_new)
     # copy buttons
     self.move_button = StartStopButton(
         translate('ImporterTab', 'Move\nphotos'),
         translate('ImporterTab', 'Stop\nmove'))
     self.move_button.click_start.connect(self.move_selected)
     self.move_button.click_stop.connect(self.stop_copy)
     buttons.addWidget(self.move_button)
     self.copy_button = StartStopButton(
         translate('ImporterTab', 'Copy\nphotos'),
         translate('ImporterTab', 'Stop\ncopy'))
     self.copy_button.click_start.connect(self.copy_selected)
     self.copy_button.click_stop.connect(self.stop_copy)
     buttons.addWidget(self.copy_button)
     self.layout().addLayout(buttons, 0, 1, 2, 1)
     self.selection_changed()
     # final initialisation
     self.image_list.sort_order_changed.connect(self.sort_file_list)
     path = QtCore.QStandardPaths.writableLocation(
         QtCore.QStandardPaths.PicturesLocation)
     self.path_format.setText(os.path.join(path, '%Y', '%Y_%m_%d',
                                           '{name}'))
示例#24
0
 def __init__(self, *arg, **kw):
     super(FacebookUploadConfig, self).__init__(*arg, **kw)
     self.setLayout(QtWidgets.QHBoxLayout())
     self.layout().setContentsMargins(0, 0, 0, 0)
     self.widgets = {}
     ## upload config
     config_group = QtWidgets.QGroupBox(self.tr('Options'))
     config_group.setLayout(QtWidgets.QFormLayout())
     self.layout().addWidget(config_group)
     # suppress feed story
     self.widgets['no_story'] = QtWidgets.QCheckBox()
     config_group.layout().addRow(self.tr('Suppress news feed story'),
                                  self.widgets['no_story'])
     label = config_group.layout().labelForField(self.widgets['no_story'])
     label.setWordWrap(True)
     label.setFixedWidth(90)
     # geotagging
     self.widgets['geo_tag'] = QtWidgets.QCheckBox()
     config_group.layout().addRow(
         self.tr('Set "city" from map coordinates'),
         self.widgets['geo_tag'])
     self.widgets['geo_tag'].setChecked(True)
     label = config_group.layout().labelForField(self.widgets['geo_tag'])
     label.setWordWrap(True)
     label.setFixedWidth(90)
     # optimise
     self.widgets['optimise'] = QtWidgets.QCheckBox()
     config_group.layout().addRow(self.tr('Optimise image size'),
                                  self.widgets['optimise'])
     label = config_group.layout().labelForField(self.widgets['optimise'])
     label.setWordWrap(True)
     label.setFixedWidth(90)
     if PIL:
         self.widgets['optimise'].setChecked(True)
     else:
         self.widgets['optimise'].setEnabled(False)
         label.setEnabled(False)
     ## album details
     album_group = QtWidgets.QGroupBox(self.tr('Album'))
     album_group.setLayout(QtWidgets.QHBoxLayout())
     # left hand side
     album_form_left = QtWidgets.QFormLayout()
     album_form_left.setFieldGrowthPolicy(
         QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     album_group.layout().addLayout(album_form_left)
     # album title / selector
     self.widgets['album_choose'] = QtWidgets.QComboBox()
     self.widgets['album_choose'].activated.connect(self.select_album)
     album_form_left.addRow(self.tr('Title'), self.widgets['album_choose'])
     # album description
     self.widgets['album_description'] = QtWidgets.QPlainTextEdit()
     self.widgets['album_description'].setReadOnly(True)
     policy = self.widgets['album_description'].sizePolicy()
     policy.setVerticalStretch(1)
     self.widgets['album_description'].setSizePolicy(policy)
     album_form_left.addRow(self.tr('Description'),
                            self.widgets['album_description'])
     # album location
     self.widgets['album_location'] = QtWidgets.QLineEdit()
     self.widgets['album_location'].setReadOnly(True)
     album_form_left.addRow(self.tr('Location'),
                            self.widgets['album_location'])
     # right hand side
     album_form_right = QtWidgets.QVBoxLayout()
     album_group.layout().addLayout(album_form_right)
     # album thumbnail
     self.widgets['album_thumb'] = QtWidgets.QLabel()
     self.widgets['album_thumb'].setFixedSize(150, 150)
     self.widgets['album_thumb'].setAlignment(Qt.AlignHCenter | Qt.AlignTop)
     album_form_right.addWidget(self.widgets['album_thumb'])
     album_form_right.addStretch(1)
     # new album
     new_album_button = QtWidgets.QPushButton(self.tr('New album'))
     new_album_button.clicked.connect(self.new_album)
     album_form_right.addWidget(new_album_button)
     self.layout().addWidget(album_group, stretch=1)
示例#25
0
 def __init__(self, *arg, **kw):
     super(PicasaUploadConfig, self).__init__(*arg, **kw)
     self.setLayout(QtWidgets.QHBoxLayout())
     self.layout().setContentsMargins(0, 0, 0, 0)
     self.widgets = {}
     ## album details, left hand side
     album_group = QtWidgets.QGroupBox(self.tr('Collection / Album'))
     album_group.setLayout(QtWidgets.QHBoxLayout())
     album_form_left = QtWidgets.QFormLayout()
     album_form_left.setFieldGrowthPolicy(
         QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     album_group.layout().addLayout(album_form_left)
     # album title / selector
     self.albums = QtWidgets.QComboBox()
     self.albums.setEditable(True)
     self.albums.setInsertPolicy(QtWidgets.QComboBox.NoInsert)
     self.albums.activated.connect(self.switch_album)
     self.albums.lineEdit().editingFinished.connect(self.new_title)
     album_form_left.addRow(self.tr('Title'), self.albums)
     # album description
     self.widgets['description'] = MultiLineEdit(spell_check=True)
     self.widgets['description'].editingFinished.connect(
         self.new_album_details)
     album_form_left.addRow(self.tr('Description'),
                            self.widgets['description'])
     # album location
     self.widgets['location'] = QtWidgets.QLineEdit()
     self.widgets['location'].editingFinished.connect(
         self.new_album_details)
     album_form_left.addRow(self.tr('Place taken'),
                            self.widgets['location'])
     # album visibility
     self.widgets['access'] = QtWidgets.QComboBox()
     self.widgets['access'].addItem(self.tr('Public on the web'), 'public')
     self.widgets['access'].addItem(
         self.tr('Limited, anyone with the link'), 'private')
     self.widgets['access'].addItem(self.tr('Only you'), 'protected')
     self.widgets['access'].currentIndexChanged.connect(self.new_access)
     album_form_left.addRow(self.tr('Visibility'), self.widgets['access'])
     ## album buttons
     buttons = QtWidgets.QHBoxLayout()
     buttons.addStretch(stretch=60)
     album_form_left.addRow(buttons)
     # new album
     new_album_button = QtWidgets.QPushButton(self.tr('New album'))
     new_album_button.clicked.connect(self.new_album)
     buttons.addWidget(new_album_button, stretch=20)
     # delete album
     delete_album_button = QtWidgets.QPushButton(self.tr('Delete album'))
     delete_album_button.clicked.connect(self.delete_album)
     buttons.addWidget(delete_album_button, stretch=20)
     ## album details, right hand side
     album_form_right = QtWidgets.QFormLayout()
     album_form_right.setFieldGrowthPolicy(
         QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
     album_group.layout().addLayout(album_form_right)
     # album date
     self.widgets['timestamp'] = QtWidgets.QDateEdit()
     self.widgets['timestamp'].setMinimumDateTime(
         QtCore.QDateTime.fromTime_t(0))
     self.widgets['timestamp'].setCalendarPopup(True)
     self.widgets['timestamp'].editingFinished.connect(
         self.new_album_details)
     album_form_right.addRow(self.tr('Date'), self.widgets['timestamp'])
     # album thumbnail
     self.album_thumb = QtWidgets.QLabel()
     self.album_thumb.setFixedWidth(160)
     album_form_right.addRow(self.album_thumb)
     self.layout().addWidget(album_group)
示例#26
0
 def show_terms(self):
     # return widgets to display map terms and conditions
     yield QtWidgets.QLabel(self.tr('Search powered by Google'))
     load_tou = QtWidgets.QPushButton(self.tr('Terms of Use'))
     load_tou.clicked.connect(self.load_tou)
     yield load_tou
示例#27
0
 def __init__(self, image_list, parent=None):
     super(PhotiniMap, self).__init__(parent)
     self.logger = logging.getLogger(self.__class__.__name__)
     self.app = QtWidgets.QApplication.instance()
     self.config_store = self.app.config_store
     self.image_list = image_list
     self.multiple_values = multiple_values()
     self.script_dir = pkg_resources.resource_filename(
         'photini', 'data/' + self.__class__.__name__.lower() + '/')
     self.drag_icon = QtGui.QPixmap(
         os.path.join(self.script_dir, 'grey_marker.png'))
     self.location = {}
     self.search_string = None
     self.map_loaded = False
     self.marker_images = {}
     layout = QtWidgets.QGridLayout()
     layout.setContentsMargins(0, 0, 0, 0)
     layout.setRowStretch(6, 1)
     layout.setColumnStretch(1, 1)
     self.setLayout(layout)
     # map
     self.map = WebView()
     self.map.setPage(WebPage(parent=self.map))
     self.map.setAcceptDrops(False)
     self.map.page().setLinkDelegationPolicy(
         QtWebKitWidgets.QWebPage.DelegateAllLinks)
     self.map.page().linkClicked.connect(self.link_clicked)
     self.map.page().loadFinished.connect(self.load_finished)
     self.map.page().mainFrame().javaScriptWindowObjectCleared.connect(
         self.java_script_window_object_cleared)
     self.map.drop_text.connect(self.drop_text)
     self.layout().addWidget(self.map, 0, 1, 8, 1)
     # search
     self.layout().addWidget(
         QtWidgets.QLabel(translate('PhotiniMap', 'Search:')), 0, 0)
     self.edit_box = QtWidgets.QComboBox()
     self.edit_box.setMinimumWidth(200)
     self.edit_box.setEditable(True)
     self.edit_box.setInsertPolicy(QtWidgets.QComboBox.NoInsert)
     self.edit_box.lineEdit().setPlaceholderText(
         translate('PhotiniMap', '<new search>'))
     self.edit_box.lineEdit().returnPressed.connect(self.search)
     self.edit_box.activated.connect(self.goto_search_result)
     self.clear_search()
     self.edit_box.setEnabled(False)
     self.layout().addWidget(self.edit_box, 1, 0)
     # latitude & longitude
     self.layout().addWidget(
         QtWidgets.QLabel(translate('PhotiniMap', 'Latitude, longitude:')),
         2, 0)
     self.coords = QtWidgets.QLineEdit()
     self.coords.editingFinished.connect(self.new_coords)
     self.coords.setEnabled(False)
     self.layout().addWidget(self.coords, 3, 0)
     # load map button
     self.load_map = QtWidgets.QPushButton(
         translate('PhotiniMap', '\nLoad map\n'))
     self.load_map.clicked.connect(self.initialise)
     self.layout().addWidget(self.load_map, 7, 0)
     # other init
     self.image_list.image_list_changed.connect(self.image_list_changed)
示例#28
0
 def __init__(self, path, image_list, thumb_size=80, *arg, **kw):
     super(Image, self).__init__(*arg, **kw)
     self.path = path
     self.image_list = image_list
     self.name, ext = os.path.splitext(os.path.basename(self.path))
     self.selected = False
     self.thumb_size = thumb_size
     # read image
     with open(self.path, 'rb') as pf:
         image_data = pf.read()
     # read metadata
     self.metadata = Metadata(
         self.path, image_data, new_status=self.show_status)
     # set file type
     ext = ext.lower()
     self.file_type = imghdr.what(self.path) or 'raw'
     if self.file_type == 'tiff' and ext not in ('.tif', '.tiff'):
         self.file_type = 'raw'
     # make 'master' thumbnail
     self.pixmap = QtGui.QPixmap()
     self.pixmap.loadFromData(image_data)
     unrotate = self.file_type == 'raw'
     if self.pixmap.isNull():
         # image read failed so attempt to use exif thumbnail
         thumb = self.metadata.get_exif_thumbnail()
         if thumb:
             self.pixmap.loadFromData(bytearray(thumb))
             unrotate = False
     if not self.pixmap.isNull():
         if max(self.pixmap.width(), self.pixmap.height()) > 450:
             # store a scaled down version of image to save memory
             self.pixmap = self.pixmap.scaled(
                 300, 300, Qt.KeepAspectRatio, Qt.SmoothTransformation)
         if unrotate:
             # loading preview which is already re-oriented
             orientation = self.metadata.orientation
             if orientation and orientation.value > 1:
                 # need to unrotate and or unreflect image
                 transform = QtGui.QTransform()
                 if orientation.value in (3, 4):
                     transform = transform.rotate(180.0)
                 elif orientation.value in (5, 6):
                     transform = transform.rotate(-90.0)
                 elif orientation.value in (7, 8):
                     transform = transform.rotate(90.0)
                 if orientation.value in (2, 4, 5, 7):
                     transform = transform.scale(-1.0, 1.0)
                 self.pixmap = self.pixmap.transformed(transform)
     # sub widgets
     layout = QtWidgets.QGridLayout()
     layout.setSpacing(0)
     layout.setContentsMargins(3, 3, 3, 3)
     self.setLayout(layout)
     self.setToolTip(self.path)
     # label to display image
     self.image = QtWidgets.QLabel()
     self.image.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
     layout.addWidget(self.image, 0, 0, 1, 2)
     # label to display file name
     self.label = QtWidgets.QLabel()
     self.label.setAlignment(Qt.AlignRight)
     self.label.setStyleSheet("QLabel { font-size: 12px }")
     layout.addWidget(self.label, 1, 1)
     # label to display status
     self.status = QtWidgets.QLabel()
     self.status.setAlignment(Qt.AlignLeft)
     self.status.setStyleSheet("QLabel { font-size: 12px }")
     self.status.setFont(QtGui.QFont("Dejavu Sans"))
     if not self.status.fontInfo().exactMatch():
         # probably on Windows, try a different font
         self.status.setFont(QtGui.QFont("Segoe UI Symbol"))
     layout.addWidget(self.status, 1, 0)
     self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Plain)
     self.setObjectName("thumbnail")
     self.set_selected(False)
     self.show_status(False)
     self._set_thumb_size(self.thumb_size)
示例#29
0
 def __init__(self, image_list, parent=None):
     super(PhotiniMap, self).__init__(parent)
     self.app = QtWidgets.QApplication.instance()
     self.image_list = image_list
     name = self.__module__.split('.')[-1]
     self.script_dir = pkg_resources.resource_filename(
         'photini', 'data/' + name + '/')
     self.drag_icon = QtGui.QPixmap(
         os.path.join(self.script_dir, '../map_pin_grey.png'))
     self.drag_hotspot = 11, 35
     self.search_string = None
     self.map_loaded = 0     # not loaded
     self.marker_info = {}
     self.map_status = {}
     self.dropped_images = []
     self.geocoder = self.get_geocoder()
     self.gpx_ids = []
     self.widgets = {}
     self.setLayout(QtWidgets.QHBoxLayout())
     ## left side
     left_side = QtWidgets.QGridLayout()
     # latitude & longitude
     self.widgets['latlon'] = LatLongDisplay(self.image_list)
     left_side.addWidget(self.widgets['latlon'].label, 0, 0)
     self.widgets['latlon'].changed.connect(self.new_coords)
     left_side.addWidget(self.widgets['latlon'], 0, 1)
     # altitude
     label = QtWidgets.QLabel(translate('MapTabsAll', 'Altitude'))
     label.setAlignment(Qt.AlignRight)
     left_side.addWidget(label, 1, 0)
     self.widgets['altitude'] = DoubleSpinBox()
     self.widgets['altitude'].setSuffix(' m')
     self.widgets['altitude'].new_value.connect(self.new_altitude)
     left_side.addWidget(self.widgets['altitude'], 1, 1)
     if hasattr(self.geocoder, 'get_altitude'):
         self.widgets['get_altitude'] = QtWidgets.QPushButton(
             translate('MapTabsAll', 'Get altitude from map'))
         self.widgets['get_altitude'].clicked.connect(self.get_altitude)
         left_side.addWidget(self.widgets['get_altitude'], 2, 1)
     else:
         self.widgets['get_altitude'] = None
     # search
     label = QtWidgets.QLabel(translate('MapTabsAll', 'Search'))
     label.setAlignment(Qt.AlignRight)
     left_side.addWidget(label, 3, 0)
     self.widgets['search'] = ComboBox()
     self.widgets['search'].setEditable(True)
     self.widgets['search'].setInsertPolicy(QtWidgets.QComboBox.NoInsert)
     self.widgets['search'].lineEdit().setPlaceholderText(
         translate('MapTabsAll', '<new search>'))
     self.widgets['search'].lineEdit().returnPressed.connect(self.search)
     self.widgets['search'].activated.connect(self.goto_search_result)
     self.clear_search()
     self.widgets['search'].setEnabled(False)
     left_side.addWidget(self.widgets['search'], 3, 1)
     # search terms and conditions
     for n, widget in enumerate(self.geocoder.search_terms()):
         left_side.addWidget(widget, n+4, 0, 1, 2)
     left_side.setColumnStretch(1, 1)
     left_side.setRowStretch(7, 1)
     # GPX importer
     if self.app.gpx_importer:
         button = QtWidgets.QPushButton(
             translate('MapTabsAll', 'Load GPX file'))
         button.clicked.connect(self.load_gpx)
         left_side.addWidget(button, 8, 1)
         self.widgets['set_from_gpx'] = QtWidgets.QPushButton(
             translate('MapTabsAll', 'Set coords from GPX'))
         self.widgets['set_from_gpx'].setEnabled(False)
         self.widgets['set_from_gpx'].clicked.connect(self.set_from_gpx)
         left_side.addWidget(self.widgets['set_from_gpx'], 9, 1)
         self.widgets['clear_gpx'] = QtWidgets.QPushButton(
             translate('MapTabsAll', 'Remove GPX data'))
         self.widgets['clear_gpx'].setEnabled(False)
         self.widgets['clear_gpx'].clicked.connect(self.clear_gpx)
         left_side.addWidget(self.widgets['clear_gpx'], 10, 1)
     self.layout().addLayout(left_side)
     # map
     # create handler for calls from JavaScript
     self.call_handler = CallHandler(parent=self)
     self.widgets['map'] = MapWebView(self.call_handler)
     self.widgets['map'].drop_text.connect(self.drop_text)
     self.widgets['map'].setAcceptDrops(False)
     self.layout().addWidget(self.widgets['map'])
     self.layout().setStretch(1, 1)
     # other init
     self.image_list.image_list_changed.connect(self.image_list_changed)