]> git.lyx.org Git - features.git/commitdiff
Change mouse cursor on tabular selection zones
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 2 Feb 2016 16:07:29 +0000 (17:07 +0100)
committerRichard Heck <rgheck@lyx.org>
Sat, 28 May 2016 21:43:01 +0000 (17:43 -0400)
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
src/insets/InsetTabular.h

index 4f94c8333fa09b3c2f48dc68aed1a90f59956f08..7323560b55d7ba936cd0a78a3b88fe82549f88c7 100644 (file)
@@ -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.
+       // Howerver, 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;
index de664f15be2af1694a7b7aee81baf157f3b814ac..6b60e44acb7c2866dd2720df3602e5fee1fd1376 100644 (file)
@@ -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;