]> Shamusworld >> Repos - guemap/blobdiff - src/mapview.cpp
Add MRU file list, adjustments to room edge labels.
[guemap] / src / mapview.cpp
index 7a915eda1f554f6ed752b1a5fd3c920178463935..6e1199fa87e61242c8b3a075071fa2de4738c287 100644 (file)
@@ -424,6 +424,16 @@ void MapView::paintEvent(QPaintEvent * /*event*/)
                { roomWidth / 4 - 48, roomHeight + 52 }
        };
 
+       // Offsets used when the label collides with the line...
+       const QPoint edgLblOffsetEx[] = {
+               // N, S, E, W
+               { -48, 0 }, { 48, 0 }, { 0, -76 }, { 0, 76 },
+               // NE, NW, SE, SW
+               { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
+               // NNE, NNW, SSE, SSW
+               { -48, 0 }, { -48, 0 }, { 48, 0 }, { 48, 0 }
+       };
+
        const int
                cantGoSide   = 19,
                cantGoAngleX = gridY / 6,
@@ -723,18 +733,46 @@ printf("    clip = %i, %i, %i, %i; docSize = %i, %i\n", clip.left(), clip.right(
 
                if (edge->type1 & etDirection)
                {
+                       QPoint ex = QPoint(0, 0);
+                       double angle = Angle(end - start);
+
+                       if (angle < 0)
+                               angle += TAU;
+
+                       // Adjust text position if it runs into an edge
+                       if (((edge->end1 == rcNNW || edge->end1 == rcN || edge->end1 == rcNNE) && (angle > THREE_QTR_TAU && angle < TAU))
+                               || ((edge->end1 == rcSSW || edge->end1 == rcS || edge->end1 == rcSSE) && (angle > QTR_TAU && angle < HALF_TAU))
+                               || ((edge->end1 == rcE) && (angle > 0 && angle < QTR_TAU))
+                               || ((edge->end1 == rcW) && (angle > HALF_TAU && angle < THREE_QTR_TAU)))
+                       {
+                               ex = edgLblOffsetEx[edge->end1];
+                       }
+
                        const QPoint & p = room[edge->room1]->pos;
-//                     dc->TextOut(p.x + edgLblXOffset[edge->end1], p.y + edgLblYOffset[edge->end1], &edgeLabel[(edge->type1 & etDirection) - 1], 1);
                        elBuf[0] = edgeLabel[(edge->type1 & etDirection) - 1];
-                       dc->drawText(p + edgLblOffset[edge->end1], elBuf);
+                       dc->drawText(p + edgLblOffset[edge->end1] + ex, elBuf);
                }
 
                if (edge->type2 & etDirection)
                {
+                       QPoint ex = QPoint(0, 0);
+                       double angle = Angle(start - end);
+
+                       if (angle < 0)
+                               angle += TAU;
+
+                       // Adjust text position if it runs into an edge
+                       if (((edge->end2 == rcNNW || edge->end2 == rcN || edge->end2 == rcNNE) && (angle > THREE_QTR_TAU && angle < TAU))
+                               || ((edge->end2 == rcSSW || edge->end2 == rcS || edge->end2 == rcSSE) && (angle > QTR_TAU && angle < HALF_TAU))
+                               || ((edge->end2 == rcE) && (angle > 0 && angle < QTR_TAU))
+                               || ((edge->end2 == rcW) && (angle > HALF_TAU && angle < THREE_QTR_TAU)))
+                       {
+                               ex = edgLblOffsetEx[edge->end2];
+                       }
+
                        const QPoint & p = room[edge->room2]->pos;
-//                     dc->TextOut(p.x + edgLblXOffset[edge->end2], p.y + edgLblYOffset[edge->end2], &edgeLabel[(edge->type2 & etDirection) - 1], 1);
                        elBuf[0] = edgeLabel[(edge->type2 & etDirection) - 1];
-                       dc->drawText(p + edgLblOffset[edge->end2], elBuf);
+                       dc->drawText(p + edgLblOffset[edge->end2] + ex, elBuf);
                }
 
                edge--;