예제 #1
0
        public void GeneratePlugins(double maxProgress, Action <string, double> processUpdate)
        {
            var pgStep = (mCatalog.Catalogs.Count > 0) ? (maxProgress / mCatalog.Catalogs.Count) : 0;

            //PluginItems.Clear();
            foreach (var plugin in Plugins)
            {
                try
                {
                    EditorCommon.PluginAssist.IEditorPlugin     pluginValue = null;
                    EditorCommon.PluginAssist.IEditorPluginData pluginData  = null;

                    pluginValue = plugin.Value;
                    pluginData  = plugin.Metadata;

                    if (pluginValue == null || pluginData == null)
                    {
                        continue;
                    }

                    processUpdate?.Invoke($"正在创建插件{pluginValue.PluginName}", pgStep);

                    Guid pluginGuid = Guid.Empty;
                    var  atts       = pluginValue.GetType().GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false);
                    if (atts.Length <= 0)
                    {
                        continue;
                    }

                    pluginGuid = EngineNS.Rtti.RttiHelper.GuidTryParse(((System.Runtime.InteropServices.GuidAttribute)(atts[0])).Value);
                    if (pluginGuid == Guid.Empty)
                    {
                        continue;
                    }

                    if (mPluginsDicWithIdKey.ContainsKey(pluginGuid))
                    {
                        continue;
                    }

                    var noUse = GenericPluginItemAction(pluginGuid, pluginValue, pluginData);
                }
                catch (System.Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.ToString());
                }
            }
        }
예제 #2
0
        public PluginItem(Guid id, EditorCommon.PluginAssist.IEditorPlugin plugin, EditorCommon.PluginAssist.IEditorPluginData pluginData)
        {
            mId           = id;
            mPluginObject = plugin;
            mPluginData   = pluginData;

            if (plugin != null)
            {
                PluginName = plugin.PluginName;
                Version    = plugin.Version;

                if (plugin is EditorCommon.PluginAssist.IEditorPluginOperation)
                {
                    var obj = plugin as EditorCommon.PluginAssist.IEditorPluginOperation;
                    AssemblyPath  = obj.AssemblyPath;
                    DelBtnVisible = System.Windows.Visibility.Visible;
                }
            }
        }
예제 #3
0
        private async System.Threading.Tasks.Task GenericPluginItemAction(Guid pluginGuid, EditorCommon.PluginAssist.IEditorPlugin pluginValue, EditorCommon.PluginAssist.IEditorPluginData pluginData)
        {
            await EngineNS.CEngine.Instance.EventPoster.Post(() =>
            {
                var item        = new PluginItem(pluginGuid, pluginValue, pluginData);
                item.PluginName = pluginValue.PluginName;
                item.Version    = pluginValue.Version;

                //if (!plugin.Value.OnActive())
                //{
                //    item.Active = false;
                //    continue;
                //}
                var pluginType = pluginValue.GetType();
                var atts       = pluginType.GetCustomAttributes(typeof(EditorCommon.PluginAssist.PluginMenuItemAttribute), false);
                if (atts.Length > 0)
                {
                    var piAtt          = (EditorCommon.PluginAssist.PluginMenuItemAttribute)(atts[0]);
                    var menuData       = EditorCommon.Menu.MenuItemDataBase.CreateMenuData(piAtt.MenuType, pluginData.PluginType);
                    menuData.MenuNames = piAtt.MenuString;
                    menuData.Count     = piAtt.Count;
                    if (piAtt.Icons != null)
                    {
                        menuData.Icons = new ImageSource[piAtt.MenuString.Length];
                        for (int i = 0; i < piAtt.Icons.Length; i++)
                        {
                            menuData.Icons[i] = new BitmapImage(new Uri(piAtt.Icons[i], UriKind.Relative));
                        }
                    }
                    if (pluginValue.Icon != null)
                    {
                        if (menuData.Icons.Length == 0)
                        {
                            menuData.Icons = new ImageSource[piAtt.MenuString.Length];
                        }
                        menuData.Icons[menuData.Icons.Length - 1] = pluginValue.Icon;
                    }
                    menuData.OperationControlType = pluginType;
                    if (menuData.OperationControls == null || menuData.OperationControls.Length != menuData.Count)
                    {
                        menuData.OperationControls = new DockControl.IDockAbleControl[menuData.Count];
                    }
                    for (int i = 0; i < menuData.Count; i++)
                    {
                        var ctrl = System.Activator.CreateInstance(menuData.OperationControlType) as DockControl.IDockAbleControl;
                        if (ctrl == null)
                        {
                            EngineNS.Profiler.Log.WriteLine(EngineNS.Profiler.ELogTag.Error, "Plugins", $"Plugin item {pluginValue.PluginName} create menus failed");
                            continue;
                        }
                        if (menuData.Count > 1)
                        {
                            ctrl.Index = i;
                        }
                        menuData.OperationControls[i] = ctrl;
                    }
                    EditorCommon.Menu.GeneralMenuManager.Instance.RegisterMenuItem(menuData);
                }

                // 将同类型的插件放入选择器字典表中
                EditorCommon.PluginAssist.PluginSelector selector;
                if (!PluginDicWithTypeKey.TryGetValue(item.PluginData.PluginType, out selector))
                {
                    selector = new EditorCommon.PluginAssist.PluginSelector(item.PluginData.PluginType);
                    PluginDicWithTypeKey[item.PluginData.PluginType] = selector;
                }
                selector.Plugins[pluginGuid] = item;

                PluginsDicWithIdKey[pluginGuid] = item;
                return(true);
            }, EngineNS.Thread.Async.EAsyncTarget.Main);
        }