diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index 87d802b8..495e5aea 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -173,81 +174,43 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter); topBarLayout_->addStretch(1); - auto addSetting = [this, &font](QString labelText) { - auto layout = new QHBoxLayout; - layout->setContentsMargins(0, OptionMargin, 0, OptionMargin); + formLayout_ = new QFormLayout; - auto label = new QLabel(labelText, this); - label->setFont(font); + formLayout_->setLabelAlignment(Qt::AlignLeft); + formLayout_->setFormAlignment(Qt::AlignRight); + formLayout_->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + formLayout_->setRowWrapPolicy(QFormLayout::WrapLongRows); + formLayout_->setHorizontalSpacing(0); - auto toggle = new Toggle(this); + auto general_ = new QLabel(tr("GENERAL"), this); + general_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); + general_->setFont(font); - layout->addWidget(label); - layout->addWidget(toggle, 0, Qt::AlignRight); + trayToggle_ = new Toggle(this); + startInTrayToggle_ = new Toggle(this); - return std::pair{layout, toggle}; - }; - - QHBoxLayout *trayOptionLayout_ = nullptr; - std::tie(trayOptionLayout_, trayToggle_) = addSetting(tr("Minimize to tray")); - - QHBoxLayout *startInTrayOptionLayout_ = nullptr; - std::tie(startInTrayOptionLayout_, startInTrayToggle_) = addSetting(tr("Start in tray")); if (!settings_->isTrayEnabled()) startInTrayToggle_->setDisabled(true); - QHBoxLayout *groupViewLayout = nullptr; - std::tie(groupViewLayout, groupViewToggle_) = addSetting(tr("Group's sidebar")); - - QHBoxLayout *avatarViewLayout = nullptr; - std::tie(avatarViewLayout, avatarCircles_) = addSetting(tr("Circular Avatars")); - - QHBoxLayout *typingLayout = nullptr; - std::tie(typingLayout, typingNotifications_) = addSetting(tr("Typing notifications")); - - QHBoxLayout *receiptsLayout = nullptr; - std::tie(receiptsLayout, readReceipts_) = addSetting(tr("Read receipts")); - - QHBoxLayout *markdownLayout = nullptr; - std::tie(markdownLayout, markdownEnabled_) = addSetting(tr("Send messages as Markdown")); - - QHBoxLayout *desktopLayout = nullptr; - std::tie(desktopLayout, desktopNotifications_) = addSetting(tr("Desktop notifications")); - - auto scaleFactorOptionLayout = new QHBoxLayout; - scaleFactorOptionLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - auto scaleFactorLabel = new QLabel(tr("Scale factor"), this); - scaleFactorLabel->setFont(font); - scaleFactorCombo_ = new QComboBox(this); + avatarCircles_ = new Toggle(this); + groupViewToggle_ = new Toggle(this); + typingNotifications_ = new Toggle(this); + readReceipts_ = new Toggle(this); + markdownEnabled_ = new Toggle(this); + desktopNotifications_ = new Toggle(this); + scaleFactorCombo_ = new QComboBox(this); for (double option = 1; option <= 3; option += 0.25) scaleFactorCombo_->addItem(QString::number(option)); - - scaleFactorOptionLayout->addWidget(scaleFactorLabel); - scaleFactorOptionLayout->addWidget(scaleFactorCombo_, 0, Qt::AlignRight); - - auto fontSizeOptionLayout = new QHBoxLayout; - fontSizeOptionLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - auto fontSizeLabel = new QLabel(tr("Font size"), this); - fontSizeLabel->setFont(font); fontSizeCombo_ = new QComboBox(this); for (double option = 10; option < 17; option += 0.5) fontSizeCombo_->addItem(QString("%1 ").arg(QString::number(option))); - fontSizeOptionLayout->addWidget(fontSizeLabel); - fontSizeOptionLayout->addWidget(fontSizeCombo_, 0, Qt::AlignRight); - - auto fontFamilyOptionLayout = new QHBoxLayout; - auto emojiFontFamilyOptionLayout = new QHBoxLayout; - fontFamilyOptionLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - emojiFontFamilyOptionLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - auto fontFamilyLabel = new QLabel(tr("Font Family"), this); - auto emojiFamilyLabel = new QLabel(tr("Emoji Font Famly"), this); - fontFamilyLabel->setFont(font); - emojiFamilyLabel->setFont(font); fontSelectionCombo_ = new QComboBox(this); emojiFontSelectionCombo_ = new QComboBox(this); + QFontDatabase fontDb; auto fontFamilies = fontDb.families(); + // TODO: Is there a way to limit to just emojis, rather than // all emoji fonts? auto emojiFamilies = fontDb.families(QFontDatabase::Symbol); @@ -266,16 +229,6 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge fontIndex = emojiFontSelectionCombo_->findText(settings_->emojiFont()); emojiFontSelectionCombo_->setCurrentIndex(fontIndex); - fontFamilyOptionLayout->addWidget(fontFamilyLabel); - fontFamilyOptionLayout->addWidget(fontSelectionCombo_, 0, Qt::AlignRight); - - emojiFontFamilyOptionLayout->addWidget(emojiFamilyLabel); - emojiFontFamilyOptionLayout->addWidget(emojiFontSelectionCombo_, 0, Qt::AlignRight); - - auto themeOptionLayout_ = new QHBoxLayout; - themeOptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin); - auto themeLabel_ = new QLabel(tr("Theme"), this); - themeLabel_->setFont(font); themeCombo_ = new QComboBox(this); themeCombo_->addItem("Light"); themeCombo_->addItem("Dark"); @@ -286,112 +239,87 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge int themeIndex = themeCombo_->findText(themeStr); themeCombo_->setCurrentIndex(themeIndex); - themeOptionLayout_->addWidget(themeLabel_); - themeOptionLayout_->addWidget(themeCombo_, 0, Qt::AlignRight); - - auto encryptionLayout_ = new QVBoxLayout; - encryptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin); - encryptionLayout_->setAlignment(Qt::AlignVCenter); + auto encryptionLabel_ = new QLabel(tr("ENCRYPTION"), this); + encryptionLabel_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); + encryptionLabel_->setFont(font); QFont monospaceFont; monospaceFont.setFamily("Monospace"); monospaceFont.setStyleHint(QFont::Monospace); monospaceFont.setPointSizeF(monospaceFont.pointSizeF() * 0.9); - auto deviceIdLayout = new QHBoxLayout; - deviceIdLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - - auto deviceIdLabel = new QLabel(tr("Device ID"), this); - deviceIdLabel->setFont(font); - deviceIdLabel->setMargin(0); deviceIdValue_ = new QLabel{this}; deviceIdValue_->setTextInteractionFlags(Qt::TextSelectableByMouse); deviceIdValue_->setFont(monospaceFont); - deviceIdLayout->addWidget(deviceIdLabel, 1); - deviceIdLayout->addWidget(deviceIdValue_); - auto deviceFingerprintLayout = new QHBoxLayout; - deviceFingerprintLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); - - auto deviceFingerprintLabel = new QLabel(tr("Device Fingerprint"), this); - deviceFingerprintLabel->setFont(font); - deviceFingerprintLabel->setMargin(0); deviceFingerprintValue_ = new QLabel{this}; deviceFingerprintValue_->setTextInteractionFlags(Qt::TextSelectableByMouse); deviceFingerprintValue_->setFont(monospaceFont); - deviceFingerprintLayout->addWidget(deviceFingerprintLabel, 1); - deviceFingerprintLayout->addWidget(deviceFingerprintValue_); - auto sessionKeysLayout = new QHBoxLayout; - sessionKeysLayout->setContentsMargins(0, OptionMargin, 0, OptionMargin); auto sessionKeysLabel = new QLabel(tr("Session Keys"), this); sessionKeysLabel->setFont(font); - sessionKeysLayout->addWidget(sessionKeysLabel, 1); + sessionKeysLabel->setMargin(OptionMargin); auto sessionKeysImportBtn = new QPushButton{tr("IMPORT"), this}; - connect( - sessionKeysImportBtn, &QPushButton::clicked, this, &UserSettingsPage::importSessionKeys); auto sessionKeysExportBtn = new QPushButton{tr("EXPORT"), this}; - connect( - sessionKeysExportBtn, &QPushButton::clicked, this, &UserSettingsPage::exportSessionKeys); + + auto sessionKeysLayout = new QHBoxLayout(this); + sessionKeysLayout->addWidget(new QLabel("", this), 1, Qt::AlignRight); sessionKeysLayout->addWidget(sessionKeysExportBtn, 0, Qt::AlignRight); sessionKeysLayout->addWidget(sessionKeysImportBtn, 0, Qt::AlignRight); - encryptionLayout_->addLayout(deviceIdLayout); - encryptionLayout_->addLayout(deviceFingerprintLayout); - encryptionLayout_->addWidget(new HorizontalLine{this}); - encryptionLayout_->addLayout(sessionKeysLayout); + auto boxWrap = [this, &font](QString labelText, QWidget *field) { + auto label = new QLabel(labelText, this); + label->setFont(font); + label->setMargin(OptionMargin); - font.setWeight(QFont::Medium); + auto layout = new QHBoxLayout(this); + layout->addWidget(field, 0, Qt::AlignRight); - auto encryptionLabel_ = new QLabel(tr("ENCRYPTION"), this); - encryptionLabel_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); - encryptionLabel_->setFont(font); + formLayout_->addRow(label, layout); + }; - auto general_ = new QLabel(tr("GENERAL"), this); - general_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); - general_->setFont(font); + formLayout_->addRow(general_); + formLayout_->addRow(new HorizontalLine(this)); + boxWrap(tr("Minimize to tray"), trayToggle_); + boxWrap(tr("Start in tray"), startInTrayToggle_); + formLayout_->addRow(new HorizontalLine{this}); + boxWrap(tr("Circular Avatars"), avatarCircles_); + boxWrap(tr("Group's sidebar"), groupViewToggle_); + boxWrap(tr("Typing notifications"), typingNotifications_); + formLayout_->addRow(new HorizontalLine{this}); + boxWrap(tr("Read receipts"), readReceipts_); + boxWrap(tr("Send messages as Markdown"), markdownEnabled_); + boxWrap(tr("Desktop notifications"), desktopNotifications_); + formLayout_->addRow(new QLabel("", this)); + formLayout_->addRow(new HorizontalLine{this}); + boxWrap(tr("Scale factor"), scaleFactorCombo_); + boxWrap(tr("Font size"), fontSizeCombo_); + formLayout_->addRow(new HorizontalLine(this)); + boxWrap(tr("Font Family"), fontSelectionCombo_); + boxWrap(tr("Emoji Font Family"), emojiFontSelectionCombo_); + boxWrap(tr("Theme"), themeCombo_); + formLayout_->addRow(new QLabel("", this)); + formLayout_->addRow(encryptionLabel_); + formLayout_->addRow(new HorizontalLine(this)); + boxWrap(tr("Device ID"), deviceIdValue_); + boxWrap(tr("Device Fingerprint"), deviceFingerprintValue_); + formLayout_->addRow(new HorizontalLine(this)); + formLayout_->addRow(sessionKeysLabel, sessionKeysLayout); mainLayout_ = new QVBoxLayout; mainLayout_->setAlignment(Qt::AlignTop); mainLayout_->setSpacing(7); mainLayout_->setContentsMargins( sideMargin_, LayoutTopMargin, sideMargin_, LayoutBottomMargin); - mainLayout_->addWidget(general_, 1, Qt::AlignLeft | Qt::AlignBottom); - mainLayout_->addWidget(new HorizontalLine(this)); - mainLayout_->addLayout(trayOptionLayout_); - mainLayout_->addLayout(startInTrayOptionLayout_); - mainLayout_->addWidget(new HorizontalLine(this)); - mainLayout_->addLayout(groupViewLayout); - mainLayout_->addLayout(avatarViewLayout); - mainLayout_->addWidget(new HorizontalLine(this)); - mainLayout_->addLayout(typingLayout); - mainLayout_->addLayout(receiptsLayout); - mainLayout_->addLayout(markdownLayout); - mainLayout_->addLayout(desktopLayout); - mainLayout_->addWidget(new HorizontalLine(this)); + mainLayout_->addLayout(formLayout_); #if defined(Q_OS_MAC) - scaleFactorLabel->hide(); + // TODO: hide these with formlayout scaleFactorCombo_->hide(); - emojiFamilyLabel->hide(); emojiFontSelectionCombo_->hide(); #endif - mainLayout_->addLayout(scaleFactorOptionLayout); - mainLayout_->addLayout(fontSizeOptionLayout); - mainLayout_->addLayout(fontFamilyOptionLayout); - mainLayout_->addLayout(emojiFontFamilyOptionLayout); - mainLayout_->addWidget(new HorizontalLine(this)); - mainLayout_->addLayout(themeOptionLayout_); - mainLayout_->addWidget(new HorizontalLine(this)); - - mainLayout_->addSpacing(50); - - mainLayout_->addWidget(encryptionLabel_, 1, Qt::AlignLeft | Qt::AlignBottom); - mainLayout_->addWidget(new HorizontalLine(this)); - mainLayout_->addLayout(encryptionLayout_); - auto scrollArea_ = new QScrollArea(this); scrollArea_->setFrameShape(QFrame::NoFrame); scrollArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -467,6 +395,12 @@ UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidge settings_->setDesktopNotifications(!isDisabled); }); + connect( + sessionKeysImportBtn, &QPushButton::clicked, this, &UserSettingsPage::importSessionKeys); + + connect( + sessionKeysExportBtn, &QPushButton::clicked, this, &UserSettingsPage::exportSessionKeys); + connect(backBtn_, &QPushButton::clicked, this, [this]() { settings_->save(); emit moveBack(); @@ -507,7 +441,7 @@ UserSettingsPage::resizeEvent(QResizeEvent *event) else sideMargin_ = static_cast(event->size().width() - contentMinWidth) / 2.; - if (sideMargin_ < 40) + if (sideMargin_ < 70) sideMargin_ = 0; mainLayout_->setContentsMargins( diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h index 299905ab..7b290073 100644 --- a/src/UserSettingsPage.h +++ b/src/UserSettingsPage.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -166,6 +167,7 @@ private slots: private: // Layouts QVBoxLayout *topLayout_; + QFormLayout *formLayout_; QVBoxLayout *mainLayout_; QHBoxLayout *topBarLayout_;