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