ROOT logo
// @(#)root/qt:$Id: TQtMarker.cxx 36079 2010-10-05 09:49:55Z brun $
// Author: Valeri Fine   21/01/2002

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * Copyright (C) 2002 by Valeri Fine.                                    *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TQtRConfig.h"
#include "TQtMarker.h"
#include "TAttMarker.h"
#include "TGQt.h"
#include <QtGui/QPolygon>
#include <QtGui/QPainter>
#include <QtCore/QDebug>


ClassImp(TQtMarker)

////////////////////////////////////////////////////////////////////////
//
// TQtMarker - class-utility to convert the ROOT TMarker object shape 
//             into the Qt QPointArray.
//
////////////////////////////////////////////////////////////////////////

//______________________________________________________________________________
TQtMarker::TQtMarker(int n, TPoint *xy, int type) : fNumNode(n),
               fChain(0), fCindex(0), fMarkerType(0),fLineWidth(0),fLineOption(false)
{
  SetPenAttributes(type);
  if (GetType() != kDot) {
     fChain.resize(n);
     TPoint *rootPoint = xy;
     for (int i=0;i<n;i++,rootPoint++)
        fChain.setPoint(i,rootPoint->fX,rootPoint->fY);
  }
}
//______________________________________________________________________________
TQtMarker::~TQtMarker(){}
//______________________________________________________________________________
TQtMarker &TQtMarker::operator=(const TAttMarker&markerAttributes)
{
   // Assign the TQtMarker from ROOT TAttMarker 
	SetMarkerAttributes(markerAttributes);
	return *this;
}

//______________________________________________________________________________
TQtMarker::TQtMarker(const TAttMarker &markerAttributes)
{
   // Create the TQtMarker from ROOT TAttMarker 
	SetMarkerAttributes(markerAttributes);
}

//______________________________________________________________________________
void TQtMarker::SetMarkerAttributes(const TAttMarker& markerAttributes)
{
   // Map Qt marker  attributes to ROOT TAttMaker parameters
   fCindex     = markerAttributes.GetMarkerColor();
   SetPenAttributes(markerAttributes.GetMarkerStyle());
   fNumNode    = Int_t(markerAttributes.GetMarkerSize());
}

//______________________________________________________________________________
void  TQtMarker::SetPenAttributes(int type)
{
   // Pen attrbutes is 100000*LineFlag + 1000*width + "marker style"
   static const int packFactor = 1000;
   static const int lineFactor = 10000;
   fMarkerType = type%packFactor;
   fLineWidth = (type - fMarkerType)/packFactor;
   if (type >= lineFactor) {
      // Set line style 
      fLineWidth -= lineFactor/packFactor;
      fLineOption = true;
   }
}
//______________________________________________________________________________
int   TQtMarker::GetNumber() const {return fNumNode;}
//______________________________________________________________________________
const QPolygon &TQtMarker::GetNodes() const {return fChain;}
//______________________________________________________________________________
int  TQtMarker::GetType()  const {return fMarkerType;}

//______________________________________________________________________________
int  TQtMarker::GetWidth() const { return fLineWidth;}

//______________________________________________________________________________
void TQtMarker::SetMarker(int n, TPoint *xy, int type)
{
//*-* Did we have a chain ?
  fNumNode = n;
  SetPenAttributes(type);
  if (GetType() != kDot) {
    fChain.resize(n);
    TPoint *rootPoint = xy;
    for (int i=0;i<n;i++,rootPoint++)
       fChain.setPoint(i,rootPoint->fX,rootPoint->fY);
  }
}

//______________________________________________________________________________
void  TQtMarker::DrawPolyMarker(QPainter &p, int n, TPoint *xy)
{
	// Draw n markers with the current attributes at positions xy.
	// p    : the external QPainter 
   // n    : number of markers to draw
	// xy   : x,y coordinates of markers
	
	/* Set marker Color */
	const QColor &mColor  = gQt->ColorIndex(fCindex);

   p.save();
   if (this->GetWidth()>0) p.setPen(QPen(mColor,this->GetWidth()));
   else                    p.setPen(mColor);

   if( this->GetNumber() <= 0  || fLineOption )
   {
      QPolygon qtPoints(n);
      TPoint *rootPoint = xy;
      for (int i=0;i<n;i++,rootPoint++)
        qtPoints.setPoint(i,rootPoint->fX,rootPoint->fY);
      if (fLineOption) p.drawPolyline(qtPoints);
      else             p.drawPoints(qtPoints);
   }
   if ( this->GetNumber() >0 ) {
      int r = this->GetNumber()/2;
      switch (this -> GetType())
      {
      case 1:
      case 3:
      default:
         p.setBrush(mColor);
         break;
		case 0:
		case 2:
			p.setBrush(Qt::NoBrush);
			break;
		case 4:
			break;
		}

		for( int m = 0; m < n; m++ )
		{
			int i;
			switch( this->GetType() )
			{
			case 0:        /* hollow circle */
			case 1:        /* filled circle */
				p.drawEllipse(xy[m].fX-r, xy[m].fY-r, 2*r, 2*r);
				break;
			case 2:        /* hollow polygon */
			case 3:        /* filled polygon */
				{
					QPolygon mxy = this->GetNodes();
					mxy.translate(xy[m].fX,xy[m].fY);
					p.drawPolygon(mxy);
					break;
				}
			case 4:        /* segmented line */
				{
					QPolygon mxy = this->GetNodes();
					mxy.translate(xy[m].fX,xy[m].fY);
					QVector<QLine> lines(this->GetNumber());
					for( i = 0; i < this->GetNumber(); i+=2 )
						lines.push_back(QLine(mxy.point(i),mxy.point(i+1)));
					p.drawLines(lines);
					break;
				}
			}
		}
	}
	p.restore();
}
 TQtMarker.cxx:1
 TQtMarker.cxx:2
 TQtMarker.cxx:3
 TQtMarker.cxx:4
 TQtMarker.cxx:5
 TQtMarker.cxx:6
 TQtMarker.cxx:7
 TQtMarker.cxx:8
 TQtMarker.cxx:9
 TQtMarker.cxx:10
 TQtMarker.cxx:11
 TQtMarker.cxx:12
 TQtMarker.cxx:13
 TQtMarker.cxx:14
 TQtMarker.cxx:15
 TQtMarker.cxx:16
 TQtMarker.cxx:17
 TQtMarker.cxx:18
 TQtMarker.cxx:19
 TQtMarker.cxx:20
 TQtMarker.cxx:21
 TQtMarker.cxx:22
 TQtMarker.cxx:23
 TQtMarker.cxx:24
 TQtMarker.cxx:25
 TQtMarker.cxx:26
 TQtMarker.cxx:27
 TQtMarker.cxx:28
 TQtMarker.cxx:29
 TQtMarker.cxx:30
 TQtMarker.cxx:31
 TQtMarker.cxx:32
 TQtMarker.cxx:33
 TQtMarker.cxx:34
 TQtMarker.cxx:35
 TQtMarker.cxx:36
 TQtMarker.cxx:37
 TQtMarker.cxx:38
 TQtMarker.cxx:39
 TQtMarker.cxx:40
 TQtMarker.cxx:41
 TQtMarker.cxx:42
 TQtMarker.cxx:43
 TQtMarker.cxx:44
 TQtMarker.cxx:45
 TQtMarker.cxx:46
 TQtMarker.cxx:47
 TQtMarker.cxx:48
 TQtMarker.cxx:49
 TQtMarker.cxx:50
 TQtMarker.cxx:51
 TQtMarker.cxx:52
 TQtMarker.cxx:53
 TQtMarker.cxx:54
 TQtMarker.cxx:55
 TQtMarker.cxx:56
 TQtMarker.cxx:57
 TQtMarker.cxx:58
 TQtMarker.cxx:59
 TQtMarker.cxx:60
 TQtMarker.cxx:61
 TQtMarker.cxx:62
 TQtMarker.cxx:63
 TQtMarker.cxx:64
 TQtMarker.cxx:65
 TQtMarker.cxx:66
 TQtMarker.cxx:67
 TQtMarker.cxx:68
 TQtMarker.cxx:69
 TQtMarker.cxx:70
 TQtMarker.cxx:71
 TQtMarker.cxx:72
 TQtMarker.cxx:73
 TQtMarker.cxx:74
 TQtMarker.cxx:75
 TQtMarker.cxx:76
 TQtMarker.cxx:77
 TQtMarker.cxx:78
 TQtMarker.cxx:79
 TQtMarker.cxx:80
 TQtMarker.cxx:81
 TQtMarker.cxx:82
 TQtMarker.cxx:83
 TQtMarker.cxx:84
 TQtMarker.cxx:85
 TQtMarker.cxx:86
 TQtMarker.cxx:87
 TQtMarker.cxx:88
 TQtMarker.cxx:89
 TQtMarker.cxx:90
 TQtMarker.cxx:91
 TQtMarker.cxx:92
 TQtMarker.cxx:93
 TQtMarker.cxx:94
 TQtMarker.cxx:95
 TQtMarker.cxx:96
 TQtMarker.cxx:97
 TQtMarker.cxx:98
 TQtMarker.cxx:99
 TQtMarker.cxx:100
 TQtMarker.cxx:101
 TQtMarker.cxx:102
 TQtMarker.cxx:103
 TQtMarker.cxx:104
 TQtMarker.cxx:105
 TQtMarker.cxx:106
 TQtMarker.cxx:107
 TQtMarker.cxx:108
 TQtMarker.cxx:109
 TQtMarker.cxx:110
 TQtMarker.cxx:111
 TQtMarker.cxx:112
 TQtMarker.cxx:113
 TQtMarker.cxx:114
 TQtMarker.cxx:115
 TQtMarker.cxx:116
 TQtMarker.cxx:117
 TQtMarker.cxx:118
 TQtMarker.cxx:119
 TQtMarker.cxx:120
 TQtMarker.cxx:121
 TQtMarker.cxx:122
 TQtMarker.cxx:123
 TQtMarker.cxx:124
 TQtMarker.cxx:125
 TQtMarker.cxx:126
 TQtMarker.cxx:127
 TQtMarker.cxx:128
 TQtMarker.cxx:129
 TQtMarker.cxx:130
 TQtMarker.cxx:131
 TQtMarker.cxx:132
 TQtMarker.cxx:133
 TQtMarker.cxx:134
 TQtMarker.cxx:135
 TQtMarker.cxx:136
 TQtMarker.cxx:137
 TQtMarker.cxx:138
 TQtMarker.cxx:139
 TQtMarker.cxx:140
 TQtMarker.cxx:141
 TQtMarker.cxx:142
 TQtMarker.cxx:143
 TQtMarker.cxx:144
 TQtMarker.cxx:145
 TQtMarker.cxx:146
 TQtMarker.cxx:147
 TQtMarker.cxx:148
 TQtMarker.cxx:149
 TQtMarker.cxx:150
 TQtMarker.cxx:151
 TQtMarker.cxx:152
 TQtMarker.cxx:153
 TQtMarker.cxx:154
 TQtMarker.cxx:155
 TQtMarker.cxx:156
 TQtMarker.cxx:157
 TQtMarker.cxx:158
 TQtMarker.cxx:159
 TQtMarker.cxx:160
 TQtMarker.cxx:161
 TQtMarker.cxx:162
 TQtMarker.cxx:163
 TQtMarker.cxx:164
 TQtMarker.cxx:165
 TQtMarker.cxx:166
 TQtMarker.cxx:167
 TQtMarker.cxx:168
 TQtMarker.cxx:169
 TQtMarker.cxx:170
 TQtMarker.cxx:171
 TQtMarker.cxx:172
 TQtMarker.cxx:173
 TQtMarker.cxx:174
 TQtMarker.cxx:175
 TQtMarker.cxx:176
 TQtMarker.cxx:177
 TQtMarker.cxx:178
 TQtMarker.cxx:179