//RightClickMenu or PopUp Menu
PopupMenuItem _buildPopupMenuItem(
{String value = 'func1',
String name = 'untitled',
IconData icon = Icons.abc,
double width = 120,
double height = 32}) {
return PopupMenuItem(
height: height,
value: value,
child: Row(
children: [
Container(width: width, child: Text(name)),
Icon(
icon,
color: Colors.black,
)
],
));
}
void _showPopupMenu(BuildContext context) async {
// context의 상위에 존재하는 Overlay의 RenderBox를 가져옵니다.
// 이는 화면 전체에 대한 렌더링 정보를 가지고 있습니다.
final RenderBox overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
// context에 해당하는 위젯(여기서는 팝업을 띄울 버튼이라 가정)의 RenderBox를 가져옵니다.
// 이는 버튼의 위치, 크기 등 렌더링 정보를 가지고 있습니다.
final RenderBox button = context.findRenderObject() as RenderBox;
// 팝업 메뉴에 표시될 항목들을 정의합니다.
// 여기서는 '복사', '공유', '삭제' 세 가지 항목을 정의하였고, 각 항목에는 value, name, icon이 있습니다.
final items = <PopupMenuEntry>[
_buildPopupMenuItem(value: 'copy', name: '복사', icon: Icons.copy),
_buildPopupMenuItem(value: 'share', name: '공유', icon: Icons.share),
_buildPopupMenuItem(
value: 'remove', name: '삭제', icon: Icons.delete_outline),
];
// 팝업 메뉴가 표시될 위치를 정의합니다.
// 이는 버튼의 위치를 기준으로 상대적인 위치를 계산하여 결정합니다.
// button.localToGlobal는 버튼의 위치를 화면 좌표로 변환하고,
// Offset.zero와 button.size.bottomRight(Offset.zero)는 각각 버튼의 왼쪽 상단과 오른쪽 하단의 위치입니다.
// 이 두 점을 이어 사각형을 이루며, 이 사각형이 팝업 메뉴가 표시될 영역을 나타냅니다.
final position = RelativeRect.fromRect(
Rect.fromPoints(
button.localToGlobal(Offset.zero, ancestor: overlay),
button.localToGlobal(button.size.bottomRight(Offset.zero),
ancestor: overlay),
),
Offset.zero & overlay.size,
);
showMenu(
context: context,
position: position,
items: items,
).then((value) {
switch (value) {
case 'copy':
print('copy tap');
_copyToClipboard();
break;
case 'share':
print('share tap');
_ShareToClipboard();
break;
case 'remove':
print('remove tap');
break;
// 다른 메뉴 아이템들에 대한 처리를 여기에 추가...
}
});
}
void _copyToClipboard() {
if (linkData.isNotEmpty) {
/*
//결과 linkData 포멧..
{
'title': title,
'description': description,
'url': url,
'homepage': address,
'thumbimage': thumbnailUrl
};
*/
var data = linkData![0];
String url = '${data['url']!}';
Clipboard.setData(ClipboardData(text: url));
} else {
Clipboard.setData(ClipboardData(text: message));
}
}
void _ShareToClipboard() {
if (linkData.isNotEmpty) {
/*
//결과 linkData 포멧..
{
'title': title,
'description': description,
'url': url,
'homepage': address,
'thumbimage': thumbnailUrl
};
*/
var data = linkData![0];
String title = (data!['title'] != '') ? '제목: ${data['title']!}\n\n' : '';
String description =
(data!['description'] != '') ? '설명: ${data['description']!}\n\n' : '';
String share_mention = '${title}${description}${data['url']!}';
Clipboard.setData(ClipboardData(text: share_mention));
} else {
Clipboard.setData(ClipboardData(text: message));
}
}