FL/Fl_Packscroller: Cleanup event behavior. Eliminate unnecessary vertical padding.

This commit is contained in:
Jonathan Moore Liles 2013-04-19 10:08:10 -07:00
parent 5d59a1d291
commit ea380f00f9
1 changed files with 76 additions and 52 deletions

View File

@ -32,7 +32,6 @@
class Fl_Packscroller : public Fl_Group
{
int _increment;
int _yposition;
static const int sbh = 15; /* scroll button height */
@ -43,7 +42,6 @@ public:
{
_increment = 30;
_yposition = 0;
// color( FL_WHITE );
}
@ -60,7 +58,8 @@ public:
if ( Y > 0 )
Y = 0;
const int H = h() - (sbh * 2);
const int H = h();
// - (sbh * 2);
Fl_Widget *o = child( 0 );
@ -89,88 +88,113 @@ public:
void bbox ( int &X, int &Y, int &W, int &H )
{
X = x();
Y = y() + sbh;
Y = y() + ( sbh * top_sb_visible() );
W = w();
H = h() - (sbh * 2);
H = h() - ( sbh * ( top_sb_visible() + bottom_sb_visible() ) );
}
int top_sb_visible ( void )
{
return children() && child(0)->y() != y() ? 1 : 0;
}
int bottom_sb_visible ( void )
{
if ( children() )
{
Fl_Widget *o = child( 0 );
if ( o->h() > h() && o->y() + o->h() != y() + h() )
return 1;
}
return 0;
}
virtual void
draw ( void )
{
if ( damage() & FL_DAMAGE_ALL )
{
fl_rectf( x(), y(), w(), h(), color() );
}
if ( ! children() )
return;
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
return;
// draw_box();
Fl_Widget *o = child( 0 );
o->position( x(), y() + sbh + _yposition );
if ( damage() != FL_DAMAGE_CHILD )
{
fl_rectf( x(), y(), w(), h(), color() );
fl_font( FL_HELVETICA, 12 );
if ( o->y() != y() + sbh )
{
fl_draw_box( box(), x(), y(), w(), sbh, color() );
fl_color( FL_BLACK );
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
}
if ( o->h() > h() - (sbh * 2) && o->y() + o->h() != y() + h() - sbh )
{
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
fl_color( FL_BLACK );
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
}
}
fl_push_clip( x(), y() + sbh, w(), h() - (sbh * 2 ) );
o->position( x(), y() + _yposition );
const int top_sb = top_sb_visible();
const int bottom_sb = bottom_sb_visible();
fl_push_clip( x(), y() + ( sbh * top_sb ), w(), h() - (sbh * (top_sb + bottom_sb) ));
draw_children();
fl_pop_clip();
fl_font( FL_HELVETICA, 12 );
if ( top_sb )
{
fl_draw_box( box(), x(), y(), w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
}
if ( bottom_sb )
{
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
}
}
virtual int
handle ( int m )
{
if ( Fl_Group::handle( m ) )
return 1;
static int _button;
int r = 0;
switch ( m )
{
case FL_PUSH:
{
if ( Fl::event_button1() )
_button = Fl::event_button();
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
if ( Fl::event_inside( x(), y(), w(), sbh ) )
return 1;
}
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
return 1;
}
break;
case FL_RELEASE:
{
int b = _button;
_button = 0;
if ( b == 1 )
{
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
yposition( yposition() + ( h() / 4 ) );
return 1;
}
else if ( Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
yposition( yposition() - (h() / 4 ) );
return 1;
}
return 0;
}
break;
}
return 0;
case FL_ENTER:
case FL_LEAVE:
return 1;
case FL_FOCUS:
case FL_UNFOCUS:
return 1;
case FL_KEYBOARD:
{
if ( Fl::event_key() == FL_Up )
@ -183,7 +207,7 @@ public:
yposition( yposition() - (h() / 4 ) );
return 1;
}
return 0;
break;
}
case FL_MOUSEWHEEL:
{
@ -193,6 +217,6 @@ public:
}
}
return 0;
return Fl_Group::handle( m ) | r;
}
};