view mde/mde.d @ 103:42e241e7be3e

ContentList content type; getting content items/lists from Options generically via content.Items, and a new addContent widget function. Several improvements to generic handling of content. New button-with-text widget. Some tidy-up. Some name changes, to increase uniformity. Bug-fix: floating widgets of fixed size could previously be made larger than intended from config dimdata.
author Diggory Hardy <diggory.hardy@gmail.com>
date Tue, 25 Nov 2008 18:01:44 +0000
parents ba035eba07b4
children 20f7d813bb0f
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;                        // this module's interface for external modules
import mde.setup.Init;                  // initialization
import mde.setup.Screen;                // Screen.draw()
import mde.events;                      // pollEvents()
import mde.lookup.Options;              // pollInterval option
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;
}

//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.
     * 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.
    mainSchedule.add (mainSchedule.getNewID, &mde.events.pollEvents).frame = true;
    //END Main loop setup
    
    double pollInterval = miscOpts.pollInterval();
    while (run) {
        mainSchedule.execute (Clock.now());
        
        Thread.sleep (pollInterval);	// sleep this many seconds
    }
    
    return 0;		// cleanup handled by init's DTOR
}