summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2019-01-12 17:51:29 +0100
committerArno <arno@disconnect.de>2019-01-12 17:51:29 +0100
commit4e5e0e6ec5668a0f0397dd8acbee0bd2f4bd0f67 (patch)
tree9c2ae637ff28d4e22af3a39ab31447dee44622ea
parent1836f0768e3e7f38d4957f9348995cb062f55a07 (diff)
downloadSheMov-4e5e0e6ec5668a0f0397dd8acbee0bd2f4bd0f67.tar.gz
SheMov-4e5e0e6ec5668a0f0397dd8acbee0bd2f4bd0f67.tar.bz2
SheMov-4e5e0e6ec5668a0f0397dd8acbee0bd2f4bd0f67.zip
Make NewPicsDialog usable by keyboard
Fix focus policy: only change focus between MappingTreeWidget and MappingTreeResultView. Also, block updating the selection of MappingTreeWidget when removing an item from the result view. That operation resets the result selection and by signal changes the selection of the mapping tree. The easiest way I could come up with was a member flag that is set in removeMapping and checked and cleared in resultSelectionChanged. Clearing the flag right after removing the item doesn't work, most likely because of thread affinity (just a guess, didn't check it). If it has side effects remains to be seen...
-rw-r--r--mappingeditwidget.cpp16
-rw-r--r--mappingeditwidget.h2
-rw-r--r--mappingtreewidget.cpp1
-rw-r--r--newpicsdialog.cpp3
4 files changed, 21 insertions, 1 deletions
diff --git a/mappingeditwidget.cpp b/mappingeditwidget.cpp
index a08bb81..6e1a60f 100644
--- a/mappingeditwidget.cpp
+++ b/mappingeditwidget.cpp
@@ -37,14 +37,19 @@ MappingEditWidget::MappingEditWidget(QWidget *parent) : QWidget(parent){
//buttons
QPushButton *addMappingB = new QPushButton(tr(">>"));
+ addMappingB->setFocusPolicy(Qt::ClickFocus);
connect(addMappingB, &QPushButton::clicked, this, &MappingEditWidget::addMapping);
QPushButton *removeMappingB = new QPushButton(tr("<<"));
+ removeMappingB->setFocusPolicy(Qt::ClickFocus);
connect(removeMappingB, &QPushButton::clicked, this, &MappingEditWidget::removeMapping);
QPushButton *clearMappingB = new QPushButton(tr("&Clear"));
+ clearMappingB->setFocusPolicy(Qt::ClickFocus);
connect(clearMappingB, &QPushButton::clicked, this, &MappingEditWidget::clearMapping);
QPushButton *addTreeB = new QPushButton(tr(">>>>"));
+ addTreeB->setFocusPolicy(Qt::ClickFocus);
connect(addTreeB, &QPushButton::clicked, this, &MappingEditWidget::addTree);
QPushButton *copyActorB = new QPushButton(tr("Copy"));
+ copyActorB->setFocusPolicy(Qt::ClickFocus);
connect(copyActorB, &QPushButton::clicked, this, &MappingEditWidget::copyActor);
//layout
@@ -87,6 +92,9 @@ void MappingEditWidget::removeMapping(){
}
QModelIndex firstIdx = sel.first();
if(firstIdx.isValid()){
+ // removing an item from the model inevitably calls resultSelctionChanged
+ // check and clear the flag there!
+ blockResultChange(true);
mResultModel->removeItem(firstIdx);
}
mMappingResult->expandAll();
@@ -146,6 +154,10 @@ void MappingEditWidget::loadMappings(QString from){
void MappingEditWidget::resultSelectionChanged(const QModelIndex &current, const QModelIndex &previous){
Q_UNUSED(previous)
+ if(mBlockResultChange){
+ blockResultChange(false);
+ return;
+ }
QStringList path;
QModelIndex c = current;
// gather elements from leaf to root
@@ -167,7 +179,9 @@ void MappingEditWidget::resultSelectionChanged(const QModelIndex &current, const
// yes, we have a valid index. Map it to the Proxy...
QModelIndex real = mMappingTree->mappingTreeProxy()->mapFromSource(srcIdx);
// select it and make sure it's visible!
- mMappingTree->mappingTreeView()->selectionModel()->select(real, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+ mMappingTree->mappingTreeView()->selectionModel()->clear();
+ mMappingTree->mappingTreeView()->selectionModel()->select(real, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
+ mMappingTree->mappingTreeView()->selectionModel()->setCurrentIndex(real, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
mMappingTree->mappingTreeView()->scrollTo(real, QAbstractItemView::PositionAtCenter);
}
diff --git a/mappingeditwidget.h b/mappingeditwidget.h
index 3044d80..54fdf0c 100644
--- a/mappingeditwidget.h
+++ b/mappingeditwidget.h
@@ -23,6 +23,7 @@ class MappingEditWidget : public QWidget {
explicit MappingEditWidget(QWidget *parent = nullptr);
MappingTreeResultModel *model() const { return mResultModel; }
MappingTreeWidget *treeWidget() const { return mMappingTree; }
+ void blockResultChange(bool c) { mBlockResultChange = c; }
public slots:
void addMapping();
@@ -42,6 +43,7 @@ class MappingEditWidget : public QWidget {
MappingTreeWidget *mMappingTree;
MappingTreeResultView *mMappingResult;
MappingTreeResultModel *mResultModel;
+ bool mBlockResultChange = false;
};
#endif // MAPPINGEDITWIDGET_H
diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp
index b1a2b8b..38e6c9a 100644
--- a/mappingtreewidget.cpp
+++ b/mappingtreewidget.cpp
@@ -86,6 +86,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){
// filter + refresh
QIcon swordIcon(Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), QChar(0x2694), true, false));
mFilter = new QLineEdit;
+ mFilter->setFocusPolicy(Qt::ClickFocus);
connect(mFilter, &QLineEdit::returnPressed, this, &MappingTreeWidget::filter);
QToolBar *filterTB = new QToolBar;
QAction *doFilterA = new QAction(Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), QChar(0x2245), true, false), tr("Filter"), this);
diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp
index 4fe8f42..dd59f8e 100644
--- a/newpicsdialog.cpp
+++ b/newpicsdialog.cpp
@@ -64,8 +64,10 @@ void NewPicsDialog::setupDlg(){
//dialog buttons
mOk = new QPushButton(tr("Ok"));
+ mOk->setFocusPolicy(Qt::ClickFocus);
connect(mOk, &QPushButton::clicked, this, &NewPicsDialog::accept);
mCancel = new QPushButton(tr("Cancel"));
+ mCancel->setFocusPolicy(Qt::ClickFocus);
connect(mCancel, &QPushButton::clicked, this, &NewPicsDialog::reject);
QHBoxLayout *dlgButtonLayout = new QHBoxLayout;
dlgButtonLayout->addStretch();
@@ -78,6 +80,7 @@ void NewPicsDialog::setupDlg(){
mTab = new QTabWidget;
mTab->addTab(mFilesWidget, tr("Files"));
mTab->addTab(mMappingEditWidget, tr("Mappings"));
+ mTab->setFocusPolicy(Qt::ClickFocus);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(mTab);
mainLayout->addLayout(dlgButtonLayout);