17 #include "shortcutspage.h"
18 #include "ui_shortcutspage.h"
23 #include <QStandardItemModel>
25 #include <QKeySequence>
26 #include <QMessageBox>
27 #include "pencilsettings.h"
29 #include <QFileDialog>
32 static const int ACT_NAME_COLUMN = 0;
33 static const int KEY_SEQ_COLUMN = 1;
37 ShortcutsPage::ShortcutsPage(
QWidget* parent )
43 m_treeModel->setColumnCount(2);
44 m_treeModel->setHorizontalHeaderLabels({
tr(
"Action",
"Shortcut table header"),
tr(
"Shortcut",
"Shortcut table header") });
45 treeModelLoadShortcutsSetting();
47 ui->treeView->setModel(m_treeModel);
48 ui->treeView->resizeColumnToContents(0);
58 tableItemClicked(m_treeModel->index(0, 0));
61 ShortcutsPage::~ShortcutsPage() {
65 void ShortcutsPage::tableItemClicked(
const QModelIndex& modelIndex )
67 int row = modelIndex.
row();
71 ui->actionNameLabel->setText(actionItem->
text());
75 ui->keySequenceEdit->setKeySequence(keySeqItem->
text());
77 qDebug() <<
"Command Selected:" << actionItem->
text();
79 m_currentItemIndex = modelIndex;
81 ui->keySequenceEdit->setFocus();
84 void ShortcutsPage::keyCapLineEditTextChanged()
87 if (!m_currentItemIndex.
isValid())
92 int row = m_currentItemIndex.
row();
100 setting.beginGroup(
"shortcuts");
102 if (isKeySequenceExist(setting, strCmdName, keySequence))
105 msgBox.setText(
tr(
"Shortcut Conflict!"));
111 int result = msgBox.exec();
115 ui->keySequenceEdit->setKeySequence( keySeqItem->
text() );
118 removeDuplicateKeySequence(&setting, keySequence);
121 setting.setValue(strCmdName, strKeySeq);
125 treeModelLoadShortcutsSetting();
127 qDebug() <<
"Shortcut " << strCmdName <<
" = " << strKeySeq;
130 void ShortcutsPage::saveShortcutsButtonClicked()
132 QSettings settings( PENCIL2D, PENCIL2D );
133 settings.beginGroup(
"LastSavePath" );
135 QString fDir = settings.value(
"Shortcuts").toString();
140 tr(
"Save Pencil2D Shortcut file"),
141 fDir +
"/" +
tr(
"untitled.pcls"),
142 tr(
"Pencil2D Shortcut File(*.pcls)"));
143 settings.setValue(
"Shortcuts", fileName);
147 settings.beginGroup(
"shortcuts" );
148 out.beginGroup(
"shortcuts");
150 foreach (
QString key, settings.allKeys())
152 out.setValue(key, settings.value(key));
156 void ShortcutsPage::loadShortcutsButtonClicked()
158 QSettings settings( PENCIL2D, PENCIL2D );
159 settings.beginGroup(
"LastSavePath");
160 QString fDir = settings.value(
"Shortcuts").toString();
166 tr(
"Open Pencil2D Shortcut file"),
168 tr(
"Pencil2D Shortcut File(*.pcls)"));
172 qDebug() <<
"Shortcut file not readable";
177 if (input.status() !=
QSettings::NoError || !input.childGroups().contains(
"shortcuts"))
179 qDebug() <<
"Error accessing or parsing shortcut file" << input.status();
183 input.beginGroup(
"shortcuts");
184 settings.beginGroup(
"shortcuts");
185 foreach (
QString pShortcutsKey, input.allKeys())
187 settings.setValue(pShortcutsKey, input.value(pShortcutsKey));
190 treeModelLoadShortcutsSetting();
193 void ShortcutsPage::restoreShortcutsButtonClicked()
195 restoreShortcutsToDefault();
196 treeModelLoadShortcutsSetting();
203 if (strTargetCmdName == strCmdName)
230 void ShortcutsPage::treeModelLoadShortcutsSetting()
233 QSettings settings( PENCIL2D, PENCIL2D );
242 const QString &strShortcutName = getHumanReadableShortcutName(strCmdName);
243 if (strShortcutName.
isEmpty()) {
253 if (m_treeModel->
item(row , ACT_NAME_COLUMN) ==
nullptr)
255 if (m_treeModel->
item(row, KEY_SEQ_COLUMN) ==
nullptr)
258 m_treeModel->
item(row, ACT_NAME_COLUMN)->
setData(strCmdName);
259 m_treeModel->
item(row, ACT_NAME_COLUMN)->
setText(strShortcutName);
261 m_treeModel->
item(row, KEY_SEQ_COLUMN)->
setText(strKeySequence);
269 ui->treeView->resizeColumnToContents( 0 );
272 void ShortcutsPage::clearButtonClicked()
274 if ( !m_currentItemIndex.
isValid() )
279 int row = m_currentItemIndex.
row();
285 setting.setValue( strCmdName,
"" );
288 ui->keySequenceEdit->clear();
290 treeModelLoadShortcutsSetting();
299 static QString getHumanReadableShortcutName(
const QString& cmdName)
302 {CMD_ADD_FRAME,
QObject::tr(
"Add Frame",
"Shortcut")},
303 {CMD_CLEAR_FRAME,
QObject::tr(
"Clear Frame",
"Shortcut")},
306 {CMD_DELETE_CUR_LAYER,
QObject::tr(
"Delete Current Layer",
"Shortcut")},
307 {CMD_DESELECT_ALL,
QObject::tr(
"Deselect All",
"Shortcut")},
308 {CMD_DUPLICATE_FRAME,
QObject::tr(
"Duplicate Frame",
"Shortcut")},
310 {CMD_EXPORT_IMAGE,
QObject::tr(
"Export Image",
"Shortcut")},
311 {CMD_EXPORT_IMAGE_SEQ,
QObject::tr(
"Export Image Sequence",
"Shortcut")},
312 {CMD_EXPORT_MOVIE,
QObject::tr(
"Export Movie",
"Shortcut")},
313 {CMD_EXPORT_PALETTE,
QObject::tr(
"Export Palette",
"Shortcut")},
314 {CMD_EXPORT_SOUND,
QObject::tr(
"Export Sound",
"Shortcut")},
315 {CMD_FLIP_HORIZONTAL,
QObject::tr(
"Horizontal Flip",
"Shortcut")},
316 {CMD_FLIP_INBETWEEN,
QObject::tr(
"Flip In-Between",
"Shortcut")},
317 {CMD_FLIP_ROLLING,
QObject::tr(
"Flip Rolling",
"Shortcut")},
318 {CMD_FLIP_VERTICAL,
QObject::tr(
"Vertical Flip",
"Shortcut")},
319 {CMD_GOTO_NEXT_FRAME,
QObject::tr(
"Next Frame",
"Shortcut")},
320 {CMD_GOTO_NEXT_KEY_FRAME,
QObject::tr(
"Next Keyframe",
"Shortcut")},
321 {CMD_GOTO_PREV_FRAME,
QObject::tr(
"Previous Frame",
"Shortcut")},
322 {CMD_GOTO_PREV_KEY_FRAME,
QObject::tr(
"Previous Keyframe",
"Shortcut")},
323 {CMD_GRID,
QObject::tr(
"Toggle Grid",
"Shortcut")},
324 {CMD_IMPORT_IMAGE,
QObject::tr(
"Import Image",
"Shortcut")},
325 {CMD_IMPORT_IMAGE_SEQ,
QObject::tr(
"Import Image Sequence",
"Shortcut")},
326 {CMD_IMPORT_SOUND,
QObject::tr(
"Import Sound",
"Shortcut")},
327 {CMD_ALL_LAYER_VISIBILITY,
QObject::tr(
"Show All Layers",
"Shortcut")},
328 {CMD_CURRENT_LAYER_VISIBILITY,
QObject::tr(
"Show Current Layer Only",
"Shortcut")},
329 {CMD_RELATIVE_LAYER_VISIBILITY,
QObject::tr(
"Show Layers Relative to Current Layer",
"Shortcut")},
330 {CMD_LOOP,
QObject::tr(
"Toggle Loop",
"Shortcut")},
331 {CMD_MOVE_FRAME_BACKWARD,
QObject::tr(
"Move Frame Backward",
"Shortcut")},
332 {CMD_MOVE_FRAME_FORWARD,
QObject::tr(
"Move Frame Forward",
"Shortcut")},
333 {CMD_NEW_BITMAP_LAYER,
QObject::tr(
"New Bitmap Layer",
"Shortcut")},
334 {CMD_NEW_CAMERA_LAYER,
QObject::tr(
"New Camera Layer",
"Shortcut")},
335 {CMD_NEW_FILE,
QObject::tr(
"New File",
"Shortcut")},
336 {CMD_NEW_SOUND_LAYER,
QObject::tr(
"New Sound Layer",
"Shortcut")},
337 {CMD_NEW_VECTOR_LAYER,
QObject::tr(
"New Vector Layer",
"Shortcut")},
338 {CMD_ONIONSKIN_NEXT,
QObject::tr(
"Toggle Next Onion Skin",
"Shortcut")},
339 {CMD_ONIONSKIN_PREV,
QObject::tr(
"Toggle Previous Onion Skin",
"Shortcut")},
340 {CMD_OPEN_FILE,
QObject::tr(
"Open File",
"Shortcut")},
343 {CMD_PREFERENCE,
QObject::tr(
"Preferences",
"Shortcut")},
346 {CMD_REMOVE_FRAME,
QObject::tr(
"Remove Frame",
"Shortcut")},
347 {CMD_RESET_WINDOWS,
QObject::tr(
"Reset Windows",
"Shortcut")},
348 {CMD_RESET_ZOOM_ROTATE,
QObject::tr(
"Reset View",
"Shortcut")},
349 {CMD_CENTER_VIEW,
QObject::tr(
"Center View",
"Shortcut")},
350 {CMD_ROTATE_ANTI_CLOCK,
QObject::tr(
"Rotate Anticlockwise",
"Shortcut")},
351 {CMD_ROTATE_CLOCK,
QObject::tr(
"Rotate Clockwise",
"Shortcut")},
352 {CMD_RESET_ROTATION,
QObject::tr(
"Reset Rotation",
"Shortcut")},
353 {CMD_SAVE_AS,
QObject::tr(
"Save File As",
"Shortcut")},
354 {CMD_SAVE_FILE,
QObject::tr(
"Save File",
"Shortcut")},
355 {CMD_SELECT_ALL,
QObject::tr(
"Select All",
"Shortcut")},
356 {CMD_TOGGLE_COLOR_INSPECTOR,
QObject::tr(
"Toggle Color Inspector Window Visibility",
"Shortcut")},
357 {CMD_TOGGLE_COLOR_LIBRARY,
QObject::tr(
"Toggle Color Palette Window Visibility",
"Shortcut")},
358 {CMD_TOGGLE_COLOR_WHEEL,
QObject::tr(
"Toggle Color Box Window Visibility",
"Shortcut")},
359 {CMD_TOGGLE_DISPLAY_OPTIONS,
QObject::tr(
"Toggle Display Window Visibility",
"Shortcut")},
360 {CMD_TOGGLE_ONION_SKIN,
QObject::tr(
"Toggle Onion Skins Window Visibility",
"Shortcut")},
361 {CMD_TOGGLE_TIMELINE,
QObject::tr(
"Toggle Timeline Window Visibility",
"Shortcut")},
362 {CMD_TOGGLE_TOOLBOX,
QObject::tr(
"Toggle Tools Window Visibility",
"Shortcut")},
363 {CMD_TOGGLE_TOOL_OPTIONS,
QObject::tr(
"Toggle Options Window Visibility",
"Shortcut")},
364 {CMD_TOOL_BRUSH,
QObject::tr(
"Brush Tool",
"Shortcut")},
365 {CMD_TOOL_BUCKET,
QObject::tr(
"Bucket Tool",
"Shortcut")},
366 {CMD_TOOL_ERASER,
QObject::tr(
"Eraser Tool",
"Shortcut")},
367 {CMD_TOOL_EYEDROPPER,
QObject::tr(
"Eyedropper Tool",
"Shortcut")},
368 {CMD_TOOL_HAND,
QObject::tr(
"Hand Tool",
"Shortcut")},
369 {CMD_TOOL_MOVE,
QObject::tr(
"Move Tool",
"Shortcut")},
370 {CMD_TOOL_PEN,
QObject::tr(
"Pen Tool",
"Shortcut")},
371 {CMD_TOOL_PENCIL,
QObject::tr(
"Pencil Tool",
"Shortcut")},
372 {CMD_TOOL_POLYLINE,
QObject::tr(
"Polyline Tool",
"Shortcut")},
373 {CMD_TOOL_SELECT,
QObject::tr(
"Select Tool",
"Shortcut")},
374 {CMD_TOOL_SMUDGE,
QObject::tr(
"Smudge Tool",
"Shortcut")},
376 {CMD_ZOOM_100,
QObject::tr(
"Set Zoom to 100%",
"Shortcut")},
377 {CMD_ZOOM_200,
QObject::tr(
"Set Zoom to 200%",
"Shortcut")},
378 {CMD_ZOOM_25,
QObject::tr(
"Set Zoom to 25%",
"Shortcut")},
379 {CMD_ZOOM_300,
QObject::tr(
"Set Zoom to 300%",
"Shortcut")},
380 {CMD_ZOOM_33,
QObject::tr(
"Set Zoom to 33%",
"Shortcut")},
381 {CMD_ZOOM_400,
QObject::tr(
"Set Zoom to 400%",
"Shortcut")},
382 {CMD_ZOOM_50,
QObject::tr(
"Set Zoom to 50%",
"Shortcut")},
384 {CMD_ZOOM_OUT,
QObject::tr(
"Zoom Out",
"Shortcut")},
387 return humanReadableShortcutNames.
value(cmdName,
QString());
QString tr(const char *sourceText, const char *disambiguation, int n)
QString text() const const
virtual void setData(const QVariant &value, int role)
void setValue(const QString &key, const QVariant &value)
bool isValid() const const
void setItem(int row, int column, QStandardItem *item)
bool isEmpty() const const
virtual int columnCount(const QModelIndex &parent) const const override
const T value(const Key &key) const const
QStandardItem * item(int row, int column) const const
void setText(const QString &text)
QVariant value(const QString &key, const QVariant &defaultValue) const const
QString toString(QKeySequence::SequenceFormat format) const const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QStringList allKeys() const const
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
void clicked(const QModelIndex &index)
void keySequence(QWindow *window, const QKeySequence &keySequence)
void setRowCount(int rows)
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString toString() const const
virtual QVariant data(int role) const const
void setEditable(bool editable)
void beginGroup(const QString &prefix)