/// <summary> /// 移除插件 /// </summary> private void UninstallPlugin() { //移除命令 foreach (var command in _dicCommand) { EnvDTE.Command cmd = _applicationObject.Commands.Item(command.Key); cmd.Delete(); } //移除菜单 foreach (var menu in _dicMenu) { MenuAttribute menuAttribute = Attribute.GetCustomAttribute(menu.Value.GetType(), typeof(MenuAttribute)) as MenuAttribute; AdditionalBarAttribute[] additionalBarAttributes = Attribute.GetCustomAttributes(menu.Value.GetType(), typeof(AdditionalBarAttribute)) as AdditionalBarAttribute[]; foreach (var s in additionalBarAttributes) { CommandBar cmdBar = ((CommandBars)_applicationObject.CommandBars)[s.VsCommandBar]; cmdBar.Controls[menuAttribute.Caption].Delete(); } } //插件卸载 _initAlreadySetup = false; }
protected MenuBase() { this.menuUid = new List <string>(); MenuAttribute attribute = null; int index = 0; foreach (object obj2 in base.GetType().GetCustomAttributes(false)) { if (obj2 is MenuAttribute) { attribute = obj2 as MenuAttribute; this.menuUid.Add(attribute.menuUid); B1AppDomain.RegisterMenuByType(this.menuUid.SingleOrDefault(e => e == attribute.menuUid), this); index++; } } if (attribute == null) { B1Exception.writeLog("Falha ao indexar Form. Por favor checar os atributos informados"); } this.OnInitializeFormEvents(); }
public void Menu_GetOrderNotSetDefaultsToIntMaxValue_ReturnsDefaultOrderValue() { var systemUnderTest = new MenuAttribute("MenuName"); var order = systemUnderTest.Order; Assert.IsTrue(order == int.MaxValue); }
public void Menu_GetOrderSetValue_ReturnsSetOrderValue() { var systemUnderTest = new MenuAttribute("MenuName"); systemUnderTest.Order = 1; var order = systemUnderTest.Order; Assert.IsTrue(order == 1); }
static void Init() { menu = new GenericMenu(); Assembly asm = Assembly.GetAssembly(typeof(Node)); Type[] types = asm.GetTypes(); List <MenuTypeDesc> menu_types = new List <MenuTypeDesc> (); foreach (Type t in types) { object[] attrs = t.GetCustomAttributes(false); if (attrs != null && attrs.Length > 0) { MenuAttribute attr = attrs[0] as MenuAttribute; if (attr != null) { MenuTypeDesc desc = new MenuTypeDesc(); desc.name = attr.Name; desc.order = attr.Order; desc.type = t; menu_types.Add(desc); } } } menu_types.Sort(MenuTypeDesc.Compare); foreach (MenuTypeDesc desc in menu_types) { Type t = desc.type; if (t.IsSubclassOf(typeof(OutputNode))) { if (t == CameraForgeWindow.modifier.output.GetType()) { menu.AddItem(new GUIContent("Output Type/" + desc.name), true, () => {}); } else { menu.AddItem(new GUIContent("Output Type/" + desc.name), false, MenuFunc, t); } } else { menu.AddItem(new GUIContent("Add Node/" + desc.name), false, MenuFunc, t); } } delete_menu = new GenericMenu(); delete_menu.AddItem(new GUIContent("Delete"), false, () => { CameraForgeWindow.modifier.DeleteNode(del_node); }); inited = true; }
private string MenuSql(MenuAttribute menu) { return(string.Format(SqlStatement.GenMenu(), new object[] { menu.Id, menu.ParentId, menu.Name, menu.Url, menu.System, menu.Depth, menu.Index })); }
/// <summary> /// 拦截 /// </summary> /// <param name="basicReturn">基本返回</param> /// <param name="invocation">拦截参数</param> /// <param name="attr">特性</param> /// <param name="isExecProceeded">是否已执行</param> protected override void Intercept(BasicReturnInfo basicReturn, IInvocation invocation, FunctionAttribute attr, out bool isExecProceeded) { isExecProceeded = false; var ignorePerAttr = invocation.Method.GetAttribute <IgnorePermissionAttribute>(); if (ignorePerAttr != null) { return; } if (attr.Codes.IsNullOrCount0()) { basicReturn.SetFailureMsg("功能编码不能为空"); return; } MenuAttribute menuAttr = invocation.TargetType.GetAttribute <MenuAttribute>(); if (menuAttr == null) { return; } if (string.IsNullOrWhiteSpace(menuAttr.Code)) { basicReturn.SetFailureMsg("菜单编码不能为空"); return; } // 这里执行权限验证 IUserService userService = AutofacTool.Resolve <IUserService>(); if (userService == null) { basicReturn.SetFailureMsg("找不到用户服务"); return; } ReturnInfo <bool> perReInfo = userService.IsCurrUserPermission(menuAttr.Code, attr.Codes); if (perReInfo.Failure()) { basicReturn.FromBasic(perReInfo); return; } if (perReInfo.Data) { return; } else { basicReturn.SetCodeMsg(ErrCodeDefine.NOT_PERMISSION, "Sorry,您没有访问此功能权限"); } }
internal void AddNewEntry(PropertyWrapper <TMenu> wrapper, MenuAttribute settings) { if (settings.orderInSection > 0) { this.sectionMembers.Add(settings.orderInSection, wrapper); } else { this.sectionMembers.Add(this.defaultPosition++, wrapper); } if (settings.sectionOrder != 0) { this.order = settings.sectionOrder; } }
private bool NotAuthorized(MenuAttribute menu) { var obj = ContainerManager.Container.Resolve(menu.OriginalType); var ret = menu.With(x => x.OriginalType) .With(x => x.GetMethod( menu.Return(y => y.ValidateMethod, string.Empty))) .With(x => x.Invoke(obj, null)); if (!(ret is bool)) { Logger.Error(String.Format(Messages.AuthorizationMessage, menu.OriginalType, menu.ValidateMethod)); return(false); } return(!(bool)ret); }
/// <summary> /// Map between menu related attributes to equivelant models. /// </summary> public static MenuModel ToMenuModel(this MenuAttribute src) { var dest = new MenuModel(); dest.Action = src.Action; dest.ActionSecurity = ToSecurityModel(src.ActionSecurity); dest.Area = src.Area; dest.Controller = src.Controller; dest.ControllerSecurity = ToSecurityModel(src.ControllerSecurity); dest.Name = src.Name; dest.Order = src.Order; dest.ParentAction = src.ParentAction; dest.ParentArea = src.ParentArea; dest.ParentController = src.ParentController; dest.Parameters = src.Parameters; return(dest); }
internal TextureWrapper(PropertyInfo property, MenuAttribute settings) { var getMethod = property.GetGetMethod(true); if (getMethod == null) { throw new ArgumentException(property.Name + " is missing get method"); } this.getter = base.CompileGetter <MaterialBase.TextureData>(getMethod); this.settings = settings; if (String.IsNullOrEmpty(this.settings.name)) { this.name = property.Name; } else { this.name = this.settings.name; } }
internal EnumWrapper(PropertyInfo property, MenuAttribute settings) { var getMethod = property.GetGetMethod(true); var setMethod = property.GetSetMethod(true); if (getMethod == null || setMethod == null) { throw new ArgumentException(property.Name + " is missing a get or set method"); } this.getter = base.CompileGetter <TEnum>(getMethod); this.setter = base.CompileSetter <TEnum>(setMethod); this.settings = settings; if (String.IsNullOrEmpty(this.settings.name)) { this.name = property.Name; } else { this.name = this.settings.name; } }
private bool RemoveIfNotEqual(MenuAttribute menu) { string sapMenuFileName = string.Empty; var sapMenu = application.Menus.Item(menu.UniqueID); if (sapMenu.Image != null) { sapMenuFileName = Path.GetFileName(sapMenu.Image); } bool same = sapMenu.Checked == menu.Return(x => x.Checked, "0").Equals("1") && sapMenu.Enabled == menu.Return(x => x.Enabled, "0").Equals("1") && sapMenuFileName == menu.Return(x => x.Image, string.Empty) && sapMenu.String == menu.String && sapMenu.Type == menu.Type && sapMenu.UID == menu.UniqueID; if (!same) { application.Menus.RemoveEx(menu.UniqueID); } return(same); }
internal void InitializeSettingsMenu(bool ignoreAttribute = false)//ignoreAttribute - for Core plugins { SettingPropertyDrawers.Clear(); StashTabNodesToUnload.ForEach(x => StashTabController.UnregisterStashNode(x)); StashTabNodesToUnload.Clear(); var settingsProps = Settings.GetType().GetProperties(); foreach (var property in settingsProps) { if (property.Name == "Enable") { continue; } if (property.GetCustomAttribute <IgnoreMenuAttribute>() != null) { continue; } var menuAttrib = property.GetCustomAttribute <MenuAttribute>(); if (ignoreAttribute && menuAttrib == null) { menuAttrib = new MenuAttribute(System.Text.RegularExpressions.Regex.Replace(property.Name, "(\\B[A-Z])", " $1"));//fix camel case } if (menuAttrib != null) { BaseSettingsDrawer drawer = null; int drawerId = menuAttrib.index == -1 ? GetUniqDrawerId() : menuAttrib.index; if (DrawersIds.Contains(drawerId)) { BasePlugin.LogError($"{PluginName}: Already contain settings child with id {menuAttrib.parentIndex}. Fixed by giving a new uniq ID. Property " + property.Name, 5); // drawer.SettingId = GetUniqDrawerId(); } var propType = property.PropertyType; if (propType == typeof(ButtonNode) || propType.IsSubclassOf(typeof(ButtonNode))) { drawer = new ButtonSettingDrawer(property.GetValue(Settings) as ButtonNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(TextNode) || propType.IsSubclassOf(typeof(TextNode))) { drawer = new TextSettingsDrawer(property.GetValue(Settings) as TextNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(EmptyNode) || propType.IsSubclassOf(typeof(EmptyNode))) { drawer = new LabelSettingDrawer(menuAttrib.MenuName, drawerId); } else if (propType == typeof(HotkeyNode) || propType.IsSubclassOf(typeof(HotkeyNode))) { drawer = new HotkeySettingDrawer(property.GetValue(Settings) as HotkeyNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(ToggleNode) || propType.IsSubclassOf(typeof(ToggleNode))) { drawer = new CheckboxSettingDrawer(property.GetValue(Settings) as ToggleNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(ColorNode) || propType.IsSubclassOf(typeof(ColorNode))) { drawer = new ColorSettingDrawer(property.GetValue(Settings) as ColorNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(ListNode) || propType.IsSubclassOf(typeof(ListNode))) { drawer = new ComboBoxSettingDrawer(property.GetValue(Settings) as ListNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(FileNode) || propType.IsSubclassOf(typeof(FileNode))) { drawer = new FilePickerDrawer(property.GetValue(Settings) as FileNode, menuAttrib.MenuName, drawerId); } else if (propType == typeof(StashTabNode) || propType.IsSubclassOf(typeof(StashTabNode))) { var stashNode = property.GetValue(Settings) as StashTabNode; StashTabNodesToUnload.Add(stashNode); StashTabController.RegisterStashNode(stashNode); drawer = new StashTabNodeSettingDrawer(stashNode, menuAttrib.MenuName, drawerId); } else if (propType.IsGenericType) { var genericType = propType.GetGenericTypeDefinition(); if (genericType == typeof(RangeNode <>)) { var genericParameter = propType.GenericTypeArguments; if (genericParameter.Length > 0) { var argType = genericParameter[0]; var valueDrawer = new CustomSettingsDrawer(menuAttrib.MenuName, drawerId); if (argType == typeof(int)) { var rangeInt = property.GetValue(Settings) as RangeNode <int>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = ImGuiExtension.IntSlider(valueDrawer.ImguiUniqLabel, rangeInt.Value, rangeInt.Min, rangeInt.Max); }; } else if (argType == typeof(float)) { var rangeInt = property.GetValue(Settings) as RangeNode <float>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = ImGuiExtension.FloatSlider(valueDrawer.ImguiUniqLabel, rangeInt.Value, rangeInt.Min, rangeInt.Max); }; } else if (argType == typeof(double)) { var rangeInt = property.GetValue(Settings) as RangeNode <double>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = ImGuiExtension.FloatSlider(valueDrawer.ImguiUniqLabel, (float)rangeInt.Value, (float)rangeInt.Min, (float)rangeInt.Max); }; } else if (argType == typeof(byte)) { var rangeInt = property.GetValue(Settings) as RangeNode <byte>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = (byte)ImGuiExtension.IntSlider(valueDrawer.ImguiUniqLabel, rangeInt.Value, rangeInt.Min, rangeInt.Max); }; } else if (argType == typeof(long)) { var rangeInt = property.GetValue(Settings) as RangeNode <long>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = ImGuiExtension.IntSlider(valueDrawer.ImguiUniqLabel, (int)rangeInt.Value, (int)rangeInt.Min, (int)rangeInt.Max); }; } else if (argType == typeof(short)) { var rangeInt = property.GetValue(Settings) as RangeNode <short>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = (short)ImGuiExtension.IntSlider(valueDrawer.ImguiUniqLabel, rangeInt.Value, rangeInt.Min, rangeInt.Max); }; } else if (argType == typeof(ushort)) { var rangeInt = property.GetValue(Settings) as RangeNode <ushort>; valueDrawer.DrawDelegate = delegate { rangeInt.Value = (ushort)ImGuiExtension.IntSlider(valueDrawer.ImguiUniqLabel, rangeInt.Value, rangeInt.Min, rangeInt.Max); }; } else if (argType == typeof(Vector2)) { var vect = property.GetValue(Settings) as RangeNode <Vector2>; valueDrawer.DrawDelegate = delegate { var val = vect.Value; ImGui.SliderVector2(valueDrawer.ImguiUniqLabel, ref val, vect.Min.X, vect.Max.X, "%.0f", 1); vect.Value = val; }; } else { BasePlugin.LogError($"{PluginName}: Generic node argument for range node '{argType.Name}' is not defined in code. Range node type: " + propType.Name, 5); } drawer = valueDrawer; } else { BasePlugin.LogError($"{PluginName}: Can't get GenericTypeArguments from option type: " + propType.Name, 5); } } else { BasePlugin.LogError($"{PluginName}: Generic option node is not defined in code: " + genericType.Name, 5); } } else { BasePlugin.LogError($"{PluginName}: Type of option node is not defined: " + propType.Name, 5); } if (drawer != null) { drawer.SettingTooltip = menuAttrib.Tooltip; if (menuAttrib.parentIndex != -1) { var parent = GetAllDrawers().Find(x => x.SettingId == menuAttrib.parentIndex); if (parent != null) { parent.Children.Add(drawer); continue; } BasePlugin.LogError($"{PluginName}: Can't find child with id {menuAttrib.parentIndex} to parent node. Property " + property.Name, 5); } SettingPropertyDrawers.Add(drawer); } else { BasePlugin.LogError($"{PluginName}: Type of option node is not defined: " + propType.Name, 5); } } } }
public static void Parse(ISettings settings, List <ISettingsHolder> draws, int id = -1) { if (settings == null) { DebugWindow.LogError("Cant parse null settings."); return; } var props = settings.GetType().GetProperties(); foreach (var property in props) { if (property.GetCustomAttribute <IgnoreMenuAttribute>() != null) { continue; } var menuAttribute = property.GetCustomAttribute <MenuAttribute>(); var isSettings = property.PropertyType.GetInterfaces().ContainsF(typeof(ISettings)); if (property.Name == "Enable" && menuAttribute == null) { continue; } if (menuAttribute == null) { menuAttribute = new MenuAttribute(Regex.Replace(property.Name, "(\\B[A-Z])", " $1")); } var holder = new SettingsHolder { Name = menuAttribute.MenuName, Tooltip = menuAttribute.Tooltip, ID = menuAttribute.index == -1 ? MathHepler.Randomizer.Next(int.MaxValue) : menuAttribute.index }; if (isSettings) { var innerSettings = (ISettings)property.GetValue(settings); if (menuAttribute.index != -1) { holder.Type = HolderChildType.Tab; draws.Add(holder); Parse(innerSettings, draws, menuAttribute.index); var parent = GetAllDrawers(draws).Find(x => x.ID == menuAttribute.parentIndex); parent?.Children.Add(holder); } else { Parse(innerSettings, draws); } continue; } var type = property.GetValue(settings); if (menuAttribute.parentIndex != -1) { var parent = GetAllDrawers(draws).Find(x => x.ID == menuAttribute.parentIndex); parent?.Children.Add(holder); } else if (id != -1) { var parent = GetAllDrawers(draws).Find(x => x.ID == id); parent?.Children.Add(holder); } else { draws.Add(holder); } switch (type) { case ButtonNode n: holder.DrawDelegate = () => { if (ImGui.Button(holder.Unique)) { n.OnPressed(); } }; break; case EmptyNode n: break; case HotkeyNode n: holder.DrawDelegate = () => { var holderName = $"{holder.Name} {n.Value}##{n.Value}"; var open = true; if (ImGui.Button(holderName)) { ImGui.OpenPopup(holderName); open = true; } if (ImGui.BeginPopupModal(holderName, ref open, (ImGuiWindowFlags)35)) { if (Input.GetKeyState(Keys.Escape)) { ImGui.CloseCurrentPopup(); ImGui.EndPopup(); return; } foreach (var key in Enum.GetValues(typeof(Keys))) { var keyState = Input.GetKeyState((Keys)key); if (keyState) { n.Value = (Keys)key; ImGui.CloseCurrentPopup(); break; } } ImGui.Text($" Press new key to change '{n.Value}' or Esc for exit."); ImGui.EndPopup(); } }; break; case ToggleNode n: holder.DrawDelegate = () => { var value = n.Value; ImGui.Checkbox(holder.Unique, ref value); n.Value = value; }; break; case ColorNode n: holder.DrawDelegate = () => { var vector4 = n.Value.ToVector4().ToVector4Num(); if (ImGui.ColorEdit4(holder.Unique, ref vector4, ImGuiColorEditFlags.AlphaBar | ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.AlphaPreviewHalf)) { n.Value = vector4.ToSharpColor(); } }; break; case ListNode n: holder.DrawDelegate = () => { if (ImGui.BeginCombo(holder.Unique, n.Value)) { foreach (var t in n.Values) { if (ImGui.Selectable(t)) { n.Value = t; ImGui.EndCombo(); return; } } ImGui.EndCombo(); } }; break; case FileNode n: holder.DrawDelegate = () => { if (ImGui.TreeNode(holder.Unique)) { var selected = n.Value; if (ImGui.BeginChildFrame(1, new Vector2(0, 300))) { var di = new DirectoryInfo("config"); if (di.Exists) { foreach (var file in di.GetFiles()) { if (ImGui.Selectable(file.Name, selected == file.FullName)) { n.Value = file.FullName; } } } ImGui.EndChildFrame(); } ImGui.TreePop(); } }; break; case RangeNode <int> n: holder.DrawDelegate = () => { var r = n.Value; ImGui.SliderInt(holder.Unique, ref r, n.Min, n.Max); n.Value = r; }; break; case RangeNode <float> n: holder.DrawDelegate = () => { var r = n.Value; ImGui.SliderFloat(holder.Unique, ref r, n.Min, n.Max); n.Value = r; }; break; case RangeNode <long> n: holder.DrawDelegate = () => { var r = (int)n.Value; ImGui.SliderInt(holder.Unique, ref r, (int)n.Min, (int)n.Max); n.Value = r; }; break; case RangeNode <Vector2> n: holder.DrawDelegate = () => { var vect = n.Value; ImGui.SliderFloat2(holder.Unique, ref vect, n.Min.X, n.Max.X); n.Value = vect; }; break; default: Core.Logger.Warning($"{type} not supported for menu now. Ask developers to add this type."); break; } } }
private static void HandleSubSettings(ISettings settings, List <ISettingsHolder> draws, PropertyInfo property, MenuAttribute menuAttribute, SettingsHolder holder) { var innerSettings = (ISettings)property.GetValue(settings); if (menuAttribute.index != -1) { holder.Type = HolderChildType.Tab; draws.Add(holder); Parse(innerSettings, draws, menuAttribute.index); var parent = GetAllDrawers(draws).Find(x => x.ID == menuAttribute.parentIndex); parent?.Children.Add(holder); } else { Parse(innerSettings, draws); } }
private bool RemoveIfNotEqual(MenuAttribute menu) { string sapMenuFileName = string.Empty; var sapMenu = application.Menus.Item(menu.UniqueID); if (sapMenu.Image != null) sapMenuFileName = Path.GetFileName(sapMenu.Image); bool same = sapMenu.Checked == menu.Return(x => x.Checked, "0").Equals("1") && sapMenu.Enabled == menu.Return(x => x.Enabled, "0").Equals("1") && sapMenuFileName == menu.Return(x => x.Image, string.Empty) && sapMenu.String == menu.String && sapMenu.Type == menu.Type && sapMenu.UID == menu.UniqueID; if (!same) application.Menus.RemoveEx(menu.UniqueID); return same; }
/// <summary>实现 IDTExtensibility2 接口的 OnConnection 方法。接收正在加载外接程序的通知。</summary> /// <param term='application'>宿主应用程序的根对象。</param> /// <param term='connectMode'>描述外接程序的加载方式。</param> /// <param term='addInInst'>表示此外接程序的对象。</param> /// <seealso class='IDTExtensibility2' /> public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (EnvDTE.AddIn)addInInst; bool abc = _addInInstance.Connected; //初始化工具箱 _dteHelper = new DTEHelper(_applicationObject, _addInInstance); if (!_initAlreadySetup && (ext_ConnectMode.ext_cm_UISetup == connectMode || ext_ConnectMode.ext_cm_Startup == connectMode || ext_ConnectMode.ext_cm_AfterStartup == connectMode)) { CommandBars commandBars = (CommandBars)_applicationObject.CommandBars; try { IDictionary <string, EnvDTE.Command> dicCmd = new Dictionary <string, EnvDTE.Command>(3); //注册插件命令 foreach (var command in CommandManager.GetAllCommands()) { if (!Attribute.IsDefined(command.GetType(), typeof(CommandAttribute))) { continue; } //命令基本信息 CommandAttribute cmdAttribute = Attribute.GetCustomAttribute(command.GetType(), typeof(CommandAttribute)) as CommandAttribute; if (null == cmdAttribute || dicCmd.ContainsKey(cmdAttribute.Key)) { continue; } try { //注册命令 EnvDTE.Command cmd = _dteHelper.RegisterCommand(cmdAttribute.Key, cmdAttribute.Caption, cmdAttribute.Tooltip, cmdAttribute.UseMsoButton, cmdAttribute.IconResource, CommonHelper.Convert2VsCmdStatus(cmdAttribute.InitViewStatus)); dicCmd.Add(cmdAttribute.Key, cmd); } catch { // 可能是由于同名的命令已经存在了,忽略该异常 } } foreach (IMenuBar menuBar in MenuManager.GetAddinMenu()) { if (!Attribute.IsDefined(menuBar.GetType(), typeof(MenuAttribute))) { continue; } //菜单信息 MenuAttribute menuAttribute = Attribute.GetCustomAttribute(menuBar.GetType(), typeof(MenuAttribute)) as MenuAttribute; //附加栏信息 AdditionalBarAttribute[] additionalBarAttribute = Attribute.GetCustomAttributes(menuBar.GetType(), typeof(AdditionalBarAttribute)) as AdditionalBarAttribute[]; if (null == menuAttribute || null == additionalBarAttribute) { continue; } //缓存菜单项,以便卸载 _dicMenu.Add(menuAttribute.Key, menuBar); foreach (var s in additionalBarAttribute) { CommandBar menuBarCommandBar = commandBars[s.VsCommandBar]; //添加菜单 CommandBarControl menu = menuBarCommandBar.Controls.Add(menuAttribute.ControlType, Type.Missing, Type.Missing, menuAttribute.Position <= 0 ? menuBarCommandBar.Controls.Count : menuAttribute.Position, true); //菜单名 menu.Caption = menuAttribute.Caption; //提示文本 menu.TooltipText = menuAttribute.Tooltip; foreach (ICommand command in menuBar.CommandList) { if (!Attribute.IsDefined(command.GetType(), typeof(CommandAttribute))) { continue; } //命令基本信息 CommandAttribute cmdAttribute = Attribute.GetCustomAttribute(command.GetType(), typeof(CommandAttribute)) as CommandAttribute; if (null == cmdAttribute) { continue; } string strCmdName = FormatCommandName(cmdAttribute.Key); try { //给菜单附加命令 if (dicCmd.ContainsKey(cmdAttribute.Key)) { if (menu is CommandBarPopup) { dicCmd[cmdAttribute.Key].AddControl(((CommandBarPopup)menu).CommandBar, cmdAttribute.Position); } else { dicCmd[cmdAttribute.Key].AddControl(menu, cmdAttribute.Position); } if (!_dicCommand.ContainsKey(strCmdName)) { command.DteHelper = _dteHelper; _dicCommand.Add(strCmdName, command); } } } catch { } /* * CommandBarButton cbc = MsoControlType.msoControlPopup == menuBar.CommandMenu.ControlType * ? DTEHelper.GetInstance().AddButtonToPopup( * menu as CommandBarPopup, command.CommandButton.Position, * command.CommandButton.Caption, * command.CommandButton.Tooltip) * : DTEHelper.GetInstance().AddButtonToCmdBar( * menu as CommandBar, command.CommandButton.Position, * command.CommandButton.Caption, * command.CommandButton.Tooltip); * * //参数区分命令来源 * cbc.Parameter = string.Format("{0}.{1}.{2}", kvp.Key, menuBar.CommandMenu.Key, * command.CommandButton.Key); * //添加按钮事件 * cbc.Click += (CommandBarButton ctrl, ref bool @default) => * { * //第1位是窗口名,每2位是菜单名,每3位是命令名 * string[] strPara = ctrl.Parameter.Split('.'); * //取出菜单 * IMenuBar customMenu = this._dicMenuBar[strPara[1]]; * * foreach (ICommand cmd in customMenu.CommandList) * { * if (strPara[2].Equals(cmd.CommandButton.Key)) * { * CommandResult result = cmd.Exec(ctrl.Parameter); * if (0 != result.ErrCode) * MessageBox.Show(result.ErrMsg); * break; * } * } * }; */ } } } //插件加载标识 _initAlreadySetup = true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } }
private static void HandleType(MenuAttribute menuAttribute, SettingsHolder holder, object type) { switch (type) { case ButtonNode n: holder.DrawDelegate = () => { if (ImGui.Button(holder.Unique)) { n.OnPressed(); } }; break; case EmptyNode n: break; case HotkeyNode n: holder.DrawDelegate = () => { var holderName = $"{holder.Name} {n.Value}##{n.Value}"; var open = true; if (ImGui.Button(holderName)) { ImGui.OpenPopup(holderName); open = true; } if (ImGui.BeginPopupModal(holderName, ref open, (ImGuiWindowFlags)35)) { if (Input.GetKeyState(Keys.Escape)) { ImGui.CloseCurrentPopup(); ImGui.EndPopup(); return; } foreach (var key in Enum.GetValues(typeof(Keys))) { var keyState = Input.GetKeyState((Keys)key); if (keyState) { n.Value = (Keys)key; ImGui.CloseCurrentPopup(); break; } } ImGui.Text($" Press new key to change '{n.Value}' or Esc for exit."); ImGui.EndPopup(); } }; break; case ToggleNode n: holder.DrawDelegate = () => { var value = n.Value; ImGui.Checkbox(holder.Unique, ref value); n.Value = value; }; break; case ColorNode n: holder.DrawDelegate = () => { var vector4 = n.Value.ToVector4().ToVector4Num(); if (ImGui.ColorEdit4(holder.Unique, ref vector4, ImGuiColorEditFlags.AlphaBar | ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.AlphaPreviewHalf)) { n.Value = vector4.ToSharpColor(); } }; break; case ListNode n: holder.DrawDelegate = () => { if (ImGui.BeginCombo(holder.Unique, n.Value)) { foreach (var t in n.Values) { if (ImGui.Selectable(t)) { n.Value = t; ImGui.EndCombo(); return; } } ImGui.EndCombo(); } }; break; case FileNode n: holder.DrawDelegate = () => { if (ImGui.TreeNode(holder.Unique)) { var selected = n.Value; if (ImGui.BeginChildFrame(1, new Vector2(0, 300))) { var di = new DirectoryInfo("config"); if (di.Exists) { foreach (var file in di.GetFiles()) { if (ImGui.Selectable(file.Name, selected == file.FullName)) { n.Value = file.FullName; } } } ImGui.EndChildFrame(); } ImGui.TreePop(); } }; break; case RangeNode <int> n: holder.DrawDelegate = () => { var r = n.Value; ImGui.SliderInt(holder.Unique, ref r, n.Min, n.Max); n.Value = r; }; break; case RangeNode <float> n: holder.DrawDelegate = () => { var r = n.Value; ImGui.SliderFloat(holder.Unique, ref r, n.Min, n.Max); n.Value = r; }; break; case RangeNode <long> n: holder.DrawDelegate = () => { var r = (int)n.Value; ImGui.SliderInt(holder.Unique, ref r, (int)n.Min, (int)n.Max); n.Value = r; }; break; case RangeNode <Vector2> n: holder.DrawDelegate = () => { var vect = n.Value; ImGui.SliderFloat2(holder.Unique, ref vect, n.Min.X, n.Max.X); n.Value = vect; }; break; case TextNode n: holder.DrawDelegate = () => { var input = n.Value; ImGui.InputText(holder.Unique, ref input, 200); n.Value = input; }; break; default: DebugWindow.LogDebug($"{type} not supported for menu now. Ask developers to add this type."); break; } }
internal static PropertyWrapper <TMenu> CreatePropertyWrapper(PropertyInfo property, MenuAttribute settings) { Type type = property.PropertyType; if (type == typeof(Single)) { return(new SingleWrapper <TMenu>(property, settings)); } else if (type == typeof(Boolean)) { return(new BooleanWrapper <TMenu>(property, settings)); } else if (type == typeof(Int32)) { return(new Int32Wrapper <TMenu>(property, settings)); } else if (type == typeof(Vector2)) { return(new Vector2Wrapper <TMenu>(property, settings)); } else if (type == typeof(Vector3)) { return(new Vector3Wrapper <TMenu>(property, settings)); } else if (type == typeof(Vector4)) { return(new Vector4Wrapper <TMenu>(property, settings)); } else if (type == typeof(Color)) { return(new ColorWrapper <TMenu>(property, settings)); } else if (type == typeof(MaterialBase.TextureData)) { return(new TextureWrapper <TMenu>(property, settings)); } else if (type == typeof(MaterialBase.ScaleOffsetTextureData)) { return(new TextureWrapper <TMenu>(property, settings)); } else if (type == typeof(EliteIndex)) { return(new EnumWrapper <TMenu, EliteIndex>(property, settings)); } else if (type == typeof(StandardMaterial.RampInfo)) { return(new EnumWrapper <TMenu, StandardMaterial.RampInfo>(property, settings)); } else if (type == typeof(StandardMaterial.DecalLayer)) { return(new EnumWrapper <TMenu, StandardMaterial.DecalLayer>(property, settings)); } else if (type == typeof(StandardMaterial.CullMode)) { return(new EnumWrapper <TMenu, StandardMaterial.CullMode>(property, settings)); } else if (type == typeof(StandardMaterial.PrintDirection)) { return(new EnumWrapper <TMenu, StandardMaterial.PrintDirection>(property, settings)); } else if (type.BaseType == typeof(Enum)) { var t = typeof(EnumWrapper <,>).MakeGenericType(typeof(TMenu), type); var constructor = t.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, default, new Type[]
static void Init() { menu = new GenericMenu(); Assembly asm = Assembly.GetAssembly(typeof(Node)); Type[] types = asm.GetTypes(); List <MenuTypeDesc> menu_types = new List <MenuTypeDesc> (); foreach (Type t in types) { object[] attrs = t.GetCustomAttributes(false); if (attrs != null && attrs.Length > 0) { MenuAttribute attr = attrs[0] as MenuAttribute; if (attr != null) { MenuTypeDesc desc = new MenuTypeDesc(); desc.name = attr.Name; desc.order = attr.Order; desc.type = t; menu_types.Add(desc); } } } menu_types.Sort(MenuTypeDesc.Compare); foreach (MenuTypeDesc desc in menu_types) { Type t = desc.type; if (!t.IsSubclassOf(typeof(OutputNode))) { menu.AddItem(new GUIContent("Add Node/" + desc.name), false, MenuFunc, t); } } foreach (Type t in types) { if (t.IsAbstract) { continue; } if (t.IsSubclassOf(typeof(MediaPoseNode))) { menu.AddItem(new GUIContent("Add Pose Node/Variable/" + t.Name), false, MenuFunc, t); } else if (t == typeof(Modifier)) { menu.AddItem(new GUIContent("Add Modifier"), false, MenuFunc, t); } else if (t.IsSubclassOf(typeof(ScriptModifier))) { menu.AddItem(new GUIContent("Add Script Modifier/" + t.Name), false, MenuFunc, t); } else if (t.IsSubclassOf(typeof(PoseNode)) && t != typeof(FinalPose) && t != typeof(Controller)) { menu.AddItem(new GUIContent("Add Pose Node/" + t.Name), false, MenuFunc, t); } } delete_menu = new GenericMenu(); delete_menu.AddItem(new GUIContent("Delete"), false, () => { if (del_node != null) { CameraForgeWindow.controller.DeleteNode(del_node); } else if (del_pose_node != null) { CameraForgeWindow.controller.DeletePoseNode(del_pose_node); } del_node = null; del_pose_node = null; }); inited = true; }
private bool NotAuthorized(MenuAttribute menu) { var obj = ContainerManager.Container.Resolve(menu.OriginalType); var ret = menu.With(x => x.OriginalType) .With(x => x.GetMethod( menu.Return(y => y.ValidateMethod, string.Empty))) .With(x => x.Invoke(obj, null)); if (!(ret is bool)) { Logger.Error(String.Format(Messages.AuthorizationMessage, menu.OriginalType, menu.ValidateMethod)); return false; } return !(bool)ret; }
public static void Parse(ISettings settings, List <ISettingsHolder> draws, int id = -1) { if (settings == null) { DebugWindow.LogError("Cant parse null settings."); return; } var props = settings.GetType().GetProperties(); foreach (var property in props) { if (property.GetCustomAttribute <IgnoreMenuAttribute>() != null) { continue; } var menuAttribute = property.GetCustomAttribute <MenuAttribute>(); var isSettings = property.PropertyType.GetInterfaces().ContainsF(typeof(ISettings)); if (property.Name == "Enable" && menuAttribute == null) { continue; } if (menuAttribute == null) { menuAttribute = new MenuAttribute(Regex.Replace(property.Name, "(\\B[A-Z])", " $1")); } var holder = new SettingsHolder { Name = menuAttribute.MenuName, Tooltip = menuAttribute.Tooltip, ID = menuAttribute.index == -1 ? MathHepler.Randomizer.Next(int.MaxValue) : menuAttribute.index }; if (isSettings) { HandleSubSettings(settings, draws, property, menuAttribute, holder); continue; } if (IsISettingsList(property, settings)) { IList list = property.GetValue(settings) as IList; foreach (var item in list) { Parse(item as ISettings, draws); } continue; } if (menuAttribute.parentIndex != -1) { var parent = GetAllDrawers(draws).Find(x => x.ID == menuAttribute.parentIndex); parent?.Children.Add(holder); } else if (id != -1) { var parent = GetAllDrawers(draws).Find(x => x.ID == id); parent?.Children.Add(holder); } else { draws.Add(holder); } var type = property.GetValue(settings); HandleType(menuAttribute, holder, type); } }