view mde/mde.d @ 161:e3fe6acc16fb

Replaced WidgetManager's click and motion callbacks with a drag event system. This is less flexible, but much closer to what is required (and is simpler and less open to bugs through unintended use). The widget under the mouse is now passed (although could just as easily have been before).
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 21 May 2009 22:15:40 +0200
parents 9f035cd139c6
children
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

This program is free software: you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation, either
version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>. */

/** Modular D Engine
 *
 * This module contains a minimal main() function. Practically, it is useful for running unittests
 * and some other testing. It also serves as a basic example program.
 */
module mde.mde;

import mde.imde;
import mde.mainLoop;			// Some setup for the main loop
import mde.setup.Init;                  // initialization
import mde.setup.Screen;                // Screen.draw()
import mde.scheduler.Scheduler;         // mainSchedule

import tango.core.Thread : Thread;	// Thread.sleep()
import tango.time.Clock;                // Clock.now()
import tango.util.log.Log : Log, Logger;
debug (mdeUnitTest) {                   // These modules contain unittests which wouldn't be run otherwise.
    import mde.file.ssi;
    import mde.file.mergetag.mdeUT;
    import mde.file.mergetag.MTTagUnittest;
    import mde.lookup.Translation;
    import mde.gui.widget.layout;
}

//BEGIN A simple drawable to print a message in the window.
/* This block of code is to draw the message you see on the screen. Most users of mde would be
better off using the gui drawable in gui.WidgetManager than this. */
import mde.font.font;
class SimpleDrawable : Screen.IDrawable {
    this () {
        msg = "Welcome to mde.\nThis executable is only for testing, and\nas such doesn't do anything interesting.";
        debug msg ~= "\nRunning in debug mode.";
        font = FontStyle.getDefault;	// get the default or fallback font
    }
    void sizeEvent (int,int) {};        // Don't care what the size is
    void draw () {
        font.textBlock (16,32, msg, textCache, Colour.WHITE);
    }
    char[] msg;
    FontStyle font;
    TextBlock textCache;
}
//END A simple drawable to print a message in the window.


int main(char[][] args)
{
    Logger logger = Log.getLogger ("mde.mde");
    
    // If compiled with unittests, notify that they completed and exit:
    debug (mdeUnitTest) {
        logger.info ("Compiled unittests have completed; terminating.");
        return 0;
    }
    
    scope Init init = new Init(args);	// initialize mde
    
    // Note: must create the drawable after init, since it uses font (initialized in init).
    Screen.addDrawable (new SimpleDrawable);    // a drawable to print a message.
    
    //BEGIN Main loop setup
    /* Note: the main loop is currently controlled by the scheduler. This is
     * not really ideal, since it provides no direct control of the order in
     * which components are executed and does not allow running components
     * simultaeneously with threads. However, it does allow easy run-on-request
     * functionality.
     * Note: probably drawing should start at the beginning of the loop and
     * glFlush()/swapBuffers be called at the end to optimise. */
    mainSchedule.add (SCHEDULE.DRAW, &Screen.draw).request = true;      // Draw, per event and first frame only.
    // Further setup is done by mde.mainLoop.
    //END Main loop setup
    
    while (run) {
        mainSchedule.execute (Clock.now());
        
        Thread.sleep (mainInterval);	// sleep this many seconds
    }
    
    return 0;		// cleanup handled by init's DTOR
}