]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiPainter.cpp
On Mac, moving down a paragraph should place the cursor at the end of the current...
[lyx.git] / src / frontends / qt4 / GuiPainter.cpp
index bda52f189049d209e71c050e24665e8db94da29a..ee0f65a3ce54f51350d9685a9b911de2099ff776 100644 (file)
@@ -44,6 +44,8 @@ using namespace std;
 
 namespace lyx {
 namespace frontend {
+  
+const float Painter::thin_line = 0.0;
 
 GuiPainter::GuiPainter(QPaintDevice * device)
        : QPainter(device), Painter(),
@@ -52,7 +54,7 @@ GuiPainter::GuiPainter(QPaintDevice * device)
        // new QPainter has default QPen:
        current_color_ = guiApp->colorCache().get(Color_black);
        current_ls_ = line_solid;
-       current_lw_ = line_thin;
+       current_lw_ = thin_line;
 }
 
 
@@ -64,7 +66,7 @@ GuiPainter::~GuiPainter()
 
 
 void GuiPainter::setQPainterPen(QColor const & col,
-       Painter::line_style ls, Painter::line_width lw)
+       Painter::line_style ls, float lw)
 {
        if (col == current_color_ && ls == current_ls_ && lw == current_lw_)
                return;
@@ -81,10 +83,7 @@ void GuiPainter::setQPainterPen(QColor const & col,
                case line_onoffdash: pen.setStyle(Qt::DotLine); break;
        }
 
-       switch (lw) {
-               case line_thin: pen.setWidth(0); break;
-               case line_thick: pen.setWidth(3); break;
-       }
+       pen.setWidthF(lw);
 
        setPen(pen);
 }
@@ -97,7 +96,9 @@ QString GuiPainter::generateStringSignature(QString const & str, FontInfo const
        sig.append(QChar(static_cast<short>(f.series())));
        sig.append(QChar(static_cast<short>(f.realShape())));
        sig.append(QChar(static_cast<short>(f.size())));
-       sig.append(QChar(static_cast<short>(f.color())));
+       Color const & color = f.realColor();
+       sig.append(QChar(static_cast<short>(color.baseColor)));
+       sig.append(QChar(static_cast<short>(color.mergeColor)));
        if (!monochrome_min_.empty()) {
                QColor const & min = monochrome_min_.top();
                QColor const & max = monochrome_max_.top();
@@ -112,7 +113,7 @@ QString GuiPainter::generateStringSignature(QString const & str, FontInfo const
 }
 
 
-QColor GuiPainter::computeColor(ColorCode col)
+QColor GuiPainter::computeColor(Color col)
 {
        return filterColor(guiApp->colorCache().get(col));
 }
@@ -144,7 +145,7 @@ QColor GuiPainter::filterColor(QColor const & col)
 }
 
 
-void GuiPainter::enterMonochromeMode(ColorCode const & min, ColorCode const & max)
+void GuiPainter::enterMonochromeMode(Color const & min, Color const & max)
 {
        QColor qmin = filterColor(guiApp->colorCache().get(min));
        QColor qmax = filterColor(guiApp->colorCache().get(max));
@@ -155,13 +156,13 @@ void GuiPainter::enterMonochromeMode(ColorCode const & min, ColorCode const & ma
 
 void GuiPainter::leaveMonochromeMode()
 {
-       LASSERT(!monochrome_min_.empty(), /**/);
+       LASSERT(!monochrome_min_.empty(), return);
        monochrome_min_.pop();
        monochrome_max_.pop();
 }
 
 
-void GuiPainter::point(int x, int y, ColorCode col)
+void GuiPainter::point(int x, int y, Color col)
 {
        if (!isDrawingEnabled())
                return;
@@ -172,9 +173,9 @@ void GuiPainter::point(int x, int y, ColorCode col)
 
 
 void GuiPainter::line(int x1, int y1, int x2, int y2,
-       ColorCode col,
+       Color col,
        line_style ls,
-       line_width lw)
+       float lw)
 {
        if (!isDrawingEnabled())
                return;
@@ -189,9 +190,9 @@ void GuiPainter::line(int x1, int y1, int x2, int y2,
 
 
 void GuiPainter::lines(int const * xp, int const * yp, int np,
-       ColorCode col,
+       Color col,
        line_style ls,
-       line_width lw)
+       float lw)
 {
        if (!isDrawingEnabled())
                return;
@@ -217,9 +218,9 @@ void GuiPainter::lines(int const * xp, int const * yp, int np,
 
 
 void GuiPainter::rectangle(int x, int y, int w, int h,
-       ColorCode col,
+       Color col,
        line_style ls,
-       line_width lw)
+       float lw)
 {
        if (!isDrawingEnabled())
                return;
@@ -229,7 +230,7 @@ void GuiPainter::rectangle(int x, int y, int w, int h,
 }
 
 
-void GuiPainter::fillRectangle(int x, int y, int w, int h, ColorCode col)
+void GuiPainter::fillRectangle(int x, int y, int w, int h, Color col)
 {
        if (!isDrawingEnabled())
                return;
@@ -239,7 +240,7 @@ void GuiPainter::fillRectangle(int x, int y, int w, int h, ColorCode col)
 
 
 void GuiPainter::arc(int x, int y, unsigned int w, unsigned int h,
-       int a1, int a2, ColorCode col)
+       int a1, int a2, Color col)
 {
        if (!isDrawingEnabled())
                return;
@@ -334,8 +335,7 @@ int GuiPainter::text(int x, int y, docstring const & s,
 
        if (f.realShape() == SMALLCAPS_SHAPE) {
                textwidth = smallCapsText(x, y, str, f);
-               if (f.underbar() == FONT_ON)
-                       underline(f, x, y, textwidth);
+               textDecoration(f, x, y, textwidth);
                return textwidth;
        }
 
@@ -343,8 +343,7 @@ int GuiPainter::text(int x, int y, docstring const & s,
        //   textwidth = fontMetrics().width(str);
        // because the above is awfully expensive on MacOSX
        textwidth = fm.width(s);
-       if (f.underbar() == FONT_ON)
-               underline(f, x, y, textwidth);
+       textDecoration(f, x, y, textwidth);
 
        if (!isDrawingEnabled())
                return textwidth;
@@ -405,6 +404,10 @@ int GuiPainter::text(int x, int y, docstring const & s,
                        //LYXERR(Debug::PAINTING, "h=" << h << "  mA=" << mA << "  mD=" << mD
                        //      << "  w=" << w << "  lb=" << lb << "  tw=" << textwidth
                        //      << "  rb=" << rb);
+
+                       // Draw the new cached pixmap.
+                       drawPixmap(x + lb, y - mA, pm);
+
                        return textwidth;
                }
        }
@@ -423,6 +426,20 @@ int GuiPainter::text(int x, int y, docstring const & s,
 }
 
 
+void GuiPainter::textDecoration(FontInfo const & f, int x, int y, int width)
+{
+       if (f.underbar() == FONT_ON)
+               underline(f, x, y, width);
+       if (f.strikeout() == FONT_ON)
+               strikeoutLine(f, x, y, width);
+       if (f.uuline() == FONT_ON)
+               doubleUnderline(f, x, y, width);
+       if (f.uwave() == FONT_ON)
+               // f.color() doesn't work on some circumstances
+               wavyHorizontalLine(x, y, width,  f.realColor().baseColor);
+}
+
+
 static int max(int a, int b) { return a > b ? a : b; }
 
 
@@ -446,7 +463,7 @@ void GuiPainter::buttonFrame(int x, int y, int w, int h)
 
 
 void GuiPainter::rectText(int x, int y, docstring const & str,
-       FontInfo const & font, ColorCode back, ColorCode frame)
+       FontInfo const & font, Color back, Color frame)
 {
        int width;
        int ascent;
@@ -516,6 +533,17 @@ int GuiPainter::preeditText(int x, int y, char_type c,
 }
 
 
+void GuiPainter::doubleUnderline(FontInfo const & f, int x, int y, int width)
+{
+       FontMetrics const & fm = theFontMetrics(f);
+
+       int const below = max(fm.maxDescent() / 2, 2);
+
+       line(x, y + below, x + width, y + below, f.realColor());
+       line(x, y + below - 2, x + width, y + below - 2, f.realColor());
+}
+
+
 void GuiPainter::underline(FontInfo const & f, int x, int y, int width)
 {
        FontMetrics const & fm = theFontMetrics(f);
@@ -530,6 +558,20 @@ void GuiPainter::underline(FontInfo const & f, int x, int y, int width)
 }
 
 
+void GuiPainter::strikeoutLine(FontInfo const & f, int x, int y, int width)
+{
+       FontMetrics const & fm = theFontMetrics(f);
+
+       int const middle = max((fm.maxHeight() / 4), 1);
+       int const height =  middle/3;
+
+       if (height < 2)
+               line(x, y - middle, x + width, y - middle, f.realColor());
+       else
+               fillRectangle(x, y - middle, width, height, f.realColor());
+}
+
+
 void GuiPainter::dashedUnderline(FontInfo const & f, int x, int y, int width)
 {
        FontMetrics const & fm = theFontMetrics(f);
@@ -544,5 +586,24 @@ void GuiPainter::dashedUnderline(FontInfo const & f, int x, int y, int width)
                line(x, y + below + n, x + width, y + below + n, f.realColor(), line_onoffdash);
 }
 
+
+void GuiPainter::wavyHorizontalLine(int x, int y, int width, ColorCode col)
+{
+       setQPainterPen(computeColor(col));
+       int const step = 2;
+       int const xend = x + width;
+       int height = 1;
+       //FIXME: I am not sure if Antialiasing gives the best effect.
+       //setRenderHint(Antialiasing, true);
+       while (x < xend) {
+               height = - height;
+               drawLine(x, y - height, x + step, y + height);
+               x += step;
+               drawLine(x, y + height, x + step/2, y + height);
+               x += step/2;
+       }
+       //setRenderHint(Antialiasing, false);
+}
+
 } // namespace frontend
 } // namespace lyx