root/src/add-ons/screen_savers/gravity/Gravity.cpp
/*
 * Copyright 2012-2013 Tri-Edge AI <triedgeai@gmail.com>
 * Copyright 2014 Haiku, Inc. All rights reserved.
 *
 * Distributed under the terms of the MIT license.
 *
 * Authors:
 *              Tri-Edge AI
 *              John Scipione, jscipione@gmail.com
 */


#include "Gravity.h"

#include "ConfigView.h"
#include "GravityView.h"

#include <ScreenSaver.h>
#include <View.h>

#include <stdlib.h>


Gravity::Gravity(BMessage* prefs, image_id imageID)
        :
        BScreenSaver(prefs, imageID),
        fGravityView(NULL),
        fConfigView(NULL)
{
        srand(time(NULL));

        if (prefs->IsEmpty()) {
                Config.ParticleCount = 1;
                Config.ShadeID = 2;
        } else {
                if (prefs->FindInt32("ParticleCount", &Config.ParticleCount) != B_OK)
                        Config.ParticleCount = 1;

                if (prefs->FindInt32("ShadeID", &Config.ShadeID) != B_OK)
                        Config.ShadeID = 2;
        }
}


status_t
Gravity::SaveState(BMessage* prefs) const
{
        prefs->AddInt32("ParticleCount", Config.ParticleCount);
        prefs->AddInt32("ShadeID", Config.ShadeID);
        return B_OK;
}


void
Gravity::StartConfig(BView* view)
{
        fConfigView = new ConfigView(view->Bounds(), this);
        view->AddChild(fConfigView);
}


status_t
Gravity::StartSaver(BView* view, bool preview)
{
        SetTickSize((1000 / 20) * 1000);
                // ~20 FPS
        fGravityView = new GravityView(view->Bounds(), this);
        view->AddChild(fGravityView);

        return B_OK;
}


void
Gravity::StopSaver()
{
        if (fGravityView != NULL)
                fGravityView->EnableDirectMode(false);
}


void
Gravity::DirectConnected(direct_buffer_info* info)
{
        if (fGravityView != NULL) {
                fGravityView->DirectConnected(info);
                fGravityView->EnableDirectMode(true);
        }
}


void
Gravity::Draw(BView*, int32 frame)
{
        fGravityView->DirectDraw();
}