Skip to content

Commit

Permalink
TabWidget: Add support for tab page image, fixes #74
Browse files Browse the repository at this point in the history
  • Loading branch information
lxn committed Nov 22, 2013
1 parent 3922f36 commit 422bfc1
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 18 deletions.
5 changes: 5 additions & 0 deletions declarative/tabpage.go
Expand Up @@ -28,6 +28,7 @@ type TabPage struct {
DataBinder DataBinder
Layout Layout
Children []Widget
Image *walk.Bitmap
Title Property
Content Widget
}
Expand All @@ -39,6 +40,10 @@ func (tp TabPage) Create(builder *Builder) error {
}

return builder.InitWidget(tp, w, func() error {
if err := w.SetImage(tp.Image); err != nil {
return err
}

if tp.Content != nil && len(tp.Children) == 0 {
if err := tp.Content.Create(builder); err != nil {
return err
Expand Down
31 changes: 15 additions & 16 deletions tabpage.go
Expand Up @@ -4,10 +4,6 @@

package walk

import (
"syscall"
)

import (
"github.com/lxn/win"
)
Expand All @@ -24,6 +20,7 @@ func init() {

type TabPage struct {
ContainerBase
image *Bitmap
title string
tabWidget *TabWidget
titleChangedPublisher EventPublisher
Expand Down Expand Up @@ -75,6 +72,20 @@ func (tp *TabPage) Font() *Font {
return defaultFont
}

func (tp *TabPage) Image() *Bitmap {
return tp.image
}

func (tp *TabPage) SetImage(value *Bitmap) error {
tp.image = value

if tp.tabWidget == nil {
return nil
}

return tp.tabWidget.onPageChanged(tp)
}

func (tp *TabPage) Title() string {
return tp.title
}
Expand All @@ -90,15 +101,3 @@ func (tp *TabPage) SetTitle(value string) error {

return tp.tabWidget.onPageChanged(tp)
}

func (tp *TabPage) tcItem() *win.TCITEM {
text := syscall.StringToUTF16(tp.Title())

item := &win.TCITEM{
Mask: win.TCIF_TEXT,
PszText: &text[0],
CchTextMax: int32(len(text)),
}

return item
}
48 changes: 46 additions & 2 deletions tabwidget.go
Expand Up @@ -23,6 +23,7 @@ func init() {
type TabWidget struct {
WidgetBase
hWndTab win.HWND
imageList *ImageList
pages *TabPageList
currentIndex int
currentIndexChangedPublisher EventPublisher
Expand Down Expand Up @@ -71,6 +72,15 @@ func NewTabWidget(parent Container) (*TabWidget, error) {
return tw, nil
}

func (tw *TabWidget) Dispose() {
tw.WidgetBase.Dispose()

if tw.imageList != nil {
tw.imageList.Dispose()
tw.imageList = nil
}
}

func (tw *TabWidget) LayoutFlags() LayoutFlags {
if tw.pages.Len() == 0 {
return ShrinkableHorz | ShrinkableVert | GrowableHorz | GrowableVert | GreedyHorz | GreedyVert
Expand Down Expand Up @@ -293,7 +303,7 @@ func (tw *TabWidget) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr)

func (tw *TabWidget) onPageChanged(page *TabPage) (err error) {
index := tw.pages.Index(page)
item := page.tcItem()
item := tw.tcitemFromPage(page)

if 0 == win.SendMessage(tw.hWndTab, win.TCM_SETITEM, uintptr(index), uintptr(unsafe.Pointer(item))) {
return newError("SendMessage(TCM_SETITEM) failed")
Expand All @@ -307,7 +317,7 @@ func (tw *TabWidget) onInsertingPage(index int, page *TabPage) (err error) {
}

func (tw *TabWidget) onInsertedPage(index int, page *TabPage) (err error) {
item := page.tcItem()
item := tw.tcitemFromPage(page)

if idx := int(win.SendMessage(tw.hWndTab, win.TCM_INSERTITEM, uintptr(index), uintptr(unsafe.Pointer(item)))); idx == -1 {
return newError("SendMessage(TCM_INSERTITEM) failed")
Expand Down Expand Up @@ -420,3 +430,37 @@ func (tw *TabWidget) onClearedPages(pages []*TabPage) (err error) {
tw.currentIndex = -1
return nil
}

func (tw *TabWidget) tcitemFromPage(page *TabPage) *win.TCITEM {
imageIndex, _ := tw.imageIndex(page.image)
text := syscall.StringToUTF16(page.title)

item := &win.TCITEM{
Mask: win.TCIF_IMAGE | win.TCIF_TEXT,
IImage: imageIndex,
PszText: &text[0],
CchTextMax: int32(len(text)),
}

return item
}

func (tw *TabWidget) imageIndex(image *Bitmap) (index int32, err error) {
index = -1
if image != nil {
if tw.imageList == nil {
if tw.imageList, err = NewImageList(Size{16, 16}, 0); err != nil {
return
}

win.SendMessage(tw.hWndTab, win.TCM_SETIMAGELIST, 0, uintptr(tw.imageList.hIml))
}

// FIXME: Protect against duplicate insertion
if index, err = tw.imageList.AddMasked(image); err != nil {
return
}
}

return
}
29 changes: 29 additions & 0 deletions walk.go
Expand Up @@ -39,3 +39,32 @@ func tr(source string, context ...string) string {

return translation(source, context...)
}

type Disposable interface {
Dispose()
}

type Disposables struct {
items []Disposable
done bool
}

func (d *Disposables) Add(item Disposable) {
d.items = append(d.items, item)
}

func (d *Disposables) Spare() {
d.done = true
}

func (d *Disposables) Treat() {
if d.done {
return
}

for _, item := range d.items {
item.Dispose()
}

d.done = true
}

0 comments on commit 422bfc1

Please sign in to comment.