fixes #0002833: [Spreadsheet] Keyboard events are sent to the wrong viewprovider

This commit is contained in:
wmayer
2018-09-12 17:40:57 +02:00
parent ef42cfb5d6
commit 4d47ce619e
5 changed files with 58 additions and 15 deletions

View File

@@ -328,10 +328,59 @@ bool SheetTableView::event(QEvent *event)
return true;
}
}
else if (kevent->key() == Qt::Key_Delete) {
deleteSelection();
return true;
}
}
else if (event->type() == QEvent::ShortcutOverride) {
QKeyEvent * kevent = static_cast<QKeyEvent*>(event);
if (kevent->modifiers() == Qt::NoModifier ||
kevent->modifiers() == Qt::ShiftModifier ||
kevent->modifiers() == Qt::KeypadModifier) {
switch (kevent->key()) {
case Qt::Key_Return:
case Qt::Key_Enter:
case Qt::Key_Delete:
case Qt::Key_Home:
case Qt::Key_End:
case Qt::Key_Backspace:
case Qt::Key_Left:
case Qt::Key_Right:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Tab:
kevent->accept();
default:
break;
}
if (kevent->key() < Qt::Key_Escape) {
kevent->accept();
}
}
}
return QTableView::event(event);
}
void SheetTableView::deleteSelection()
{
QModelIndexList selection = selectionModel()->selectedIndexes();
if (selection.size() > 0) {
Gui::Command::openCommand("Clear cell(s)");
std::vector<Range> ranges = selectedRanges();
std::vector<Range>::const_iterator i = ranges.begin();
for (; i != ranges.end(); ++i) {
Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.clear('%s')", sheet->getNameInDocument(),
i->rangeString().c_str());
}
Gui::Command::commitCommand();
Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()");
}
}
void SheetTableView::closeEditor(QWidget * editor, QAbstractItemDelegate::EndEditHint hint)
{
SpreadsheetGui::LineEdit * le = qobject_cast<SpreadsheetGui::LineEdit*>(editor);

View File

@@ -58,6 +58,7 @@ public:
void edit(const QModelIndex &index);
void setSheet(Spreadsheet::Sheet *_sheet);
std::vector<App::Range> selectedRanges() const;
void deleteSelection();
protected Q_SLOTS:
void commitData(QWidget *editor);
void updateCellSpan(App::CellAddress address);

View File

@@ -332,6 +332,11 @@ QModelIndexList SheetView::selectedIndexes() const
return ui->cells->selectionModel()->selectedIndexes();
}
void SheetView::deleteSelection()
{
ui->cells->deleteSelection();
}
QModelIndex SheetView::currentIndex() const
{
return ui->cells->currentIndex();

View File

@@ -75,6 +75,8 @@ public:
QModelIndex currentIndex() const;
void deleteSelection();
PyObject *getPyObject(void);
virtual void deleteSelf();

View File

@@ -154,21 +154,7 @@ bool ViewProviderSheet::onDelete(const std::vector<std::string> &)
SpreadsheetGui::SheetView * sheetView = freecad_dynamic_cast<SpreadsheetGui::SheetView>(activeWindow);
if (sheetView) {
Sheet * sheet = sheetView->getSheet();
QModelIndexList selection = sheetView->selectedIndexes();
if (selection.size() > 0) {
Gui::Command::openCommand("Clear cell(s)");
std::vector<Range> ranges = sheetView->selectedRanges();
std::vector<Range>::const_iterator i = ranges.begin();
for (; i != ranges.end(); ++i) {
Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.clear('%s')", sheet->getNameInDocument(),
i->rangeString().c_str());
}
Gui::Command::commitCommand();
Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()");
}
sheetView->deleteSelection();
}
}