| 
							- // generated by Fast Light User Interface Designer (fluid) version 1.0107f
 - 
 - #include "WidgetPDial.h"
 - #include <cstdio>
 - #include <iostream>
 - #include <cmath>
 - #include <string>
 - #include <FL/Fl_Tooltip.H>
 - #include <FL/fl_draw.H>
 - #include <FL/Fl_Group.H>
 - #include <FL/Fl_Menu_Window.H>
 - #include "../Misc/Util.h"
 - //Copyright (c) 2003-2005 Nasca Octavian Paul
 - //License: GNU GPL version 2 or later
 - 
 - using namespace std;
 - 
 - class TipWin:public Fl_Menu_Window
 - {
 -     public:
 -         TipWin();
 -         void draw();
 -         void showValue(float f);
 -         void setText(const char *c);
 -         void showText();
 -     private:
 -         void redraw();
 -         const char *getStr() const;
 -         string tip;
 -         string text;
 -         bool   textmode;
 - };
 - 
 - TipWin::TipWin():Fl_Menu_Window(1, 1)
 - {
 -     set_override();
 -     end();
 - }
 - 
 - void TipWin::draw()
 - {
 -     //setup window
 -     draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Color(175));
 -     fl_color(FL_BLACK);
 -     fl_font(labelfont(), labelsize());
 - 
 -     //Draw the current string
 -     fl_draw(getStr(), 3, 3, w() - 6, h() - 6,
 -             Fl_Align(FL_ALIGN_LEFT | FL_ALIGN_WRAP));
 - }
 - 
 - void TipWin::showValue(float f)
 - {
 -     //convert the value to a string
 -     char tmp[10];
 -     snprintf(tmp, 9, "%.2f", f);
 -     tip = tmp;
 - 
 -     textmode = false;
 -     redraw();
 -     show();
 - }
 - 
 - void TipWin::setText(const char *c)
 - {
 -     text     = c;
 -     textmode = true;
 -     redraw();
 - }
 - 
 - void TipWin::showText()
 - {
 -     if(!text.empty()) {
 -         textmode = true;
 -         redraw();
 -         show();
 -     }
 - }
 - 
 - void TipWin::redraw()
 - {
 -     // Recalc size of window
 -     fl_font(labelfont(), labelsize());
 -     int W = 0, H = 0;
 -     fl_measure(getStr(), W, H, 0);
 -     //provide a bit of extra space
 -     W += 8;
 -     H += 4;
 -     size(W, H);
 -     Fl_Menu_Window::redraw();
 - }
 - 
 - const char *TipWin::getStr() const
 - {
 -     return (textmode ? text : tip).c_str();
 - }
 - 
 - //static int numobj = 0;
 - 
 - WidgetPDial::WidgetPDial(int x, int y, int w, int h, const char *label)
 -     :Fl_Dial(x, y, w, h, label), oldvalue(0.0f), pos(false), textset(false)
 - {
 -     //cout << "[" << label << "] There are now " << ++numobj << endl;
 -     Fl_Group *save = Fl_Group::current();
 -     tipwin = new TipWin();
 -     tipwin->hide();
 -     Fl_Group::current(save);
 - }
 - 
 - WidgetPDial::~WidgetPDial()
 - {
 -     //cout << "There are now " << --numobj << endl;
 -     delete tipwin;
 - }
 - 
 - int WidgetPDial::handle(int event)
 - {
 - #ifdef NTK_GUI
 -     return Fl_Dial::handle( event );
 - #else
 -     double dragsize, min = minimum(), max = maximum();
 -     int    my;
 - 
 -     switch(event) {
 -         case FL_PUSH:
 -             oldvalue = value();
 -         case FL_DRAG:
 -             getPos();
 -             tipwin->showValue(value());
 -             my = -(Fl::event_y() - y() - h() / 2);
 - 
 -             dragsize = 200.0f;
 -             if(Fl::event_state(FL_BUTTON1) == 0)
 -                 dragsize *= 10;
 - 
 -             value(limit(oldvalue + my / dragsize * (max - min), min, max));
 -             value_damage();
 -             if(this->when() != 0)
 -                 do_callback();
 -             return 1;
 -         case FL_ENTER:
 -             getPos();
 -             tipwin->showText();
 -             return 1;
 -         case FL_HIDE:
 -         case FL_LEAVE:
 -             tipwin->hide();
 -             resetPos();
 -             break;
 -         case FL_RELEASE:
 -             tipwin->hide();
 -             resetPos();
 -             if(this->when() == 0)
 -                 do_callback();
 -             return 1;
 -             break;
 -     }
 -     return 0;
 - #endif
 - }
 - 
 - void WidgetPDial::drawgradient(int cx, int cy, int sx, double m1, double m2)
 - {
 - #ifdef NTK_GUI
 -     return;
 - #else
 -     for(int i = (int)(m1 * sx); i < (int)(m2 * sx); i++) {
 -         double tmp = 1.0f - powf(i * 1.0f / sx, 2.0f);
 -         pdialcolor(140
 -                    + (int) (tmp
 -                             * 90), 140
 -                    + (int)(tmp * 90), 140 + (int) (tmp * 100));
 -         fl_arc(cx + sx / 2 - i / 2, cy + sx / 2 - i / 2, i, i, 0, 360 );
 -     }
 - #endif
 - }
 - 
 - void WidgetPDial::draw()
 - {
 - #ifdef NTK_GUI
 -     box( FL_NO_BOX );
 - 
 -     Fl_Dial::draw();
 -     
 -     return;
 - #else
 -     int cx = x(), cy = y(), sx = w(), sy = h();
 - 
 -     //clears the button face
 -     pdialcolor(190, 190, 200);
 -     fl_pie(cx - 1, cy - 1, sx + 2, sy + 2, 0, 360);
 - 
 -     /* //Draws the button face (gradinet) */
 -     drawgradient(cx, cy, sx, 0.5f, 1.0f); 
 - 
 -     double val = (value() - minimum()) / (maximum() - minimum());
 - 
 -     //draws the scale
 -     pdialcolor(220, 220, 250);
 -     double a1 = angle1(), a2 = angle2();
 -     for(int i = 0; i < 12; i++) {
 -         double a = -i / 12.0f * 360.0f - val * (a2 - a1) - a1;
 -         fl_pie(cx, cy, sx, sy, a + 270 - 3, a + 3 + 270);
 -     }
 - 
 -     drawgradient(cx, cy, sx, 0.0f, 0.75f);
 - 
 - 
 - 
 -     //draws the value
 -     double a = -(a2 - a1) * val - a1;
 - 
 -     //draws the max and min points
 -     pdialcolor(0, 100, 200);
 -     int xp =
 -         (int)(cx + sx / 2.0f + sx / 2.0f * sinf(angle1() / 180.0f * 3.141592f));
 -     int yp =
 -         (int)(cy + sy / 2.0f + sy / 2.0f * cosf(angle1() / 180.0f * 3.141592f));
 -     fl_pie(xp - 2, yp - 2, 4, 4, 0, 360);
 - 
 -     xp = (int)(cx + sx / 2.0f + sx / 2.0f * sinf(angle2() / 180.0f * 3.141592f));
 -     yp = (int)(cy + sy / 2.0f + sy / 2.0f * cosf(angle2() / 180.0f * 3.141592f));
 -     fl_pie(xp - 2, yp - 2, 4, 4, 0, 360);
 - 
 -     fl_push_matrix();
 - 
 -     fl_translate(cx + sx / 2, cy + sy / 2);
 -     fl_rotate(a - 90.0f);
 - 
 -     fl_translate(sx / 2, 0);
 - 
 -     fl_begin_polygon();
 -     pdialcolor(0, 0, 0);
 -     fl_vertex(-10, -4);
 -     fl_vertex(-10, 4);
 -     fl_vertex(0, 0);
 -     fl_end_polygon();
 - 
 -     fl_pop_matrix();
 - #endif
 - }
 - 
 - void WidgetPDial::pdialcolor(int r, int g, int b)
 - {
 -     if(active_r())
 -         fl_color(r, g, b);
 -     else
 -         fl_color(160 - (160 - r) / 3, 160 - (160 - b) / 3, 160 - (160 - b) / 3);
 - }
 - 
 - void WidgetPDial::tooltip(const char *c)
 - {
 -     tipwin->setText(c);
 -     textset = true;
 - }
 - 
 - void WidgetPDial::getPos()
 - {
 -     if(!pos) {
 -         tipwin->position(Fl::event_x_root(), Fl::event_y_root() + 20);
 -         pos = true;
 -     }
 - }
 - 
 - void WidgetPDial::resetPos()
 - {
 -     pos = false;
 - }
 
 
  |