feat: Add node type-specific double-click actions

노드 타입별 더블클릭 액션 구현:

UnifiedAGVCanvas.Mouse.cs:
- MouseDoubleClick 핸들러 수정 - 노드 타입별 분기 처리
- HandleNormalNodeDoubleClick() 추가 - RFID 입력 InputBox 표시
- HandleLabelNodeDoubleClick() 추가 - 라벨 텍스트 입력 InputBox 표시
- HandleImageNodeDoubleClick() 추가 - ImageNodeDoubleClicked 이벤트 발생

UnifiedAGVCanvas.cs:
- ImageNodeDoubleClicked 이벤트 정의 추가

MainForm.cs:
- OnImageNodeDoubleClicked 이벤트 핸들러 추가
- 이미지 편집창(ImageEditorForm) 자동 표시

AGVNavigationCore.csproj:
- Microsoft.VisualBasic 참조 추가 (InputBox 사용)

이제 노드 더블클릭 시:
- 일반노드(Normal/Rotation/Docking/Charging): RFID 입력창 표시
- 라벨노드: 텍스트 입력창 표시
- 이미지노드: 이미지 편집창 자동 표시

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
backuppc
2025-10-30 15:14:53 +09:00
parent 42bd262177
commit 0e8a452b54
6 changed files with 116 additions and 36 deletions

View File

@@ -56,11 +56,81 @@ namespace AGVNavigationCore.Controls
if (hitNode != null)
{
// 노드 속성 편집 (이벤트 발생)
NodeSelected?.Invoke(this, hitNode);
// 노드 타입별 더블클릭 액션
switch (hitNode.Type)
{
case NodeType.Normal:
case NodeType.Rotation:
case NodeType.Docking:
case NodeType.Charging:
HandleNormalNodeDoubleClick(hitNode);
break;
case NodeType.Label:
HandleLabelNodeDoubleClick(hitNode);
break;
case NodeType.Image:
HandleImageNodeDoubleClick(hitNode);
break;
default:
// 기본 동작: 노드 선택 이벤트 발생
NodeSelected?.Invoke(this, hitNode);
break;
}
}
}
private void HandleNormalNodeDoubleClick(MapNode node)
{
// RFID 입력창 표시
string currentRfid = node.RfidId ?? "";
string newRfid = Microsoft.VisualBasic.Interaction.InputBox(
$"노드 '{node.Name}'의 RFID를 입력하세요:",
"RFID 설정",
currentRfid);
if (!string.IsNullOrWhiteSpace(newRfid) && newRfid != currentRfid)
{
node.RfidId = newRfid.Trim();
MapChanged?.Invoke(this, EventArgs.Empty);
Invalidate();
}
// 노드 선택 이벤트도 발생 (속성창 업데이트)
NodeSelected?.Invoke(this, node);
}
private void HandleLabelNodeDoubleClick(MapNode node)
{
// 라벨 텍스트 입력창 표시
string currentText = node.Name ?? "새 라벨";
string newText = Microsoft.VisualBasic.Interaction.InputBox(
"라벨 텍스트를 입력하세요:",
"라벨 편집",
currentText);
if (!string.IsNullOrWhiteSpace(newText) && newText != currentText)
{
node.Name = newText.Trim();
MapChanged?.Invoke(this, EventArgs.Empty);
Invalidate();
}
// 노드 선택 이벤트도 발생 (속성창 업데이트)
NodeSelected?.Invoke(this, node);
}
private void HandleImageNodeDoubleClick(MapNode node)
{
// 이미지 노드는 선택 이벤트만 발생 (MainForm에서 이미지 편집 버튼 활성화됨)
NodeSelected?.Invoke(this, node);
// 이미지 편집 이벤트 발생 (MainForm에서 처리)
ImageNodeDoubleClicked?.Invoke(this, node);
}
private void UnifiedAGVCanvas_MouseDown(object sender, MouseEventArgs e)
{
var worldPoint = ScreenToWorld(e.Location);

View File

@@ -142,6 +142,7 @@ namespace AGVNavigationCore.Controls
public event EventHandler<MapNode> NodeDeleted;
public event EventHandler<MapNode> NodeMoved;
public event EventHandler<(MapNode From, MapNode To)> ConnectionDeleted;
public event EventHandler<MapNode> ImageNodeDoubleClicked;
public event EventHandler MapChanged;
#endregion