views:

36

answers:

1

I have an mxml component "PresentationWindow" that is for brevity's sake, simply:

<fx:Script>
    //... functions here will be explained below
</fx:Script>
<s:Window>
    <mx:Canvas id="presentationCanvas" width="100%" height="100%">
        <mx:Button label="Test" width="100" height="25" left="0" top="100" />
    </mx:Canvas>
</s:Window>

And I'm trying to get an mx.controls.Alert to show centered on the window if the user attempts to quit while the window is in StageDisplayState.FULL_SCREEN_INTERACTIVE. I've had no trouble getting the alert to appear and the functionality of stopping/allowing quit to work, but the alert window itself will not center properly.

Currently, on CMD/CTRL + Q, I drop the window out of full screen mode, prevent the window close event, and show an alert (same erroneous behavior if I leave it in full screen mode):

Alert.show("Are you sure you want to quit with a presentation in progress?", 
    "Quit?", (Alert.YES | Alert.NO), presentationCanvas, alertHandler);

I've tried centering on "this", on the nativeWindow object, and now on presentationCanvas which is taking up the entire window; however, in all cases, I get this glorious centering effect (regardless of whether the button is in the canvas object or not).

I have also attempted to add an event listener to the window for Event.FULLSCREEN, so that regardless of whether you're entering or exiting full screen, if the alert window exists, utilize PopUpManager.centerPopUp() to attempt to center the alert.

Nothing will move that Alert window to the middle of my window.

Any ideas? (Full ActionScript below with my current failed attempt at centering present...)


<fx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.managers.PopUpManager;
        import mx.events.CloseEvent;

        private var alert:Alert;

        private function windowInit():void {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP;
            stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;

            nativeWindow.addEventListener(Event.CLOSING, preventCloseIfFullScreen);
        }

        protected function preventCloseIfFullScreen(e:Event):void {
            if (stage.displayState == StageDisplayState.FULL_SCREEN_INTERACTIVE) {
                e.preventDefault();
                stage.addEventListener(Event.FULLSCREEN, adjustAfterFullScreen);
                alert = Alert.show("Are you sure you want to quit with a presentation in progress?", "Quit?", (Alert.YES | Alert.NO), presentationCanvas, alertHandler);
                //stage.displayState = StageDisplayState.NORMAL;
            }
        }

        protected function adjustAfterFullScreen(e:FullScreenEvent):void {
            if (alert) {
                Alert.show("hi");
                PopUpManager.centerPopUp(alert);
            }
        }

        protected function alertHandler(e:CloseEvent):void {
            if (e.detail == Alert.YES) {
                NativeApplication.nativeApplication.exit();
            }
            else {
                stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
            }
        }
    ]]>
</fx:Script>
A: 

Blah, dumbest mistake of the month. StageAlign.TOP instead of StageAlign.TOP_LEFT. It was centering everything in the window, and then anything I tried to center on was starting halfway across the width of the window.

Tegeril