提交rbac
提交设置右键错位的bug
This commit is contained in:
2
DHSoftware/Views/SettingWindow.Designer.cs
generated
2
DHSoftware/Views/SettingWindow.Designer.cs
generated
@ -96,6 +96,7 @@
|
||||
btnSave.Name = "btnSave";
|
||||
btnSave.Size = new Size(63, 28);
|
||||
btnSave.TabIndex = 2;
|
||||
btnSave.Tag = "sys-setsave";
|
||||
btnSave.Text = "保存";
|
||||
//
|
||||
// btnAdd
|
||||
@ -111,6 +112,7 @@
|
||||
btnAdd.Placement = AntdUI.TAlignFrom.TL;
|
||||
btnAdd.Size = new Size(63, 28);
|
||||
btnAdd.TabIndex = 1;
|
||||
btnAdd.Tag = "sys-setadd";
|
||||
btnAdd.Text = "新增";
|
||||
btnAdd.Trigger = AntdUI.Trigger.Hover;
|
||||
//
|
||||
|
@ -4,6 +4,9 @@ using DH.Commons.Helper;
|
||||
using DH.Commons.Models;
|
||||
using DHSoftware.Utils;
|
||||
using DH.Commons.Base;
|
||||
using DH.RBAC.Model.Sys;
|
||||
using System.Reflection;
|
||||
using ScrollBar = AntdUI.ScrollBar;
|
||||
|
||||
namespace DHSoftware.Views
|
||||
{
|
||||
@ -227,6 +230,8 @@ namespace DHSoftware.Views
|
||||
|
||||
private void InitData()
|
||||
{
|
||||
ButtonPermissionList = DH.RBAC.Common.GlobalConfig.PermissionList.ToList();
|
||||
|
||||
btnAdd.Items.Clear();
|
||||
btnAdd.Items.Add("相机设置");
|
||||
btnAdd.Items.Add("工位设置");
|
||||
@ -316,18 +321,137 @@ namespace DHSoftware.Views
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public List<SysPermission> ButtonPermissionList
|
||||
{
|
||||
set
|
||||
{
|
||||
List<SysPermission> list = value;
|
||||
SetPermission(list, this.Controls);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetPermission(List<SysPermission> list, Control.ControlCollection controls)
|
||||
{
|
||||
foreach (Control control in controls)
|
||||
{
|
||||
if (control.HasChildren)
|
||||
{
|
||||
SetPermission(list, control.Controls);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (control is AntdUI.Button button)
|
||||
{
|
||||
HandleButtonVisibility(button, list);
|
||||
continue;
|
||||
}
|
||||
if (control is AntdUI.Label label)
|
||||
{
|
||||
HandleLabelVisibility(label, list);
|
||||
continue;
|
||||
}
|
||||
if (control is AntdUI.Dropdown dropdown)
|
||||
{
|
||||
HandleDropdownVisibility(dropdown, list);
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleDropdownVisibility(Dropdown dropdown, List<SysPermission> permissions)
|
||||
{
|
||||
if (dropdown.Tag is string tag && !string.IsNullOrEmpty(tag))
|
||||
{
|
||||
bool hasPermission = permissions.Any(p => p.EnCode == tag);
|
||||
dropdown.Visible = hasPermission;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 处理 Button 可见性
|
||||
/// </summary>
|
||||
private void HandleButtonVisibility(AntdUI.Button button, List<SysPermission> permissions)
|
||||
{
|
||||
if (button.Tag is string tag && !string.IsNullOrEmpty(tag))
|
||||
{
|
||||
bool hasPermission = permissions.Any(p => p.EnCode == tag);
|
||||
button.Visible = hasPermission;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理 Label 可见性
|
||||
/// </summary>
|
||||
private void HandleLabelVisibility(AntdUI.Label label, List<SysPermission> permissions)
|
||||
{
|
||||
if (label.Tag is string tag && !string.IsNullOrEmpty(tag))
|
||||
{
|
||||
bool hasPermission = permissions.Any(p => p.EnCode == tag);
|
||||
label.Visible = hasPermission;
|
||||
}
|
||||
}
|
||||
|
||||
private bool isUpdatingTabs = false;
|
||||
|
||||
public static int GetMenuScrollValue(Menu menu)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 通过反射获取内部 ScrollBar 的 Value
|
||||
var scrollBarField = typeof(Menu).GetField("ScrollBar",
|
||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
if (scrollBarField != null)
|
||||
{
|
||||
var scrollBar = scrollBarField.GetValue(menu) as ScrollBar;
|
||||
return scrollBar?.Value ?? 0;
|
||||
}
|
||||
}
|
||||
catch { /* 异常处理 */ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static MenuItem FindClickedMenuItem(Menu menu, Point clickPoint)
|
||||
{
|
||||
int scrollY = GetMenuScrollValue(menu);
|
||||
// 调整点击坐标为内容坐标系(叠加滚动偏移)
|
||||
Point adjustedPoint = new Point(clickPoint.X, clickPoint.Y + scrollY);
|
||||
return TraverseMenuItems(menu.Items, adjustedPoint);
|
||||
}
|
||||
|
||||
private static MenuItem TraverseMenuItems(MenuItemCollection items, Point adjustedPoint)
|
||||
{
|
||||
foreach (MenuItem item in items)
|
||||
{
|
||||
if (!item.Visible) continue;
|
||||
|
||||
// 检查当前项是否命中
|
||||
if (item.Rect.Contains(adjustedPoint)) return item;
|
||||
|
||||
// 如果子菜单展开且存在子项,递归查找
|
||||
if (item.Expand && item.Sub != null && item.Sub.Count > 0)
|
||||
{
|
||||
var childResult = TraverseMenuItems(item.Sub, adjustedPoint);
|
||||
if (childResult != null) return childResult;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private void menu1_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Right)
|
||||
{
|
||||
// 转换坐标到控件内部坐标系(考虑滚动条)
|
||||
Point clickPoint = new Point(e.X, e.Y + menu1.ScrollBar.Value);
|
||||
|
||||
// 递归查找命中的菜单项
|
||||
MenuItem clickedItem = FindClickedItem(menu1.Items, clickPoint);
|
||||
var menu = sender as Menu;
|
||||
if (menu == null) return;
|
||||
|
||||
// 获取命中的 MenuItem
|
||||
MenuItem clickedItem = FindClickedMenuItem(menu, e.Location);
|
||||
|
||||
|
||||
if (clickedItem != null)
|
||||
{
|
||||
@ -355,20 +479,24 @@ namespace DHSoftware.Views
|
||||
switch (it.Text)
|
||||
{
|
||||
case "删除相机":
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn);
|
||||
if (result == DialogResult.OK)
|
||||
{
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
tabs1.Pages.Remove(tab);
|
||||
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
tabs1.Pages.Remove(tab);
|
||||
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
|
||||
}
|
||||
ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text);
|
||||
break;
|
||||
|
||||
case "重命名":
|
||||
@ -437,19 +565,23 @@ namespace DHSoftware.Views
|
||||
switch (it.Text)
|
||||
{
|
||||
case "删除工位":
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn);
|
||||
if (result == DialogResult.OK)
|
||||
{
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
tabs1.Pages.Remove(tab);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
tabs1.Pages.Remove(tab);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigModel.DetectionList.RemoveAll(c => c.Name == clickedItem.Text);
|
||||
}
|
||||
ConfigModel.DetectionList.RemoveAll(c => c.Name == clickedItem.Text);
|
||||
break;
|
||||
|
||||
case "重命名":
|
||||
@ -519,22 +651,25 @@ namespace DHSoftware.Views
|
||||
switch (it.Text)
|
||||
{
|
||||
case "删除运控":
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn);
|
||||
if (result == DialogResult.OK)
|
||||
{
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
menu1.Remove(clickedItem);
|
||||
foreach (var tab in tabs1.Pages)
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
//tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage
|
||||
tabs1.Pages.Remove(tab);
|
||||
ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}")
|
||||
{
|
||||
isUpdatingTabs = true;
|
||||
//tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage
|
||||
tabs1.Pages.Remove(tab);
|
||||
ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text);
|
||||
isUpdatingTabs = false;
|
||||
currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text);
|
||||
}
|
||||
ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text);
|
||||
|
||||
break;
|
||||
|
||||
case "重命名":
|
||||
@ -587,25 +722,6 @@ namespace DHSoftware.Views
|
||||
}
|
||||
}
|
||||
|
||||
private MenuItem FindClickedItem(MenuItemCollection items, Point clickPoint)
|
||||
{
|
||||
foreach (MenuItem item in items)
|
||||
{
|
||||
// 检查当前项是否可见且包含点击坐标
|
||||
if (item.Visible && item.Rect.Contains(clickPoint))
|
||||
{
|
||||
return item;
|
||||
}
|
||||
|
||||
// 递归检查子项(如果展开)
|
||||
if (item.Expand && item.Sub != null)
|
||||
{
|
||||
var childResult = FindClickedItem(item.Sub, clickPoint);
|
||||
if (childResult != null) return childResult;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void btnAdd_SelectedValueChanged(object sender, ObjectNEventArgs e)
|
||||
{
|
||||
|
Reference in New Issue
Block a user