pplugins/pui/slider.cpp

223 lines
5.2 KiB
C++

#include <pugl/pugl.h>
#include "pui.h"
static const int trough1_cut = 15;
static const int trough2_cut = 20;
static const int pad = 20;
float HSlider::GetNewValue(int x, int y)
{
int x2 = this->x + pad;
int w2 = this->w - pad - pad;
if (x <= x2) return min;
if (x >= x2 + w2) return max;
return (x - x2) * (max - min) / w2 + min;
}
void HSlider::OnPaint() const
{
float m = (value - min) / (max - min);
// printf("%d\n", tex[TEX_TROUGH1]);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
int t = big ? TEX_TROUGH1 : TEX_TROUGH1;
int w2 = tex->w[t];
int h2 = tex->h[t];
int mx, my;
mx = (w - w2) * 0.5f + x;
my = (h - h2) * 0.5f + y;
int cut = big ? trough2_cut : trough1_cut;
float fc = (float)cut / h2;
glBindTexture(GL_TEXTURE_2D, tex->tex[t]);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, y);
glTexCoord2f(0.0, fc);
glVertex2f( mx, y + cut);
glTexCoord2f(1.0, fc);
glVertex2f(w2 + mx, y + cut);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, y);
glTexCoord2f(0.0, fc);
glVertex2f( mx, y + cut);
glTexCoord2f(0.0, 1.0 - fc);
glVertex2f( mx, h + y - cut);
glTexCoord2f(1.0, 1.0 - fc);
glVertex2f(w2 + mx, h + y - cut);
glTexCoord2f(1.0, fc);
glVertex2f(w2 + mx, y + cut);
glTexCoord2f(0.0, 1.0 - fc);
glVertex2f( mx, h + y - cut);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h + y);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h + y);
glTexCoord2f(1.0, 1.0 - fc);
glVertex2f(w2 + mx, h + y - cut);
/*
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, my);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h2 + my);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h2 + my);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, my);*/
glEnd();
if (big) {
t = active ? TEX_SLIDER2_PRE : TEX_SLIDER2;
} else {
t = active ? TEX_SLIDER1_PRE : TEX_SLIDER1;
}
w2 = tex->w[t];
h2 = tex->h[t];
int x3 = this->x + pad;
int w3 = this->w - pad - pad;
mx = w3 * m + x3 - w2 * 0.5f;
my = (h - h2) * 0.5f + y;
glBindTexture(GL_TEXTURE_2D, tex->tex[t]);
glBegin(GL_QUADS);
if (this->colour.a) glColor4f(colour.r, colour.g, colour.b, colour.a);
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, my);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h2 + my);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h2 + my);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, my);
glEnd();
glDisable(GL_TEXTURE_2D);
/* glBegin(GL_QUADS);
glColor4f(0.5f, 0.3f, 0.5f, 0.5f);
glVertex2f( x, y);
glVertex2f( x, h + y);
glVertex2f(w + x, h + y);
glVertex2f(w + x, y);
glEnd();*/
}
float VSlider::GetNewValue(int x, int y)
{
int y2 = this->y + pad;
int h2 = this->h - pad - pad;
if (y <= y2) return max;
if (y >= y2 + h2) return min;
return (y2 + h2 - y) * (max - min) / h2 + min;
}
void VSlider::OnPaint() const
{
float m = (value - min) / (max - min);
// printf("%d\n", tex[TEX_TROUGH1]);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
int t = big ? TEX_TROUGH1 : TEX_TROUGH1;
int w2 = tex->w[t];
int h2 = tex->h[t];
int mx, my;
mx = (w - w2) * 0.5f + x;
my = (h - h2) * 0.5f + y;
int cut = big ? trough2_cut : trough1_cut;
float fc = (float)cut / h2;
glBindTexture(GL_TEXTURE_2D, tex->tex[t]);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, y);
glTexCoord2f(0.0, fc);
glVertex2f( mx, y + cut);
glTexCoord2f(1.0, fc);
glVertex2f(w2 + mx, y + cut);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, y);
glTexCoord2f(0.0, fc);
glVertex2f( mx, y + cut);
glTexCoord2f(0.0, 1.0 - fc);
glVertex2f( mx, h + y - cut);
glTexCoord2f(1.0, 1.0 - fc);
glVertex2f(w2 + mx, h + y - cut);
glTexCoord2f(1.0, fc);
glVertex2f(w2 + mx, y + cut);
glTexCoord2f(0.0, 1.0 - fc);
glVertex2f( mx, h + y - cut);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h + y);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h + y);
glTexCoord2f(1.0, 1.0 - fc);
glVertex2f(w2 + mx, h + y - cut);
/*
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, my);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h2 + my);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h2 + my);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, my);*/
glEnd();
if (big) {
t = active ? TEX_SLIDER2_PRE : TEX_SLIDER2;
} else {
t = active ? TEX_SLIDER1_PRE : TEX_SLIDER1;
}
w2 = tex->w[t];
h2 = tex->h[t];
int y3 = this->y + pad;
int h3 = this->h - pad - pad;
mx = (w - w2) * 0.5f + x;
my = h3 - h3 * m + y3 - h2 * 0.5f;
glBindTexture(GL_TEXTURE_2D, tex->tex[t]);
glBegin(GL_QUADS);
if (this->colour.a) glColor4f(colour.r, colour.g, colour.b, colour.a);
glTexCoord2f(0.0, 0.0);
glVertex2f( mx, my);
glTexCoord2f(0.0, 1.0);
glVertex2f( mx, h2 + my);
glTexCoord2f(1.0, 1.0);
glVertex2f(w2 + mx, h2 + my);
glTexCoord2f(1.0, 0.0);
glVertex2f(w2 + mx, my);
glEnd();
glDisable(GL_TEXTURE_2D);
if (this->active) {
glBegin(GL_LINE_LOOP);
glColor4f(1.f, 1.f, 1.0f, 0.25f);
glVertex2f( x + .5f, y + .5f);
glVertex2f( x + .5f, h + y - .5f);
glVertex2f(w + x - .5f, h + y - .5f);
glVertex2f(w + x - .5f, y + .5f);
glEnd();
}
}