[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