]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt/GuiFontMetrics.h
Make string-widget combination more l7n friendly
[lyx.git] / src / frontends / qt / GuiFontMetrics.h
index c19a3cd426cbe10d2f3200acaa6860f635e30725..5c32ea9de89237cc9e6822ff50b1cb4ed84c86b9 100644 (file)
 namespace lyx {
 namespace frontend {
 
+struct TextLayoutHelper;
+
+struct BreakStringKey
+{
+       bool operator==(BreakStringKey const & key) const {
+               return key.s == s && key.first_wid == first_wid && key.wid == wid
+                       && key.rtl == rtl && key.force == force;
+       }
+
+       docstring s;
+       int first_wid;
+       int wid;
+       bool rtl;
+       bool force;
+};
+
+struct TextLayoutKey
+{
+       bool operator==(TextLayoutKey const & key) const {
+               return key.s == s && key.rtl == rtl && key.ws == ws;
+       }
+
+       docstring s;
+       bool rtl;
+       double ws;
+};
+
+
 class GuiFontMetrics : public FontMetrics
 {
 public:
@@ -34,51 +62,53 @@ public:
 
        virtual ~GuiFontMetrics() {}
 
-       virtual int maxAscent() const;
-       virtual int maxDescent() const;
-       virtual Dimension const defaultDimension() const;
-       virtual int em() const;
-       virtual int xHeight() const;
-       virtual int lineWidth() const;
-       virtual int underlinePos() const;
-       virtual int strikeoutPos() const;
-       virtual bool italic() const;
-       virtual double italicSlope() const;
-       virtual int width(char_type c) const;
-       virtual int ascent(char_type c) const;
-       virtual int descent(char_type c) const;
-       virtual int lbearing(char_type c) const;
-       virtual int rbearing(char_type c) const;
-       virtual int width(docstring const & s) const;
-       virtual int signedWidth(docstring const & s) const;
-       virtual int pos2x(docstring const & s, int pos, bool rtl, double ws) const;
-       virtual int x2pos(docstring const & s, int & x, bool rtl, double ws) const;
-       virtual bool breakAt(docstring & s, int & x, bool rtl, bool force) const;
-       virtual Dimension const dimension(char_type c) const;
-
-       virtual void rectText(docstring const & str,
+       int maxAscent() const override;
+       int maxDescent() const override;
+       Dimension const defaultDimension() const override;
+       int em() const override;
+       int xHeight() const override;
+       int lineWidth() const override;
+       int underlinePos() const override;
+       int strikeoutPos() const override;
+       bool italic() const override;
+       double italicSlope() const override;
+       int width(char_type c) const override;
+       int ascent(char_type c) const override;
+       int descent(char_type c) const override;
+       int lbearing(char_type c) const override;
+       int rbearing(char_type c) const override;
+       int width(docstring const & s) const override;
+       int signedWidth(docstring const & s) const override;
+       int pos2x(docstring const & s, int pos, bool rtl, double ws) const override;
+       int x2pos(docstring const & s, int & x, bool rtl, double ws) const override;
+       Breaks breakString(docstring const & s, int first_wid, int wid, bool rtl, bool force) const override;
+       Dimension const dimension(char_type c) const override;
+
+       void rectText(docstring const & str,
                int & width,
                int & ascent,
-               int & descent) const;
-       virtual void buttonText(docstring const & str,
+               int & descent) const override;
+       void buttonText(docstring const & str,
                const int offset,
                int & width,
                int & ascent,
-               int & descent) const;
+               int & descent) const override;
 
-       int countExpanders(docstring const & str) const;
        ///
        int width(QString const & str) const;
 
        /// Return a pointer to a cached QTextLayout object
        std::shared_ptr<QTextLayout const>
-       getTextLayout(docstring const & s, bool const rtl,
-                     double const wordspacing) const;
+       getTextLayout(docstring const & s, bool const rtl, double const wordspacing) const;
 
 private:
 
-       std::pair<int, int> breakAt_helper(docstring const & s, int const x,
-                                          bool const rtl, bool const force) const;
+       Breaks breakString_helper(docstring const & s, int first_wid, int wid,
+                                 bool rtl, bool force) const;
+
+       /// A different version of getTextLayout for internal use
+       std::shared_ptr<QTextLayout const>
+       getTextLayout(TextLayoutHelper const & tlh, double const wordspacing) const;
 
        /// The font
        QFont font_;
@@ -93,10 +123,10 @@ private:
        mutable QHash<char_type, int> width_cache_;
        /// Cache of string widths
        mutable Cache<docstring, int> strwidth_cache_;
-       /// Cache for breakAt
-       mutable Cache<docstring, std::pair<int, int>> breakat_cache_;
+       /// Cache for breakString
+       mutable Cache<BreakStringKey, Breaks> breakstr_cache_;
        /// Cache for QTextLayout
-       mutable Cache<docstring, std::shared_ptr<QTextLayout>> qtextlayout_cache_;
+       mutable Cache<TextLayoutKey, std::shared_ptr<QTextLayout>> qtextlayout_cache_;
 
        struct AscendDescend {
                int ascent;