Pith - wedge_linux
wedge_linux/WedgeSettings.cpp [9.3 kb]
Modified: 20:12:45 158 026 (24 Aug 026)
5 Days Ago
#include "WedgeHeader.h"
#include "WedgeSettings.h"
#include "WedgeStyle.h"
#include <QColorDialog>
#include <QDesktopServices>
#include <QFormLayout>
#include <QFrame>
#include <QHBoxLayout>
#include <QLabel>
#include <QTimer>
#include <QUrl>
#include <QVBoxLayout>
#include <QButtonGroup>

// version
static const QString kVersionRemote = "158.026.1";

static QSpacerItem* makeSpacer(int height) {
    return new QSpacerItem(0, height, QSizePolicy::Minimum, QSizePolicy::Fixed);
 }

// radio buttons
static QWidget* makeSegmentRow(QButtonGroup *group, const QString &opt0, const QString &opt1,
                               int currentIndex, QWidget *parent) {
    auto *w = new QWidget(parent);
    auto *h = new QHBoxLayout(w);
    h->setContentsMargins(0, 0, 0, 0);
    h->setSpacing(0);
    auto *b0 = new QPushButton(opt0, w);
    auto *b1 = new QPushButton(opt1, w);
    b0->setProperty("segment", "left");
    b1->setProperty("segment", "right");
    for (QPushButton *b : {b0, b1}) {
        b->setCheckable(true);
        b->setCursor(Qt::PointingHandCursor);
        b->setFocusPolicy(Qt::NoFocus);
    }
    group->addButton(b0, 0);
    group->addButton(b1, 1);
    group->setExclusive(true);
    (currentIndex == 1 ? b1 : b0)->setChecked(true);
    h->addWidget(b0);
    h->addWidget(b1);
    h->addStretch(1);
    return w;
}

SettingsDialog::SettingsDialog(const NoteData &data, QWidget *parent) 
    : QDialog(parent), originalData(data) {
    
    setWindowTitle("");
    setFixedWidth(333);
    setStyleSheet(WedgeStyle::sheet());

    auto *layout = new QVBoxLayout(this);
    layout->setContentsMargins(16, 14, 16, 14);
    auto *form = new QFormLayout();

    form->setVerticalSpacing(7);
    form->setHorizontalSpacing(15);

    // aesthetics

    form->addItem(makeSpacer(3));

    currentBg = data.bgColor;
    currentText = data.textColor;
    currentFocus = data.focusColor;
    currentHighlight = data.highlightColor;

    fontCombo = new QFontComboBox();
    fontCombo->setCurrentFont(QFont(data.fontFamily));

    sizeSpin = new QSpinBox();
    sizeSpin->setRange(8, 47);
    sizeSpin->setValue(data.fontSize);

    bgColorBtn = new QPushButton("Ground Color");
    textColorBtn = new QPushButton("Text Color");
    focusColorBtn = new QPushButton("Focus Color");
    highlightColorBtn = new QPushButton("Next Color");

    QFrame *bgPreview = new QFrame();
    bgPreview->setFixedSize(27, 27);
    QFrame *textPreview = new QFrame();
    textPreview->setFixedSize(27, 27);
    QFrame *focusPreview = new QFrame();
    focusPreview->setFixedSize(27, 27);
    QFrame *highlightPreview = new QFrame();
    highlightPreview->setFixedSize(27, 27);

    auto updateButtonColors = [this, bgPreview, textPreview, focusPreview, highlightPreview]() {
        bgPreview->setStyleSheet(QString("background-color: %1; border: 1px solid #d5d5d5; border-radius: 4px;").arg(currentBg.name()));
        textPreview->setStyleSheet(QString("background-color: %1; border: 1px solid #d5d5d5; border-radius: 4px;").arg(currentText.name()));
        focusPreview->setStyleSheet(QString("background-color: %1; border: 1px solid #d5d5d5; border-radius: 4px;").arg(currentFocus.name()));
        highlightPreview->setStyleSheet(QString("background-color: %1; border: 1px solid #d5d5d5; border-radius: 4px;").arg(currentHighlight.name()));
    };

    QHBoxLayout *bgLayout = new QHBoxLayout(); bgLayout->setSpacing(8); bgLayout->addWidget(bgPreview); bgLayout->addWidget(bgColorBtn);
    QHBoxLayout *textLayout = new QHBoxLayout(); textLayout->setSpacing(8); textLayout->addWidget(textPreview); textLayout->addWidget(textColorBtn);
    QHBoxLayout *focusLayout = new QHBoxLayout(); focusLayout->setSpacing(8); focusLayout->addWidget(focusPreview); focusLayout->addWidget(focusColorBtn);
    QHBoxLayout *highlightLayout = new QHBoxLayout(); highlightLayout->setSpacing(8); highlightLayout->addWidget(highlightPreview); highlightLayout->addWidget(highlightColorBtn);
    updateButtonColors();

    connect(bgColorBtn, &QPushButton::clicked, [this, updateButtonColors]() {
        QColor c = QColorDialog::getColor(currentBg, this, "Select Ground Color");
        if (c.isValid()) { currentBg = c; updateButtonColors(); emitChange(); }
    });

    connect(textColorBtn, &QPushButton::clicked, [this, updateButtonColors]() {
        QColor c = QColorDialog::getColor(currentText, this, "Select Text Color");
        if (c.isValid()) { currentText = c; updateButtonColors(); emitChange(); }
    });

    connect(focusColorBtn, &QPushButton::clicked, [this, updateButtonColors]() {
        QColor c = QColorDialog::getColor(currentFocus, this, "Select Focus Color");
        if (c.isValid()) { currentFocus = c; updateButtonColors(); emitChange(); }
    });

    connect(highlightColorBtn, &QPushButton::clicked, this, [this, updateButtonColors]() {
        QColor col = QColorDialog::getColor(currentHighlight, this, "Select Next Color");
        if (col.isValid()) { currentHighlight = col; updateButtonColors(); emitChange(); }
    });

    autoStartGroup = new QButtonGroup(this);
    QWidget *autoStartRow = makeSegmentRow(autoStartGroup, "False", "True", data.autoStart ? 1 : 0, this);

    hideTaskbarGroup = new QButtonGroup(this);
    QWidget *hideTaskbarRow = makeSegmentRow(hideTaskbarGroup, "False", "True", data.hideTaskbar ? 1 : 0, this);

    form->addRow("Font Family", fontCombo);
    form->addRow("Font Size", sizeSpin);
    form->addRow("Font Color", textLayout);
    form->addRow("Focus Color", focusLayout);
    form->addRow("Next Color", highlightLayout);
    form->addRow("Ground Color", bgLayout);

    form->addItem(makeSpacer(4));

    // calendar

    headerEdit = new QLineEdit(this);
    headerEdit->setText(data.headerFormat.isEmpty() ? "otcDay EEE dd MMM*" : data.headerFormat);

    form->addRow("Header", headerEdit);

    QLabel *headerPreviewLabel = new QLabel(this);
    headerPreviewLabel->setStyleSheet("font-family: monospace; font-size: 8pt; padding-top: 2px; padding-bottom: 2px;");

    auto updateHeaderPreview = [headerPreviewLabel](const QString &fmt) {
        headerPreviewLabel->setText(fmt.isEmpty() ? QString() : WedgeHeader::render(fmt, QDate::currentDate()));
    };
    updateHeaderPreview(headerEdit->text());

    connect(headerEdit, &QLineEdit::textChanged, this, updateHeaderPreview);

    form->addRow("Print", headerPreviewLabel);

    form->addItem(makeSpacer(3));

    // system

    form->addRow("Auto Start", autoStartRow);
    form->addRow("Hide Task Bar", hideTaskbarRow);

    form->addItem(makeSpacer(1));

    // data

    qint64 backupTime = ConfigManager::lastBackupTime();
    QString archivedStr = (backupTime > 0) ? ConfigManager::formatOtc(backupTime) : "n/a";
    QLabel *archiveLabel = new QLabel(archivedStr, this);
    archiveLabel->setStyleSheet("font-family: monospace; font-size: 8pt; padding-top: 2px; padding-bottom: 2px;");

    QLabel *dataLabel = new QLabel("<a style='text-decoration: none; color: #000000; font-family: monospace; font-size: 8pt;' href='conf'>wedge.conf</a>", this);
    dataLabel->setOpenExternalLinks(false);
    dataLabel->setStyleSheet("padding-top: 2px; padding-bottom: 2px;");

    connect(dataLabel, &QLabel::linkActivated, this, [](const QString &link) {
        if (link == "conf") {
            QDesktopServices::openUrl(QUrl::fromLocalFile(ConfigManager::getConfigPath() + "/wedge.conf"));
        }
    });

    QLabel *versionLabel = new QLabel(
        QString("%1 <a style='text-decoration: none; color: #888888; font-family: monospace; font-size: 8pt;' href='https://vgmlr.com/?t=Wedge'>[update]</a>").arg(kVersionRemote),
        this);
    versionLabel->setStyleSheet("font-family: monospace; font-size: 8pt; padding-top: 2px; padding-bottom: 2px;");
    versionLabel->setOpenExternalLinks(true);
    versionLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);

    QLabel *sourceLabel = new QLabel("<a style='text-decoration: none; color: #000000; font-family: monospace; font-size: 8pt;' href='https://vgmlr.com/mlwrk'>vgmlr.com/mlwrk</a>", this);
    sourceLabel->setOpenExternalLinks(true);
    sourceLabel->setStyleSheet("padding-top: 2px; padding-bottom: 2px;");

    form->addRow("Storage", dataLabel);
    form->addRow("Archived", archiveLabel);
    form->addRow("Version", versionLabel);
    form->addRow("Source", sourceLabel);
    
    form->addItem(makeSpacer(6));

    layout->addLayout(form);
    
    connect(fontCombo, &QFontComboBox::currentFontChanged, this, [this](const QFont &) { emitChange(); });
    connect(sizeSpin, &QSpinBox::valueChanged, this, [this](int) { emitChange(); });
    connect(autoStartGroup, &QButtonGroup::idClicked, this, [this](int) { emitChange(); });
    connect(hideTaskbarGroup, &QButtonGroup::idClicked, this, [this](int) { emitChange(); });
    connect(headerEdit, &QLineEdit::textChanged, this, [this](const QString &) { emitChange(); });
}

void SettingsDialog::emitChange() {
    emit settingsChanged(getUpdatedData());
}

NoteData SettingsDialog::getUpdatedData() const {
    NoteData data = originalData;
    data.autoStart = (autoStartGroup->checkedId() == 1);
    data.bgColor = currentBg;
    data.focusColor = currentFocus;
    data.fontFamily = fontCombo->currentFont().family();
    data.fontSize = sizeSpin->value();
    data.headerFormat = headerEdit->text();
    data.hideTaskbar = (hideTaskbarGroup->checkedId() == 1);
    data.highlightColor = currentHighlight;
    data.textColor = currentText;
    return data;
}
Updates
Stave - Android 158.026
Kerf - Android 157.026
Kiln - Android 157.026
Wedge - Android 156.026
Whittle - Linux 155.026

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)
0.00169
260,122 (+536)