]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiSetBorder.cpp
Use <cstdint> instead of <boost/cstdint.hpp>
[lyx.git] / src / frontends / qt4 / GuiSetBorder.cpp
index 0d49f1112704aaaa1cc042fd9226ff70fce77657..30e25743fb99709a9f07e0c8a538fc4ec5436261 100644 (file)
@@ -5,6 +5,7 @@
  *
  * \author Edwin Leuven
  * \author John Levon
+ * \author Jürgen Spitzmüller
  *
  * Full author contact details are available in file CREDITS.
  */
 
 #include "GuiSetBorder.h"
 
+#include "support/debug.h"
+
 #include <QPainter>
 #include <QMouseEvent>
 #include <QPaintEvent>
 
 
-GuiSetBorder::GuiSetBorder(QWidget * parent, Qt::WFlags fl)
-       : QWidget(parent, fl), buffer(75, 75)
+GuiSetBorder::GuiSetBorder(QWidget * parent, Qt::WindowFlags fl)
+       : QWidget(parent, fl), buffer(75, 75), bottom_drawn_wide_(false),
+         top_drawn_wide_(false)
 {
        /* length of corner line */
-       l = buffer.width() / 10;
+       corner_length = buffer.width() / 10;
        /* margin */
-       m = buffer.height() / 10;
+       margin = buffer.height() / 10;
 
-       w = buffer.width();
-       h = buffer.height();
+       bwidth = buffer.width();
+       bheight = buffer.height();
 
        init();
 
-       setMinimumSize(w,h);
-       setMaximumSize(w,h);
+       setMinimumSize(bwidth, bheight);
+       setMaximumSize(bwidth, bheight);
 }
 
 
@@ -51,19 +55,26 @@ void GuiSetBorder::init()
 
        paint.setPen(Qt::black);
 
-       // FIXME: wow, readable !! :)
-
-       paint.drawLine(m + l , m, m + l, m + l);
-       paint.drawLine(w - (m + l), m, w - (m + l), m + l);
-
-       paint.drawLine(m, m + l , m + l, m + l);
-       paint.drawLine(m, h - (m + l), m + l, h - (m + l));
-
-       paint.drawLine(m + l ,h - m, m + l ,h - (m + l));
-       paint.drawLine(w - (m + l), h - m, w - (m + l), h - (m + l));
-
-       paint.drawLine(h - m, m+l, h - (m + l), m + l);
-       paint.drawLine(h - m, h - (m + l), h - (m + l),h - (m + l));
+       // Draw the corner marks
+       paint.drawLine(margin + corner_length, margin,
+                      margin + corner_length, margin + corner_length);
+       paint.drawLine(bwidth - (margin + corner_length), margin,
+                      bwidth - (margin + corner_length), margin + corner_length);
+
+       paint.drawLine(margin, margin + corner_length,
+                      margin + corner_length, margin + corner_length);
+       paint.drawLine(margin, bheight - (margin + corner_length),
+                      margin + corner_length, bheight - (margin + corner_length));
+
+       paint.drawLine(margin + corner_length ,bheight - margin,
+                      margin + corner_length ,bheight - (margin + corner_length));
+       paint.drawLine(bwidth - (margin + corner_length), bheight - margin,
+                      bwidth - (margin + corner_length), bheight - (margin + corner_length));
+
+       paint.drawLine(bheight - margin, margin+corner_length,
+                      bheight - (margin + corner_length), margin + corner_length);
+       paint.drawLine(bheight - margin, bheight - (margin + corner_length),
+                      bheight - (margin + corner_length),bheight - (margin + corner_length));
 }
 
 
@@ -72,29 +83,45 @@ void GuiSetBorder::mousePressEvent(QMouseEvent * e)
        if (e->y() > e->x()) {
                if (e->y() < height() - e->x()) {
                        if (left_.enabled) {
-                               setLeft(!left_.set);
+                               setLeft(left_.set == LINE_SET ? LINE_UNSET : LINE_SET);
                                // emit signal
-                               leftSet(left_.set);
+                               leftSet();
                        }
                } else {
-                       if (bottom_.enabled) {
-                               setBottom(!bottom_.set);
+                       if (bottom_trim_left_.enabled && e->x() < margin + 4 + 2 * corner_length) {
+                               setBottomLeftTrim(bottom_trim_left_.set == LINE_SET ? LINE_UNSET : LINE_SET);
+                               // emit signal
+                               bottomLTSet();
+                       } else if (bottom_trim_right_.enabled && e->x() > bwidth - margin - 2 * corner_length - 4) {
+                                       setBottomRightTrim(bottom_trim_right_.set == LINE_SET ? LINE_UNSET : LINE_SET);
+                                       // emit signal
+                                       bottomRTSet();
+                       } else if (bottom_.enabled) {
+                               setBottom(bottom_.set == LINE_SET ? LINE_UNSET : LINE_SET);
                                // emit signal
-                               bottomSet(bottom_.set);
+                               bottomSet();
                        }
                }
        } else {
                if (e->y() < height() - e->x()) {
-                       if (top_.enabled) {
-                               setTop(!top_.set);
+                       if (top_trim_left_.enabled && e->x() < margin + 4 + 2 * corner_length) {
+                               setTopLeftTrim(top_trim_left_.set == LINE_SET ? LINE_UNSET : LINE_SET);
                                // emit signal
-                               topSet(top_.set);
+                               topLTSet();
+                       } else if (top_trim_right_.enabled && e->x() > bwidth - margin - 2 * corner_length - 4) {
+                                       setTopRightTrim(top_trim_right_.set == LINE_SET ? LINE_UNSET : LINE_SET);
+                                       // emit signal
+                                       topRTSet();
+                       } else if (top_.enabled) {
+                               setTop(top_.set == LINE_SET ? LINE_UNSET : LINE_SET);
+                               // emit signal
+                               topSet();
                        }
                } else {
                        if (right_.enabled) {
-                               setRight(!right_.set);
+                               setRight(right_.set == LINE_SET ? LINE_UNSET : LINE_SET);
                                // emit signal
-                               rightSet(right_.set);
+                               rightSet();
                        }
                }
        }
@@ -115,128 +142,405 @@ void GuiSetBorder::drawLine(QColor const & col, int x, int y, int x2, int y2)
 }
 
 
-void GuiSetBorder::drawLeft(bool draw)
+void GuiSetBorder::drawLeft(BorderState draw)
 {
-       QColor col(draw ? Qt::black : Qt::white);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
        if (!left_.enabled)
                col = QColor(Qt::lightGray);
-       drawLine(col, m + l, m + l + 2, m + l, h - m - l - 1);
+       drawLine(col, margin + corner_length, margin + corner_length + 2,
+                margin + corner_length, bheight - margin - corner_length - 1);
 }
 
 
-void GuiSetBorder::drawRight(bool draw)
+void GuiSetBorder::drawRight(BorderState draw)
 {
-       QColor col(draw ? Qt::black : Qt::white);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
        if (!right_.enabled)
                col = QColor(Qt::lightGray);
-       drawLine(col, h - m - l + 1, m + l + 2, h - m - l + 1, h - m - l - 1);
+       drawLine(col, bheight - margin - corner_length + 1, margin + corner_length + 2,
+                bheight - margin - corner_length + 1, bheight - margin - corner_length - 1);
 }
 
 
-void GuiSetBorder::drawTop(bool draw)
+void GuiSetBorder::drawTop(BorderState draw)
 {
-       QColor col(draw ? Qt::black : Qt::white);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               top_drawn_wide_ = true;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               top_drawn_wide_ = false;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               top_drawn_wide_ = true;
+               break;
+       }
        if (!top_.enabled)
                col = QColor(Qt::lightGray);
-       drawLine(col, m + l + 2, m + l, w - m - l - 1, m + l);
+       int const lt = (top_trim_left_.enabled) ? corner_length + 4 : 0;
+       int const rt = (top_trim_right_.enabled) ? corner_length + 4 : 0;
+       drawLine(col, margin + corner_length + 2 + lt, margin + corner_length,
+                bwidth - margin - corner_length - 1 - rt, margin + corner_length);
+}
+
+
+void GuiSetBorder::undrawWideTopLine()
+{
+       if (!top_drawn_wide_)
+               return;
+
+       // Overpaint previous lines white
+       drawLine(Qt::white, margin + corner_length + 2, margin + corner_length,
+                bwidth - margin - corner_length - 1, margin + corner_length);
+       top_drawn_wide_ = false;
+}
+
+
+void GuiSetBorder::drawTopLeftTrim(BorderState draw)
+{
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
+       if (!top_trim_left_.enabled)
+               col = QColor(Qt::white);
+       int const lt = corner_length;
+       if (top_trim_left_.enabled)
+               drawLine(col, margin + corner_length + 2, margin + corner_length,
+                        margin + corner_length + 2 + lt, margin + corner_length);
+}
+
+
+void GuiSetBorder::drawTopRightTrim(BorderState draw)
+{
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
+       if (!top_trim_right_.enabled)
+               col = QColor(Qt::white);
+       int const rt = corner_length;
+       if (top_trim_right_.enabled)
+               drawLine(col, bwidth - margin - corner_length - 1 - rt, margin + corner_length,
+                       bwidth - margin - corner_length - 1, margin + corner_length);
 }
 
 
-void GuiSetBorder::drawBottom(bool draw)
+void GuiSetBorder::drawBottom(BorderState draw)
 {
-       QColor col(draw ? Qt::black : Qt::white);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               bottom_drawn_wide_ = true;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               bottom_drawn_wide_ = false;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               bottom_drawn_wide_ = true;
+               break;
+       }
        if (!bottom_.enabled)
                col = QColor(Qt::lightGray);
-       drawLine(col, m + l + 2, w - m - l + 1, w - m - l - 1, w - m - l + 1);
+       int const lt = (bottom_trim_left_.enabled) ? corner_length + 4 : 0;
+       int const rt = (bottom_trim_right_.enabled) ? corner_length + 4 : 0;
+       drawLine(col, margin + corner_length + 2 + lt, bwidth - margin - corner_length + 1,
+                bwidth - margin - corner_length - 1 - rt, bwidth - margin - corner_length + 1);
 }
 
 
-void GuiSetBorder::setLeftEnabled(bool border)
+void GuiSetBorder::undrawWideBottomLine()
 {
-       left_.enabled = border;
-       drawLeft(border);
+       if (!bottom_drawn_wide_)
+               return;
+
+       //Overpaint previous lines white
+       drawLine(Qt::white, margin + corner_length + 2, bwidth - margin - corner_length + 1,
+                bwidth - margin - corner_length - 1, bwidth - margin - corner_length + 1);
+       bottom_drawn_wide_ = false;
 }
 
 
-void GuiSetBorder::setRightEnabled(bool border)
+void GuiSetBorder::drawBottomLeftTrim(BorderState draw)
 {
-       right_.enabled = border;
-       drawRight(border);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
+       if (!bottom_trim_left_.enabled)
+               col = QColor(Qt::white);
+       int const lt = corner_length;
+       if (bottom_trim_left_.enabled)
+               drawLine(col, margin + corner_length + 2, bwidth - margin - corner_length + 1,
+                        margin + corner_length + 2 + lt, bwidth - margin - corner_length + 1);
 }
 
 
-void GuiSetBorder::setTopEnabled(bool border)
+void GuiSetBorder::drawBottomRightTrim(BorderState draw)
 {
-       top_.enabled = border;
-       drawTop(border);
+       QColor col;
+       switch (draw) {
+       case LINE_SET:
+               col = Qt::black;
+               break;
+       case LINE_UNSET:
+               col = Qt::white;
+               break;
+       case LINE_UNDECIDED:
+       case LINE_UNDEF:
+               col = Qt::lightGray;
+               break;
+       }
+       if (!bottom_trim_right_.enabled)
+               col = QColor(Qt::white);
+       int const rt = corner_length;
+       if (bottom_trim_right_.enabled)
+               drawLine(col, bwidth - margin - corner_length - 1 - rt, bwidth - margin - corner_length + 1,
+                        bwidth - margin - corner_length - 1, bwidth - margin - corner_length + 1);
 }
 
 
-void GuiSetBorder::setBottomEnabled(bool border)
+void GuiSetBorder::setLeftEnabled(bool enabled)
 {
-       bottom_.enabled = border;
-       drawBottom(border);
+       left_.enabled = enabled;
+       drawLeft(left_.set);
+}
+
+
+void GuiSetBorder::setRightEnabled(bool enabled)
+{
+       right_.enabled = enabled;
+       drawRight(right_.set);
+}
+
+
+void GuiSetBorder::setTopEnabled(bool enabled)
+{
+       top_.enabled = enabled;
+       drawTop(top_.set);
+}
+
+
+void GuiSetBorder::setBottomEnabled(bool enabled)
+{
+       bottom_.enabled = enabled;
+       drawBottom(bottom_.set);
+}
+
+
+void GuiSetBorder::setTopLeftTrimEnabled(bool enabled)
+{
+       top_trim_left_.enabled = enabled;
+       undrawWideTopLine();
+       drawTopLeftTrim(top_trim_left_.set);
+       drawTop(top_.set);
+       top_drawn_wide_ = !enabled;
+}
+
+
+void GuiSetBorder::setTopRightTrimEnabled(bool enabled)
+{
+       top_trim_right_.enabled = enabled;
+       undrawWideTopLine();
+       drawTopRightTrim(top_trim_right_.set);
+       drawTop(top_.set);
+       top_drawn_wide_ = !enabled;;
+}
+
+
+void GuiSetBorder::setBottomLeftTrimEnabled(bool enabled)
+{
+       bottom_trim_left_.enabled = enabled;
+       undrawWideBottomLine();
+       drawBottomLeftTrim(bottom_trim_left_.set);
+       drawBottom(bottom_.set);
+       bottom_drawn_wide_ = !enabled;;
 }
 
 
-void GuiSetBorder::setLeft(bool border)
+void GuiSetBorder::setBottomRightTrimEnabled(bool enabled)
+{
+       bottom_trim_right_.enabled = enabled;
+       undrawWideBottomLine();
+       drawBottomRightTrim(bottom_trim_right_.set);
+       drawBottom(bottom_.set);
+       bottom_drawn_wide_ = !enabled;;
+}
+
+
+void GuiSetBorder::setLeft(BorderState border)
 {
        left_.set = border;
        drawLeft(border);
 }
 
 
-void GuiSetBorder::setRight(bool border)
+void GuiSetBorder::setRight(BorderState border)
 {
        right_.set = border;
        drawRight(border);
 }
 
 
-void GuiSetBorder::setTop(bool border)
+void GuiSetBorder::setTop(BorderState border)
 {
        top_.set = border;
        drawTop(border);
 }
 
 
-void GuiSetBorder::setBottom(bool border)
+void GuiSetBorder::setBottom(BorderState border)
 {
        bottom_.set = border;
        drawBottom(border);
 }
 
 
-void GuiSetBorder::setAll(bool border)
+void GuiSetBorder::setTopLeftTrim(BorderState border)
+{
+       top_trim_left_.set = border;
+       drawTopLeftTrim(border);
+}
+
+
+void GuiSetBorder::setTopRightTrim(BorderState border)
+{
+       top_trim_right_.set = border;
+       drawTopRightTrim(border);
+}
+
+
+void GuiSetBorder::setBottomLeftTrim(BorderState border)
+{
+       bottom_trim_left_.set = border;
+       drawBottomLeftTrim(border);
+}
+
+void GuiSetBorder::setBottomRightTrim(BorderState border)
+{
+       bottom_trim_right_.set = border;
+       drawBottomRightTrim(border);
+}
+
+
+void GuiSetBorder::setAll(BorderState border)
 {
        setLeft(border);
        setRight(border);
        setTop(border);
        setBottom(border);
+       setTopLeftTrim(border);
+       setTopRightTrim(border);
+       setBottomLeftTrim(border);
+       setBottomRightTrim(border);
 }
 
 
-bool GuiSetBorder::getLeft()
+GuiSetBorder::BorderState GuiSetBorder::getLeft()
 {
        return left_.set;
 }
 
 
-bool GuiSetBorder::getRight()
+GuiSetBorder::BorderState GuiSetBorder::getRight()
 {
        return right_.set;
 }
 
 
-bool GuiSetBorder::getTop()
+GuiSetBorder::BorderState GuiSetBorder::getTop()
 {
        return top_.set;
 }
 
 
-bool GuiSetBorder::getBottom()
+GuiSetBorder::BorderState GuiSetBorder::getBottom()
 {
        return bottom_.set;
 }
 
+
+GuiSetBorder::BorderState GuiSetBorder::getTopLeftTrim()
+{
+       return top_trim_left_.set;
+}
+
+
+GuiSetBorder::BorderState GuiSetBorder::getTopRightTrim()
+{
+       return top_trim_right_.set;
+}
+
+
+GuiSetBorder::BorderState GuiSetBorder::getBottomLeftTrim()
+{
+       return bottom_trim_left_.set;
+}
+
+
+GuiSetBorder::BorderState GuiSetBorder::getBottomRightTrim()
+{
+       return bottom_trim_right_.set;
+}
+
 #include "moc_GuiSetBorder.cpp"