Browse Source

fixes issue with updates to user preferences not getting reflected in the embedded web view

Shaddock Heath 9 years ago
parent
commit
c069587e3e

+ 9 - 2
Data/AtomicEditor/CodeEditor/MonacoEditor.html

@@ -53,6 +53,7 @@
 
                 System.import('./source/editorCore/interop').then((module) => {
                     module.default.getInstance().setEditor(editor);
+                    module.default.getInstance().editorLoaded();
                     resolve(module.default);
                 });
             });
@@ -86,9 +87,15 @@
             });
         }
 
-        function HOST_preferencesChanged() {
+        function HOST_preferencesChanged(jsonProjectPrefs, jsonApplicationPrefs) {
             setupEditor.then((interop) => {
-                interop.getInstance().preferencesChanged();
+
+                let prefs = {
+                    projectPreferences: JSON.parse(jsonProjectPrefs),
+                    applicationPreferences: JSON.parse(jsonApplicationPrefs)
+                };
+
+                interop.getInstance().preferencesChanged(prefs);
             });
         }
     </script>

+ 13 - 2
Script/AtomicEditor/editor/Editor.ts

@@ -161,7 +161,12 @@ class Editor extends Atomic.ScriptObject {
     setUserPreference(extensionName: string, preferenceName: string, value: number | boolean | string) {
         Preferences.getInstance().setUserPreference(extensionName, preferenceName, value);
         WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ProjectPreferences", JSON.stringify(Preferences.getInstance().cachedProjectPreferences, null, 2 ));
-        this.sendEvent(EditorEvents.UserPreferencesChangedNotification);
+        const eventData: EditorEvents.UserPreferencesChangedEvent = {
+            projectPreferences: JSON.stringify(Preferences.getInstance().cachedProjectPreferences),
+            applicationPreferences: JSON.stringify(Preferences.getInstance().cachedApplicationPreferences)
+        };
+
+        this.sendEvent(EditorEvents.UserPreferencesChangedNotification, eventData);
     }
 
     /**
@@ -174,7 +179,12 @@ class Editor extends Atomic.ScriptObject {
     setUserPreferenceGroup(settingsGroup: string, groupPreferenceValues: Object) {
         Preferences.getInstance().setUserPreferenceGroup(settingsGroup, groupPreferenceValues);
         WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ProjectPreferences", JSON.stringify(Preferences.getInstance().cachedProjectPreferences, null, 2 ));
-        this.sendEvent(EditorEvents.UserPreferencesChangedNotification);
+        const eventData: EditorEvents.UserPreferencesChangedEvent = {
+            projectPreferences: JSON.stringify(Preferences.getInstance().cachedProjectPreferences),
+            applicationPreferences: JSON.stringify(Preferences.getInstance().cachedApplicationPreferences)
+        };
+
+        this.sendEvent(EditorEvents.UserPreferencesChangedNotification, eventData);
     }
 
     handleEditorLoadProject(event: EditorEvents.LoadProjectEvent): boolean {
@@ -190,6 +200,7 @@ class Editor extends Atomic.ScriptObject {
         }
         const loaded = system.loadProject(event.path);
         if (loaded) {
+            Preferences.getInstance().loadUserPrefs();
             WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ProjectPreferences", JSON.stringify(Preferences.getInstance().cachedProjectPreferences, null, 2 ));
             WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ApplicationPreferences", JSON.stringify(Preferences.getInstance().cachedApplicationPreferences, null, 2 ));
             this.sendEvent(EditorEvents.LoadProjectNotification, event);

+ 12 - 0
Script/AtomicEditor/editor/EditorEvents.ts

@@ -159,5 +159,17 @@ export interface RemoveCurrentAssetAssignedEvent {
 }
 
 export const UserPreferencesChangedNotification  = "UserPreferencesChangedNotification";
+export interface UserPreferencesChangedEvent {
+    /**
+     * JSON string of the project preferences
+     */
+    projectPreferences: string;
+
+    /**
+     * JSON string of the application preferences
+     */
+    applicationPreferences: string;
+}
+
 export const WebViewLoadEnd = "WebViewLoadEnd";
 export const WebMessage = "WebMessage";

+ 33 - 26
Script/AtomicEditor/editor/Preferences.ts

@@ -133,11 +133,11 @@ class Preferences {
         this._prefs = new PreferencesFormat();
     }
 
-    get cachedProjectPreferences():any {
+    get cachedProjectPreferences(): any {
         return this._cachedProjectPreferences;
     }
 
-    get cachedApplicationPreferences():PreferencesFormat {
+    get cachedApplicationPreferences(): PreferencesFormat {
         return this._prefs;
     }
 
@@ -165,6 +165,22 @@ class Preferences {
         return Preferences.instance;
     }
 
+    /**
+     * Load up the user preferences for the project
+     */
+    loadUserPrefs() {
+        const prefsFileLoc = ToolCore.toolSystem.project.userPrefsFullPath;
+        if (Atomic.fileSystem.fileExists(prefsFileLoc)) {
+            let prefsFile = new Atomic.File(prefsFileLoc, Atomic.FILE_READ);
+            try {
+                let prefs = JSON.parse(prefsFile.readText());
+                this._cachedProjectPreferences = prefs;
+            } finally {
+                prefsFile.close();
+            }
+        }
+    }
+
     /**
      * Return a preference value or the provided default from the user settings file located in the project
      * @param  {string} settingsGroup name of the group these settings should fall under
@@ -179,16 +195,7 @@ class Preferences {
 
         // Cache the settings so we don't keep going out to the file
         if (this._cachedProjectPreferences == null) {
-            const prefsFileLoc = ToolCore.toolSystem.project.userPrefsFullPath;
-            if (Atomic.fileSystem.fileExists(prefsFileLoc)) {
-                let prefsFile = new Atomic.File(prefsFileLoc, Atomic.FILE_READ);
-                try {
-                    let prefs = JSON.parse(prefsFile.readText());
-                    this._cachedProjectPreferences = prefs;
-                } finally {
-                    prefsFile.close();
-                }
-            }
+            this.loadUserPrefs();
         }
 
         if (this._cachedProjectPreferences && this._cachedProjectPreferences[settingsGroup]) {
@@ -293,15 +300,15 @@ interface AceEditorSettings {
 }
 
 interface UserInterfaceData {
-    skinPath : string;
-    defaultSkinPath : string;
-    fontFile : string;
-    fontName : string;
-    fontSize : number;
+    skinPath: string;
+    defaultSkinPath: string;
+    fontFile: string;
+    fontName: string;
+    fontSize: number;
 }
 
 interface EditorBuildData {
-    lastEditorBuildSHA : string;
+    lastEditorBuildSHA: string;
 }
 
 
@@ -344,15 +351,15 @@ class PreferencesFormat {
         };
 
         this.uiData = {
-            skinPath : "AtomicEditor/editor/skin/",
-            defaultSkinPath : "AtomicEditor/resources/default_skin/",
-            fontFile : "AtomicEditor/resources/vera.ttf",
-            fontName : "Vera",
-            fontSize : 12
+            skinPath: "AtomicEditor/editor/skin/",
+            defaultSkinPath: "AtomicEditor/resources/default_skin/",
+            fontFile: "AtomicEditor/resources/vera.ttf",
+            fontName: "Vera",
+            fontSize: 12
         };
 
         this.editorBuildData = {
-            lastEditorBuildSHA : "Unversioned Build"
+            lastEditorBuildSHA: "Unversioned Build"
         }
 
     }
@@ -402,8 +409,8 @@ class PreferencesFormat {
     editorWindow: WindowData;
     playerWindow: WindowData;
     codeEditorSettings: AceEditorSettings;
-    uiData : UserInterfaceData;
-    editorBuildData : EditorBuildData;
+    uiData: UserInterfaceData;
+    editorBuildData: EditorBuildData;
 }
 
 export = Preferences;

+ 2 - 2
Script/AtomicEditor/ui/resourceEditors/AbstractTextResourceEditorBuilder.ts

@@ -73,9 +73,9 @@ export abstract class AbstractTextResourceEditorBuilder implements Editor.Extens
             webClient.executeJavaScript(`HOST_resourceDeleted("atomic://${this.getNormalizedPath(data.path)}");`);
         });
 
-        editor.subscribeToEvent(EditorEvents.UserPreferencesChangedNotification, (data) => {
+        editor.subscribeToEvent(EditorEvents.UserPreferencesChangedNotification, (data: EditorEvents.UserPreferencesChangedEvent) => {
             const webClient = editor.webView.webClient;
-            webClient.executeJavaScript("HOST_preferencesChanged();");
+            webClient.executeJavaScript(`HOST_preferencesChanged('${data.projectPreferences}','${data.applicationPreferences}');`);
         });
 
         return editor;

+ 3 - 3
Script/AtomicWebViewEditor/clientExtensions/ClientExtensionServices.ts

@@ -100,7 +100,7 @@ export class WebViewServicesProvider extends ServicesProvider<Editor.ClientExten
         eventDispatcher.subscribeToEvent(ClientExtensionEventNames.ResourceRenamedEvent, (ev) => this.renameResource(ev));
         eventDispatcher.subscribeToEvent(ClientExtensionEventNames.ResourceDeletedEvent, (ev) => this.deleteResource(ev));
         eventDispatcher.subscribeToEvent(ClientExtensionEventNames.CodeSavedEvent, (ev) => this.saveCode(ev));
-        eventDispatcher.subscribeToEvent(ClientExtensionEventNames.PreferencesChangedEvent, (ev) => this.preferencesChanged());
+        eventDispatcher.subscribeToEvent(ClientExtensionEventNames.PreferencesChangedEvent, (ev) => this.preferencesChanged(ev));
     }
 
     /**
@@ -192,12 +192,12 @@ export class WebViewServicesProvider extends ServicesProvider<Editor.ClientExten
      * Called when preferences changes
      * @param  {Editor.EditorEvents.PreferencesChangedEvent} ev
      */
-    preferencesChanged() {
+    preferencesChanged(prefs: Editor.ClientExtensions.PreferencesChangedEventData) {
         this.registeredServices.forEach((service) => {
             // Notify services that the project has been unloaded
             try {
                 if (service.preferencesChanged) {
-                    service.preferencesChanged();
+                    service.preferencesChanged(prefs);
                 }
             } catch (e) {
                 alert(`Extension Error:\n Error detected in extension ${service.name}\n \n ${e.stack}`);

+ 3 - 4
Script/AtomicWebViewEditor/editor/editorCommands.ts

@@ -135,11 +135,10 @@ export function editorLoaded() {
 
 /**
  * Called when new preferences are available (or initially with current prefs)
- * @param  {any} prefs
  */
-export function preferencesChanged() {
-    serviceLocator.clientServices.setPreferences(JSON.parse(window.HOST_Preferences.ProjectPreferences), JSON.parse(window.HOST_Preferences.ApplicationPreferences));
-    serviceLocator.sendEvent(ClientExtensionEventNames.PreferencesChangedEvent, null);
+export function preferencesChanged(prefs: Editor.ClientExtensions.PreferencesChangedEventData) {
+    serviceLocator.clientServices.setPreferences(prefs.projectPreferences, prefs.applicationPreferences);
+    serviceLocator.sendEvent(ClientExtensionEventNames.PreferencesChangedEvent, prefs);
 }
 
 export function setEditor(editor: any) {

+ 3 - 4
Script/AtomicWebViewEditor/interop.ts

@@ -203,12 +203,11 @@ export default class HostInteropType {
     }
 
     /**
-     * Host is notifying client that there are preferences to load and passing us the path
+     * Host is notifying client that there are preferences to load and passing us JSON objects containing the prefs
      * of the prefs.
-     * @param  {string} prefUrl
      */
-    preferencesChanged() {
-        editorCommands.preferencesChanged();
+    preferencesChanged(prefs: Editor.ClientExtensions.PreferencesChangedEventData) {
+        editorCommands.preferencesChanged(prefs);
     }
 
     /**

+ 1 - 1
Script/AtomicWebViewEditor/typings/WindowExt.d.ts

@@ -44,7 +44,7 @@ interface Window {
 
     HOST_resourceRenamed: (path: string, newPath: string) => void;
     HOST_resourceDeleted: (path: string) => void;
-    HOST_preferencesChanged: () => void;
+    HOST_preferencesChanged: (jsonProjectPrefs: string, jsonApplicationPrefs: string) => void;
 
     /**
      * Preferences set by the host.  Each preference category is a JSON string of all the prefs

+ 6 - 1
Script/TypeScript/EditorWork.d.ts

@@ -408,6 +408,11 @@ declare module Editor.ClientExtensions {
         initialize(serviceLocator: ClientServiceLocator);
     }
 
+    export interface PreferencesChangedEventData {
+        applicationPreferences? : any,
+        projectPreferences? : any
+    }
+
     export interface WebViewServiceEventListener extends Editor.Extensions.EditorServiceExtension {
         configureEditor?(ev: EditorEvents.EditorFileEvent);
         codeLoaded?(ev: EditorEvents.CodeLoadedEvent);
@@ -415,7 +420,7 @@ declare module Editor.ClientExtensions {
         delete?(ev: EditorEvents.DeleteResourceEvent);
         rename?(ev: EditorEvents.RenameResourceEvent);
         projectUnloaded?();
-        preferencesChanged?();
+        preferencesChanged?(preferences: PreferencesChangedEventData);
     }
 
     /**