- Main Page
- Related Pages
- Modules
- Classes
- Examples

# progressWindowCmd.cpp

    //-
    // ==========================================================================
    // Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
    //
    // Use of this software is subject to the terms of the Autodesk
    // license agreement provided at the time of installation or download,
    // or which otherwise accompanies this software in either electronic
    // or hard copy form.
    // ==========================================================================
    //+

    /*

        file : progressWindowCmd.cpp
        class: progressWindowPlugin

        ----------------------

        This class is an example of how to use a progress window from within a
        plugin.  The command "progressWindowPlugin" displays a simple progress
        window which updates every second.  The progress window can be terminated
        by hitting escape.

    */

    #include <maya/MPxCommand.h>
    #include <maya/MIOStream.h>
    #include <maya/MFnPlugin.h>
    #include <maya/MProgressWindow.h>
    #include <maya/MString.h>
    #include <maya/MGlobal.h>

    class progressWindowPlugin : public MPxCommand
    {
    public:

        MStatus doIt(const MArgList &args);

        static void* creator();
    };

    void* progressWindowPlugin::creator()
    {
        return new progressWindowPlugin;
    }

    MStatus progressWindowPlugin::doIt(const MArgList &args)
    {
        MStatus stat = MS::kSuccess;
        MString title = "Doing Nothing";
        MString sleeping = "Sleeping: ";

        int amount = 0;
        int maxProgress = 10;

        // First reserve the progress window.  If a progress window is already
        // active (eg. through the mel "progressWindow" command), this command
        // fails.
        //
        if (!MProgressWindow::reserve())
        {
            MGlobal::displayError("Progress window already in use.");
            stat = MS::kFailure;
            return stat;
        }

        //
        // Set up and print progress window state
        //

        CHECK_MSTATUS(MProgressWindow::setProgressRange(amount, maxProgress));
        CHECK_MSTATUS(MProgressWindow::setTitle(title));
        CHECK_MSTATUS(MProgressWindow::setInterruptable(true));
        CHECK_MSTATUS(MProgressWindow::setProgress(amount));

        MString progressWindowState = MString("Progress Window Info:") +
            MString("\nMin: ") + MProgressWindow::progressMin() +
            MString("\nMax: ") + MProgressWindow::progressMax() +
            MString("\nTitle: ") + MProgressWindow::title() +
            MString("\nInterruptible: ") + MProgressWindow::isInterruptable();

        MGlobal::displayInfo(progressWindowState);

        CHECK_MSTATUS(MProgressWindow::startProgress());

        // Count 10 seconds
        //
        for (int i = amount; i < maxProgress; i++)
        {
            if (i != 0 && MProgressWindow::isCancelled()) {
                MGlobal::displayInfo("Progress interrupted!");
                break;
            }

            MString statusStr = sleeping;
            statusStr += i;
            CHECK_MSTATUS(MProgressWindow::setProgressStatus(statusStr));
            CHECK_MSTATUS(MProgressWindow::advanceProgress(1));

            MGlobal::displayInfo(MString("Current progress: ") + MProgressWindow::progress());

            MGlobal::executeCommand("pause -sec 1", false, false);
        }

        // End the progress, unreserving the progress window so it can be used
        // elsewhere.
        //
        CHECK_MSTATUS(MProgressWindow::endProgress());

        return stat;
    }

    // standard initialize and uninitialize functions

    MStatus initializePlugin( MObject obj )
    {
        MStatus   status;
        MFnPlugin plugin( obj, PLUGIN_COMPANY, "6.0", "Any");

        status = plugin.registerCommand( "progressWindowCmd", progressWindowPlugin::creator );
        if (!status) {
            status.perror("registerCommand");
            return status;
        }

        return status;
    }

    MStatus uninitializePlugin( MObject obj )
    {
        MStatus   status;
        MFnPlugin plugin( obj );

        status = plugin.deregisterCommand( "progressWindowCmd" );
        if (!status) {
            status.perror("progressWindowCmd");
        }
        return status;
    }