entry_password.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package widget
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/canvas"
  5. "fyne.io/fyne/v2/driver/desktop"
  6. "fyne.io/fyne/v2/theme"
  7. )
  8. var _ desktop.Cursorable = (*passwordRevealer)(nil)
  9. var _ fyne.Tappable = (*passwordRevealer)(nil)
  10. var _ fyne.Widget = (*passwordRevealer)(nil)
  11. type passwordRevealer struct {
  12. BaseWidget
  13. icon *canvas.Image
  14. entry *Entry
  15. }
  16. func newPasswordRevealer(e *Entry) *passwordRevealer {
  17. pr := &passwordRevealer{
  18. icon: canvas.NewImageFromResource(theme.VisibilityOffIcon()),
  19. entry: e,
  20. }
  21. pr.ExtendBaseWidget(pr)
  22. return pr
  23. }
  24. func (r *passwordRevealer) CreateRenderer() fyne.WidgetRenderer {
  25. return &passwordRevealerRenderer{
  26. WidgetRenderer: NewSimpleRenderer(r.icon),
  27. icon: r.icon,
  28. entry: r.entry,
  29. }
  30. }
  31. func (r *passwordRevealer) Cursor() desktop.Cursor {
  32. return desktop.DefaultCursor
  33. }
  34. func (r *passwordRevealer) Tapped(*fyne.PointEvent) {
  35. r.entry.setFieldsAndRefresh(func() {
  36. r.entry.Password = !r.entry.Password
  37. })
  38. fyne.CurrentApp().Driver().CanvasForObject(r).Focus(r.entry.super().(fyne.Focusable))
  39. }
  40. var _ fyne.WidgetRenderer = (*passwordRevealerRenderer)(nil)
  41. type passwordRevealerRenderer struct {
  42. fyne.WidgetRenderer
  43. entry *Entry
  44. icon *canvas.Image
  45. }
  46. func (r *passwordRevealerRenderer) Layout(size fyne.Size) {
  47. r.icon.Resize(fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize()))
  48. r.icon.Move(fyne.NewPos((size.Width-theme.IconInlineSize())/2, (size.Height-theme.IconInlineSize())/2))
  49. }
  50. func (r *passwordRevealerRenderer) MinSize() fyne.Size {
  51. return fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize())
  52. }
  53. func (r *passwordRevealerRenderer) Refresh() {
  54. r.entry.propertyLock.RLock()
  55. defer r.entry.propertyLock.RUnlock()
  56. if !r.entry.Password {
  57. r.icon.Resource = theme.VisibilityIcon()
  58. } else {
  59. r.icon.Resource = theme.VisibilityOffIcon()
  60. }
  61. canvas.Refresh(r.icon)
  62. }