#include #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 PUi *pui) 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 = pui->w[t]; int h2 = pui->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, pui->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 = pui->w[t]; h2 = pui->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, pui->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 PUi *pui) 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 = pui->w[t]; int h2 = pui->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, pui->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 = pui->w[t]; h2 = pui->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, pui->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); char tmp[128]; snprintf(tmp, sizeof tmp, "%s", this->label); FTBBox box = pui->font->BBox(tmp); FTPoint p = box.Upper() - box.Lower(); float cx = p.X(); float cy = p.Y(); float ox = -.5f; float oy = 0; glPushMatrix(); // glColor4f(colour.r, colour.g, colour.b, colour.a); glTranslatef(x + w * 0.5f, y - 4, 0); glScalef(.5f, -.5f, 1); glTranslatef(cx * ox, -cy * oy, 0); glColor4f(0, 0, 0, 1); pui->font->Render(tmp); glTranslatef(0, 2, 0); glColor4f(1, 1, 1, 1); pui->font->Render(tmp); glPopMatrix(); Widget::OnPaint(pui); }