From 0ea92e677a80692896695c3802e8643dc99af253 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 2 Feb 2016 17:07:29 +0100 Subject: [PATCH] Change mouse cursor on tabular selection zones This is done by implementing the clickable method. It is not possible yet to have the usual left and down arrows, because Qt does not implement them as far as I can see. Factor the code that triggers row/column selection and fix the logic. Now it is possible to select also at the right of the tabular inset. --- src/insets/InsetTabular.cpp | 30 +++++++++++++++++++++++++----- src/insets/InsetTabular.h | 7 +++++++ status.22x | 4 +++- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 4f94c8333f..ac63676369 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3951,6 +3951,29 @@ void InsetTabular::addToToc(DocIterator const & cpit, bool output_active, } +bool InsetTabular::hitSelectRow(BufferView const & bv, int x) const +{ + int const x0 = xo(bv) + ADD_TO_TABULAR_WIDTH; + return x < x0 || x > x0 + tabular.width(); +} + + +bool InsetTabular::hitSelectColumn(BufferView const & bv, int y) const +{ + int const y0 = yo(bv) - tabular.rowAscent(0) + offset_valign_; + // FIXME: using ADD_TO_TABULAR_WIDTH is not really correct since + // there is no margin added vertically to tabular insets. + // However, it works for now. + return y < y0 + ADD_TO_TABULAR_WIDTH || y > y0 + tabular.height() - ADD_TO_TABULAR_WIDTH; +} + + +bool InsetTabular::clickable(BufferView const & bv, int x, int y) const +{ + return hitSelectRow(bv, x) || hitSelectColumn(bv, y); +} + + void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) { LYXERR(Debug::DEBUG, "# InsetTabular::doDispatch: cmd: " << cmd @@ -3965,8 +3988,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_MOUSE_PRESS: { //lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl; // select row - if (cmd.x() < xo(cur.bv()) + ADD_TO_TABULAR_WIDTH - || cmd.x() > xo(cur.bv()) + tabular.width()) { + if (hitSelectRow(cur.bv(), cmd.x())) { row_type r = rowFromY(cur, cmd.y()); cur.idx() = tabular.getFirstCellInRow(r); cur.pit() = 0; @@ -3981,9 +4003,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) break; } // select column - int const y0 = yo(cur.bv()) - tabular.rowAscent(0) + offset_valign_; - if (cmd.y() < y0 + ADD_TO_TABULAR_WIDTH - || cmd.y() > y0 + tabular.height()) { + if (hitSelectColumn(cur.bv(), cmd.y())) { col_type c = columnFromX(cur, cmd.x()); cur.idx() = tabular.cellIndex(0, c); cur.pit() = 0; diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index de664f15be..bb36b7f13d 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -1003,6 +1003,13 @@ private: /// Inset * clone() const { return new InsetTabular(*this); } + /// + bool hitSelectRow(BufferView const & bv, int x) const; + /// + bool hitSelectColumn(BufferView const & bv, int y) const; + /// Returns true if coordinates are on row/column selection zones + bool clickable(BufferView const &, int x, int y) const; + /// void drawCellLines(PainterInfo &, int x, int y, row_type row, idx_type cell) const; diff --git a/status.22x b/status.22x index bbd3ac8531..0f107e97a2 100644 --- a/status.22x +++ b/status.22x @@ -33,7 +33,9 @@ What's new - Increase the maximum value for the number of last open files that LyX can remember (bug 9924). - +- Change mouse cursor to indicate row/column selection in tabulars. + + * DOCUMENTATION AND LOCALIZATION -- 2.39.5