You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ksquirrel/ksquirrel/sq_glselectionpainter.cpp

146 lines
3.3 KiB

/***************************************************************************
sq_glselectionpainter.cpp - description
-------------------
begin : Apr 4 2007
copyright : (C) 2007 by Baryshev Dmitry
email : ksquirrel.iv@gmail.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tqbitmap.h>
#include <tqpainter.h>
#include <cmath>
#include "sq_glwidget.h"
#include "sq_glselectionpainter.h"
static const int len = 4;
static const int len2 = 10;
static const int lenc = 2;
static const int lenc2 = lenc / 2;
static const double rad_const = 3.14159265358979323846 / 180.0;
/* ******************************************************************* */
SQ_GLSelectionPainter::SQ_GLSelectionPainter(SQ_GLWidget *widget)
: w(widget), sourcew(1), sourceh(1), sw(0), sh(0), sx(0), sy(0),
angle(0), m_valid(false), m_shown(false)
{}
SQ_GLSelectionPainter::~SQ_GLSelectionPainter()
{}
void SQ_GLSelectionPainter::begin(Type tp, int x, int y, bool U)
{
// end previous drawing if any
end();
m_type = tp;
hackXY(x, y);
sx = xmoveold = x;
sy = ymoveold = y;
sw = 0;
sh = 0;
m_valid = true;
m_shown = true;
if(U) w->updateGLA();
}
void SQ_GLSelectionPainter::move(int x, int y)
{
hackXY(x, y);
int X = TQMAX(x, xmoveold);
int Y = TQMIN(y, ymoveold);
int Xmin = TQMIN(x, xmoveold);
int Ymin = TQMAX(y, ymoveold);
sx = Xmin;
sy = Ymin;
sw = X - Xmin;
sh = Ymin - Y;
angle += 3;
if(angle > 360)
angle = 0;
// SQ_GLWidget::paintGL() will call draw()
w->updateGLA();
}
void SQ_GLSelectionPainter::end()
{
m_valid = false;
m_shown = false;
w->updateGLA();
}
void SQ_GLSelectionPainter::drawEllipse(float xradius, float yradius)
{
w->makeCurrent();
double degInRad;
glBegin(GL_LINE_LOOP);
glColor4f(1,0,1,1);
for(int i = 0; i < 360; i++)
{
degInRad = rad_const * i;
glVertex2f(cos(degInRad) * xradius, sin(degInRad) * yradius);
}
glColor4f(1,1,1,1);
glEnd();
}
void SQ_GLSelectionPainter::drawRect()
{
w->makeCurrent();
glBegin(GL_LINE_LOOP);
glColor4f(1,0,1,1);
glVertex2f(-sw/2, sh/2);
glVertex2f(sw/2, sh/2);
glVertex2f(sw/2, -sh/2);
glVertex2f(-sw/2, -sh/2);
glColor4f(1,1,1,1);
glEnd();
}
void SQ_GLSelectionPainter::draw()
{
if(!sw || !sh)
return;
if(m_type == Ellipse)
drawEllipse(sw/2, sh/2);
else
drawRect();
// center rectangle
if(sw > lenc && sh > lenc)
{
glColor4f(1,0,1,1);
glRectf(-lenc2, lenc2, lenc2, -lenc2);
glColor4f(1,1,1,1);
}
}