提交rbac

提交设置右键错位的bug
This commit is contained in:
2025-04-08 15:15:02 +08:00
parent ab38ee029a
commit 9f7c6206ca
139 changed files with 27868 additions and 117 deletions

View File

@ -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;
//

View File

@ -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)
{