]> git.lyx.org Git - lyx.git/blobdiff - src/CoordCache.h
Compil fix
[lyx.git] / src / CoordCache.h
index a93696df1e7a9dd0cbd4021b82957d5722ad9985..a666a4ecb025bb291b1eecc6ec8d3f5b5c279107 100644 (file)
@@ -3,7 +3,7 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author André Pönitz
+ * \author André Pönitz
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -29,21 +29,36 @@ class Paragraph;
 
 void lyxbreaker(void const * data, const char * hint, int size);
 
-class Point {
-public:
-       Point()
-               : x_(0), y_(0)
-       {}
+struct Geometry {
+       Point pos;
+       Dimension dim;
 
-       Point(int x, int y);
+       bool covers(int x, int y) const
+       {
+               return x >= pos.x_
+                       && x <= pos.x_ + dim.wid
+                       && y >= pos.y_ - dim.asc
+                       && y <= pos.y_ + dim.des;
+       }
 
-       int x_, y_;
-};
+       int squareDistance(int x, int y) const
+       {
+               int xx = 0;
+               int yy = 0;
 
+               if (x < pos.x_)
+                       xx = pos.x_ - x;
+               else if (x > pos.x_ + dim.wid)
+                       xx = x - pos.x_ - dim.wid;
 
-struct Geometry {
-       Point pos;
-       Dimension dim;
+               if (y < pos.y_ - dim.asc)
+                       yy = pos.y_ - dim.asc - y;
+               else if (y > pos.y_ + dim.des)
+                       yy = y - pos.y_ - dim.des;
+
+               // Optimisation: We avoid to compute the sqrt on purpose.
+               return xx*xx + yy*yy;
+       }
 };
 
 
@@ -69,9 +84,15 @@ public:
                data_[thing].dim = dim;
        }
 
+       Geometry const & geometry(T const * thing) const
+       {
+               check(thing, "geometry");
+               return data_.find(thing)->second;
+       }
+
        Dimension const & dim(T const * thing) const
        {
-               //check(thing, "dim");
+               check(thing, "dim");
                return data_.find(thing)->second.dim;
        }
 
@@ -98,11 +119,19 @@ public:
                return data_.find(thing) != data_.end();
        }
 
-//     T * find(int x, int y) const
-//     {
-//             T *
-//             cache_type iter
-//     }
+       bool covers(T const * thing, int x, int y) const
+       {
+               typename cache_type::const_iterator it = data_.find(thing);
+               return it != data_.end() && it->second.covers(x, y);
+       }
+
+       int squareDistance(T const * thing, int x, int y) const
+       {
+               typename cache_type::const_iterator it = data_.find(thing);
+               if (it == data_.end())
+                       return 1000000;
+               return it->second.squareDistance(x, y);
+       }
 
 private:
        friend class CoordCache;
@@ -121,14 +150,20 @@ public:
 };
 
 /**
- * A global cache that allows us to come from a paragraph in a document
- * to a position point on the screen.
+ * A BufferView dependent cache that allows us to come from an inset in
+ * a document to a position point and dimension on the screen.
  * All points cached in this cache are only valid between subsequent
  * updates. (x,y) == (0,0) is the upper left screen corner, x increases
  * to the right, y increases downwords.
- * The cache is built in BufferView::updateMetrics which is called
- * from BufferView::update. The individual points are added
- * while we paint them. See for instance paintPar in RowPainter.C.
+ * The dimension part is built in BufferView::updateMetrics() and the 
+ * diverse Inset::metrics() calls.
+ * The individual points are added at drawing time in
+ * BufferView::updateMetrics(). The math inset position are cached in
+ * the diverse InsetMathXXX::draw() calls and the in-text inset position
+ * are cached in RowPainter::paintInset().
+ * FIXME: For mathed, it would be nice if the insets did not saves their
+ * position themselves. That should be the duty of the containing math
+ * array.
  */
 class CoordCache {
 public: