diff --git a/labelswatch.go b/labelswatch.go index 10947cb..f935b78 100644 --- a/labelswatch.go +++ b/labelswatch.go @@ -49,11 +49,17 @@ func (this *LabelSwatch) RGBA () (r, g, b, a uint32) { } // OnValueChange specifies a function to be called when the swatch's color -// changes. +// is changed by the user. func (this *LabelSwatch) OnValueChange (callback func ()) event.Cookie { return this.swatch.OnValueChange(callback) } +// OnEnter specifies a function to be called when the user selects "OK" in the +// color picker. +func (this *LabelSwatch) OnEnter (callback func ()) event.Cookie { + return this.swatch.OnEnter(callback) +} + func (this *LabelSwatch) handleMouseUp (button input.Button) { if button != input.ButtonLeft { return } if this.MousePosition().In(this.Bounds()) { diff --git a/swatch.go b/swatch.go index 8b87051..2757df9 100644 --- a/swatch.go +++ b/swatch.go @@ -17,6 +17,7 @@ type Swatch struct { label string on struct { valueChange event.FuncBroadcaster + enter event.FuncBroadcaster } } @@ -49,15 +50,22 @@ func (this *Swatch) Value () color.Color { // RGBA satisfies the color.Color interface func (this *Swatch) RGBA () (r, g, b, a uint32) { + if this.value == nil { return } return this.value.RGBA() } // OnValueChange specifies a function to be called when the swatch's color -// changes. +// is changed by the user. func (this *Swatch) OnValueChange (callback func ()) event.Cookie { return this.on.valueChange.Connect(callback) } +// OnEnter specifies a function to be called when the user selects "OK" in the +// color picker. +func (this *Swatch) OnEnter (callback func ()) event.Cookie { + return this.on.enter.Connect(callback) +} + // Choose creates a modal that allows the user to edit the color of the swatch. func (this *Swatch) Choose () { if this.editing { return } @@ -65,7 +73,7 @@ func (this *Swatch) Choose () { var err error var window tomo.Window if parent := this.Window(); parent != nil { - window, err = parent.NewModal(image.Rectangle { }) + window, err = parent.NewChild(image.Rectangle { }) } else { window, err = tomo.NewWindow(image.Rectangle { }) } @@ -79,22 +87,26 @@ func (this *Swatch) Choose () { window.SetTitle(this.label) } + committed := false + colorPicker := NewColorPicker(this.Value()) colorPicker.OnValueChange(func () { this.userSetValue(colorPicker.Value()) }) + hexInput := NewTextInput("TODO") + colorMemory := this.value cancelButton := NewButton("Cancel") cancelButton.SetIcon(tomo.IconDialogCancel) cancelButton.OnClick(func () { - this.userSetValue(colorMemory) window.Close() }) okButton := NewButton("OK") okButton.SetFocused(true) okButton.SetIcon(tomo.IconDialogOkay) okButton.OnClick(func () { + committed = true window.Close() }) @@ -106,8 +118,16 @@ func (this *Swatch) Choose () { window.SetRoot(NewOuterContainer ( layouts.Column { true, false }, colorPicker, + NewInnerContainer(layouts.Row { false, true }, + NewLabel("Hex"), + hexInput), controlRow)) window.OnClose(func () { + if committed { + this.on.enter.Broadcast() + } else { + this.userSetValue(colorMemory) + } this.editing = false }) this.editing = true