100520_labelpatch.diff

Marco Hugentobler, 2010-05-20 08:30 AM

Download (8.13 KB)

View differences:

src/plugins/labeling/labelingguibase.ui (Arbeitskopie)
206 206
          <item row="0" column="2">
207 207
           <widget class="QLabel" name="label_9">
208 208
            <property name="text">
209
             <string>pixels</string>
209
             <string>mm</string>
210 210
            </property>
211 211
           </widget>
212 212
          </item>
......
312 312
            <item>
313 313
             <widget class="QLabel" name="label_15">
314 314
              <property name="text">
315
               <string>pixels</string>
315
               <string>mm</string>
316 316
              </property>
317 317
             </widget>
318 318
            </item>
......
472 472
           </widget>
473 473
          </item>
474 474
          <item>
475
           <widget class="QSpinBox" name="spinBufferSize">
476
            <property name="minimum">
477
             <number>1</number>
475
           <widget class="QDoubleSpinBox" name="spinBufferSize">
476
            <property name="suffix">
477
             <string> mm</string>
478 478
            </property>
479 479
           </widget>
480 480
          </item>
......
753 753
  <tabstop>btnChangeFont</tabstop>
754 754
  <tabstop>btnTextColor</tabstop>
755 755
  <tabstop>chkBuffer</tabstop>
756
  <tabstop>spinBufferSize</tabstop>
757 756
  <tabstop>btnBufferColor</tabstop>
758 757
  <tabstop>sliderPriority</tabstop>
759 758
  <tabstop>chkScaleBasedVisibility</tabstop>
src/plugins/labeling/pallabeling.cpp (Arbeitskopie)
105 105
  bufferColor = Qt::white;
106 106
  labelPerPart = false;
107 107
  mergeLines = false;
108
  vectorScaleFactor = 1.0;
109
  rasterCompressFactor = 1.0;
108 110
}
109 111

  
110 112
LayerSettings::LayerSettings( const LayerSettings& s )
......
125 127
  bufferColor = s.bufferColor;
126 128
  labelPerPart = s.labelPerPart;
127 129
  mergeLines = s.mergeLines;
128

  
130
  vectorScaleFactor = s.vectorScaleFactor;
131
  rasterCompressFactor = s.rasterCompressFactor;
129 132
  fontMetrics = NULL;
130 133
  ct = NULL;
131 134
}
......
212 215
  //QFontMetrics fontMetrics(textFont);
213 216
  QRect labelRect = /*QRect(0,0,20,20);*/ fontMetrics->boundingRect( text );
214 217

  
215
  // 2px border...
216
  QgsPoint ptSize = xform->toMapCoordinates( labelRect.width() + 2, labelRect.height() + 2 );
218
  // 1mm border...
219
  double border = vectorScaleFactor;
220
  double buffer = bufferSize * vectorScaleFactor;
221
  QgsPoint ptSize = xform->toMapCoordinates( labelRect.width() + 2 * ( border + buffer ) , labelRect.height() + 2 * ( border + buffer ) );
217 222
  labelX = fabs( ptSize.x() - ptZero.x() );
218 223
  labelY = fabs( ptSize.y() - ptZero.y() );
219 224
}
......
252 257

  
253 258
  // TODO: allow layer-wide feature dist in PAL...?
254 259
  if ( dist != 0 )
255
    feat->setDistLabel( fabs( ptOne.x() - ptZero.x() )* dist );
260
    feat->setDistLabel( fabs( ptOne.x() - ptZero.x() )* dist * vectorScaleFactor );
256 261
}
257 262

  
258 263

  
......
358 363
  double size = 0.3527 * lyr.textFont.pointSizeF() * ctx.scaleFactor(); //* ctx.rasterScaleFactor();
359 364
  lyr.textFont.setPixelSize(( int )size );
360 365

  
366
  //raster and vector scale factors
367
  lyr.vectorScaleFactor = ctx.scaleFactor();
368
  lyr.rasterCompressFactor = ctx.rasterScaleFactor();
369

  
361 370
  // save the pal layer to our layer context (with some additional info)
362 371
  lyr.palLayer = l;
363 372
  lyr.fieldIndex = fldIndex;
......
579 588
  painter->save();
580 589
  painter->translate( QPointF( outPt.x(), outPt.y() ) );
581 590
  painter->rotate( -label->getAlpha() * 180 / M_PI );
582
  painter->translate( QPointF( 1, -1 - lyr.fontBaseline ) );
591
  painter->translate( QPointF( lyr.vectorScaleFactor *( 1 + lyr.bufferSize ), -lyr.vectorScaleFactor *( 1  + lyr.bufferSize ) - lyr.fontBaseline ) );
583 592

  
593
  //request larger font and scale down painter (to avoid Qt font scale bug)
594
  QFont labelFont = lyr.textFont;
595
  labelFont.setPixelSize( labelFont.pixelSize() * lyr.rasterCompressFactor );
596
  painter->scale( 1.0 / lyr.rasterCompressFactor, 1.0 / lyr.rasterCompressFactor );
597

  
584 598
  if ( drawBuffer )
585 599
  {
586 600
    // we're drawing buffer
587
    drawLabelBuffer( painter, txt, lyr.textFont, lyr.bufferSize, lyr.bufferColor );
601
    drawLabelBuffer( painter, txt, labelFont, lyr.bufferSize * lyr.vectorScaleFactor * lyr.rasterCompressFactor, lyr.bufferColor );
588 602
  }
589 603
  else
590 604
  {
......
594 608
    painter->drawText((0,0, txt);*/
595 609

  
596 610
    QPainterPath path;
597
    path.addText( 0, 0, lyr.textFont, txt );
611
    path.addText( 0, 0, labelFont, txt );
598 612
    painter->setPen( Qt::NoPen );
599 613
    painter->setBrush( lyr.textColor );
600 614
    painter->drawPath( path );
......
606 620
}
607 621

  
608 622

  
609
void PalLabeling::drawLabelBuffer( QPainter* p, QString text, const QFont& font, int size, QColor color )
623
void PalLabeling::drawLabelBuffer( QPainter* p, QString text, const QFont& font, double size, QColor color )
610 624
{
611 625
  /*
612 626
  p->setFont( font );
......
618 632

  
619 633
  QPainterPath path;
620 634
  path.addText( 0, 0, font, text );
621
  p->setPen( QPen( color, size ) );
635
  QPen pen( color );
636
  pen.setWidthF( size );
637
  p->setPen( pen );
622 638
  p->setBrush( color );
623 639
  p->drawPath( path );
624 640
}
src/plugins/labeling/pallabeling.h (Arbeitskopie)
60 60
    bool enabled;
61 61
    int priority; // 0 = low, 10 = high
62 62
    bool obstacle; // whether it's an obstacle
63
    double dist; // distance from the feature (in pixels)
63
    double dist; // distance from the feature (in mm)
64
    double vectorScaleFactor; //scale factor painter units->pixels
65
    double rasterCompressFactor; //pixel resolution scale factor
64 66
    int scaleMin, scaleMax; // disabled if both are zero
65
    int bufferSize;
67
    double bufferSize; //buffer size (in mm)
66 68
    QColor bufferColor;
67 69
    bool labelPerPart; // whether to label every feature's part or only the biggest one
68 70
    bool mergeLines;
......
139 141

  
140 142
    void drawLabelCandidateRect( pal::LabelPosition* lp, QPainter* painter, const QgsMapToPixel* xform );
141 143
    void drawLabel( pal::LabelPosition* label, QPainter* painter, const QgsMapToPixel* xform, bool drawBuffer = false );
142
    static void drawLabelBuffer( QPainter* p, QString text, const QFont& font, int size, QColor color );
144
    static void drawLabelBuffer( QPainter* p, QString text, const QFont& font, double size, QColor color );
143 145

  
144 146
  protected:
145 147

  
src/plugins/labeling/labelpreview.cpp (Arbeitskopie)
15 15
  update();
16 16
}
17 17

  
18
void LabelPreview::setBuffer( int size, QColor color )
18
void LabelPreview::setBuffer( double size, QColor color )
19 19
{
20
  mBufferSize = size;
20
  mBufferSize = size * 88 / 25.4; //assume standard dpi for preview
21 21
  mBufferColor = color;
22 22
  update();
23 23
}
src/plugins/labeling/labelinggui.cpp (Arbeitskopie)
41 41
  connect( btnChangeFont, SIGNAL( clicked() ), this, SLOT( changeTextFont() ) );
42 42
  connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) );
43 43
  connect( btnBufferColor, SIGNAL( clicked() ), this, SLOT( changeBufferColor() ) );
44
  connect( spinBufferSize, SIGNAL( valueChanged( int ) ), this, SLOT( updatePreview() ) );
44
  connect( spinBufferSize, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) );
45 45
  connect( btnEngineSettings, SIGNAL( clicked() ), this, SLOT( showEngineConfigDialog() ) );
46 46

  
47 47
  // set placement methods page based on geometry type
src/plugins/labeling/labelpreview.h (Arbeitskopie)
10 10

  
11 11
    void setTextColor( QColor color );
12 12

  
13
    void setBuffer( int size, QColor color );
13
    void setBuffer( double size, QColor color );
14 14

  
15 15
    void paintEvent( QPaintEvent* e );
16 16