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)
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)
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)
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)
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]
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)
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, })
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]
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
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)
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)
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)
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)
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)
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
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)
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)
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
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()
def search_terms(self): widget = QtWidgets.QLabel(self.tr('Search powered by Google')) scale_font(widget, 80) return '', widget
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()
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)
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}'))
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)
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)
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
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)
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)
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)