diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 774a45186..6040c32c5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,388 +1,387 @@ add_subdirectory(icons) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) if (NOT DISABLE_KWATCHGNUPG) add_subdirectory(kwatchgnupg) endif() add_subdirectory(libkleopatraclient) add_subdirectory(conf) add_subdirectory(kconf_update) if(WIN32) set(_kleopatra_extra_uiserver_SRCS uiserver/uiserver_win.cpp) set(_kleopatra_extra_SRCS utils/gnupg-registry.c selftest/registrycheck.cpp utils/windowsprocessdevice.cpp utils/userinfo_win.cpp ) else() set(_kleopatra_extra_uiserver_SRCS uiserver/uiserver_unix.cpp) set(_kleopatra_extra_SRCS) endif() set(_kleopatra_uiserver_SRCS uiserver/sessiondata.cpp uiserver/uiserver.cpp ${_kleopatra_extra_uiserver_SRCS} uiserver/assuanserverconnection.cpp uiserver/echocommand.cpp uiserver/decryptverifycommandemailbase.cpp uiserver/decryptverifycommandfilesbase.cpp uiserver/signcommand.cpp uiserver/signencryptfilescommand.cpp uiserver/prepencryptcommand.cpp uiserver/prepsigncommand.cpp uiserver/encryptcommand.cpp uiserver/selectcertificatecommand.cpp uiserver/importfilescommand.cpp uiserver/createchecksumscommand.cpp uiserver/verifychecksumscommand.cpp selftest/uiservercheck.cpp ) if(ASSUAN2_FOUND) include_directories(${ASSUAN2_INCLUDES}) set(_kleopatra_uiserver_extra_libs ${ASSUAN2_LIBRARIES}) else() include_directories(${ASSUAN_INCLUDES}) if(WIN32) set(_kleopatra_uiserver_extra_libs ${ASSUAN_VANILLA_LIBRARIES}) else() set(_kleopatra_uiserver_extra_libs ${ASSUAN_PTHREAD_LIBRARIES}) endif() endif() if(HAVE_GPG_ERR_SOURCE_KLEO) add_definitions(-DGPG_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_KLEO) add_definitions(-DGPGMEPP_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_KLEO) else() add_definitions(-DGPG_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_USER_1) add_definitions(-DGPGMEPP_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_USER_1) endif() ki18n_wrap_ui(_kleopatra_uiserver_SRCS crypto/gui/signingcertificateselectionwidget.ui) if("${Gpgmepp_VERSION}" VERSION_GREATER_EQUAL "1.14.1") set(_kleopatra_deviceinfowatcher_files smartcard/deviceinfowatcher.cpp ) else() set(_kleopatra_deviceinfowatcher_files) endif() set(_kleopatra_SRCS utils/gui-helper.cpp utils/filedialog.cpp utils/kdpipeiodevice.cpp utils/headerview.cpp utils/scrollarea.cpp utils/dragqueen.cpp utils/multivalidator.cpp utils/systemtrayicon.cpp utils/hex.cpp utils/path-helper.cpp utils/input.cpp utils/output.cpp utils/validation.cpp utils/wsastarter.cpp utils/iodevicelogger.cpp utils/log.cpp utils/action_data.cpp utils/types.cpp utils/archivedefinition.cpp utils/auditlog.cpp utils/clipboardmenu.cpp utils/kuniqueservice.cpp utils/tags.cpp utils/writecertassuantransaction.cpp utils/keyparameters.cpp utils/userinfo.cpp selftest/selftest.cpp selftest/enginecheck.cpp selftest/gpgconfcheck.cpp selftest/gpgagentcheck.cpp selftest/libkleopatrarccheck.cpp ${_kleopatra_extra_SRCS} view/keylistcontroller.cpp view/keytreeview.cpp view/searchbar.cpp view/smartcardwidget.cpp view/openpgpkeycardwidget.cpp view/padwidget.cpp view/pgpcardwidget.cpp view/pivcardwidget.cpp view/p15cardwidget.cpp view/netkeywidget.cpp view/nullpinwidget.cpp view/tabwidget.cpp view/keycacheoverlay.cpp view/waitwidget.cpp view/welcomewidget.cpp dialogs/certificateselectiondialog.cpp dialogs/certifywidget.cpp dialogs/expirydialog.cpp dialogs/lookupcertificatesdialog.cpp dialogs/ownertrustdialog.cpp dialogs/selftestdialog.cpp dialogs/certifycertificatedialog.cpp dialogs/revokecertificationwidget.cpp dialogs/revokecertificationdialog.cpp dialogs/adduseriddialog.cpp dialogs/addemaildialog.cpp dialogs/deletecertificatesdialog.cpp dialogs/setinitialpindialog.cpp dialogs/certificatedetailsdialog.cpp dialogs/certificatedetailswidget.cpp dialogs/trustchainwidget.cpp dialogs/weboftrustwidget.cpp dialogs/weboftrustdialog.cpp dialogs/exportdialog.cpp dialogs/subkeyswidget.cpp dialogs/gencardkeydialog.cpp dialogs/updatenotification.cpp dialogs/pivcardapplicationadministrationkeyinputdialog.cpp dialogs/certificatedetailsinputwidget.cpp dialogs/createcsrforcardkeydialog.cpp dialogs/groupdetailsdialog.cpp dialogs/editgroupdialog.cpp crypto/controller.cpp crypto/certificateresolver.cpp crypto/sender.cpp crypto/recipient.cpp crypto/task.cpp crypto/taskcollection.cpp crypto/decryptverifytask.cpp crypto/decryptverifyemailcontroller.cpp crypto/decryptverifyfilescontroller.cpp crypto/autodecryptverifyfilescontroller.cpp crypto/encryptemailtask.cpp crypto/encryptemailcontroller.cpp crypto/newsignencryptemailcontroller.cpp crypto/signencrypttask.cpp crypto/signencryptfilescontroller.cpp crypto/signemailtask.cpp crypto/signemailcontroller.cpp crypto/createchecksumscontroller.cpp crypto/verifychecksumscontroller.cpp crypto/gui/wizard.cpp crypto/gui/wizardpage.cpp crypto/gui/certificateselectionline.cpp crypto/gui/certificatelineedit.cpp crypto/gui/signingcertificateselectionwidget.cpp crypto/gui/signingcertificateselectiondialog.cpp crypto/gui/resultitemwidget.cpp crypto/gui/resultlistwidget.cpp crypto/gui/resultpage.cpp crypto/gui/newresultpage.cpp crypto/gui/signencryptfileswizard.cpp crypto/gui/signencryptemailconflictdialog.cpp crypto/gui/decryptverifyoperationwidget.cpp crypto/gui/decryptverifyfileswizard.cpp crypto/gui/decryptverifyfilesdialog.cpp crypto/gui/objectspage.cpp crypto/gui/resolverecipientspage.cpp crypto/gui/signerresolvepage.cpp crypto/gui/encryptemailwizard.cpp crypto/gui/signemailwizard.cpp crypto/gui/signencryptwidget.cpp crypto/gui/signencryptwizard.cpp crypto/gui/unknownrecipientwidget.cpp crypto/gui/verifychecksumsdialog.cpp commands/command.cpp commands/gnupgprocesscommand.cpp commands/detailscommand.cpp commands/exportcertificatecommand.cpp commands/importcertificatescommand.cpp commands/importcertificatefromfilecommand.cpp commands/importcertificatefromclipboardcommand.cpp commands/importcertificatefromdatacommand.cpp commands/lookupcertificatescommand.cpp commands/reloadkeyscommand.cpp commands/refreshx509certscommand.cpp commands/refreshopenpgpcertscommand.cpp commands/deletecertificatescommand.cpp commands/decryptverifyfilescommand.cpp commands/signencryptfilescommand.cpp commands/signencryptfoldercommand.cpp commands/encryptclipboardcommand.cpp commands/signclipboardcommand.cpp commands/decryptverifyclipboardcommand.cpp commands/clearcrlcachecommand.cpp commands/dumpcrlcachecommand.cpp commands/dumpcertificatecommand.cpp commands/importcrlcommand.cpp commands/changeexpirycommand.cpp commands/changeownertrustcommand.cpp commands/changeroottrustcommand.cpp commands/changepassphrasecommand.cpp commands/certifycertificatecommand.cpp commands/revokecertificationcommand.cpp commands/selftestcommand.cpp commands/exportsecretkeycommand.cpp commands/exportopenpgpcertstoservercommand.cpp commands/adduseridcommand.cpp commands/newcertificatecommand.cpp commands/setinitialpincommand.cpp commands/learncardkeyscommand.cpp commands/checksumcreatefilescommand.cpp commands/checksumverifyfilescommand.cpp commands/exportpaperkeycommand.cpp commands/importpaperkeycommand.cpp commands/genrevokecommand.cpp commands/keytocardcommand.cpp commands/cardcommand.cpp commands/pivgeneratecardkeycommand.cpp commands/changepincommand.cpp commands/authenticatepivcardapplicationcommand.cpp commands/setpivcardapplicationadministrationkeycommand.cpp commands/certificatetopivcardcommand.cpp commands/importcertificatefrompivcardcommand.cpp commands/createopenpgpkeyfromcardkeyscommand.cpp commands/createcsrforcardkeycommand.cpp ${_kleopatra_uiserver_files} conf/configuredialog.cpp conf/groupsconfigdialog.cpp conf/groupsconfigpage.cpp conf/groupsconfigwidget.cpp newcertificatewizard/listwidget.cpp newcertificatewizard/newcertificatewizard.cpp smartcard/readerstatus.cpp smartcard/card.cpp smartcard/openpgpcard.cpp smartcard/netkeycard.cpp smartcard/pivcard.cpp smartcard/p15card.cpp smartcard/keypairinfo.cpp smartcard/utils.cpp ${_kleopatra_deviceinfowatcher_files} aboutdata.cpp systrayicon.cpp kleopatraapplication.cpp mainwindow.cpp main.cpp kleopatra.qrc ) if(WIN32) configure_file (versioninfo.rc.in versioninfo.rc) set(_kleopatra_SRCS ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc ${_kleopatra_SRCS}) endif() set (_kleopatra_SRCS conf/kleopageconfigdialog.cpp ${_kleopatra_SRCS}) ecm_qt_declare_logging_category(_kleopatra_SRCS HEADER kleopatra_debug.h IDENTIFIER KLEOPATRA_LOG CATEGORY_NAME org.kde.pim.kleopatra DESCRIPTION "kleopatra (kleopatra)" OLD_CATEGORY_NAMES log_kleopatra EXPORT KLEOPATRA ) if(KLEO_MODEL_TEST) add_definitions(-DKLEO_MODEL_TEST) set(_kleopatra_SRCS ${_kleopatra_SRCS} models/modeltest.cpp) endif() ki18n_wrap_ui(_kleopatra_SRCS - dialogs/expirydialog.ui dialogs/lookupcertificatesdialog.ui dialogs/ownertrustdialog.ui dialogs/selectchecklevelwidget.ui dialogs/selftestdialog.ui dialogs/adduseriddialog.ui dialogs/setinitialpindialog.ui dialogs/trustchainwidget.ui dialogs/subkeyswidget.ui newcertificatewizard/listwidget.ui newcertificatewizard/chooseprotocolpage.ui newcertificatewizard/enterdetailspage.ui newcertificatewizard/keycreationpage.ui newcertificatewizard/resultpage.ui newcertificatewizard/advancedsettingsdialog.ui ) kconfig_add_kcfg_files(_kleopatra_SRCS kcfg/tooltippreferences.kcfgc kcfg/emailoperationspreferences.kcfgc kcfg/fileoperationspreferences.kcfgc kcfg/smimevalidationpreferences.kcfgc kcfg/tagspreferences.kcfgc kcfg/settings.kcfgc ) file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/*-apps-kleopatra.png") ecm_add_app_icon(_kleopatra_SRCS ICONS ${ICONS_SRCS}) add_executable(kleopatra_bin ${_kleopatra_SRCS} ${_kleopatra_uiserver_SRCS}) # For the ConfigureDialog & KCMs target_link_libraries(kleopatra_bin kcm_kleopatra_static) #if (COMPILE_WITH_UNITY_CMAKE_SUPPORT) # set_target_properties(kleopatra_bin PROPERTIES UNITY_BUILD ON) #endif() set_target_properties(kleopatra_bin PROPERTIES OUTPUT_NAME kleopatra) if (WIN32) set(_kleopatra_platform_libs "secur32") endif () target_link_libraries(kleopatra_bin Gpgmepp QGpgme ${_kleopatra_extra_libs} KF5::Libkleo KF5::Mime KF5::I18n KF5::XmlGui KF5::IconThemes KF5::WindowSystem KF5::CoreAddons KF5::ItemModels KF5::Crash Qt::Network Qt::PrintSupport # Printing secret keys ${_kleopatra_uiserver_extra_libs} ${_kleopatra_dbusaddons_libs} kleopatraclientcore ${_kleopatra_platform_libs} ) install(TARGETS kleopatra_bin ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) install( PROGRAMS data/org.kde.kleopatra.desktop data/kleopatra_import.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) install(FILES data/org.kde.kleopatra.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) install( FILES data/kleopatra_signencryptfiles.desktop data/kleopatra_signencryptfolders.desktop data/kleopatra_decryptverifyfiles.desktop data/kleopatra_decryptverifyfolders.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}/ServiceMenus ) diff --git a/src/dialogs/expirydialog.cpp b/src/dialogs/expirydialog.cpp index 96eee2419..a1df3b34d 100644 --- a/src/dialogs/expirydialog.cpp +++ b/src/dialogs/expirydialog.cpp @@ -1,206 +1,296 @@ /* -*- mode: c++; c-basic-offset:4 -*- dialogs/expirydialog.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "expirydialog.h" -#include "ui_expirydialog.h" +#include +#include +#include +#include #include #include +#include +#include #include +#include +#include #include using namespace Kleo; using namespace Kleo::Dialogs; +namespace +{ + enum Period { Days, Weeks, Months, Years, NumPeriods }; static QDate date_by_amount_and_unit(int inAmount, int inUnit) { const QDate current = QDate::currentDate(); switch (inUnit) { case Days: return current.addDays(inAmount); case Weeks: return current.addDays(7 * inAmount); case Months: return current.addMonths(inAmount); case Years: return current.addYears(inAmount); default: Q_ASSERT(!"Should not reach here"); } return QDate(); } // these calculations should be precise enough for the forseeable future... static const double DAYS_IN_GREGORIAN_YEAR = 365.2425; static int monthsBetween(const QDate &d1, const QDate &d2) { const int days = d1.daysTo(d2); return qRound(days / DAYS_IN_GREGORIAN_YEAR * 12); } static int yearsBetween(const QDate &d1, const QDate &d2) { const int days = d1.daysTo(d2); return qRound(days / DAYS_IN_GREGORIAN_YEAR); } +auto radioButtonSize(const QRadioButton *radioButton) +{ + QStyleOptionButton opt; + return radioButton->style()->sizeFromContents(QStyle::CT_RadioButton, &opt, QSize(), radioButton); +} + +} + class ExpiryDialog::Private { friend class ::Kleo::Dialogs::ExpiryDialog; ExpiryDialog *const q; public: explicit Private(ExpiryDialog *qq) : q{qq} , inUnit{Days} , ui{q} { connect(ui.inSB, &QSpinBox::valueChanged, q, [this] () { slotInAmountChanged(); }); connect(ui.inCB, QOverload::of(&QComboBox::currentIndexChanged), q, [this] () { slotInUnitChanged(); }); connect(ui.onCW, &QCalendarWidget::selectionChanged, q, [this] () { slotOnDateChanged(); }); connect(ui.onCW, &QCalendarWidget::currentPageChanged, q, [this] (int year, int month) { // We select the same day in the month when // a page is switched. auto date = ui.onCW->selectedDate(); if (!date.setDate(year, month, date.day())) { date.setDate(year, month, 1); } ui.onCW->setSelectedDate(date); }); Q_ASSERT(ui.inCB->currentIndex() == inUnit); } private: void slotInAmountChanged(); void slotInUnitChanged(); void slotOnDateChanged(); private: QDate inDate() const; int inAmountByDate(const QDate &date) const; private: int inUnit; - struct UI : public Ui::ExpiryDialog { + struct UI { + QRadioButton *neverRB; + QRadioButton *inRB; + QSpinBox *inSB; + QComboBox *inCB; + QRadioButton *onRB; + QCalendarWidget *onCW; + explicit UI(Dialogs::ExpiryDialog *qq) - : Ui::ExpiryDialog{} { - auto mainWidget = new QWidget(qq); + auto mainLayout = new QVBoxLayout{qq}; + + auto mainWidget = new QWidget{qq}; + + auto vboxLayout = new QVBoxLayout{mainWidget}; + vboxLayout->setContentsMargins(0, 0, 0, 0); + + vboxLayout->addWidget(new QLabel{i18n("Please select when to expire this certificate:"), mainWidget}); + + neverRB = new QRadioButton(i18n("Ne&ver"), mainWidget); + neverRB->setChecked(false); + + vboxLayout->addWidget(neverRB); + + { + auto hboxLayout = new QHBoxLayout; + + inRB = new QRadioButton{i18n("In"), mainWidget}; + inRB->setChecked(false); + + hboxLayout->addWidget(inRB); + + inSB = new QSpinBox{mainWidget}; + inSB->setEnabled(false); + inSB->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); + inSB->setMinimum(1); + + hboxLayout->addWidget(inSB); + + inCB = new QComboBox{mainWidget}; + inCB->addItem(i18n("Days")); + inCB->addItem(i18n("Weeks")); + inCB->addItem(i18n("Months")); + inCB->addItem(i18n("Years")); + Q_ASSERT(inCB->count() == NumPeriods); + inCB->setEnabled(false); + + hboxLayout->addWidget(inCB); + + hboxLayout->addStretch(1); + + vboxLayout->addLayout(hboxLayout); + } + + onRB = new QRadioButton{i18n("On this da&y:"), mainWidget}; + onRB->setChecked(true); + + vboxLayout->addWidget(onRB); + + { + auto hboxLayout = new QHBoxLayout; + + hboxLayout->addSpacing(radioButtonSize(onRB).width()); + + onCW = new QCalendarWidget{mainWidget}; + onCW->setGridVisible(true); + onCW->setMinimumDate(QDate::currentDate().addDays(1)); + + hboxLayout->addWidget(onCW); + + hboxLayout->addStretch(1); + + vboxLayout->addLayout(hboxLayout); + } + + vboxLayout->addStretch(1); - setupUi(mainWidget); - auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, qq); - auto mainLayout = new QVBoxLayout; - qq->setLayout(mainLayout); mainLayout->addWidget(mainWidget); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); + + auto buttonBox = new QDialogButtonBox{QDialogButtonBox::Ok | QDialogButtonBox::Cancel, qq}; + auto okButton = buttonBox->button(QDialogButtonBox::Ok); + KGuiItem::assign(okButton, KStandardGuiItem::ok()); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); + KGuiItem::assign(buttonBox->button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel()); qq->connect(buttonBox, &QDialogButtonBox::accepted, qq, &QDialog::accept); qq->connect(buttonBox, &QDialogButtonBox::rejected, qq, &QDialog::reject); - mainLayout->addWidget(buttonBox); - Q_ASSERT(inCB->count() == NumPeriods); + mainLayout->addWidget(buttonBox); - onCW->setMinimumDate(QDate::currentDate().addDays(1)); + connect(onRB, &QRadioButton::toggled, onCW, &QWidget::setEnabled); + connect(inRB, &QRadioButton::toggled, inCB, &QWidget::setEnabled); + connect(inRB, &QRadioButton::toggled, inSB, &QWidget::setEnabled); } } ui; }; -ExpiryDialog::ExpiryDialog(QWidget *p) - : QDialog{p} - , d{new Private{this}} -{ - setWindowTitle(i18nc("@title:window", "Change Expiry")); -} - -ExpiryDialog::~ExpiryDialog() = default; - -void ExpiryDialog::setDateOfExpiry(const QDate &date) -{ - const QDate current = QDate::currentDate(); - if (date.isValid()) { - d->ui.onRB->setChecked(true); - d->ui.onCW->setSelectedDate(qMax(date, current)); - } else { - d->ui.neverRB->setChecked(true); - d->ui.onCW->setSelectedDate(current); - d->ui.inSB->setValue(0); - } -} - -QDate ExpiryDialog::dateOfExpiry() const -{ - return - d->ui.inRB->isChecked() ? d->inDate() : - d->ui.onRB->isChecked() ? d->ui.onCW->selectedDate() : - QDate{}; -} - void ExpiryDialog::Private::slotInUnitChanged() { const int oldInAmount = ui.inSB->value(); const QDate targetDate = date_by_amount_and_unit(oldInAmount, inUnit); inUnit = ui.inCB->currentIndex(); if (targetDate.isValid()) { ui.inSB->setValue(inAmountByDate(targetDate)); } else { slotInAmountChanged(); } } void ExpiryDialog::Private::slotInAmountChanged() { // Only modify onCW when onCW is slave: if (ui.inRB->isChecked()) { ui.onCW->setSelectedDate(inDate()); } } void ExpiryDialog::Private::slotOnDateChanged() { // Only modify inSB/inCB when onCW is master: if (ui.onRB->isChecked()) { ui.inSB->setValue(inAmountByDate(ui.onCW->selectedDate())); } } QDate ExpiryDialog::Private::inDate() const { return date_by_amount_and_unit(ui.inSB->value(), ui.inCB->currentIndex()); } int ExpiryDialog::Private::inAmountByDate(const QDate &selected) const { const QDate current = QDate::currentDate(); switch (ui.inCB->currentIndex()) { case Days: return current.daysTo(selected); case Weeks: return qRound(current.daysTo(selected) / 7.0); case Months: return monthsBetween(current, selected); case Years: return yearsBetween(current, selected); }; Q_ASSERT(!"Should not reach here"); return -1; } +ExpiryDialog::ExpiryDialog(QWidget *p) + : QDialog{p} + , d{new Private{this}} +{ + setWindowTitle(i18nc("@title:window", "Change Expiry")); +} + +ExpiryDialog::~ExpiryDialog() = default; + +void ExpiryDialog::setDateOfExpiry(const QDate &date) +{ + const QDate current = QDate::currentDate(); + if (date.isValid()) { + d->ui.onRB->setChecked(true); + d->ui.onCW->setSelectedDate(qMax(date, current)); + } else { + d->ui.neverRB->setChecked(true); + d->ui.onCW->setSelectedDate(current); + d->ui.inSB->setValue(0); + } +} + +QDate ExpiryDialog::dateOfExpiry() const +{ + return + d->ui.inRB->isChecked() ? d->inDate() : + d->ui.onRB->isChecked() ? d->ui.onCW->selectedDate() : + QDate{}; +} + #include "moc_expirydialog.cpp" diff --git a/src/dialogs/expirydialog.ui b/src/dialogs/expirydialog.ui deleted file mode 100644 index 39cec6359..000000000 --- a/src/dialogs/expirydialog.ui +++ /dev/null @@ -1,252 +0,0 @@ - - - Kleo::Dialogs::ExpiryDialog - - - - 0 - 0 - 436 - 386 - - - - Change Certificate Date of Expiry - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Please select when to expire this certificate: - - - - - - - Ne&ver - - - false - - - - - - - - - In - - - - - - - false - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 1 - - - - - - - false - - - - Days - - - - - Weeks - - - - - Months - - - - - Years - - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - On this da&y: - - - true - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - true - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 418 - 16 - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - onRB - toggled(bool) - onCW - setEnabled(bool) - - - 102 - 55 - - - 102 - 79 - - - - - inRB - toggled(bool) - inCB - setEnabled(bool) - - - 144 - 313 - - - 314 - 315 - - - - - inRB - toggled(bool) - inSB - setEnabled(bool) - - - 144 - 331 - - - 176 - 331 - - - - -