internal static void RunGUIAction(ActionDelegate action) { if (EditorDispatcher.IsOnMainThread) { action(); return; } lock (mLock) { ManualResetEvent syncEvent = new ManualResetEvent(false); EditorDispatcher.Dispatch(delegate { try { action(); } catch (Exception e) { mLog.ErrorFormat("GUI action failed: {0}", e.Message); mLog.DebugFormat("Stack trace:{0}{1}", Environment.NewLine, e.StackTrace); throw; } finally { syncEvent.Set(); } }); syncEvent.WaitOne(); } }
void OnTimerTick() { if (mThreadOperation.IsRunning) { if (mTimerTickDelegate != null) { EditorDispatcher.Dispatch(() => mTimerTickDelegate()); } return; } mPlasticTimer.Stop(); if (mbCancelled) { return; } EditorDispatcher.Dispatch(() => mAfterOperationDelegate()); }
protected void OnGUI() { try { // If the Dialog has been saved into the Unity editor layout and persisted between restarts, the methods // to configure the dialogs will be skipped. Simple fix here is to close it when this state is detected. // Fixes a NPE loop when the state mentioned above is occurring. if (!mIsConfigured) { mIsClosed = true; Close(); return; } if (Event.current.type == EventType.Layout) { EditorDispatcher.Update(); } if (!mFocusedOnce) { // Somehow the prevents the dialog from jumping when dragged // NOTE(rafa): We cannot do every frame because the modal kidnaps focus for all processes (in mac at least) Focus(); mFocusedOnce = true; } ProcessKeyActions(); if (mIsClosed) { return; } GUI.Box(new Rect(0, 0, position.width, position.height), GUIContent.none, EditorStyles.label); float margin = 25; float marginTop = 25; using (new EditorGUILayout.HorizontalScope(GUILayout.Height(position.height))) { GUILayout.Space(margin); using (new EditorGUILayout.VerticalScope(GUILayout.Height(position.height))) { GUILayout.Space(marginTop); OnModalGUI(); GUILayout.Space(margin); } GUILayout.Space(margin); } var lastRect = GUILayoutUtility.GetLastRect(); float desiredHeight = lastRect.yMax; Rect newPos = position; newPos.height = desiredHeight; if (position.height < desiredHeight) { position = newPos; } if (Event.current.type == EventType.Repaint) { if (mIsCompleted) { mIsClosed = true; Close(); } } } finally { if (mIsClosed) { EditorGUIUtility.ExitGUI(); } } }