22 #include <QVBoxLayout>
26 #include <QStandardItemModel>
28 #include <QKeySequence>
29 #include <QMessageBox>
30 #include "pencilsettings.h"
31 #include "shortcutspage.h"
32 #include "keycapturelineedit.h"
33 #include "ui_shortcutspage.h"
35 static const int ACT_NAME_COLUMN = 0;
36 static const int KEY_SEQ_COLUMN = 1;
38 ShortcutsPage::ShortcutsPage( QWidget* parent ) : QWidget(parent),
43 m_treeModel =
new QStandardItemModel(
this);
45 treeModelLoadShortcutsSetting();
47 ui->treeView->setModel(m_treeModel);
48 ui->treeView->resizeColumnToContents(0);
50 connect( ui->treeView, &QTreeView::clicked,
this, &ShortcutsPage::tableItemClicked );
51 connect( ui->keySeqLineEdit, &KeyCaptureLineEdit::keyCaptured,
this, &ShortcutsPage::keyCapLineEditTextChanged );
52 connect( ui->restoreShortcutsButton, &QPushButton::clicked,
this, &ShortcutsPage::restoreShortcutsButtonClicked );
53 connect( ui->clearButton, &QPushButton::clicked,
this, &ShortcutsPage::clearButtonClicked );
56 void ShortcutsPage::tableItemClicked(
const QModelIndex& modelIndex )
58 int row = modelIndex.row();
61 QStandardItem* actionItem = m_treeModel->item(row, ACT_NAME_COLUMN);
62 ui->actionNameLabel->setText(actionItem->text());
65 QStandardItem* keyseqItem = m_treeModel->item(row, KEY_SEQ_COLUMN);
66 ui->keySeqLineEdit->setText(keyseqItem->text());
68 qDebug() <<
"Command Selected:" << actionItem->text();
70 m_currentItemIndex = modelIndex;
72 ui->keySeqLineEdit->setFocus();
75 void ShortcutsPage::keyCapLineEditTextChanged(QKeySequence keySeqence)
77 if ( !m_currentItemIndex.isValid() )
82 int row = m_currentItemIndex.row();
83 QStandardItem* actionItem = m_treeModel->item(row, ACT_NAME_COLUMN);
84 QStandardItem* keyseqItem = m_treeModel->item(row, KEY_SEQ_COLUMN);
86 QString strCmdName = QString(
"Cmd%1").arg( actionItem->text() );
87 QString strKeySeq = keySeqence.toString( QKeySequence::PortableText );
89 QSettings setting( PENCIL2D, PENCIL2D );
90 setting.beginGroup(
"shortcuts");
92 if (isKeySequenceExist(setting, strCmdName, keySeqence))
95 msgBox.setText( tr(
"Shortcut Conflict!"));
96 msgBox.setInformativeText( tr(
"%1 is already used, overwrite?").arg(keySeqence.toString(QKeySequence::NativeText)) );
97 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
98 msgBox.setDefaultButton(QMessageBox::No);
99 msgBox.setIcon( QMessageBox::Warning );
101 int result = msgBox.exec();
103 if ( result != QMessageBox::Yes )
105 ui->keySeqLineEdit->setText( keyseqItem->text() );
108 removeDuplicateKeySequence(&setting, keySeqence);
111 setting.setValue(strCmdName, strKeySeq);
115 treeModelLoadShortcutsSetting();
117 qDebug() <<
"Shortcut " << strCmdName <<
" = " << strKeySeq;
120 void ShortcutsPage::restoreShortcutsButtonClicked()
122 restoreShortcutsToDefault();
123 treeModelLoadShortcutsSetting();
126 bool ShortcutsPage::isKeySequenceExist(
const QSettings& settings, QString strTargetCmdName, QKeySequence targetkeySeq)
128 foreach (QString strCmdName, settings.allKeys())
130 if (strTargetCmdName == strCmdName)
135 QString strCmdKeySeq = settings.value(strCmdName).toString();
142 if (QKeySequence(strCmdKeySeq) == targetkeySeq)
150 void ShortcutsPage::removeDuplicateKeySequence(QSettings* settings, QKeySequence keySeq)
152 foreach(QString strCmdName, settings->allKeys())
154 QString strCmdKeySeq = settings->value(strCmdName).toString();
156 if ( strCmdKeySeq == keySeq.toString(QKeySequence::PortableText))
158 settings->setValue(strCmdName,
"");
163 void ShortcutsPage::treeModelLoadShortcutsSetting()
166 QSettings settings( PENCIL2D, PENCIL2D );
167 settings.beginGroup(
"shortcuts");
169 m_treeModel->clear();
171 m_treeModel->setRowCount( settings.allKeys().size() );
172 m_treeModel->setColumnCount( 2 );
175 foreach (QString strCmdName, settings.allKeys())
177 QString strKeySequence = settings.value(strCmdName).toString();
180 strKeySequence = QKeySequence(strKeySequence).toString( QKeySequence::NativeText );
183 QStringRef strHumanReadCmdName (&strCmdName, 3, strCmdName.size() - 3);
185 QStandardItem* nameItem =
new QStandardItem(strHumanReadCmdName.toString());
186 QStandardItem* keyseqItem =
new QStandardItem(strKeySequence);
188 m_treeModel->setItem(row, 0, nameItem);
189 m_treeModel->setItem(row, 1, keyseqItem);
191 m_treeModel->item(row, 0)->setEditable(
false);
192 m_treeModel->item(row, 1)->setEditable(
false);
198 ui->treeView->resizeColumnToContents( 0 );
201 void ShortcutsPage::clearButtonClicked()
203 if ( !m_currentItemIndex.isValid() )
208 int row = m_currentItemIndex.row();
209 QStandardItem* actionItem = m_treeModel->item(row, ACT_NAME_COLUMN);
211 QString strCmdName = QString(
"shortcuts/Cmd%1").arg( actionItem->text() );
213 QSettings setting( PENCIL2D, PENCIL2D );
214 setting.setValue( strCmdName,
"" );
217 ui->keySeqLineEdit->setText(
"");
219 treeModelLoadShortcutsSetting();