[Zope] icons not in __init__.py
Peter Bengtsson
peter_bengtsson_temporary@yahoo.co.uk
Fri, 5 Oct 2001 01:02:13 +0100 (BST)
Thank you. That worked perfectly for me!
--- Brian Lloyd <brian.lloyd@zope.com> wrote: > >
When stating which icon to use for a python
> product you do that
> > like this in __init__.py
> > icon="event.gif"
> >
> > But what about subclasses which are object on
> their own? They
> > don't use the initialize() method.
> >
> > I have tried:
> >
> > class SubClassObject(ObjectManager, etc):
> > meta_type='Event'
> > icon='event.gif'
> >
> > where event.gif is a valid gif next to the .py
> file I write this in.
> > That didn't work!
> >
> > So, I have also tried:
> >
> > icon="misc_/MyProduct/event.gif" and
> icon="misc_/MyProduct/event"
> > and
> > icon="/misc_/MyProduct/event.gif" and
> icon="/misc_/MyProduct/event"
> >
> > Nothing has worked?
> > Zope 2.4.0
> > What's the trick?
>
> [ Brian's product development tip-o-the-day :) ]
>
> Sorry for the long inclusion above, but I thought it
> will be
> useful one day to have the context when someone
> searches the
> mailing list for the answer to this...
>
> The "normal" way that icons get associated with
> classes is
> somewhat opaque:
>
> (in an __init__.py):
>
> context.registerClass(
> instance_class = MyModule.MyClass,
> meta_type = 'My Object',
> permission = 'Add My Objects',
> constructors = MyModule.constructors,
> icon = 'www/MyClass.gif'
> )
>
> The 'registerClass' helper automatically sets up
> your icon. It
> can do that because it gets and / or knows:
>
> o the class object
>
> o the relative path to the file you want to use
> for
> the icon ('www/MyClass.gif')
>
> o the package that is being registered
>
> So what it does is:
>
> o creates an ImageFile object (the ImageFile class
> is located
> in the App.ImageFile module)
>
> o adds the ImageFile instance to a special place
> where
> miscellanous static web-accessible resources for
> use
> by products are kept
>
> o adds an 'icon' attribute to the class being
> registered
> whose value is the url to the ImageFile instance
>
> This is the 'misc_' funny business you see in icon
> urls. The
> 'misc_' object is a child of the root Zope object.
> When
> a product is initialized, a generic container is
> created in
> misc_, named after the product being initialized.
> registerClass
> does a setattr on the generic container for the
> product, making
> the ImageFile instance available through traversal
> as
> /misc_/ProductName/filename.
>
> (Note that these things are set as class attributes
> rather than
> instance attributes, so they are not persistent and
> go away at
> shutdown, and are rebuilt at the next startup).
>
> So... to set up an icon for an object that is not
> registered
> using registerClass, we just need to change the
> __init__.py
> to create ImageFiles for the extra icons we need,
> add those
> ImageFile instances to the container for our product
> in
> misc_, and add appropriate 'icon' attributes to our
> classes
> whose values are url paths to the appropriate
> ImageFiles.
>
>
>
> (in __init__.py)
>
> def initialize(context):
> # standard registration for MyClass, which is a
> normal
> # through-the-web creatable object. Note that
> after
> # registering MyClass, we call our registerIcon
> helper
> # function to register icons for MyOtherClass1
> and MyOtherClass2,
> # which are not directly registered using
> registerClass.
>
> context.registerClass(
> instance_class = MyModule.MyClass,
> meta_type = 'My Object',
> permission = 'Add My Objects',
> constructors = MyModule.constructors,
> icon = 'www/MyClass.gif'
> )
>
> registerIcon('MyOtherClass1.gif')
> registerIcon('MyOtherClass2.gif')
>
>
> import OFS, App
>
> def registerIcon(filename):
> # A helper function that takes an image filename
> (assumed
> # to live in a 'www' subdirectory of this
> package). It
> # creates an ImageFile instance and adds it as
> an attribute
> # of misc_.MyPackage of the zope application
> object (note
> # that misc_.MyPackage has already been created
> by the product
> # initialization machinery by the time
> registerIcon is called).
>
> setattr(OFS.misc_.misc_.MyPackage,
> filename,
> App.ImageFile.ImageFile('www/%s' %
> filename, globals())
> )
>
>
> Now we just need to add 'icon' attributes to our
> 'Other' classes:
>
>
> (in MyModule.py)
>
> class MyOtherClass1:
>
> icon = 'misc_/MyProduct/MyOtherClass1.gif'
> ...
>
> class MyOtherClass2:
>
> icon = 'misc_/MyProduct/MyOtherClass2.gif'
> ...
>
>
> Hope this helps!
>
>
> Brian Lloyd brian@zope.com
> Software Engineer 540.361.1716
> Zope Corporation http://www.zope.com
>
>
>
>
=====
peter_bengtsson_temporary@yahoo.co.uk is a temporary address that
I use to send until I get my email stuff together.
You can always continue to send to my real address which is
mail@peterbe.com
____________________________________________________________
Do You Yahoo!?
Get your free @yahoo.co.uk address at http://mail.yahoo.co.uk
or your free @yahoo.ie address at http://mail.yahoo.ie