|
- /* TriggerWidget
- * Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
- #include "Fl_Trigger.h"
- #include <iostream>
- #include <FL/fl_draw.H>
- #include <math.h>
- #include <stdio.h>
- #include "Fl_Loop.h"
-
- /////////////////////////////////////////////////////////////////////////////
-
- static const float RADCONV = 0.017453292;
-
- Fl_Trigger::Fl_Trigger(int x, int y, int w, int h, const char* label) :
- Fl_Widget(x,y,w,h,label),
- m_ID(0),
- m_CentreX(0),
- m_CentreY(0),
- m_CentreRadius(0),
- m_Dragging(false),
- m_Loop(0),
- m_Passes(0),
- m_Count(0),
- m_Angle(0),
- m_MaxLoops(10),
- m_MaxPasses(10),
- m_Snap(false),
- m_SnapDegrees(45)
- {
- }
-
- void Fl_Trigger::draw()
- {
- x((int)((sin(m_Angle*RADCONV)*m_CentreRadius)+m_CentreX-w()/2));
- y((int)((cos(m_Angle*RADCONV)*m_CentreRadius)+m_CentreY-h()/2));
-
- fl_font(fl_font(),8);
-
- fl_color(255,255,255);
- fl_arc(x(), y(), w(), h(), 0, 360);
-
- int cx=x()+w()/2;
- int cy=y()+h()/2;
-
- char text[32];
- //sprintf(text,"%d",m_Loop);
- //fl_draw(text, cx-2, cy-h()+5);
-
- //sprintf(text,"%d",m_Passes);
- //fl_draw(text, cx+w()-5, cy+3);
-
- sprintf(text,"%d",m_ID);
- fl_draw(text, cx, cy);
-
- //char t[32];
- //sprintf(t,"%d",m_Count);
- //fl_draw(t, cx-2, cy-h()+5);
- }
-
- int Fl_Trigger::handle(int event)
- {
- static int LastButtonPushed=0;
-
- // call base
- if (!Fl_Widget::handle(event))
- {
- int ww,hh;
-
- ww = w();
- hh = h();
-
- int mx = Fl::event_x();
- int my = Fl::event_y();
-
- switch (event)
- {
- case FL_PUSH:
- LastButtonPushed=Fl::event_button();
-
- if (LastButtonPushed==1)
- {
- if (sqrt((float)(mx-x()*my-y()))<w())
- {
- m_Dragging=true;
- }
- }
-
- if (LastButtonPushed==2)
- {
- m_ID++;
- if (m_ID>7)
- {
- m_ID=0;
- }
- redraw();
- Fl_Loop *p=(Fl_Loop*)parent();
- p->DrawEveryThing();
- p->redraw();
- }
-
- if (LastButtonPushed==3)
- {
- /*m_Passes++;
- if (m_Passes>m_MaxPasses)
- {
- m_Passes=0;
- }
- redraw();
- Fl_Loop *p=(Fl_Loop*)parent();
- p->DrawEveryThing();
- p->redraw();*/
- }
-
- // fall through
-
- case FL_DRAG:
- {
- if (LastButtonPushed==2)
- {
-
- }
- else if (LastButtonPushed==1)
- {
- if (m_Dragging)
- {
- int px = mx-m_CentreX;
- int py = my-m_CentreY;
-
- double angle = 90+atan2((float)-py, (float)px)*180/M_PI;
- while (angle < m_Angle-180) angle += 360;
- while (angle > m_Angle+180) angle -= 360;
-
- while (angle < 0) angle += 360;
- while (angle > 360) angle -= 360;
-
- m_Angle=angle;
-
- // snap
- if (m_Snap)
- {
- m_Angle-=(int)m_Angle%m_SnapDegrees;
- }
-
- redraw();
- }
- }
- else if (LastButtonPushed==3)
- {
-
- }
- }
- break;
-
- case FL_RELEASE:
- {
- m_Dragging=false;
- Fl_Loop *p=(Fl_Loop*)parent();
- p->DrawEveryThing();
- p->redraw();
- }
- break;
-
- default:
- return 0;
- }
-
- }
- return 1;
- }
-
- istream &operator>>(istream &s, Fl_Trigger &o)
- {
- s>>o.m_CentreX>>o.m_CentreY>>o.m_CentreRadius>>o.m_Dragging>>o.m_ID>>o.m_Passes>>
- o.m_Count>>o.m_Angle>>o.m_MaxLoops>>o.m_MaxPasses;
-
- return s;
- }
-
- ostream &operator<<(ostream &s, Fl_Trigger &o)
- {
- s<<o.m_CentreX<<" "<<o.m_CentreY<<" "<<o.m_CentreRadius<<" "<<o.m_Dragging<<" "<<
- o.m_ID<<" "<<o.m_Passes<<" "<<o.m_Count<<" "<<o.m_Angle<<" "<<
- o.m_MaxLoops<<" "<<o.m_MaxPasses<<" ";
-
- return s;
- }
|