[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeedu/kalgebra/src
From:       Aleix Pol Gonzalez <aleixpol () gmail ! com>
Date:       2008-02-19 19:27:06
Message-ID: 1203449226.077374.32155.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 777116 by apol:

Added a keep aspect ratio feature for 2D Graphs.


 M  +1 -1      functionsmodel.cpp  
 M  +71 -38    graph2d.cpp  
 M  +10 -4     graph2d.h  


--- trunk/KDE/kdeedu/kalgebra/src/functionsmodel.cpp #777115:777116
@@ -1,5 +1,5 @@
 /*************************************************************************************
                
- *  Copyright (C) 2007 by Aleix Pol <aleixpol@gmail.com>                             \
* + *  Copyright (C) 2007-2008 by Aleix Pol <aleixpol@gmail.com>                      \
                *
  *                                                                                   \
                *
  *  This program is free software; you can redistribute it and/or                    \
                *
  *  modify it under the terms of the GNU General Public License                      \
                *
--- trunk/KDE/kdeedu/kalgebra/src/graph2d.cpp #777115:777116
@@ -1,5 +1,5 @@
 /*************************************************************************************
                
- *  Copyright (C) 2007 by Aleix Pol <aleixpol@gmail.com>                             \
* + *  Copyright (C) 2007-2008 by Aleix Pol <aleixpol@gmail.com>                      \
                *
  *                                                                                   \
                *
  *  This program is free software; you can redistribute it and/or                    \
                *
  *  modify it under the terms of the GNU General Public License                      \
* @@ -42,7 +42,8 @@
 
 Graph2D::Graph2D(FunctionsModel* fm, QWidget *parent) :
 	QWidget(parent), m_model(fm),
-	valid(false), mode(None), m_squares(true), resolucio(800), m_framed(false), \
m_readonly(false), m_posText("") +	valid(false), mode(None), m_squares(true), \
m_keepRatio(true), resolucio(800), +	m_framed(false), m_readonly(false), m_posText()
 {
 	this->setFocusPolicy(Qt::ClickFocus);
 	this->setCursor(QCursor(Qt::CrossCursor));
@@ -136,13 +137,14 @@
 	
 	double xini=ceil(viewport.left()), inc=1.;
 	double yini=ceil(viewport.top());
-	if(viewport.width()>100.) {
+	
+	if(viewport.width()>100.) { //Draw less lines on large viewports
 		inc=10.;
 		xini=floor(xini/10.)*10.;
 		yini=floor(yini/10.)*10.;
 	}
 	
-	for(double x=xini; x<=viewport.right(); x+=inc) {	// ralletes X
+	for(double x=xini; x<=viewport.right(); x+=inc) {	// ticks X
 		p = toWidget(QPointF(x, 0.));
 		if(m_squares)
 			finestra->drawLine(QPointF(p.x(), this->height()), QPointF(p.x(), 0));
@@ -310,7 +312,7 @@
 		viewport.setTop(viewport.top() + d);
 		viewport.setRight(viewport.right() + d);
 		viewport.setBottom(viewport.bottom() - d);
-		update_scale();
+		updateScale();
 	}
 	sendStatus(QString("(%1, %2)-(%3, \
%4)").arg(viewport.left()).arg(viewport.top()).arg(viewport.right()).arg(viewport.bottom()));
  }
@@ -370,20 +372,24 @@
 	
 	switch(e->key()) {
 		case Qt::Key_Right:
-			viewport.setLeft(viewport.left() +xstep);
-			viewport.setRight(viewport.right() +xstep);
+			userViewport.setLeft(viewport.left() +xstep);
+			userViewport.setRight(viewport.right() +xstep);
+			updateScale();
 			break;
 		case Qt::Key_Left:
-			viewport.setLeft(viewport.left() -xstep);
-			viewport.setRight(viewport.right() -xstep);
+			userViewport.setLeft(viewport.left() -xstep);
+			userViewport.setRight(viewport.right() -xstep);
+			updateScale();
 			break;
 		case Qt::Key_Down:
-			viewport.setTop(viewport.top() -ystep);
-			viewport.setBottom(viewport.bottom() -ystep);
+			userViewport.setTop(viewport.top() -ystep);
+			userViewport.setBottom(viewport.bottom() -ystep);
+			updateScale();
 			break;
 		case Qt::Key_Up:
-			viewport.setTop(viewport.top() +ystep);
-			viewport.setBottom(viewport.bottom() +ystep);
+			userViewport.setTop(viewport.top() +ystep);
+			userViewport.setBottom(viewport.bottom() +ystep);
+			updateScale();
 			break;
 		case Qt::Key_Minus:
 			zoomOut();
@@ -420,7 +426,8 @@
 
 QPointF Graph2D::toWidget(const QPointF& p) const
 {
-	return QPointF((-viewport.left() + p.x()) * rang_x,  (-viewport.top() + p.y()) * \
rang_y); +	double left=-viewport.left(), top=-viewport.top();
+	return QPointF((left + p.x()) * rang_x,  (top + p.y()) * rang_y);
 }
 
 QPointF Graph2D::fromWidget(const QPointF& p) const
@@ -442,27 +449,28 @@
 
 void Graph2D::setViewport(const QRectF &vp)
 {
-	viewport = vp;
-	if(viewport.top()<viewport.bottom()) {
-		double aux = viewport.bottom();
-		viewport.setBottom(viewport.top());
-		viewport.setTop(aux);
+	userViewport = vp;
+	if(userViewport.top()<userViewport.bottom()) {
+		double aux = userViewport.bottom();
+		userViewport.setBottom(userViewport.top());
+		userViewport.setTop(aux);
 	}
 	
-	if(viewport.right()<viewport.left()) {
-		double aux = viewport.left();
-		viewport.setLeft(viewport.right());
-		viewport.setRight(aux);
+	if(userViewport .right()<userViewport .left()) {
+		double aux = userViewport .left();
+		userViewport.setLeft(userViewport .right());
+		userViewport.setRight(aux);
 	}
 	
-	sendStatus(QString("(%1, %2)-(%3, \
%4)").arg(viewport.left()).arg(viewport.top()).arg(viewport.right()).arg(viewport.bottom()));
                
-	update_scale();
+	sendStatus(QString("(%1, %2)-(%3, %4)")
+			.arg(viewport.left()).arg(viewport.top()).arg(viewport.right()).arg(viewport.bottom()));
 +	updateScale();
 }
 
 void Graph2D::resizeEvent(QResizeEvent *)
 {
 	buffer=QPixmap(this->size());
-	update_scale();
+	updateScale();
 	repaint();
 }
 
@@ -500,20 +508,39 @@
 	return b;
 }
 
-void Graph2D::update_scale()
+void Graph2D::updateScale()
 {
-	rang_x= this->width()/viewport.width();
-	rang_y= this->height()/viewport.height();
+	viewport=userViewport;
+	rang_x= width()/viewport.width();
+	rang_y= height()/viewport.height();
+	
+	if(m_keepRatio && rang_x!=rang_y)
+	{
+		rang_y=rang_x=qMax(fabs(rang_x), fabs(rang_y));
+		if(rang_y>0.) rang_y=-rang_y;
+		if(rang_x<0.) rang_x=-rang_x;
+		
+		double newW=width()/rang_x, newH=height()/rang_x;
+		
+		double mx=(userViewport.width()-newW)/2.;
+		double my=(userViewport.height()-newH)/2.;
+		
+		viewport.setLeft(userViewport.left()+mx);
+		viewport.setTop(userViewport.bottom()-my);
+		viewport.setWidth(newW);
+		viewport.setHeight(-newH);
+		Q_ASSERT(userViewport.center() == viewport.center());
+	}
+	
 	valid=false;
 	this->repaint();
 }
 
 void Graph2D::zoomIn()
 {
-	if(viewport.height() < -3. && viewport.width() > 3.){
+	if(userViewport.height() < -3. && userViewport.width() > 3.){
 		//resolucio=(resolucio*viewport.width())/(viewport.width()-2.);
-		viewport.setCoords(viewport.left() + 1., viewport.top() -1., viewport.right() -1., \
                viewport.bottom() +1.);
-		update_scale();
+		setViewport(QRect(userViewport.left() + 1., userViewport.top() -1., \
userViewport.right() -1., userViewport.bottom() +1.));  }
 }
 
@@ -521,16 +548,15 @@
 {
 	//FIXME:Bad solution
 	//resolucio=(resolucio*viewport.width())/(viewport.width()+2.);
-	viewport.setCoords(viewport.left() -1., viewport.top() +1., viewport.right() + 1., \
                viewport.bottom() -1.);
-	update_scale();
+	setViewport(QRect(userViewport.left() -1., userViewport.top() +1., \
userViewport.right() + 1., userViewport.bottom() -1.));  }
 
 void Graph2D::update(const QModelIndex & startIdx, const QModelIndex & endIdx)
 {
 	int start=startIdx.row(), end=endIdx.row();
 	
-	for(; start<end; start++) {
-		m_model->updatePoints(start, toBiggerRect(viewport), \
static_cast<int>(floor(resolucio))); +	for(int i=start; i<end; i++) {
+		m_model->updatePoints(i, toBiggerRect(viewport), \
static_cast<int>(floor(resolucio)));  }
 	valid=false;
 	repaint();
@@ -538,8 +564,8 @@
 
 void Graph2D::addFuncs(const QModelIndex & parent, int start, int end)
 {
-	for(; start<end; start++) {
-		m_model->updatePoints(start, toBiggerRect(viewport), \
static_cast<int>(floor(resolucio))); +	for(int i=start; i<end; i++) {
+		m_model->updatePoints(i, toBiggerRect(viewport), \
static_cast<int>(floor(resolucio)));  }
 	valid=false;
 }
@@ -550,4 +576,11 @@
 	repaint();
 }
 
+void Graph2D::setKeepAspectRatio(bool ar)
+{
+	m_keepRatio=ar;
+	valid=false;
+	repaint();
+}
+
 #include "graph2d.moc"
--- trunk/KDE/kdeedu/kalgebra/src/graph2d.h #777115:777116
@@ -1,5 +1,5 @@
 /*************************************************************************************
                
- *  Copyright (C) 2007 by Aleix Pol <aleixpol@gmail.com>                             \
* + *  Copyright (C) 2007-2008 by Aleix Pol <aleixpol@gmail.com>                      \
                *
  *                                                                                   \
                *
  *  This program is free software; you can redistribute it and/or                    \
                *
  *  modify it under the terms of the GNU General Public License                      \
* @@ -91,6 +91,10 @@
 	/** Sets whether it is a read-only widget. */
 	void setReadOnly(bool ro) { m_readonly=ro; setMouseTracking(!ro); }
 	
+	void setKeepAspectRatio(bool ar);
+	
+	bool keepAspectRatio() const { return m_keepRatio; }
+	
 public slots:
 	/** Makes the image as dirty and repaints everything. */
 	void forceRepaint() { valid=false; repaint(); }
@@ -149,13 +153,15 @@
 	
 	//presentation
 	bool m_squares;
+	bool m_keepRatio;
 	double resolucio;
 	double rang_x, rang_y;
-	QPointF ant;
-	QRectF viewport;
+    QPointF ant;
+    QRectF viewport;
+    QRectF userViewport;
 	QRectF defViewport;
 	void pintafunc(QPaintDevice*);
-	void update_scale();
+	void updateScale();
 		
 	void sendStatus(const QString& msg) { emit status(msg); }
 	bool m_framed;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic