On 03/06/13 09:47, Greg Ercolano wrote:
> I could make an example, but thinking the above might get you in
> the right direction.
I lied. Made one anyway; wanted to see it work.
Implemented pretty much exactly as described..
------------------------------------------------------------------------------------
#include <string.h>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Slider.H>
#include <vector>
// Demonstrate how to connect volume knobs to each other by name - erco 1.0
03/06/13
// CLASS TO HANDLE CONNECTING VOLUME KNOBS
class VolumeKnob : public Fl_Slider {
static void Adjust_CB(Fl_Widget *w, void *data);
public:
VolumeKnob(int X,int Y,int W,int H, const char *L=0);
~VolumeKnob();
};
static std::vector<VolumeKnob*> G_knobs; // global array of all
vol knob instances
// HANDLE VOLUME ADJUSTMENT
void VolumeKnob::Adjust_CB(Fl_Widget *w, void *data) {
VolumeKnob *knob = (VolumeKnob*)data;
printf("KNOB '%s' CHANGED: %.2f\n", knob->label(), knob->value());
// Real work here: cause current knob's value to affect others
for ( unsigned t=0; t<G_knobs.size(); t++ ) {
// walk all knobs created so far
if ( knob == G_knobs[t] ) continue;
// skip ourself
if ( strcmp(G_knobs[t]->label(), knob->label()) != 0 ) continue;
// skip knobs of different name
G_knobs[t]->value(knob->value());
// adjust other knob of same name
}
}
// CTOR
VolumeKnob::VolumeKnob(int X,int Y,int W,int H, const char
*L):Fl_Slider(X,Y,W,H,L) {
type(FL_VERT_NICE_SLIDER); // type of slider
align(FL_ALIGN_BOTTOM); // (labels on bottom)
selection_color(FL_RED); // nicer looking knob
callback(Adjust_CB, (void*)this); // setup callback
G_knobs.push_back(this); // save pointer to self
}
// DTOR
VolumeKnob::~VolumeKnob() {
// Remove from our global array
for ( unsigned t=0; t<G_knobs.size(); t++ ) {
if ( G_knobs[t] == this ) {
G_knobs.erase(G_knobs.begin()+t); // stl, why u so fugly
break;
}
}
}
int main(int argc, char* argv[]) {
Fl::scheme("gtk+");
Fl_Window *w1 = new Fl_Window(0,0,100,120,"Win #1");
w1->begin();
new VolumeKnob(10+0 ,10,20,80,"T1");
new VolumeKnob(10+30,10,20,80,"T2");
new VolumeKnob(10+60,10,20,80,"T3");
w1->end();
w1->show();
Fl_Window *w2 = new Fl_Window(200,0,100,120,"Win #2");
w2->begin();
new VolumeKnob(10+0 ,10,20,80,"T1");
new VolumeKnob(10+30,10,20,80,"T2");
new VolumeKnob(10+60,10,20,80,"T3");
w2->end();
w2->show();
return Fl::run();
}
------------------------------------------------------------------------------------
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk