omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Containers for photos, with scroll, drag&drop between them

    Pythonista
    2
    47
    16771
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • cvp
      cvp @jmv38 last edited by

      @jmv38 said:

      seems a bit over my head, with all this objC functions...

      It is not so complex as it seems...

      1 Reply Last reply Reply Quote 0
      • jmv38
        jmv38 @cvp last edited by

        @cvp thanks for juxtapositionDePhotos.py
        all the bricks i need are there
        => this is really going to help me.
        thanks.

        cvp 1 Reply Last reply Reply Quote 0
        • cvp
          cvp @jmv38 last edited by

          @jmv38 quick and dirty horizontal scroll view

          import photos
          import ui
          
          def main():
          	assets = photos.get_assets()
          	#assets = photos.pick_asset(assets=assets,multi=True)
          	d = 100
          	wsv = min(400,d * len(assets))
          	sv = ui.ScrollView()
          	sv.frame = (0,0,wsv,d)
          	x = 0
          	for i in range(0,len(assets)):
          		b = ui.Button(name=str(i))
          		#b = ui.ImageView(name=str(i))
          		b.border_color = 'blue'
          		b.border_width = 1
          		ui_image = assets[i].get_ui_image().with_rendering_mode(ui.RENDERING_MODE_ORIGINAL)
          		w,h = ui_image.size
          		w = d * w/h
          		b.frame = (x,0,w,d)
          		b.image = ui_image
          		def b_action(sender):
          			sender.superview.name = 'tapped=' + sender.name
          		b.action = b_action
          		sv.add_subview(b)
          		x = x + w
          	sv.content_size = (x,d)
          	sv.present('sheet')
          
          if __name__ == '__main__':
          	main()
          

          jmv38 1 Reply Last reply Reply Quote 0
          • jmv38
            jmv38 @cvp last edited by

            @cvp excellent! thanks.
            It is nice to have the function in a really small piece of code.
            I had to limit the number of photos because i have 1600 and that crashes my app. I’ll manage that.

            Another thing: for the interractions between panels i learned (from coding in Codea) that it is much easier to wire things together via a register/trigger message system. Do you have something available?

            cvp 2 Replies Last reply Reply Quote 0
            • cvp
              cvp @jmv38 last edited by

              @jmv38 said:

              it is much easier to wire things together via a register/trigger message system. Do you have something available?

              No, never done like that. I always use normal way of ui. Good luck

              1 Reply Last reply Reply Quote 0
              • cvp
                cvp @jmv38 last edited by

                @jmv38 said:

                limit the number of photos because i have 1600

                Perhaps, use collections or get_moments

                jmv38 1 Reply Last reply Reply Quote 0
                • jmv38
                  jmv38 @cvp last edited by jmv38

                  @cvp here an example of a very simple event class i found on google and modified for my needs. I also added an example of usage.

                  class EventHook(object):
                  
                      def __init__(self):
                          self.__handlers = []
                  
                      def __iadd__(self, handler):
                          self.__handlers.append(handler)
                          return self
                  
                      def __isub__(self, handler):
                          self.__handlers.remove(handler)
                          return self
                  
                      def __call__(self, *args, **keywargs):
                          for handler in self.__handlers:
                              handler(*args, **keywargs)
                  
                      def clearObjectHandlers(self, inObject):
                          for theHandler in self.__handlers:
                              if theHandler.im_self == inObject:
                                  self -= theHandler
                                  
                  if __name__ == '__main__':
                    class Watcher():
                        def __init__(self):
                            self.incoming = EventHook()
                            self.leaving = EventHook()
                    
                    class Greeter():
                      def __init__(self,me):
                        self.me = me
                      def sayHello(self, name):
                        print('{}: hello Mister {}'.format(self.me,name))
                      def sayGoodbye(self, name):
                        print('{}: goobye Mister {}'.format(self.me,name))
                        
                    class Maid():
                      def __init__(self,me):
                        self.me = me
                      def sayHello(self, name):
                        print('{}: hello Mister {}'.format(self.me,name))
                      def sayGoodbye(self, name):
                        if name != 'DSK':
                          print('{}: goobye Mister {}'.format(self.me,name))
                        else:
                          print('{}: You f... s.. o. a b...!'.format(self.me))
                    
                    from console import clear
                    clear()
                    Isee = Watcher()
                    deskMan = Greeter('desk man Georges')
                    maid = Maid('maid Sandra')
                    
                    # make the connections:
                    Isee.incoming += lambda name: print('\nM. {} is comming...'.format(name))
                    Isee.incoming += deskMan.sayHello
                    Isee.incoming += maid.sayHello
                    
                    Isee.leaving += lambda name: print('\nM. {} is leaving...'.format(name))
                    Isee.leaving += maid.sayGoodbye
                    Isee.leaving += deskMan.sayGoodbye
                    
                    # remove listener from the event
                    
                    # fire event
                    Isee.incoming('Clinton')
                    Isee.leaving('Clinton')
                  
                    
                  
                  cvp 1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp @jmv38 last edited by

                    @jmv38 Too complex for me 😀

                    jmv38 2 Replies Last reply Reply Quote 0
                    • jmv38
                      jmv38 @cvp last edited by

                      @cvp i can understand what you feel: it is exactly what i thought the first time saw this! It took me several months to start to understand it, but once i did, bam!, it opened a huge box of possibilties because it made a complex project so much simpler. But I wont try to convert you, you’ll see for yourself as i use it in my project if you think it is usefull...
                      Thanks.

                      1 Reply Last reply Reply Quote 0
                      • jmv38
                        jmv38 @cvp last edited by

                        @cvp i am in the final polishing phase of my project.
                        I have pb with button icons: they render in color when i want a gray rendering (the one shown in the editor).
                        my code:

                        img = ui.Image('iow:refresh_32').with_rendering_mode(ui.RENDERING_MODE_TEMPLATE)
                            clear_button.image = img
                        

                        any suggestion?
                        thanks.

                        cvp 2 Replies Last reply Reply Quote 0
                        • cvp
                          cvp @jmv38 last edited by

                          @jmv38 did you try ui.RENDERING_MODE_ORIGINAL

                          1 Reply Last reply Reply Quote 0
                          • cvp
                            cvp @jmv38 last edited by

                            @jmv38 this is ok, I think

                            img = ui.Image('iow:refresh_32')#.with_rendering_mode(ui.RENDERING_MODE_ORIGINAL)
                            b.image = img
                            b.tint_color = 'gray'
                            
                            jmv38 2 Replies Last reply Reply Quote 0
                            • jmv38
                              jmv38 @cvp last edited by

                              @cvp thanks.
                              but it still doesnt work: now the button shows in gray, not white, and is not visible on my gray background.
                              I wonder how to get it simply as it shows in the editor?

                              cvp 1 Reply Last reply Reply Quote 0
                              • jmv38
                                jmv38 @cvp last edited by

                                @cvp you know what? it works with ORIGINAL
                                looks like omz inverted TEMPLATE and ORIGINAL values
                                thanks.

                                1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @jmv38 last edited by

                                  @jmv38 said:

                                  but it still doesnt work: now the button shows in gray, not white, and is not visible on my gray background.
                                  I wonder how to get it simply as it shows in the editor?

                                  You asked gray and I didn't know you had a gray background

                                  jmv38 2 Replies Last reply Reply Quote 0
                                  • jmv38
                                    jmv38 @cvp last edited by

                                    @cvp i have finished my first version of the program
                                    here https://gist.github.com/1b67ba85ca7bd7b23c7058216895372c
                                    this will:

                                    • let you choose an album xxxx
                                    • load the 200 first pictures
                                    • present them in a photopicker
                                    • from which you can build photo album pages (collage)
                                    • it creates 2 new albums:
                                    • xxxx_pages : the album pages
                                    • xxxx_pages_and_photos: as it says. useful to upload the album in photoweb printing service for instance
                                    • your own photos and albums are not modified

                                    to see how to use it tap ‘?’ button: it opens a youtube video that shows it in action.

                                    It is designed to work in lanscape mode
                                    let me know how it works for you.

                                    1 Reply Last reply Reply Quote 0
                                    • jmv38
                                      jmv38 @cvp last edited by

                                      @cvp hello again!

                                      I am trying to make a high definition image with draw_snapshot()
                                      I works fine until the context width is 4000, but i get a black image when the context width is 5000 or more. I need 9000....
                                      Any suggestion?
                                      Thanks.

                                      cvp 2 Replies Last reply Reply Quote 0
                                      • cvp
                                        cvp @jmv38 last edited by cvp

                                        @jmv38 Sorry, I forgot to tell you, 20 days ago, I had tried your Appli.py it I don't have any album in my photos, thus I tap the X in the first screen, and your program crashes in line
                                        inputAlbum = allAlbums[inputTitle] 😢

                                        1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @jmv38 last edited by

                                          @jmv38 this works for me

                                          import ui
                                          iv = ui.ImageView()
                                          iv.image = ui.Image.named('P1020096.JPG') # 3888 x 2592 pixels
                                          wi,hi = iv.image.size
                                          iv.frame = (0,0,wi,hi)
                                          print(wi,hi)															# 3888 2592
                                          w = 2*wi
                                          h = 2*hi
                                          print(w,h)																# 7776 5184
                                          with ui.ImageContext(w,h) as ctx:
                                          	iv.draw_snapshot()
                                          	ui_image = ctx.get_image()
                                          	with open('t1.jpg', 'wb') as f:
                                          		f.write(ui_image.to_jpeg(0.9))			# 15552 x 10368 
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • cvp
                                            cvp last edited by

                                            But 9000 x 6000 crashes..

                                            jmv38 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors