text: from kivy.app import App
  from kivy.clock import Clock
  from kivy.factory import Factory
  from kivy.properties import NumericProperty, StringProperty, BooleanProperty
  from kivy.core.window import Window
  
  from electrumpq_gui.kivy.i18n import _
  
  
  
  class AnimatedPopup(Factory.Popup):
      ''' An Animated Popup that animates in and out.
      '''
  
      anim_duration = NumericProperty(.36)
      '''Duration of animation to be used
      '''
  
      __events__ = ['on_activate', 'on_deactivate']
  
  
      def on_activate(self):
          '''Base function to be overridden on inherited classes.
          Called when the popup is done animating.
          '''
          pass
  
      def on_deactivate(self):
          '''Base function to be overridden on inherited classes.
          Called when the popup is done animating.
          '''
          pass
  
      def open(self):
          '''Do the initialization of incoming animation here.
          Override to set your custom animation.
          '''
          def on_complete(*l):
              self.dispatch('on_activate')
  
          self.opacity = 0
          super(AnimatedPopup, self).open()
          anim = Factory.Animation(opacity=1, d=self.anim_duration)
          anim.bind(on_complete=on_complete)
          anim.start(self)
  
      def dismiss(self):
          '''Do the initialization of incoming animation here.
          Override to set your custom animation.
          '''
          def on_complete(*l):
              super(AnimatedPopup, self).dismiss()
              self.dispatch('on_deactivate')
  
          anim = Factory.Animation(opacity=0, d=.25)
          anim.bind(on_complete=on_complete)
          anim.start(self)
  
  class EventsDialog(Factory.Popup):
      ''' Abstract Popup that provides the following events
      .. events::
          `on_release`
          `on_press`
      '''
  
      __events__ = ('on_release', 'on_press')
  
      def __init__(self, **kwargs):
          super(EventsDialog, self).__init__(**kwargs)
  
      def on_release(self, instance):
          pass
  
      def on_press(self, instance):
          pass
  
      def close(self):
          self.dismiss()
  
  
  class SelectionDialog(EventsDialog):
  
      def add_widget(self, widget, index=0):
          if self.content:
              self.content.add_widget(widget, index)
              return
          super(SelectionDialog, self).add_widget(widget)
  
  
  class InfoBubble(Factory.Bubble):
      '''Bubble to be used to display short Help Information'''
  
      message = StringProperty(_('Nothing set !'))
      '''Message to be displayed; defaults to "nothing set"'''
  
      icon = StringProperty('')
      ''' Icon to be displayed along with the message defaults to ''
  
      :attr:`icon` is a  `StringProperty` defaults to `''`
      '''
  
      fs = BooleanProperty(False)
      ''' Show Bubble in half screen mode
  
      :attr:`fs` is a `BooleanProperty` defaults to `False`
      '''
  
      modal = BooleanProperty(False)
      ''' Allow bubble to be hidden on touch.
  
      :attr:`modal` is a `BooleanProperty` defauult to `False`.
      '''
  
      exit = BooleanProperty(False)
      '''Indicates whether to exit app after bubble is closed.
  
      :attr:`exit` is a `BooleanProperty` defaults to False.
      '''
  
      dim_background = BooleanProperty(False)
      ''' Indicates Whether to draw a background on the windows behind the bubble.
  
      :attr:`dim` is a `BooleanProperty` defaults to `False`.
      '''
  
      def on_touch_down(self, touch):
          if self.modal:
              return True
          self.hide()
          if self.collide_point(*touch.pos):
              return True
  
      def show(self, pos, duration, width=None, modal=False, exit=False):
          '''Animate the bubble into position'''
          self.modal, self.exit = modal, exit
          if width:
              self.width = width
          if self.modal:
              from kivy.uix.modalview import ModalView
              self._modal_view = m = ModalView(background_color=[.5, .5, .5, .2])
              Window.add_widget(m)
              m.add_widget(self)
          else:
              Window.add_widget(self)
  
          # wait for the bubble to adjust its size according to text then animate
          Clock.schedule_once(lambda dt: self._show(pos, duration))
  
      def _show(self, pos, duration):
  
          def on_stop(*l):
              if duration:
                  Clock.schedule_once(self.hide, duration + .5)
  
          self.opacity = 0
          arrow_pos = self.arrow_pos
          if arrow_pos[0] in ('l', 'r'):
              pos = pos[0], pos[1] - (self.height/2)
          else:
              pos = pos[0] - (self.width/2), pos[1]
  
          self.limit_to = Window
  
          anim = Factory.Animation(opacity=1, pos=pos, d=.32)
          anim.bind(on_complete=on_stop)
          anim.cancel_all(self)
          anim.start(self)
  
  
      def hide(self, now=False):
          ''' Auto fade out the Bubble
          '''
          def on_stop(*l):
              if self.modal:
                  m = self._modal_view
                  m.remove_widget(self)
                  Window.remove_widget(m)
              Window.remove_widget(self)
              if self.exit:
                  App.get_running_app().stop()
                  import sys
                  sys.exit()
              else:
                  App.get_running_app().is_exit = False
  
          if now:
              return on_stop()
  
          anim = Factory.Animation(opacity=0, d=.25)
          anim.bind(on_complete=on_stop)
          anim.cancel_all(self)
          anim.start(self)
  
  
  
  class OutputItem(Factory.BoxLayout):
      pass
  
  class OutputList(Factory.GridLayout):
  
      def __init__(self, **kwargs):
          super(Factory.GridLayout, self).__init__(**kwargs)
          self.app = App.get_running_app()
  
      def update(self, outputs):
          self.clear_widgets()
          for (type, address, amount) in outputs:
              self.add_output(address, amount)
  
      def add_output(self, address, amount):
          b = Factory.OutputItem()
          b.address = address
          b.value = self.app.format_amount_and_units(amount)
          self.add_widget(b)
  
  