class RenameOptionsWidget(FlexiFrame): """ Display and allow editing of preference values for Downloads today and Stored Sequence Number and associated options, as well as the strip incompatible characters option. """ def __init__( self, prefs: Preferences, photoRenameWidget: RenameWidget, videoRenameWidget: RenameWidget, parent, ) -> None: super().__init__(parent=parent) self.prefs = prefs self.photoRenameWidget = photoRenameWidget self.videoRenameWidget = videoRenameWidget self.setBackgroundRole(QPalette.Base) self.setAutoFillBackground(True) compatibilityLayout = QVBoxLayout() layout = self.layout() # QSpinBox cannot display values greater than this value self.c_maxint = platform_c_maxint() tip = _("A counter for how many downloads occur on each day") self.downloadsTodayLabel = QLabel(_("Downloads today:")) self.downloadsToday = QSpinBox() self.downloadsToday.setMinimum(0) # QSpinBox defaults to a maximum of 99 self.downloadsToday.setMaximum(self.c_maxint) self.downloadsToday.setToolTip(tip) # This instance of the downloads today tracker is secondary to the # instance in the rename files process. That process automatically # updates the value and then once a download is complete, the # downloads today value here is overwritten. self.downloads_today_tracker = DownloadsTodayTracker( day_start=self.prefs.day_start, downloads_today=self.prefs.downloads_today ) downloads_today = self.downloads_today_tracker.get_or_reset_downloads_today() if self.prefs.downloads_today != self.downloads_today_tracker.downloads_today: self.prefs.downloads_today = self.downloads_today_tracker.downloads_today self.downloadsToday.setValue(downloads_today) self.downloadsToday.valueChanged.connect(self.downloadsTodayChanged) tip = _("A counter that is remembered each time the program is run ") self.storedNumberLabel = QLabel(_("Stored number:")) self.storedNumberLabel.setToolTip(tip) self.storedNumber = QSpinBox() self.storedNumberLabel.setBuddy(self.storedNumber) self.storedNumber.setMinimum(0) self.storedNumber.setMaximum(self.c_maxint) self.storedNumber.setToolTip(tip) self.storedNumber.setValue(self.stored_sequence_no) self.storedNumber.valueChanged.connect(self.storedNumberChanged) tip = _( "The time at which the <i>Downloads today</i> sequence number should be reset" ) self.dayStartLabel = QLabel(_("Day start:")) self.dayStartLabel.setToolTip(tip) self.dayStart = QTimeEdit() self.dayStart.setToolTip(tip) self.dayStart.setTime(self.prefs.get_day_start_qtime()) self.dayStart.timeChanged.connect(self.timeChanged) # 24 hour format, if wanted in a future release: # self.dayStart.setDisplayFormat('HH:mm:ss') self.sync = QCheckBox(_("Synchronize RAW + JPEG")) self.sync.setChecked(self.prefs.synchronize_raw_jpg) self.sync.stateChanged.connect(self.syncChanged) tip = _( "Synchronize sequence numbers for matching RAW and JPEG pairs.\n\n" "See the online documentation for more details." ) self.sync.setToolTip(tip) self.sequences = QGroupBox(_("Sequence Numbers")) sequencesLayout = QFormLayout() sequencesLayout.addRow(self.storedNumberLabel, self.storedNumber) sequencesLayout.addRow(self.downloadsTodayLabel, self.downloadsToday) sequencesLayout.addRow(self.dayStartLabel, self.dayStart) sequencesLayout.addRow(self.sync) self.sequences.setLayout(sequencesLayout) self.stripCharacters = QCheckBox(_("Strip incompatible characters")) self.stripCharacters.setChecked(self.prefs.strip_characters) self.stripCharacters.stateChanged.connect(self.stripCharactersChanged) self.stripCharacters.setToolTip( _( "Whether photo, video and folder names should have any characters " "removed that are not allowed by other operating systems" ) ) self.compatibility = QGroupBox(_("Compatibility")) self.compatibility.setLayout(compatibilityLayout) compatibilityLayout.addWidget(self.stripCharacters) layout.addWidget(self.sequences) layout.addWidget(self.compatibility) layout.addStretch() layout.setSpacing(18) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) @property def stored_sequence_no(self) -> int: try: stored_value = int(self.prefs.stored_sequence_no) + 1 assert 0 <= stored_value <= self.c_maxint except (ValueError, AssertionError): stored_value = 0 logging.error("Resetting invalid stored sequence number to 0") self.prefs.stored_sequence_no = -1 return stored_value @stored_sequence_no.setter def stored_sequence_no(self, value: int) -> None: logging.info("Setting stored sequence no to %d", value) self.prefs.stored_sequence_no = value - 1 @pyqtSlot(QTime) def timeChanged(self, time: QTime) -> None: hour = time.hour() minute = time.minute() self.prefs.day_start = "{}:{}".format(hour, minute) logging.debug("Setting day start to %s", self.prefs.day_start) self.downloads_today_tracker.set_day_start(hour=hour, minute=minute) @pyqtSlot(int) def downloadsTodayChanged(self, value: int) -> None: self.downloads_today_tracker.reset_downloads_today(value=value) dt = self.downloads_today_tracker.downloads_today logging.debug("Setting downloads today value to %s %s", dt[0], dt[1]) self.prefs.downloads_today = dt if self.prefs.photo_rename_pref_uses_downloads_today(): self.photoRenameWidget.updateExampleFilename(downloads_today=dt) if self.prefs.video_rename_pref_uses_downloads_today(): self.videoRenameWidget.updateExampleFilename(downloads_today=dt) @pyqtSlot(int) def storedNumberChanged(self, value: int) -> None: self.stored_sequence_no = value if self.prefs.photo_rename_pref_uses_stored_sequence_no(): self.photoRenameWidget.updateExampleFilename(stored_sequence_no=value - 1) if self.prefs.video_rename_pref_uses_stored_sequence_no(): self.videoRenameWidget.updateExampleFilename(stored_sequence_no=value - 1) @pyqtSlot(int) def syncChanged(self, state: int) -> None: sync = state == Qt.Checked logging.debug("Setting synchronize RAW + JPEG sequence values to %s", sync) self.prefs.synchronize_raw_jpg = sync @pyqtSlot(int) def stripCharactersChanged(self, state: int) -> None: strip = state == Qt.Checked logging.debug("Setting strip incompatible characers to %s", strip) self.prefs.strip_characters = strip
class HeadWidget(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.resize(700, 105) self.setMinimumWidth(700) # Widgets self.work_type = QComboBox(self) self.work_type.setToolTip('Тип работы') self.work_type.addItems(work_types) self.work_type.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) self.lesson = QComboBox(self) self.lesson.setToolTip('Урок') self.lesson.addItems(school_lessons) self.lesson.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) actuality_label = QLabel('Дата начала', self) self.actuality = QDateEdit(self) self.actuality.setDate(date.today()) self.actuality.setMinimumDate(date(2017, 9, 1)) self.actuality.setToolTip('Дата начала') deadline_label = QLabel('Дата окончания', self) self.deadline = QDateEdit(self) self.deadline.setDate(date.today() + timedelta(1)) self.deadline.setMinimumDate(date.today()) self.deadline.setToolTip('Дата окончания') priority_label = QLabel('Приоритет', self) self.priority = QDoubleSpinBox(self) # self.priority.setMaximumWidth(80) self.priority.setMaximum(1.0) self.priority.setSingleStep(0.01) self.priority.setValue(0.5) self.priority.setToolTip('Приоритет') time_label = QLabel('Время выполнения', self) self.time = QTimeEdit(self) # self.time.setMaximumWidth(80) self.time.setDisplayFormat('HH:mm') self.time.setToolTip('Время выполнения') self.add_button = QPushButton('Добавить', self) self.add_button.setToolTip('Добавить в список') # Layouts actuality_layout = QHBoxLayout() actuality_layout.setSizeConstraint(QHBoxLayout.SetFixedSize) actuality_layout.addWidget(actuality_label) actuality_layout.addWidget(self.actuality) deadline_layout = QHBoxLayout() deadline_layout.setSizeConstraint(QHBoxLayout.SetFixedSize) deadline_layout.addWidget(deadline_label) deadline_layout.addWidget(self.deadline) priority_layout = QHBoxLayout() priority_layout.setSizeConstraint(QHBoxLayout.SetFixedSize) priority_layout.addWidget(priority_label) priority_layout.addWidget(self.priority) time_layout = QHBoxLayout() time_layout.setSizeConstraint(QHBoxLayout.SetFixedSize) time_layout.addWidget(time_label) time_layout.addWidget(self.time) layout = QGridLayout(self) layout.addWidget(self.lesson, 0, 0) layout.addWidget(self.work_type, 1, 0) layout.addLayout(actuality_layout, 0, 2) layout.addLayout(deadline_layout, 1, 2) layout.addLayout(time_layout, 0, 3) layout.addLayout(priority_layout, 1, 3) layout.addWidget(self.add_button, 2, 3) # Tab order self.setTabOrder(self.lesson, self.work_type) self.setTabOrder(self.work_type, self.actuality) self.setTabOrder(self.actuality, self.deadline) self.setTabOrder(self.deadline, self.time) self.setTabOrder(self.time, self.priority) self.setTabOrder(self.priority, self.add_button)