From d8f6e65ec73e3a4aa4bfba510ee42dbe353e2742 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 14 Mar 2016 11:46:28 +0100 Subject: [PATCH] Make inset-select-all select all cells only in tables inset-select-all has 3 levels 1. select current cell 2. select all cells 3. select inset from outside. The second level makes sense for tables (text and math), but not for things like a math fraction. Introduce a new method Inset::isTable() that allows to detect this case properly and skip level 2. --- src/BufferView.cpp | 23 ++++++++++++++--------- src/insets/Inset.h | 2 ++ src/insets/InsetTabular.h | 2 ++ src/mathed/InsetMathGrid.h | 2 ++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 56ecd94e29..414dbf216d 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1777,21 +1777,25 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } - case LFUN_INSET_SELECT_ALL: - if (cur.depth() > 1 + case LFUN_INSET_SELECT_ALL: { + // true if all cells are selected + bool const all_selected = cur.depth() > 1 && cur.selBegin().at_begin() - && cur.selEnd().at_end()) { - // All the contents of the inset if selected. + && cur.selEnd().at_end(); + // true if some cells are selected + bool const cells_selected = cur.depth() > 1 + && cur.selBegin().at_cell_begin() + && cur.selEnd().at_cell_end(); + if (all_selected || (cells_selected && !cur.inset().isTable())) { + // All the contents of the inset if selected, or only at + // least one cell but inset is not a table. // Select the inset from outside. cur.pop(); cur.resetAnchor(); cur.setSelection(true); cur.posForward(); - } else if (cur.selBegin().idx() != cur.selEnd().idx() - || (cur.depth() > 1 - && cur.selBegin().at_cell_begin() - && cur.selEnd().at_cell_end())) { - // At least one complete cell is selected. + } else if (cells_selected) { + // At least one complete cell is selected and inset is a table. // Select all cells cur.idx() = 0; cur.pos() = 0; @@ -1811,6 +1815,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) cur.setCurrentFont(); dr.screenUpdate(Update::Force); break; + } // This would be in Buffer class if only Cursor did not diff --git a/src/insets/Inset.h b/src/insets/Inset.h index c413f9b4cc..cbcaf518a2 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -347,6 +347,8 @@ public: virtual bool clickable(BufferView const &, int, int) const { return false; } /// Move one cell backwards virtual bool allowsCaptionVariation(std::string const &) const { return false; } + // true for insets that have a table structure (InsetMathGrid, InsetTabular) + virtual bool isTable() const { return false; } /// does this contain text that can be change track marked in DVI? virtual bool canTrackChanges() const { return false; } diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 6b60e44acb..5b5f836cbc 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -881,6 +881,8 @@ public: bool inheritFont() const { return false; } /// bool allowsCaptionVariation(std::string const &) const; + // + bool isTable() const { return true; } /// DisplayType display() const; /// diff --git a/src/mathed/InsetMathGrid.h b/src/mathed/InsetMathGrid.h index 7faf938818..e9ea396930 100644 --- a/src/mathed/InsetMathGrid.h +++ b/src/mathed/InsetMathGrid.h @@ -154,6 +154,8 @@ public: InsetMathGrid * asGridInset() { return this; } /// identifies GridInset InsetMathGrid const * asGridInset() const { return this; } + // + bool isTable() const { return true; } /// col_type ncols() const; ///