entry_password.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. if r.entry.Disabled() {
  36. return
  37. }
  38. r.entry.setFieldsAndRefresh(func() {
  39. r.entry.Password = !r.entry.Password
  40. })
  41. fyne.CurrentApp().Driver().CanvasForObject(r).Focus(r.entry.super().(fyne.Focusable))
  42. }
  43. var _ fyne.WidgetRenderer = (*passwordRevealerRenderer)(nil)
  44. type passwordRevealerRenderer struct {
  45. fyne.WidgetRenderer
  46. entry *Entry
  47. icon *canvas.Image
  48. }
  49. func (r *passwordRevealerRenderer) Layout(size fyne.Size) {
  50. r.icon.Resize(fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize()))
  51. r.icon.Move(fyne.NewPos((size.Width-theme.IconInlineSize())/2, (size.Height-theme.IconInlineSize())/2))
  52. }
  53. func (r *passwordRevealerRenderer) MinSize() fyne.Size {
  54. return fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize())
  55. }
  56. func (r *passwordRevealerRenderer) Refresh() {
  57. r.entry.propertyLock.RLock()
  58. defer r.entry.propertyLock.RUnlock()
  59. if !r.entry.Password {
  60. r.icon.Resource = theme.VisibilityIcon()
  61. } else {
  62. r.icon.Resource = theme.VisibilityOffIcon()
  63. }
  64. if r.entry.disabled {
  65. r.icon.Resource = theme.NewDisabledResource(r.icon.Resource)
  66. }
  67. canvas.Refresh(r.icon)
  68. }