fix
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\..\..\..\..\..\Amkor\AGV4\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -111,6 +111,7 @@ namespace AGVMapEditor.Forms
|
||||
// 이벤트 연결
|
||||
_mapCanvas.NodeAdded += OnNodeAdded;
|
||||
_mapCanvas.NodeSelected += OnNodeSelected;
|
||||
_mapCanvas.NodesSelected += OnNodesSelected; // 다중 선택 이벤트
|
||||
_mapCanvas.NodeMoved += OnNodeMoved;
|
||||
_mapCanvas.NodeDeleted += OnNodeDeleted;
|
||||
_mapCanvas.ConnectionDeleted += OnConnectionDeleted;
|
||||
@@ -184,8 +185,46 @@ namespace AGVMapEditor.Forms
|
||||
private void OnNodeSelected(object sender, MapNode node)
|
||||
{
|
||||
_selectedNode = node;
|
||||
UpdateNodeProperties();
|
||||
UpdateImageEditButton(); // 이미지 노드 선택 시 이미지 편집 버튼 활성화
|
||||
|
||||
if (node == null)
|
||||
{
|
||||
// 빈 공간 클릭 시 캔버스 속성 표시
|
||||
ShowCanvasProperties();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 노드 클릭 시 노드 속성 표시
|
||||
UpdateNodeProperties();
|
||||
UpdateImageEditButton(); // 이미지 노드 선택 시 이미지 편집 버튼 활성화
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNodesSelected(object sender, List<MapNode> nodes)
|
||||
{
|
||||
// 다중 선택 시 처리
|
||||
if (nodes == null || nodes.Count == 0)
|
||||
{
|
||||
ShowCanvasProperties();
|
||||
return;
|
||||
}
|
||||
|
||||
if (nodes.Count == 1)
|
||||
{
|
||||
// 단일 선택은 기존 방식 사용
|
||||
_selectedNode = nodes[0];
|
||||
UpdateNodeProperties();
|
||||
UpdateImageEditButton();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 다중 선택: 상태바에 선택 개수 표시
|
||||
toolStripStatusLabel1.Text = $"{nodes.Count}개 노드 선택됨 - PropertyGrid에서 공통 속성 일괄 변경 가능";
|
||||
|
||||
// 다중 선택 PropertyWrapper 표시
|
||||
var multiWrapper = new MultiNodePropertyWrapper(nodes);
|
||||
_propertyGrid.SelectedObject = multiWrapper;
|
||||
_propertyGrid.Focus();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNodeMoved(object sender, MapNode node)
|
||||
@@ -589,6 +628,13 @@ namespace AGVMapEditor.Forms
|
||||
_mapCanvas.Nodes = _mapNodes;
|
||||
// RfidMappings 제거됨 - MapNode에 통합
|
||||
|
||||
// 🔥 맵 설정 적용 (배경색, 그리드 표시)
|
||||
if (result.Settings != null)
|
||||
{
|
||||
_mapCanvas.BackColor = System.Drawing.Color.FromArgb(result.Settings.BackgroundColorArgb);
|
||||
_mapCanvas.ShowGrid = result.Settings.ShowGrid;
|
||||
}
|
||||
|
||||
// 현재 파일 경로 업데이트
|
||||
_currentMapFile = filePath;
|
||||
_hasChanges = false;
|
||||
@@ -614,7 +660,38 @@ namespace AGVMapEditor.Forms
|
||||
|
||||
private void SaveMapToFile(string filePath)
|
||||
{
|
||||
if (MapLoader.SaveMapToFile(filePath, _mapNodes))
|
||||
// 🔥 백업 파일 생성 (기존 파일이 있을 경우)
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
// 날짜시간 포함 백업 파일명 생성
|
||||
var directory = Path.GetDirectoryName(filePath);
|
||||
var fileNameWithoutExt = Path.GetFileNameWithoutExtension(filePath);
|
||||
var extension = Path.GetExtension(filePath);
|
||||
var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
|
||||
var backupFileName = $"{fileNameWithoutExt}_{timestamp}{extension}.bak";
|
||||
var backupFilePath = Path.Combine(directory, backupFileName);
|
||||
|
||||
// 기존 파일을 백업 파일로 복사
|
||||
File.Copy(filePath, backupFilePath, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 백업 파일 생성 실패 시 경고만 표시하고 계속 진행
|
||||
MessageBox.Show($"백업 파일 생성 실패: {ex.Message}\n원본 파일은 계속 저장됩니다.", "백업 경고",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
// 🔥 현재 캔버스 설정을 맵 파일에 저장
|
||||
var settings = new MapLoader.MapSettings
|
||||
{
|
||||
BackgroundColorArgb = _mapCanvas.BackColor.ToArgb(),
|
||||
ShowGrid = _mapCanvas.ShowGrid
|
||||
};
|
||||
|
||||
if (MapLoader.SaveMapToFile(filePath, _mapNodes, settings))
|
||||
{
|
||||
// 현재 파일 경로 업데이트
|
||||
_currentMapFile = filePath;
|
||||
@@ -892,7 +969,7 @@ namespace AGVMapEditor.Forms
|
||||
{
|
||||
if (_selectedNode == null)
|
||||
{
|
||||
ClearNodeProperties();
|
||||
ShowCanvasProperties();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -905,6 +982,16 @@ namespace AGVMapEditor.Forms
|
||||
UpdateImageEditButton();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 캔버스 속성 표시 (배경색 등)
|
||||
/// </summary>
|
||||
private void ShowCanvasProperties()
|
||||
{
|
||||
var canvasWrapper = new CanvasPropertyWrapper(_mapCanvas);
|
||||
_propertyGrid.SelectedObject = canvasWrapper;
|
||||
DisableImageEditButton();
|
||||
}
|
||||
|
||||
private void ClearNodeProperties()
|
||||
{
|
||||
_propertyGrid.SelectedObject = null;
|
||||
@@ -1010,6 +1097,9 @@ namespace AGVMapEditor.Forms
|
||||
|
||||
private void PropertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
|
||||
{
|
||||
// 변경된 속성명 디버그 출력
|
||||
System.Diagnostics.Debug.WriteLine($"[PropertyGrid] 속성 변경됨: {e.ChangedItem.PropertyDescriptor.Name}");
|
||||
|
||||
// RFID 값 변경시 중복 검사
|
||||
if (e.ChangedItem.PropertyDescriptor.Name == "RFID")
|
||||
{
|
||||
@@ -1031,14 +1121,39 @@ namespace AGVMapEditor.Forms
|
||||
_hasChanges = true;
|
||||
UpdateTitle();
|
||||
|
||||
// 현재 선택된 노드를 기억
|
||||
// 🔥 다중 선택 여부 확인 및 선택된 노드들 저장
|
||||
bool isMultiSelect = _propertyGrid.SelectedObject is MultiNodePropertyWrapper;
|
||||
List<MapNode> selectedNodes = null;
|
||||
if (isMultiSelect)
|
||||
{
|
||||
// 캔버스에서 현재 선택된 노드들 가져오기
|
||||
selectedNodes = new List<MapNode>(_mapCanvas.SelectedNodes);
|
||||
System.Diagnostics.Debug.WriteLine($"[PropertyGrid] 다중 선택 노드 수: {selectedNodes.Count}");
|
||||
}
|
||||
|
||||
// 현재 선택된 노드를 기억 (단일 선택인 경우만)
|
||||
var currentSelectedNode = _selectedNode;
|
||||
|
||||
|
||||
RefreshNodeList();
|
||||
RefreshMapCanvas();
|
||||
|
||||
// 선택된 노드를 다시 선택
|
||||
if (currentSelectedNode != null)
|
||||
|
||||
// 🔥 캔버스 강제 갱신 (bool 타입 속성 변경 시 특히 필요)
|
||||
_mapCanvas.Invalidate();
|
||||
_mapCanvas.Update();
|
||||
|
||||
// 🔥 다중 선택인 경우 MultiNodePropertyWrapper를 다시 생성하여 바인딩
|
||||
if (isMultiSelect && selectedNodes != null && selectedNodes.Count > 0)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[PropertyGrid] MultiNodePropertyWrapper 재생성: {selectedNodes.Count}개");
|
||||
var multiWrapper = new MultiNodePropertyWrapper(selectedNodes);
|
||||
_propertyGrid.SelectedObject = multiWrapper;
|
||||
}
|
||||
|
||||
// PropertyGrid 새로고침
|
||||
_propertyGrid.Refresh();
|
||||
|
||||
// 🔥 단일 선택인 경우에만 노드를 다시 선택 (다중 선택은 캔버스에서 유지)
|
||||
if (!isMultiSelect && currentSelectedNode != null)
|
||||
{
|
||||
var nodeIndex = _mapNodes.IndexOf(currentSelectedNode);
|
||||
if (nodeIndex >= 0)
|
||||
@@ -1162,5 +1277,96 @@ namespace AGVMapEditor.Forms
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Multi-Node Selection
|
||||
|
||||
private void ShowMultiNodeContextMenu(List<MapNode> nodes)
|
||||
{
|
||||
// 다중 선택 시 간단한 다이얼로그 표시
|
||||
var result = MessageBox.Show(
|
||||
$"{nodes.Count}개의 노드가 선택되었습니다.\n\n" +
|
||||
"일괄 속성 변경을 하시겠습니까?\n\n" +
|
||||
"예: 글자색 변경\n" +
|
||||
"아니오: 배경색 변경\n" +
|
||||
"취소: 닫기",
|
||||
"다중 노드 속성 변경",
|
||||
MessageBoxButtons.YesNoCancel,
|
||||
MessageBoxIcon.Question);
|
||||
|
||||
if (result == DialogResult.Yes)
|
||||
{
|
||||
BatchChangeForeColor();
|
||||
}
|
||||
else if (result == DialogResult.No)
|
||||
{
|
||||
BatchChangeBackColor();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 선택된 노드들의 글자색 일괄 변경
|
||||
/// </summary>
|
||||
public void BatchChangeForeColor()
|
||||
{
|
||||
var selectedNodes = _mapCanvas.SelectedNodes;
|
||||
if (selectedNodes == null || selectedNodes.Count == 0)
|
||||
{
|
||||
MessageBox.Show("선택된 노드가 없습니다.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
using (var colorDialog = new ColorDialog())
|
||||
{
|
||||
colorDialog.Color = selectedNodes[0].ForeColor;
|
||||
if (colorDialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
foreach (var node in selectedNodes)
|
||||
{
|
||||
node.ForeColor = colorDialog.Color;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
|
||||
_hasChanges = true;
|
||||
UpdateTitle();
|
||||
RefreshMapCanvas();
|
||||
MessageBox.Show($"{selectedNodes.Count}개 노드의 글자색이 변경되었습니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 선택된 노드들의 배경색 일괄 변경
|
||||
/// </summary>
|
||||
public void BatchChangeBackColor()
|
||||
{
|
||||
var selectedNodes = _mapCanvas.SelectedNodes;
|
||||
if (selectedNodes == null || selectedNodes.Count == 0)
|
||||
{
|
||||
MessageBox.Show("선택된 노드가 없습니다.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
using (var colorDialog = new ColorDialog())
|
||||
{
|
||||
colorDialog.Color = selectedNodes[0].DisplayColor;
|
||||
if (colorDialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
foreach (var node in selectedNodes)
|
||||
{
|
||||
node.DisplayColor = colorDialog.Color;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
|
||||
_hasChanges = true;
|
||||
UpdateTitle();
|
||||
RefreshMapCanvas();
|
||||
MessageBox.Show($"{selectedNodes.Count}개 노드의 배경색이 변경되었습니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Design;
|
||||
using AGVNavigationCore.Models;
|
||||
using AGVNavigationCore.Controls;
|
||||
|
||||
namespace AGVMapEditor.Models
|
||||
{
|
||||
@@ -521,6 +522,84 @@ namespace AGVMapEditor.Models
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("노드 배경색")]
|
||||
[Description("노드 배경 색상")]
|
||||
public Color DisplayColor
|
||||
{
|
||||
get => _node.DisplayColor;
|
||||
set
|
||||
{
|
||||
_node.DisplayColor = value;
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 색상")]
|
||||
[Description("노드 텍스트 색상 (NodeId, Name 등)")]
|
||||
public Color ForeColor
|
||||
{
|
||||
get => _node.ForeColor;
|
||||
set
|
||||
{
|
||||
_node.ForeColor = value;
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 크기")]
|
||||
[Description("노드 텍스트 크기 (픽셀)")]
|
||||
public float TextFontSize
|
||||
{
|
||||
get => _node.TextFontSize;
|
||||
set
|
||||
{
|
||||
_node.TextFontSize = Math.Max(5.0f, Math.Min(20.0f, value));
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 굵게")]
|
||||
[Description("노드 텍스트 볼드 표시")]
|
||||
public bool TextFontBold
|
||||
{
|
||||
get => _node.TextFontBold;
|
||||
set
|
||||
{
|
||||
_node.TextFontBold = value;
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("이름 말풍선 배경색")]
|
||||
[Description("노드 이름 말풍선(하단 표시) 배경색")]
|
||||
public Color NameBubbleBackColor
|
||||
{
|
||||
get => _node.NameBubbleBackColor;
|
||||
set
|
||||
{
|
||||
_node.NameBubbleBackColor = value;
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("이름 말풍선 글자색")]
|
||||
[Description("노드 이름 말풍선(하단 표시) 글자색")]
|
||||
public Color NameBubbleForeColor
|
||||
{
|
||||
get => _node.NameBubbleForeColor;
|
||||
set
|
||||
{
|
||||
_node.NameBubbleForeColor = value;
|
||||
_node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
[Category("정보")]
|
||||
[DisplayName("생성 일시")]
|
||||
[Description("노드가 생성된 일시")]
|
||||
@@ -540,5 +619,207 @@ namespace AGVMapEditor.Models
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 다중 노드 선택 시 공통 속성 편집용 래퍼
|
||||
/// </summary>
|
||||
public class MultiNodePropertyWrapper
|
||||
{
|
||||
private List<MapNode> _nodes;
|
||||
|
||||
public MultiNodePropertyWrapper(List<MapNode> nodes)
|
||||
{
|
||||
_nodes = nodes ?? new List<MapNode>();
|
||||
}
|
||||
|
||||
[Category("다중 선택")]
|
||||
[DisplayName("선택된 노드 수")]
|
||||
[Description("현재 선택된 노드의 개수")]
|
||||
[ReadOnly(true)]
|
||||
public int SelectedCount => _nodes.Count;
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("노드 배경색")]
|
||||
[Description("선택된 모든 노드의 배경색을 일괄 변경")]
|
||||
public Color DisplayColor
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].DisplayColor : Color.Blue;
|
||||
set
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
node.DisplayColor = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 색상")]
|
||||
[Description("선택된 모든 노드의 글자 색상을 일괄 변경")]
|
||||
public Color ForeColor
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].ForeColor : Color.Black;
|
||||
set
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
node.ForeColor = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 크기")]
|
||||
[Description("선택된 모든 노드의 글자 크기를 일괄 변경 (5~20 픽셀)")]
|
||||
public float TextFontSize
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].TextFontSize : 7.0f;
|
||||
set
|
||||
{
|
||||
var validValue = Math.Max(5.0f, Math.Min(20.0f, value));
|
||||
System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontSize 변경 시작: {validValue}, 노드 수: {_nodes.Count}");
|
||||
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($" - 노드 {node.NodeId}: {node.TextFontSize} → {validValue}");
|
||||
node.TextFontSize = validValue;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
System.Diagnostics.Debug.WriteLine($" - 변경 후: {node.TextFontSize}");
|
||||
}
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontSize 변경 완료");
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("글자 굵게")]
|
||||
[Description("선택된 모든 노드의 글자 굵기를 일괄 변경")]
|
||||
public bool TextFontBold
|
||||
{
|
||||
get
|
||||
{
|
||||
var result = _nodes.Count > 0 ? _nodes[0].TextFontBold : true;
|
||||
System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold GET: {result}");
|
||||
return result;
|
||||
}
|
||||
set
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold 변경 시작: {value}, 노드 수: {_nodes.Count}");
|
||||
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($" - 노드 {node.NodeId}: {node.TextFontBold} → {value}");
|
||||
node.TextFontBold = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
System.Diagnostics.Debug.WriteLine($" - 변경 후: {node.TextFontBold}");
|
||||
}
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold 변경 완료");
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("이름 말풍선 배경색")]
|
||||
[Description("선택된 모든 노드의 이름 말풍선(하단 표시) 배경색을 일괄 변경")]
|
||||
public Color NameBubbleBackColor
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].NameBubbleBackColor : Color.Gold;
|
||||
set
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
node.NameBubbleBackColor = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("표시")]
|
||||
[DisplayName("이름 말풍선 글자색")]
|
||||
[Description("선택된 모든 노드의 이름 말풍선(하단 표시) 글자색을 일괄 변경")]
|
||||
public Color NameBubbleForeColor
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].NameBubbleForeColor : Color.Black;
|
||||
set
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
node.NameBubbleForeColor = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("고급")]
|
||||
[DisplayName("활성화")]
|
||||
[Description("선택된 모든 노드의 활성화 상태를 일괄 변경")]
|
||||
public bool IsActive
|
||||
{
|
||||
get => _nodes.Count > 0 ? _nodes[0].IsActive : true;
|
||||
set
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
node.IsActive = value;
|
||||
node.ModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("정보")]
|
||||
[DisplayName("안내")]
|
||||
[Description("다중 선택 시 공통 속성만 변경할 수 있습니다")]
|
||||
[ReadOnly(true)]
|
||||
public string HelpText => "위 속성을 변경하면 선택된 모든 노드에 일괄 적용됩니다.";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 캔버스 속성 래퍼 (배경색 등 캔버스 전체 속성 편집)
|
||||
/// </summary>
|
||||
public class CanvasPropertyWrapper
|
||||
{
|
||||
private UnifiedAGVCanvas _canvas;
|
||||
|
||||
public CanvasPropertyWrapper(UnifiedAGVCanvas canvas)
|
||||
{
|
||||
_canvas = canvas;
|
||||
}
|
||||
|
||||
[Category("배경")]
|
||||
[DisplayName("배경색")]
|
||||
[Description("맵 캔버스 배경색")]
|
||||
public Color BackgroundColor
|
||||
{
|
||||
get => _canvas.BackColor;
|
||||
set
|
||||
{
|
||||
_canvas.BackColor = value;
|
||||
_canvas.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Category("그리드")]
|
||||
[DisplayName("그리드 표시")]
|
||||
[Description("그리드 표시 여부")]
|
||||
public bool ShowGrid
|
||||
{
|
||||
get => _canvas.ShowGrid;
|
||||
set
|
||||
{
|
||||
_canvas.ShowGrid = value;
|
||||
_canvas.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Category("정보")]
|
||||
[DisplayName("설명")]
|
||||
[Description("맵 캔버스 전체 속성")]
|
||||
[ReadOnly(true)]
|
||||
public string Description
|
||||
{
|
||||
get => "빈 공간을 클릭하면 캔버스 전체 속성을 편집할 수 있습니다.";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user