223 lines
5.2 KiB
C++
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();
|
|
}
|
|
}
|
|
|