]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiPainter.cpp
Fix the tab ordering of GuiDocument components.
[lyx.git] / src / frontends / qt4 / GuiPainter.cpp
index 0122475a7f05a83ad0d57225716498e319112000..3ade5c918857c680433f94051ff31c64b772d5db 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);
 }
@@ -112,7 +111,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 +143,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));
@@ -161,7 +160,7 @@ void GuiPainter::leaveMonochromeMode()
 }
 
 
-void GuiPainter::point(int x, int y, ColorCode col)
+void GuiPainter::point(int x, int y, Color col)
 {
        if (!isDrawingEnabled())
                return;
@@ -172,9 +171,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 +188,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 +216,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 +228,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 +238,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;
@@ -336,6 +335,12 @@ int GuiPainter::text(int x, int y, docstring const & s,
                textwidth = smallCapsText(x, y, str, f);
                if (f.underbar() == FONT_ON)
                        underline(f, x, y, textwidth);
+               if (f.strikeout() == FONT_ON)
+                       strikeoutLine(f, x, y, textwidth);
+               if (f.uuline() == FONT_ON)
+                       doubleUnderline(f, x, y, textwidth);
+               if (f.uwave() == FONT_ON)
+                       wavyHorizontalLine(x, y, textwidth, f.realColor().baseColor);
                return textwidth;
        }
 
@@ -345,6 +350,13 @@ int GuiPainter::text(int x, int y, docstring const & s,
        textwidth = fm.width(s);
        if (f.underbar() == FONT_ON)
                underline(f, x, y, textwidth);
+       if (f.strikeout() == FONT_ON)
+               strikeoutLine(f, x, y, textwidth);
+       if (f.uuline() == FONT_ON)
+               doubleUnderline(f, x, y, textwidth);
+       if (f.uwave() == FONT_ON)
+               // f.color() doesn't work on some circumstances
+               wavyHorizontalLine(x, y, textwidth,  f.realColor().baseColor);
 
        if (!isDrawingEnabled())
                return textwidth;
@@ -450,7 +462,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;
@@ -520,6 +532,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);
@@ -534,6 +557,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);
@@ -548,5 +585,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