Just a few extra notes to round out Albrecht's suggestions...

On 12 Oct 2008, at 8:52, Albrecht Schlosser wrote:
> Decide, how to implement your piano widget. I can see two rather
> different approaches:
> (1) use 128 Fl_Buttons, and put then into a Fl_Group
> (2) use one widget, probably derived from Fl_Box, and draw the layout
> yourself.
>
> I assume (2), because (1) seems easier at the first glance, but (2)
> looks more flexible in the way you can do the setup (see below).

Yes - agree strongly.


> Now, derive your own widget from Fl_Box, and write a draw() method to
> draw the keys. This should be rather simple, if you first draw the  
> white
> keys and draw the black keys on top of them (maybe you need only
> fl_rect() and fl_rectf() ).

Yes - I did something similar for a keyboard simulator way back.  
Simple rectangles is pretty much all I needed.

> The active ranges could be drawn below the keys, as in your picture
> (fl_polygon() or similar).
>
> Next, write your handle() method to get the user input (key  
> clicks). You
> would need to calculate the position of a key from the x/y mouse
> coordinates, but that should be rather straight forward (test the  
> black
> keys first, then the white keys, and this can be done with simple x/y
> range comparisons).

Based on your box widget's x(), y(), w(), h() and the Fl::event_x(),  
event_y() values returned for the mouse click in your handle method.

Also check out Fl::event_inside(int,int,int,int) which may be a  
better option for you.

> For setting up the ranges, I would suggest to add a radio button group
> somewhere else, to let the user select normal display, or start  
> setting
> up range 1-4.
>
> After switching to setup mode for a certain range, you could let the
> user click four keys, and the callbacks from your handle() would  
> fire to
> let your application know what s/he clicked.

If you are handling the clicks yourself in the handle method, you can  
do all sorts of clever stuff to set your ranges etc...

> If you want to let the user drag a range of keys, then IMHO approach 2
> would be much easier to implement, because your handle() method  
> could do
> this. Left click, right click, double click, and the combination could
> also help to decide which of the 4 points of a range the user wants to
> set. Clicking on a previously defined range point and dragging it
> elsewhere would also be nice (left click for normal range, right click
> for fade in/out) ?

FL_PUSH, FL_RELESE, FL_DRAG. Fl::event_buttons(), ::event_button1()  
etc... Fl::event_is_click() might also be handy.




_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to