Project

General

Profile

Bug #4731 » ScrollbarWidget.cpp

Markus S, 02/12/2016 12:44 PM

 
#include "StdAfx.h"

#include "ScrollbarWidget.h"
#include "SlotConnectable.h"
#include "WebApp.h"
#include "DC.h"

#include "../Bfx.Abstract.Engine/Import.Begin.h"
#include "../Bfx.Abstract.Model.PrintEngine/Utilities/ImageFileUtilities.h"
#include "../Bfx.Abstract.Interpreter/IsInFunction.h"
#include "../Bfx.Abstract.Engine/Import.End.h"

#include <Wt/WApplication>
#include <Wt/WPainter>

#include <boost/assign/std/vector.hpp>

using namespace std;
using namespace boost;
using namespace boost::assign;
using namespace BitFactory;
using namespace BitFactory::UI::Web;
using namespace BitFactory::UI::Architecture;

Pixel::Scalar BitFactory::UI::Web::Scrollbar()
{
return Pixel::Scalar( 22 );
}

class ScrollbarWidget::Impl
: public SlotConnectable
{
Wt::JSlot myScrollJS;
Wt::JSignal< int > myScrolled;
int myScrolledOffset;
String myOrientation;
Wt::WContainerWidget* myC;
ScrollbarWidget* mySelf;
public:
Impl( const ScrollbarWidget* self )
: mySelf( const_cast< ScrollbarWidget* >( self ) )
, myScrolled( this, "scrolled" )
, myScrolledOffset( 0 )
{
myScrolled.connect( SLOT( this, Impl::Scrolled ) );
}
void Init( const String& orientation, const std::vector< Wt::WWidget* >& toScroll )
{
myOrientation = orientation;
mySelf->addWidget( myC = new Wt::WContainerWidget );
String js = "function(obj, event) {";
foreach_auto( w, toScroll )
js += "$('#" + w->id() + "').scroll" + myOrientation + "(obj.scroll" + myOrientation + ");";
js += myScrolled.createCall( "obj.scroll" + myOrientation ) + ";";
js += "}";
myScrollJS.setJavaScript( js );
mySelf->scrolled().connect( myScrollJS );
}
void ResizeImpl( const Pixel::Size& viewed, const Pixel::Size& all )
{
mySelf->resize( viewed.Width().Get(), viewed.Height().Get() );
myC->resize( all.Width().Get(), all.Height().Get() );
}
void Scrolled( int offset )
{
myScrolledOffset = offset;
}
int Offset()
{
return myScrolledOffset;
}
void ScrollTo( int pos )
{
GetWebApp()->doJavaScript( mySelf->jsRef() + ".scroll" + myOrientation + " += " + to_string( pos ) );
}
};
X_PIMPL_IMPLEMENTATION( ScrollbarWidget )

ScrollbarWidget::ScrollbarWidget( const String& orientation, const std::vector< Wt::WWidget* >& toScroll, Wt::WContainerWidget* p )
: Wt::WContainerWidget( p )
{
GetPimpl()->Init( orientation, toScroll );
}
Pixel::Scalar ScrollbarWidget::GetScrollOffset() const
{
return Pixel::Scalar( GetPimpl()->Offset() );
}
void ScrollbarWidget::ResizeImpl( const Pixel::Size& viewed, const Pixel::Size& all )
{
GetPimpl()->ResizeImpl( viewed, all );
}
void ScrollbarWidget::ScrollTo( const Pixel::Scalar& position )
{
GetPimpl()->ScrollTo( position.Get() );
}
HScrollbarWidget::HScrollbarWidget( const std::vector< Wt::WWidget* >& toScroll, Wt::WContainerWidget* p )
: ScrollbarWidget( "Left", toScroll, p )
{
foreach_auto( w, toScroll )
GetWidgetParent< AbsolutePositionContainerBase >( w )->SetHorizontalScrollbar( this );
setOverflow( Wt::WContainerWidget::OverflowScroll, Wt::Horizontal );
setOverflow( Wt::WContainerWidget::OverflowHidden, Wt::Vertical );
}
void HScrollbarWidget::Resize( const Pixel::Scalar& viewed, const Pixel::Scalar& all )
{
ResizeImpl( Pixel::Size( viewed, Scrollbar() ), Pixel::Size( all, 1 ) );
}

VScrollbarWidget::VScrollbarWidget( const std::vector< Wt::WWidget* >& toScroll, Wt::WContainerWidget* p )
: ScrollbarWidget( "Top", toScroll, p )
{
foreach_auto( w, toScroll )
{
GetWidgetParent< AbsolutePositionContainerBase >( w )->SetVerticalScrollbar( this );
if( auto interact = dynamic_cast< Wt::WInteractWidget* >( w ) )
interact->mouseWheel().connect( [&]( const Wt::WMouseEvent& e )
{
ScrollTo( Pixel::Scalar( -10 * e.wheelDelta() ) );
});
}
setOverflow( Wt::WContainerWidget::OverflowHidden, Wt::Horizontal );
setOverflow( Wt::WContainerWidget::OverflowScroll, Wt::Vertical );
}
void VScrollbarWidget::Resize( const Pixel::Scalar& viewed, const Pixel::Scalar& all )
{
ResizeImpl( Pixel::Size( Scrollbar(), viewed ), Pixel::Size( 1, all ) );
}
(2-2/6)