#include <stdio.h>
#include "Application.h"
#include "Message.h"
#include "Button.h"
#include "View.h"
#include "Window.h"
enum {
MSG_RESET = 'rset'
};
class TestView : public BView {
public:
TestView(BRect frame, const char* name,
uint32 resizeFlags, uint32 flags)
: BView(frame, name, resizeFlags, flags),
fTracking(false),
fLastMousePos(0.0, 0.0)
{
SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
SetLowUIColor(ViewUIColor());
}
virtual void MessageReceived(BMessage* message);
virtual void Draw(BRect updateRect);
virtual void MouseDown(BPoint where);
virtual void MouseUp(BPoint where);
virtual void MouseMoved(BPoint where, uint32 transit,
const BMessage* dragMessage);
private:
bool fTracking;
BPoint fLastMousePos;
};
void
TestView::MessageReceived(BMessage* message)
{
if (message->what == MSG_RESET)
ScrollTo(0.0, 0.0);
else
BView::MessageReceived(message);
}
void
TestView::Draw(BRect updateRect)
{
SetHighColor(200, 90, 0, 100);
StrokeEllipse(BPoint(80.0, 50.0), 70.0, 40.0);
SetDrawingMode(B_OP_ALPHA);
SetPenSize(2.0);
SetHighColor(20, 40, 180, 150);
StrokeEllipse(BPoint(230.0, 90.0), 14.0, 60.0);
SetPenSize(5.0);
SetHighColor(60, 20, 110, 100);
StrokeEllipse(BPoint(100.0, 180.0), 35.0, 25.0);
SetHighColor(0, 0, 0, 255);
SetDrawingMode(B_OP_OVER);
const char* message = "Click and drag to scroll this view!";
DrawString(message, BPoint(0.0, 30.0));
}
void
TestView::MouseDown(BPoint where)
{
fTracking = true;
fLastMousePos = where;
SetMouseEventMask(B_POINTER_EVENTS);
}
void
TestView::MouseUp(BPoint where)
{
fTracking = false;
}
void
TestView::MouseMoved(BPoint where, uint32 transit,
const BMessage* dragMessage)
{
if (fTracking) {
BPoint offset = fLastMousePos - where;
ScrollBy(offset.x, offset.y);
fLastMousePos = where + offset;
}
}
void
show_window(BRect frame, const char* name)
{
BWindow* window = new BWindow(frame, name,
B_TITLED_WINDOW,
B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE);
BView* view = new TestView(window->Bounds(), "test", B_FOLLOW_ALL,
B_WILL_DRAW);
window->AddChild(view);
BRect b(0.0, 0.0, 60.0, 15.0);
b.OffsetTo(5.0, view->Bounds().bottom - (b.Height() + 15.0));
BButton* control = new BButton(b, "button", "Reset", new BMessage(MSG_RESET));
view->AddChild(control);
control->SetTarget(view);
window->Show();
}
int
main(int argc, char** argv)
{
BApplication* app = new BApplication("application/x.vnd-Haiku.Scrolling");
BRect frame(50.0, 50.0, 300.0, 250.0);
show_window(frame, "Scrolling Test");
app->Run();
delete app;
return 0;
}