public void OpenDimensionsDialog()
 {
     dimensionsDialog = new DimensionsDialog();
     dimensionsDialog.SetInputRange(500, 6000);
     dimensionsDialog.SetData(3000, editData.Collage.AspectRatio);
     dimensionsDialog.Start();
 }
        public bool Update()
        {
            // adjust the size
            if(step == 1)
            {
                if (dimensionsDialog == null && !dataAccess.GuiThread.WaitsToInvoke) dataAccess.GuiThread.Invoke(OpenDimensionsDialog);

                if (!dataAccess.GuiThread.WaitsToInvoke)
                {
                    if (dimensionsDialog.Response == Gtk.ResponseType.Cancel) {
                        dimensionsDialog.Destroy();
                        dimensionsDialog = null;
                        return false;
                    }
                    if (dimensionsDialog.Response == Gtk.ResponseType.Ok)
                    {
                        width = dimensionsDialog.InputWidth;
                        height = dimensionsDialog.InputHeight;
                        dimensionsDialog.Destroy();
                        dimensionsDialog = null;
                        step = 2;
                    }
                }
            }
            // select a path where to save
            if(step == 2)
            {
                if(sfw == null && !dataAccess.GuiThread.WaitsToInvoke) dataAccess.GuiThread.Invoke(OpenFileBrowser);

                if(!dataAccess.GuiThread.IsBlockedByDialog)
                {
                    fileName = sfw.SelectedPath;
                    sfw.Destroy();
                    sfw = null;
                    if (fileName == null) return false;
                    step = 3;
                }
            }
            // render the image and size
            if (step == 3)
            {
                // setup progress bar
                dataAccess.GuiThread.Invoke(StartProgressBar);
                while (progressBar == null) ; // wait until the bar is setup
                progressBar.TotalSteps = editData.Collage.Images.Count + 2;

                Rectangle dimensions = new Rectangle(0, 0, width, height);
                Texture2D render = Render(dimensions, width, height);

                // correct alpha
                progressBar.StepUp("correct alpha");
                Color[] colors = new Color[width * height];
                render.GetData<Color>(colors);
                for (int i = 0; i < colors.Length; i++)
                {
                    colors[i].A = 255;
                }
                render.SetData<Color>(colors);
                colors = null;
                GC.Collect();

                System.Drawing.Bitmap bitmap = Utils.ToBitmap(render);
                progressBar.StepUp("Save");
                bitmap.Save(fileName);
                bitmap.Dispose();
                render.Dispose();
                GC.Collect();

                progressBar.Destroy();
                step = 4;
            }
            return step < 4;
        }