All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | Static Protected Attributes | Properties
SciFigs::NameLineLayer Class Reference

A NameLineLayer is a layer to plot lines with symbols and names. More...

#include <NameLineLayer.h>

Inheritance diagram for SciFigs::NameLineLayer:
SciFigs::LineLayer SciFigs::GraphContentLayer QGpGuiTools::PropertyItem QGpCoreTools::XMLClass

List of all members.

Public Member Functions

AbstractNameLineaddLine ()
AbstractNameLineaddLine (const Pen &pen, const Symbol &sym)
virtual void addProperties (PropertyProxy *pp)
QString fontString () const
virtual bool hasProperties ()
bool isShowNames () const
virtual Legend legend () const
AbstractNameLineline (int i)
const AbstractNameLineline (int i) const
 NameLineLayer (AxisWindow *parent=0)
virtual void properties (PropertyWidget *w) const
virtual void removeProperties (PropertyProxy *pp)
void setFontString (QString fs)
virtual void setLegend (Legend legend)
void setNames (int i, QVector< QString > *names)
virtual void setProperty (uint wid, int pid, QVariant val)
void setShowNames (bool b)
virtual const QString & xml_tagName () const
 ~NameLineLayer ()

Static Public Attributes

static const QString xmlNameLineLayerTag = "NameLineLayer"

Protected Member Functions

virtual void paintData (const LayerPainterRequest &lp, QPainter &p, double dotpercm) const
virtual void paintText (const LayerPainterRequest &lp, double dotpercm)

Protected Attributes

bool _showNames
QFont _textFont

Static Protected Attributes

static uint _tab = PropertyProxy::uniqueId()

Properties

QString font
bool showNames

Detailed Description

A NameLineLayer is a layer to plot lines with symbols and names.


Constructor & Destructor Documentation

References _showNames, and TRACE.

                                                :
    LineLayer(parent)
{
  TRACE;
  _showNames=true;
}

References SciFigs::LineLayer::clear(), and TRACE.

{
  TRACE;
  clear();
}

Member Function Documentation

Adds one new line with default pen and symbol.

Reimplemented from SciFigs::LineLayer.

Referenced by GeopsyGui::ArrayMap::addLine(), addLine(), GeopsyGui::ArrayMap::ArrayMap(), createCurveName(), createCurveNamePlot(), and MonoStation::AbstractSummary::setBubbleValues().

{
  return static_cast<AbstractNameLine *>(LineLayer::addLine());
}
AbstractNameLine * SciFigs::NameLineLayer::addLine ( const Pen pen,
const Symbol sym 
) [inline]

Adds one new line with pen pen and symbol sym.

Reimplemented from SciFigs::LineLayer.

References addLine().

{
  return static_cast<AbstractNameLine *>(LineLayer::addLine(pen, sym) );
}

Setup property editor

Reimplemented from SciFigs::LineLayer.

References _tab, SciFigs::NameLineLayerProperties::addLayer(), QGpGuiTools::PropertyProxy::addReference(), QGpGuiTools::PropertyProxy::addTab(), QGpGuiTools::PropertyProxy::currentTabWidget(), QGpGuiTools::PropertyProxy::setCurrentTab(), QGpCoreTools::tr(), TRACE, and w.

{
  TRACE;
  LineLayer::addProperties(pp);
  if(pp->setCurrentTab(_tab)) {
    pp->addReference(this);
    NameLineLayerProperties * w=static_cast<NameLineLayerProperties *>(pp->currentTabWidget());
    w->addLayer(this);
  } else {
    NameLineLayerProperties * w=new NameLineLayerProperties;
    pp->addTab(_tab, tr("Name Plot"), w, this);
    w->addLayer(this);
  }
}
QString SciFigs::NameLineLayer::fontString ( ) const [inline]

Referenced by properties().

{return _textFont.toString();}
virtual bool SciFigs::NameLineLayer::hasProperties ( ) [inline, virtual]

Reimplemented from SciFigs::LineLayer.

{return true;}
bool SciFigs::NameLineLayer::isShowNames ( ) const [inline]

Referenced by properties().

{return _showNames;}

Reimplemented from SciFigs::LineLayer.

References SciFigs::LineLayer::count(), line(), SciFigs::AbstractLine::pen(), SciFigs::Legend::setPen(), SciFigs::Legend::setSymbol(), SciFigs::Legend::setText(), SciFigs::Legend::setTextColor(), SciFigs::AbstractLine::symbol(), SciFigs::AbstractNameLine::textColor(), and TRACE.

{
  TRACE;
  int n=count();
  Legend leg(n);
  for(int i=0;i < n;i++ ) {
    const AbstractNameLine& l=* line(i);
    leg.setText(i, QString::number(i));
    leg.setTextColor(i, l.textColor());
    leg.setPen(i, l.pen());
    leg.setSymbol(i, l.symbol());
  }
  return leg;
}
const AbstractNameLine * SciFigs::NameLineLayer::line ( int  i) const [inline]

Reimplemented from SciFigs::LineLayer.

References line().

{
  return static_cast<const AbstractNameLine *>(LineLayer::line(i) );
}
void SciFigs::NameLineLayer::paintData ( const LayerPainterRequest lp,
QPainter &  p,
double  dotpercm 
) const [protected, virtual]

Reimplemented from SciFigs::LineLayer.

References _showNames, SciFigs::LineLayer::begin(), SciFigs::AbstractLine::count(), SciFigs::LineLayer::end(), SciFigs::AbstractLine::isSelected(), SciFigs::AbstractLine::isVisible(), line(), SciFigs::LayerPainterRequest::options(), SciFigs::AbstractLine::point(), SciFigs::LineLayer::pointOptions(), SciFigs::Symbol::setBrush(), QGpCoreTools::Angle::setDegrees(), SciFigs::Symbol::size(), SciFigs::AbstractLine::symbol(), SciFigs::LayerPainterRequest::terminated(), SciFigs::AbstractNameLine::textColor(), SciFigs::AbstractNameLine::textDx(), SciFigs::AbstractNameLine::textDy(), SciFigs::AbstractNameLine::textOrientation(), TRACE, SciFigs::GraphContentOptions::xr2s(), and SciFigs::GraphContentOptions::yr2s().

{
  TRACE;
  // Draw points
  LineLayer::paintData(lp, p, dotpercm);
  if( !_showNames) return ;
  const GraphContentOptions& gc=lp.options();
  QRectF r;
  QList<AbstractLine *>::const_iterator it;
  QMutexLocker ml(&_textPathsMutex);
  QList<QPainterPath>::const_iterator itText=_textPaths.begin();
  p.setRenderHints(QPainter::Antialiasing, true);
  p.setPen(Qt::NoPen);
  for(it=begin() ;it!=end();++it) {
    AbstractNameLine * line=static_cast<AbstractNameLine *>( *it);
    if(lp.terminated()) return;
    int countPoints=line->count();
    if(countPoints && line->isVisible()) {
      Symbol sym=line->symbol();
      int symSize=(int) floor(0.05*sym.size()*dotpercm+0.5);
      if(line->isSelected()) { // set selection mark
        symSize *= 2;
        p.setBrush(Qt::red);
      } else {
        p.setBrush(line->textColor());
      }
      double ddx=line->textDx() * dotpercm;
      double ddy=-line->textDy() * dotpercm;
      int dx=(int) round(ddx);
      int dy=(int) round(ddy);
      Angle angle;
      angle.setDegrees(-line->textOrientation());
      // According to position of label the offset refers to a different side of the label rectangle
      if(ddx > 0 && ddy > -ddx && ddy < ddx) { // Label on right side
         for(int j=0;j < countPoints;j++ ) {
          ASSERT(itText!=_textPaths.end());
          Point p1=line->point(j, pointOptions());
          int orx=gc.xr2s(p1.x());
          if(dx<symSize) orx+=symSize; else orx+=dx;
          int ory=gc.yr2s(p1.y()) + dy;
          r=itText->boundingRect();
          int baseLine=(int) round(-r.top());
          r.moveLeft(orx);
          r.moveTop(ory - r.height()/2);
          drawLabel(p, *itText, angle, r, baseLine);
          itText++;
        }
      } else if(ddx < 0 && ddy > ddx && ddy < -ddx) { // Label on left side
        for(int j=0;j < countPoints;j++ ) {
          ASSERT(itText!=_textPaths.end());
          Point p1=line->point(j, pointOptions());
          int orx=gc.xr2s(p1.x());
          if(-dx<symSize) orx-=symSize; else orx+=dx;
          int ory=gc.yr2s(p1.y()) + dy;
          r=itText->boundingRect();
          int baseLine=(int) round(-r.top());
          r.moveRight(orx);
          r.moveTop(ory - r.height()/2);
          drawLabel(p, *itText, angle, r, baseLine);
          itText++;
        }
      } else if(ddy < 0) { // Label on top side
        for(int j=0;j < countPoints;j++ ) {
          ASSERT(itText!=_textPaths.end());
          Point p1=line->point(j, pointOptions());
          int orx=gc.xr2s(p1.x()) + dx;
          int ory=gc.yr2s(p1.y());
          if(-dy<symSize) ory-=symSize; else ory+=dy;
          r=itText->boundingRect();
          int baseLine=(int) round(-r.top());
          r.moveLeft(orx - r.width()/2);
          r.moveBottom(ory);
          drawLabel(p, *itText, angle, r, baseLine);
          itText++;
        }
      } else if(ddy > 0) { // Label on bottom side
        for(int j=0;j < countPoints;j++ ) {
          ASSERT(itText!=_textPaths.end());
          Point p1=line->point(j, pointOptions());
          int orx=gc.xr2s(p1.x()) + dx;
          int ory=gc.yr2s(p1.y());
          if(dy<symSize) ory+=symSize; else ory+=dy;
          r=itText->boundingRect();
          int baseLine=(int) round(-r.top());
          r.moveLeft(orx - r.width()/2);
          r.moveTop(ory);
          drawLabel(p, *itText, angle, r, baseLine);
          itText++;
        }
      } else { // dx and dy==0
        for(int j=0;j < countPoints;j++ ) {
          ASSERT(itText!=_textPaths.end());
          Point p1=line->point(j, pointOptions());
          int orx=gc.xr2s(p1.x());
          int ory=gc.yr2s(p1.y());
          r=itText->boundingRect();
          int baseLine=(int) round(-r.top());
          r.moveCenter(QPoint( orx, ory) );
          drawLabel(p, *itText, angle, r, baseLine);
          itText++;
        }
      }
    }
  }
  p.setRenderHints(QPainter::Antialiasing, false);
}
void SciFigs::NameLineLayer::paintText ( const LayerPainterRequest lp,
double  dotpercm 
) [protected, virtual]

Reimplemented from SciFigs::GraphContentLayer.

References _showNames, _textFont, SciFigs::LineLayer::begin(), SciFigs::AbstractLine::count(), SciFigs::LineLayer::end(), SciFigs::AbstractLine::isSelected(), SciFigs::AbstractLine::isVisible(), line(), SciFigs::AbstractNameLine::name(), SciFigs::LayerPainterRequest::options(), SciFigs::GraphContentOptions::printBitmap(), SciFigs::GraphicObject::scaleFont(), and SciFigs::SciFigsGlobal::screenResolution().

{
  QMutexLocker ml(&_textPathsMutex);
  _textPaths.clear();
  if( !_showNames) return ;

  const GraphContentOptions& gc=lp.options();
  double coef=dotpercm/SciFigsGlobal::screenResolution();
  QFont scaledFont=_textFont;
  if(coef!=1.0 && gc.printBitmap())
    GraphicObject::scaleFont(scaledFont, coef);
  QList<AbstractLine *>::const_iterator it;
  for(it=begin() ;it!=end();++it) {
    AbstractNameLine * line=static_cast<AbstractNameLine *>( *it);
    int countPoints=line->count();
    if(countPoints && line->isVisible()) {
      if(line->isSelected()) { // set selection mark
        scaledFont.setBold(true);
      }
      for(int j=0;j < countPoints;j++ ) {
        QString name=line->name(j);
        QPainterPath p;
        p.addText(0, 0, scaledFont, name);
        _textPaths.append(p);
      }
      if(line->isSelected()) { // set selection mark
        scaledFont.setBold(false);
      }
    }
  }
}
void SciFigs::NameLineLayer::properties ( PropertyWidget w) const [virtual]

Clean property editor

Reimplemented from SciFigs::LineLayer.

References _tab, QGpGuiTools::PropertyProxy::currentTabWidget(), SciFigs::NameLineLayerProperties::removeLayer(), QGpGuiTools::PropertyProxy::removeTab(), QGpGuiTools::PropertyProxy::setCurrentTab(), TRACE, and w.

{
  TRACE;
  LineLayer::removeProperties(pp);
  if(pp->setCurrentTab(_tab)) {
    NameLineLayerProperties * w=static_cast<NameLineLayerProperties *>(pp->currentTabWidget());
    w->removeLayer(this);
    pp->removeTab(_tab, this);
  }
}
void SciFigs::NameLineLayer::setFontString ( QString  fs) [inline]

Referenced by setProperty().

{_textFont.fromString(fs);}
void SciFigs::NameLineLayer::setLegend ( Legend  legend) [virtual]
void SciFigs::NameLineLayer::setNames ( int  i,
QVector< QString > *  names 
)
void SciFigs::NameLineLayer::setProperty ( uint  wid,
int  pid,
QVariant  val 
) [virtual]
void SciFigs::NameLineLayer::setShowNames ( bool  b) [inline]

Referenced by setProperty().

virtual const QString& SciFigs::NameLineLayer::xml_tagName ( ) const [inline, virtual]

Reimplemented from SciFigs::LineLayer.


Member Data Documentation

Referenced by NameLineLayer(), paintData(), and paintText().

uint SciFigs::NameLineLayer::_tab = PropertyProxy::uniqueId() [static, protected]

Referenced by paintText().

const QString SciFigs::NameLineLayer::xmlNameLineLayerTag = "NameLineLayer" [static]

Property Documentation

QString SciFigs::NameLineLayer::font [read, write]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines