package widget import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/theme" ) var _ desktop.Cursorable = (*passwordRevealer)(nil) var _ fyne.Tappable = (*passwordRevealer)(nil) var _ fyne.Widget = (*passwordRevealer)(nil) type passwordRevealer struct { BaseWidget icon *canvas.Image entry *Entry } func newPasswordRevealer(e *Entry) *passwordRevealer { th := e.Theme() pr := &passwordRevealer{ icon: canvas.NewImageFromResource(th.Icon(theme.IconNameVisibilityOff)), entry: e, } pr.ExtendBaseWidget(pr) return pr } func (r *passwordRevealer) CreateRenderer() fyne.WidgetRenderer { return &passwordRevealerRenderer{ WidgetRenderer: NewSimpleRenderer(r.icon), icon: r.icon, entry: r.entry, } } func (r *passwordRevealer) Cursor() desktop.Cursor { return desktop.DefaultCursor } func (r *passwordRevealer) Tapped(*fyne.PointEvent) { if r.entry.Disabled() { return } r.entry.setFieldsAndRefresh(func() { r.entry.Password = !r.entry.Password }) fyne.CurrentApp().Driver().CanvasForObject(r).Focus(r.entry.super().(fyne.Focusable)) } var _ fyne.WidgetRenderer = (*passwordRevealerRenderer)(nil) type passwordRevealerRenderer struct { fyne.WidgetRenderer entry *Entry icon *canvas.Image } func (r *passwordRevealerRenderer) Layout(size fyne.Size) { iconSize := r.entry.Theme().Size(theme.SizeNameInlineIcon) r.icon.Resize(fyne.NewSquareSize(iconSize)) r.icon.Move(fyne.NewPos((size.Width-iconSize)/2, (size.Height-iconSize)/2)) } func (r *passwordRevealerRenderer) MinSize() fyne.Size { iconSize := r.entry.Theme().Size(theme.SizeNameInlineIcon) return fyne.NewSquareSize(iconSize + r.entry.Theme().Size(theme.SizeNameInnerPadding)*2) } func (r *passwordRevealerRenderer) Refresh() { th := r.entry.Theme() if !r.entry.Password { r.icon.Resource = th.Icon(theme.IconNameVisibility) } else { r.icon.Resource = th.Icon(theme.IconNameVisibilityOff) } if r.entry.Disabled() { r.icon.Resource = theme.NewDisabledResource(r.icon.Resource) } r.icon.Refresh() }