diff --git a/wdgt_bordered.go b/wdgt_bordered.go index e964034..5505eb3 100644 --- a/wdgt_bordered.go +++ b/wdgt_bordered.go @@ -83,13 +83,14 @@ func (w *BorderedWidget) Draw(screen tcell.Screen) { if !w.widget.Visible() { return } + st := w.style.Dim(!w.Active()) if len(w.title) > 0 { - wh.TitledBorderFilled(w.x, w.y, w.x+w.w, w.y+w.h, w.title, w.border, w.style, screen) + wh.TitledBorderFilled(w.x, w.y, w.x+w.w, w.y+w.h, w.title, w.border, st, screen) } else { - wh.BorderFilled(w.x, w.y, w.x+w.w, w.y+w.h, w.border, w.style, screen) + wh.BorderFilled(w.x, w.y, w.x+w.w, w.y+w.h, w.border, st, screen) } if len(w.help) > 0 { - wh.DrawText(w.x+w.w-len(w.help)-2, w.y+w.h, w.help, w.style, screen) + wh.DrawText(w.x+w.w-len(w.help)-2, w.y+w.h, w.help, st, screen) } w.GetPos().DrawOffset(w.widget, screen) } diff --git a/wdgt_datepicker.go b/wdgt_datepicker.go index d31a3bf..2de0793 100644 --- a/wdgt_datepicker.go +++ b/wdgt_datepicker.go @@ -67,6 +67,7 @@ func (w *DatePicker) Init(id string, s tcell.Style) { w.format = time.RFC3339 w.dateFld = NewField(fmt.Sprintf("%s-date", id), s) + w.dateFld.SetOverwrite(true) w.dateFld.SetValue(w.date.Format(w.format)) w.dateFld.SetH(1) diff --git a/wdgt_field.go b/wdgt_field.go index 8af727a..fe6284a 100644 --- a/wdgt_field.go +++ b/wdgt_field.go @@ -35,6 +35,8 @@ type Field struct { label string value string + overwriteMode bool + cursor int visible bool active bool @@ -93,6 +95,10 @@ func (w *Field) HandleKey(ev *tcell.EventKey) bool { return false } if wh.IsBS(*ev) { + if w.overwriteMode { + w.cursor-- + return true + } return w.handleBackspace(ev) } if ok := w.keyMap.Handle(ev); ok { @@ -102,7 +108,16 @@ func (w *Field) HandleKey(ev *tcell.EventKey) bool { return false } if ev.Key() == tcell.KeyRune { - w.SetValue(fmt.Sprintf("%s%s%s", w.value[:w.cursor], string(ev.Rune()), w.value[w.cursor:])) + var val string + if w.overwriteMode { + val = fmt.Sprintf("%s%s", w.value[:w.cursor], string(ev.Rune())) + if len(w.value) > w.cursor+1 { + val = fmt.Sprintf("%s%s", val, w.value[w.cursor+1:]) + } + } else { + val = fmt.Sprintf("%s%s%s", w.value[:w.cursor], string(ev.Rune()), w.value[w.cursor:]) + } + w.SetValue(val) w.cursor++ return true } @@ -252,3 +267,4 @@ func (w *Field) SetFilter(f func(ev tcell.EventKey) bool) { return f(ev) } } +func (w *Field) SetOverwrite(b bool) { w.overwriteMode = b } diff --git a/wdgt_top_menu_layout.go b/wdgt_top_menu_layout.go index d2fa21d..ba25a69 100644 --- a/wdgt_top_menu_layout.go +++ b/wdgt_top_menu_layout.go @@ -68,19 +68,30 @@ func (w *TopMenuLayout) Init(id string, s tcell.Style) { w.menu.SetType(MenuTypeH) w.widget = NewBlankWidget("blank") - w.keyMap = BlankKeyMap() - w.keyMap.Add(tcell.KeyEscape, func(ev *tcell.EventKey) bool { - if w.menu != nil { - w.menu.SetActive(!w.menu.Active()) - if w.widget != nil { - w.widget.SetActive(!w.menu.Active()) - } - return true + w.keyMap = NewKeyMap(map[tcell.Key]func(ev *tcell.EventKey) bool{ + tcell.KeyEscape: func(ev *tcell.EventKey) bool { + return w.ToggleMenu() + }, + }) + w.keyMap.AddRune(' ', func(ev *tcell.EventKey) bool { + if ev.Modifiers()&tcell.ModAlt != 0 { + return w.ToggleMenu() } return false }) } +func (w *TopMenuLayout) ToggleMenu() bool { + if w.menu != nil { + w.menu.SetActive(!w.menu.Active()) + if w.widget != nil { + w.widget.SetActive(!w.menu.Active()) + } + return true + } + return false +} + func (w *TopMenuLayout) Id() string { return w.id } func (w *TopMenuLayout) HandleResize(ev *tcell.EventResize) { w.w, w.h = ev.Size()