File: shortcutedit.cpp

package info (click to toggle)
pineapple-pictures 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,424 kB
  • sloc: cpp: 3,794; xml: 339; sh: 8; makefile: 2
file content (126 lines) | stat: -rw-r--r-- 3,906 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// SPDX-FileCopyrightText: 2024 Gary Wang <opensource@blumia.net>
//
// SPDX-License-Identifier: MIT

#include "shortcutedit.h"

#include <QLabel>
#include <QToolButton>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QDialogButtonBox>
#include <QKeySequenceEdit>

ShortcutEditor::ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent)
    : QWidget(parent)
    , m_descriptionLabel(new QLabel)
    , m_shortcutEdit(shortcutEdit)
    , m_shortcutLayout(new QFormLayout)
{
    Q_CHECK_PTR(m_shortcutEdit);

    QDialogButtonBox * buttons = new QDialogButtonBox(QDialogButtonBox::Apply | QDialogButtonBox::Discard);

    QVBoxLayout * layout = new QVBoxLayout(this);
    layout->addWidget(m_descriptionLabel);
    layout->addLayout(m_shortcutLayout);
    layout->addWidget(buttons);

    connect(buttons, &QDialogButtonBox::clicked, this, [=](QAbstractButton *button){
        if ((QPushButton *)button == buttons->button(QDialogButtonBox::Apply)) {
            applyShortcuts();
        } else {
            reloadShortcuts();
        }
    });
    connect(shortcutEdit, &ShortcutEdit::shortcutsChanged, this, &ShortcutEditor::reloadShortcuts);

    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);

    reloadShortcuts();
}

void ShortcutEditor::setDescription(const QString &desc)
{
    m_descriptionLabel->setText(desc);
}

void ShortcutEditor::reloadShortcuts()
{
    if (!m_keySequenceEdits.isEmpty()) {
        for (QKeySequenceEdit * keyseqEdit : m_keySequenceEdits) {
            m_shortcutLayout->removeRow(keyseqEdit);
        }
        m_keySequenceEdits.clear();
    }

    QList<QKeySequence> shortcuts = m_shortcutEdit->shortcuts();
    shortcuts.append(QKeySequence());
    for (const QKeySequence & shortcut : shortcuts) {
        QKeySequenceEdit * keyseqEdit = new QKeySequenceEdit(this);
        keyseqEdit->setClearButtonEnabled(true);
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
        keyseqEdit->setMaximumSequenceLength(1);
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
        keyseqEdit->setKeySequence(shortcut);
        m_keySequenceEdits.append(keyseqEdit);
    }

    for (int i = 0; i < m_keySequenceEdits.count(); i++) {
        m_shortcutLayout->addRow(tr("Shortcut #%1").arg(i + 1), m_keySequenceEdits.at(i));
    }
}

void ShortcutEditor::applyShortcuts()
{
    QList<QKeySequence> shortcuts;
    for (const QKeySequenceEdit * keyseqEdit : m_keySequenceEdits) {
        if (!keyseqEdit->keySequence().isEmpty() && !shortcuts.contains(keyseqEdit->keySequence())) {
            shortcuts.append(keyseqEdit->keySequence());
        }
    }
    emit m_shortcutEdit->applyShortcutsRequested(shortcuts);
}

// ----------------------------------------

ShortcutEdit::ShortcutEdit(QWidget *parent)
    : QWidget(parent)
    , m_shortcutsLabel(new QLabel(this))
    , m_setShortcutButton(new QToolButton(this))
{
    m_setShortcutButton->setText("...");

    QHBoxLayout * layout = new QHBoxLayout(this);
    layout->setContentsMargins(0, 0, 0, 0);
    layout->addWidget(m_shortcutsLabel, 1);
    layout->addWidget(m_setShortcutButton);

    connect(this, &ShortcutEdit::shortcutsChanged, this, [=](){
        QStringList shortcutTexts;
        for (const QKeySequence & shortcut : std::as_const(m_shortcuts)) {
            shortcutTexts.append(shortcut.toString(QKeySequence::NativeText));
        }
        m_shortcutsLabel->setText(shortcutTexts.isEmpty() ? tr("No shortcuts") : shortcutTexts.join(", "));
        m_shortcutsLabel->setDisabled(shortcutTexts.isEmpty());
    });

    connect(m_setShortcutButton, &QToolButton::clicked, this, &ShortcutEdit::editButtonClicked);

    adjustSize();
}

ShortcutEdit::~ShortcutEdit()
{
}

QList<QKeySequence> ShortcutEdit::shortcuts() const
{
    return m_shortcuts;
}

void ShortcutEdit::setShortcuts(const QList<QKeySequence> &shortcuts)
{
    m_shortcuts = shortcuts;
    emit shortcutsChanged();
}