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
Ejemplo n.º 2
0
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)