Skip to content

Commit f14a06c

Browse files
committedJan 14, 2020
Make table cell editing behave more like the spreadsheet style conventions
Where selecting a cell and then typing enters a "weak" edit mode, whereby pressing a cursor key will immediately end editing and move to another cell. But double-clicking a cell to edit enters a "strong" edit mode, where cursor key presses are used to navigate through the current cell text
1 parent 515a6b1 commit f14a06c

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed
 

‎src/gui/tableeditor/qgstableeditorwidget.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ QgsTableEditorWidget::QgsTableEditorWidget( QWidget *parent )
122122

123123
setItemDelegate( new QgsTableEditorDelegate( this ) );
124124

125+
126+
connect( this, &QTableWidget::cellDoubleClicked, this, [ = ]
127+
{
128+
if ( QgsTableEditorDelegate *d = qobject_cast< QgsTableEditorDelegate *>( itemDelegate( ) ) )
129+
{
130+
d->setWeakEditorMode( false );
131+
}
132+
} );
133+
125134
connect( selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsTableEditorWidget::activeCellChanged );
126135
}
127136

@@ -261,6 +270,10 @@ void QgsTableEditorWidget::keyPressEvent( QKeyEvent *event )
261270
default:
262271
QTableWidget::keyPressEvent( event );
263272
}
273+
if ( QgsTableEditorDelegate *d = qobject_cast< QgsTableEditorDelegate *>( itemDelegate( ) ) )
274+
{
275+
d->setWeakEditorMode( true );
276+
}
264277
}
265278

266279
void QgsTableEditorWidget::setTableContents( const QgsTableContents &contents )
@@ -903,21 +916,50 @@ void QgsTableEditorTextEdit::keyPressEvent( QKeyEvent *event )
903916
break;
904917
}
905918

919+
case Qt::Key_Right:
920+
case Qt::Key_Left:
921+
case Qt::Key_Up:
922+
case Qt::Key_Down:
923+
{
924+
if ( mWeakEditorMode )
925+
{
926+
// close editor and defer to table
927+
event->ignore();
928+
}
929+
else
930+
{
931+
QPlainTextEdit::keyPressEvent( event );
932+
}
933+
break;
934+
}
935+
906936
default:
907937
QPlainTextEdit::keyPressEvent( event );
908938
}
909939
}
910940

911941

942+
void QgsTableEditorTextEdit::setWeakEditorMode( bool weakEditorMode )
943+
{
944+
mWeakEditorMode = weakEditorMode;
945+
}
946+
947+
912948
QgsTableEditorDelegate::QgsTableEditorDelegate( QObject *parent )
913949
: QStyledItemDelegate( parent )
914950
{
915951

916952
}
917953

954+
void QgsTableEditorDelegate::setWeakEditorMode( bool weakEditorMode )
955+
{
956+
mWeakEditorMode = weakEditorMode;
957+
}
958+
918959
QWidget *QgsTableEditorDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &, const QModelIndex & ) const
919960
{
920961
QgsTableEditorTextEdit *w = new QgsTableEditorTextEdit( parent );
962+
w->setWeakEditorMode( mWeakEditorMode );
921963
return w;
922964
}
923965

‎src/gui/tableeditor/qgstableeditorwidget.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,42 @@ class QgsTableEditorTextEdit : public QPlainTextEdit
3434
public:
3535
QgsTableEditorTextEdit( QWidget *parent );
3636

37+
/**
38+
* Sets whether the editor is an a "weak" editor mode, where any
39+
* cursor key presses will be ignored by the editor and deferred to the table instead.
40+
*/
41+
void setWeakEditorMode( bool weakEditorMode );
42+
3743
protected:
3844

3945
void keyPressEvent( QKeyEvent *e ) override;
4046

47+
private:
48+
49+
bool mWeakEditorMode = false;
50+
4151
};
4252

4353
class QgsTableEditorDelegate : public QStyledItemDelegate
4454
{
4555
Q_OBJECT
4656
public:
4757
QgsTableEditorDelegate( QObject *parent );
58+
59+
/**
60+
* Sets whether the editor is an a "weak" editor mode, where any
61+
* cursor key presses will be ignored by the editor and deferred to the table instead.
62+
*/
63+
void setWeakEditorMode( bool weakEditorMode );
64+
4865
protected:
4966
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem & /*option*/, const QModelIndex &index ) const override;
5067
void setEditorData( QWidget *editor, const QModelIndex &index ) const override;
5168
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const override;
5269

70+
private:
71+
72+
bool mWeakEditorMode = false;
5373
};
5474

5575
///@endcond

0 commit comments

Comments
 (0)
Please sign in to comment.