https://github.com/pirogom/walkmgr_example/blob/master/menu_test.go
GitHub - pirogom/walkmgr_example: walkmgr example project
walkmgr example project . Contribute to pirogom/walkmgr_example development by creating an account on GitHub.
github.com
walkmgr 에 메뉴관련 기능과 예제는 한참 전에 추가를 해두긴 했습니다만.. 메뉴와 관련된 글은 작성을 제대로 안한것 같아서 예제도 조금더 보강을 하고 관련 글을 작성해봅니다. 관련 예제는 위의 링크 참고 하시면 됩니다.
윈도 프로그래밍을 하다보면 진짜 유용하고 친숙하게 사용하는게 메뉴입니다. UI나 그런거 귀찮으면 ㅎㅎ 그냥 메뉴에 다 때려넣어도 ;;;
첫번째 예제 부터 가봅시다..
func TestMenu1(t *testing.T) {
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
//
m1 := walkmgr.NewMenu("메인메뉴1")
m1.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m1.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m1.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m1.AddAction("메뉴4", func() { fmt.Println("액숀4") })
wm.AddMenu(m1)
wm.Start()
}
walkmgr 을 이용해서 생성된 윈도에 메뉴기능을 사용하는 방법은 단순합니다.
우선 메뉴 객체를 구성한 뒤에 해당 객체를 추가하고자 하는 대상에 AddMenu 로 추가해서 넣으면 되겠습니다. 왜 윈도가 아닌 추가하고자 하는 대상에 AddMenu 를 하냐 표현 하냐면 .. 메뉴라는 것은 메뉴 안에 메뉴가 또 들어가는 서브메뉴 같은 놈들도 있기 때문에 .. 그렇습니다. 예제의 설명을 보면 이해하실 수 있습니다.
첫 예제는 메뉴를 하나 생성해서 윈도에 추가하는 예제입니다.
walkmgr.NewMenu로 m1 이라는 메뉴객체를 생성하고 이 m1의 메뉴 명은 '메인메뉴1' 그리고 메뉴1~4까지 4개의 액션을 추가하였습니다.
액션은 생성한 메뉴 객체에 AddAction 메소드로 추가하시면 되는데요 메뉴의 타이틀 명칭과 해당 메뉴가 선택 되었을때 실행될 함수를 인자로 지정하시면 되겠습니다.
그러니까 ..
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
wm 라는 변수로 walkmgr 객체를 생성하고
m1 := walkmgr.NewMenu("메인메뉴1")
'메인메뉴1' 이라는 타이틀을 가지는 m1 이라는 메뉴 객체를 생성 한 후에
m1.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m1.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m1.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m1.AddAction("메뉴4", func() { fmt.Println("액숀4") })
총 4개의 액션을 서브메뉴 액션을 추가 한 뒤
wm.AddMenu(m1)
NewWin 으로 생성한 WalkUI 객체에 .. 그러니까 메인 윈도의 메뉴에 생성한 메뉴 객체를 추가한다.
이번엔 조금 확장된 예제를 봅시다.
func TestMenu2(t *testing.T) {
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
//
m1 := walkmgr.NewMenu("메인메뉴1")
m1.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m1.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m1.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m1.AddAction("메뉴4", func() { fmt.Println("액숀4") })
wm.AddMenu(m1)
m2 := walkmgr.NewMenu("메인메뉴1")
m2.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m2.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m2.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m2.AddAction("메뉴4", func() { fmt.Println("액숀4") })
wm.AddMenu(m2)
wm.Start()
}
이번에는 메뉴객체를 2개를 생성해서 wm.AddMenu 로 윈도에 두 객체를 추가 했습니다. 추가한 순서대로 첫번째 예제랑 다르게 메뉴가 2개가 추가된 것을 볼 수 있습니다.
다음으로 메뉴의 액션이 많이 존재하는 경우에는 구분이 필요한 경우가 생깁니다. 그런경우 AddSeparator() 메소드를 호출하면 구분선이 메뉴에 추가됩니다.
func TestMenu3(t *testing.T) {
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
//
m1 := walkmgr.NewMenu("메인메뉴1")
m1.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m1.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m1.AddSeparator()
m1.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m1.AddAction("메뉴4", func() { fmt.Println("액숀4") })
wm.AddMenu(m1)
wm.Start()
}
중간에 구분선이 들어간 것을 보실 수 있습니다.
메뉴를 간단한 환경설정 용도로 사용을 하려는 경우 체크박스를 사용하면 편리한 경우가 있습니다. 예를들어 메뉴를 선택 할때마다 토글된다던지 하는 등으로 말이죠 .. 특정 기능을 켜고 끈다던지
func TestMenu4(t *testing.T) {
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
//
m1 := walkmgr.NewMenu("메인메뉴1")
m1.AddAction("메뉴1", func() { fmt.Println("액숀1") })
m1.AddAction("메뉴2", func() { fmt.Println("액숀2") })
m1.AddSeparator()
m1.AddAction("메뉴3", func() { fmt.Println("액숀3") })
m1.AddAction("메뉴4", func() { fmt.Println("액숀4") })
m1.AddSeparator()
c1 := m1.AddCheck("체크메뉴1", false, func() {})
c2 := m1.AddCheck("체크메뉴2", true, func() {})
m1.AddAction("체크토글", func() {
if c1.Checked() {
c1.SetChecked(false)
} else {
c1.SetChecked(true)
}
if c2.Checked() {
c2.SetChecked(false)
} else {
c2.SetChecked(true)
}
})
wm.AddMenu(m1)
wm.Start()
}
메뉴 객체에 액션을 추가할 경우에는 AddAction 이라는 메소드를 쓰지만 체크박스를 포함한 액션은 AddCheck 메소드를 사용하면 됩니다.
c1 := m1.AddCheck("체크메뉴1", false, func() {})
c2 := m1.AddCheck("체크메뉴2", true, func() {})
AddCheck 의 첫번째 인자는 다른 메뉴 액션과 같이 메뉴의 타이틀 텍스트고 두번째는 체크박스의 체크여부 입니다. false 로 생성하면 기본 체크가 해제되어 있을것이고 true 로 생성하면 체크가 되어진 상태로 생성됩니다. 마지막 인자는 이 메뉴가 선택된 경우에 호출되는 콜백 함수를 전달하시면 됩니다.
체크박스 액션은 UI에서 사용되는 체크박스와 같이 AddCheck 호출시 리턴되는 리턴값으로 현재 상태나, 체크여부등의 변경이 가능합니다.
m1.AddAction("체크토글", func() {
if c1.Checked() {
c1.SetChecked(false)
} else {
c1.SetChecked(true)
}
if c2.Checked() {
c2.SetChecked(false)
} else {
c2.SetChecked(true)
}
})
그래서 '체크토글' 이라는 메뉴가 선택되면 2개의 체크박스의 체크상태가 토글되도록 예제를 만들어 두었으니, 참고하시면 되겠습니다.
마지막으로 ..
AddMenu 메소드는 WalkUI 객체에만 존재하는게 아닌 NewMenu 메소드로 생성되는 메뉴 객체에도 존재합니다. 그 이유는 메뉴 안에 단순 선택으로 끝나는 액션이 아닌 또 다른 서브 메뉴를 포함시킬 수 있기 때문입니다.
func TestMenu5(t *testing.T) {
wm := walkmgr.NewWin("메뉴 테스트1", 640, 480)
//
m1 := walkmgr.NewMenu("메인메뉴1")
s1 := walkmgr.NewMenu("과일")
s1.AddAction("사과", func() {})
s1.AddAction("포토", func() {})
s1.AddAction("배", func() {})
s1.AddAction("바나나", func() {})
m1.AddMenu(s1)
s2 := walkmgr.NewMenu("한식")
s2.AddAction("된장찌개", func() {})
s2.AddAction("김치찌개", func() {})
s2.AddAction("순두부", func() {})
s2.AddAction("고추장찌개", func() {})
s2.AddSeparator()
s2.AddAction("갈비찜", func() {})
s2.AddAction("불고기", func() {})
s2.AddAction("곱창전골", func() {})
m1.AddMenu(s2)
s3 := walkmgr.NewMenu("양식")
ss1 := walkmgr.NewMenu("유럽")
sss1 := walkmgr.NewMenu("이탈리아")
sss1.AddAction("파스타", func() {})
sss1.AddAction("피자", func() {})
ss1.AddMenu(sss1)
s3.AddMenu(ss1)
m1.AddMenu(s3)
wm.AddMenu(m1)
wm.Start()
}
위 예제를 보시면 우선 메인메뉴1 을 생성하고 과일, 한식, 양식 이라는 메뉴를 생성해서 메인메뉴1에 추가 한 뒤 이 메인메뉴1을 윈도에 추가를 합니다.
맨 마지막 양식의 경우엔
메인메뉴1 -> 양식 -> 유럽 -> 이탈리아 -> 파스타, 피자로 메뉴 안에 메뉴 안에 메뉴 .... 의 예를 들어본 것이구요.
실행 결과는 위와 같이 메뉴 안에 메뉴도 가능하고 메뉴 안에 메뉴 안에 메뉴안에 액션들도 가능합니다.
적절히 잘 섞어 쓰면 .. 유용하게 사용 가능하실 겁니다.
이상입니다.
[Go언어 윈도 GUI] walkmgr에 트리뷰(TreeView) 추가 2편 (0) | 2023.02.10 |
---|---|
[Go언어 윈도 GUI] walkmgr에 트리뷰(TreeView) 추가 1편 (0) | 2023.02.09 |
[Go언어 윈도 GUI] walkmgr에 툴바(ToolBar) 추가 (0) | 2022.12.19 |
[Go언어 윈도 GUI] walkmgr에 링크 라벨(Link Label) 추가 (0) | 2022.12.10 |
[Go언어 윈도 GUI] walkmgr에 스크롤뷰(ScrollView) 추가 (0) | 2022.12.06 |
[Go언어 윈도 GUI] walkmgr에 상태바(StatusBar) 추가 (0) | 2022.12.02 |
[Go언어 윈도 GUI] walkmgr 에 ListControl 추가 (0) | 2022.08.11 |
[Go언어 윈도 GUI] walkmgr 에 Progress Bar 추가 (0) | 2022.08.10 |