OSDN Git Service

fix caret drawing at hexview
authorsuma <devnull@localhost>
Tue, 10 Feb 2009 12:45:30 +0000 (21:45 +0900)
committersuma <devnull@localhost>
Tue, 10 Feb 2009 12:45:30 +0000 (21:45 +0900)
src/control/standard/hexview.cpp
src/control/standard/hexview.h
src/control/standard/scursor.cpp

index 8bbcd44..eb9750d 100644 (file)
@@ -15,7 +15,7 @@ namespace Standard {
 // Config
 HexConfig::HexConfig()
        : Margin(2, 2, 3, 3)
-       , ByteMargin(2, 0, 2, 1)
+       , ByteMargin(2, 0, 2, 0)
        , Font("Monaco", 13)
        , EnableCaret(true)
        , CaretBlinkTime(500)
@@ -298,89 +298,71 @@ void HexView::drawCaret(quint64 pos, int height_max)
        const int y = config.top() + config.byteHeight() * (pos / HexConfig::Num - cursor->Top);
 
        // Draw shape
-       drawCaretShape(CaretDrawInfo(painter, pos, x, y), pos < document->length());
+       drawCaretShape(CaretDrawInfo(painter, pos, x, y, pos < document->length()));
 
        // Finish paint and update screen buffer
        painter.end();
        update(config.x(x), y, config.byteWidth(), config.charHeight());
 }
 
-void HexView::drawCaretShape(CaretDrawInfo info, bool drawText)
+void HexView::drawCaretShape(CaretDrawInfo info)
 {
-       if (drawText) {
+       if (info.caret_middle) {
                // Copy from document
                uchar data;
                document->get(info.pos, &data, 1);
 
                info.hex.resize(2);
                byteToHex(data, info.hex);
-
-               switch (cursor->CaretShape) {
-               case CARET_LINE:
-                       drawCaretText(info);
-                       drawCaretLine(info);
-                       break;
-               case CARET_BLOCK:
-                       drawCaretBlock(info);
-                       break;
-               case CARET_FRAME:
-                       drawCaretText(info);
-                       drawCaretFrame(info);
-                       break;
-               case CARET_UNDERBAR:
-                       drawCaretText(info);
-                       drawCaretUnderbar(info);
-                       break;
-               }
-       } else {
-               // Draw caret only(without text data)
-               switch (cursor->CaretShape) {
-               case CARET_LINE:
-                       drawCaretLine(info);
-                       break;
-               case CARET_BLOCK:
-               {
-                       QBrush brush(config.Colors[Color::CaretBackground]);
-                       info.painter.fillRect(config.x(info.x), info.y, config.byteWidth(), config.byteHeight(), brush);
-                       break;
-               }
-               case CARET_FRAME:
-                       drawCaretFrame(info);
-                       break;
-               case CARET_UNDERBAR:
-                       drawCaretUnderbar(info);
-                       break;
-               }
        }
-}
 
-void HexView::drawCaretText(const CaretDrawInfo &info)
-{
-       QBrush brush(config.Colors[isSelected(info.pos) ? Color::SelBackground : Color::Background]);
-       info.painter.setPen(config.Colors[Color::Text]);
-       info.painter.setBackground(brush);
-
-       info.painter.fillRect(config.x(info.x), info.y, config.byteWidth(), config.byteHeight(), brush);
-       info.painter.drawText(config.x(info.x) + config.ByteMargin.left(), info.y + config.ByteMargin.top(), config.charWidth(2), config.charHeight(), Qt::AlignCenter, info.hex);
+       switch (cursor->CaretShape) {
+       case CARET_LINE:
+               drawCaretLine(info);
+               break;
+       case CARET_BLOCK:
+               drawCaretBlock(info);
+               break;
+       case CARET_FRAME:
+               drawCaretFrame(info);
+               break;
+       case CARET_UNDERBAR:
+               drawCaretUnderbar(info);
+               break;
+       }
 }
 
 void HexView::drawCaretLine(const CaretDrawInfo &info)
 {
+       int x;
+       if (cursor->CaretHigh || !info.caret_middle) {
+               x = config.x(info.x);
+       } else {
+               x = config.x(info.x) + config.ByteMargin.left() + config.charWidth();
+       }
        QBrush brush(config.Colors[Color::CaretBackground]);
-       info.painter.fillRect(config.x(info.x) + (cursor->CaretHigh ? 0 : config.charWidth() + config.ByteMargin.left()), info.y, 2, config.byteHeight(), brush);
+       info.painter.fillRect(x, info.y, 2, config.byteHeight(), brush);
 }
 
 void HexView::drawCaretUnderbar(const CaretDrawInfo &info)
 {
+       int width, x;
+       if (cursor->CaretHigh || !info.caret_middle) {
+               width = config.byteWidth() - 1;
+               x = config.x(info.x);
+       } else {
+               width = config.charWidth() + config.ByteMargin.right() - 1;
+               x = config.x(info.x) + config.ByteMargin.left() + config.charWidth();
+       }
+
        QBrush brush(config.Colors[Color::CaretBackground]);
-       int width = config.charWidth() + (cursor->CaretHigh ? config.ByteMargin.left() : config.ByteMargin.right());
-       info.painter.fillRect(config.x(info.x) + (cursor->CaretHigh ? 0 : config.charWidth() + config.ByteMargin.left()), info.y + config.byteHeight() - 2, width, 2, brush);
+       info.painter.fillRect(x, info.y + config.byteHeight() - 2, width, 2, brush);
 }
 
 void HexView::drawCaretFrame(const CaretDrawInfo &info)
 {
        int width, x;
-       if (cursor->CaretHigh) {
+       if (cursor->CaretHigh || !info.caret_middle) {
                width = config.byteWidth() - 1;
                x = config.x(info.x);
        } else {
@@ -393,20 +375,24 @@ void HexView::drawCaretFrame(const CaretDrawInfo &info)
 
 void HexView::drawCaretBlock(CaretDrawInfo &info)
 {
-       if (cursor->CaretHigh) {
-               QBrush brush(config.Colors[Color::CaretBackground]);
-               info.painter.setBackground(brush);
-               info.painter.setPen(config.Colors[Color::CaretText]);
-               info.painter.fillRect(config.x(info.x), info.y, config.byteWidth(), config.byteHeight(), brush);
-               info.painter.drawText(config.x(info.x) + config.ByteMargin.left(), info.y + config.ByteMargin.top(), config.charWidth(2), config.charHeight(), Qt::AlignCenter, info.hex);
+       if (info.caret_middle) {
+               if (cursor->CaretHigh) {
+                       QBrush brush(config.Colors[Color::CaretBackground]);
+                       info.painter.setBackground(brush);
+                       info.painter.setPen(config.Colors[Color::CaretText]);
+                       info.painter.fillRect(config.x(info.x), info.y, config.byteWidth(), config.byteHeight(), brush);
+                       info.painter.drawText(config.x(info.x) + config.ByteMargin.left(), info.y + config.ByteMargin.top(), config.charWidth(2), config.charHeight(), Qt::AlignCenter, info.hex);
+               } else {
+                       QBrush brush(config.Colors[Color::CaretBackground]);
+                       info.painter.setBackground(brush);
+                       info.painter.setPen(config.Colors[Color::CaretText]);
+                       info.painter.fillRect(config.x(info.x) + config.ByteMargin.left() + config.charWidth(), info.y, config.charWidth() + config.ByteMargin.right(), config.byteHeight(), brush);
+                       info.hex.remove(0, 1);
+                       info.painter.drawText(config.x(info.x) + config.ByteMargin.left() + config.charWidth(), info.y + config.ByteMargin.top(), config.charWidth(2), config.charHeight(), Qt::AlignLeft, info.hex);
+               }
        } else {
-               drawCaretText(info);
                QBrush brush(config.Colors[Color::CaretBackground]);
-               info.painter.setBackground(brush);
-               info.painter.setPen(config.Colors[Color::CaretText]);
-               info.painter.fillRect(config.x(info.x) + config.ByteMargin.left() + config.charWidth(), info.y, config.charWidth() + config.ByteMargin.right(), config.byteHeight(), brush);
-               info.hex.remove(0, 1);
-               info.painter.drawText(config.x(info.x) + config.ByteMargin.left() + config.charWidth(), info.y + config.ByteMargin.top(), config.charWidth(2), config.charHeight(), Qt::AlignLeft, info.hex);
+               info.painter.fillRect(config.x(info.x), info.y, config.byteWidth(), config.byteHeight(), brush);
        }
 }
 
@@ -642,12 +628,13 @@ void HexView::keyPressEvent(QKeyEvent *ev)
        }
 }
 
-HexView::CaretDrawInfo::CaretDrawInfo(QPainter &p, quint64 pos, int x, int y)
+HexView::CaretDrawInfo::CaretDrawInfo(QPainter &p, quint64 pos, int x, int y, bool caret_middle)
        : painter(p)
 {
        this->pos = pos;
        this->x = x;
        this->y = y;
+       this->caret_middle = caret_middle;
 }
 
 }      // namespace
index 4aae172..4d649da 100644 (file)
@@ -109,10 +109,11 @@ namespace Standard {
                class CaretDrawInfo
                {
                        public:
-                               CaretDrawInfo(QPainter &, quint64 pos, int x, int y);
+                               CaretDrawInfo(QPainter &, quint64 pos, int x, int y, bool caret_middle);
                                QPainter &painter;
                                QString hex;
                                quint64 pos;
+                               bool caret_middle;
                                int x;
                                int y;
                };
@@ -136,8 +137,7 @@ namespace Standard {
                bool isSelected(quint64 pos);
                void drawSelected(bool reset = false);
                void drawCaret(quint64 pos, int ymax);
-               void drawCaretShape(CaretDrawInfo info, bool);
-               void drawCaretText(const CaretDrawInfo &);
+               void drawCaretShape(CaretDrawInfo info);
                void drawCaretLine(const CaretDrawInfo &);
                void drawCaretUnderbar(const CaretDrawInfo &);
                void drawCaretFrame(const CaretDrawInfo &);
index 50d4b15..7b7e555 100644 (file)
@@ -19,7 +19,7 @@ Cursor::Cursor(Document *Doc, HexView *View)
        , Selected(false)
        , Toggle(false)
        , CaretHigh(true)
-       , CaretShape(CARET_FRAME)
+       , CaretShape(CARET_BLOCK)
        , CaretTimerId(0)
        , HexCaretVisible(true)
        , StrCaretVisible(true)
@@ -116,7 +116,6 @@ void Cursor::PageDown(uint)
 
 void Cursor::refreshTopByUp()
 {
-       const int count_line = view->getConfig().drawableLines(view->height()) - 1;
        const quint64 pos_line = Position / HexConfig::Num;
 
        if (pos_line < Top) {