Je souhaite placer une barre de progression animée dans une vue personnalisée NSMenuItem
. Ceci est démontré dans l'exemple de MenuItemView d'Apple, mais il ne s'anime pas (du moins pas dans 10.5, et l'échantillon est apparemment de 10.4).Barre de progression animée dans NSMenuItem
J'ai essayé de régler un temporisateur qui appelle setNeedsDisplay:YES
, programmé comme NSEventTrackingRunLoopMode
comme le disent les docs. Cela fonctionne, mais seulement pour une barre de progression déterminée si je change la valeur, et seulement la première fois que le menu s'ouvre. La deuxième fois et successivement, la barre redessine deux fois et reste ensuite figée. Pour une barre de progression indéterminée, les rayures du barbier ne s'animent jamais.
Modifier: extrait de code. Je viens d'ajouter l'appel
itemChanged
, qui ne semble pas avoir d'effet. La mise à jour de l'élément textuel fonctionne correctement.
class AppDelegate(NSObject):
barItem = None
menuProgressBar = None
progressItem = None
def applicationDidFinishLaunching_(self, sender):
statusbar = NSStatusBar.systemStatusBar()
self.statusitem = statusbar.statusItemWithLength_(
NSSquareStatusItemLength)
self.statusitem.setHighlightMode_(True)
image = NSImage.imageNamed_("menubar.png")
self.statusitem.setImage_(image)
self.statusitem.retain()
menu = NSMenu.alloc().init()
AppDelegate.barItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('progress', None, '')
itemView = NSView.alloc().initWithFrame_(NSMakeRect(0, 0, 50, 20))
itemView.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar = \
NSProgressIndicator.alloc().initWithFrame_(NSMakeRect(16, 5, 22, 10))
AppDelegate.menuProgressBar.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar.setControlSize_(NSSmallControlSize)
AppDelegate.menuProgressBar.setUsesThreadedAnimation_(True)
itemView.addSubview_(AppDelegate.menuProgressBar)
AppDelegate.menuProgressBar.setIndeterminate_(False)
AppDelegate.menuProgressBar.setMaxValue_(100)
AppDelegate.menuProgressBar.startAnimation_(self)
timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(
0.1, self,
objc.selector(self.animateProgress, signature='[email protected]:'),
None, True)
NSRunLoop.currentRunLoop().addTimer_forMode_(
timer, NSEventTrackingRunLoopMode)
AppDelegate.barItem.setView_(itemView)
menu.addItem_(AppDelegate.barItem)
AppDelegate.progressItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('Progress', None, '')
menu.addItem_(AppDelegate.progressItem)
self.statusitem.setMenu_(menu)
def animateProgress(self):
time = NSDate.timeIntervalSinceReferenceDate()
AppDelegate.menuProgressBar.setDoubleValue_(time%100)
AppDelegate.menuProgressBar.display()
AppDelegate.progressItem.setTitle_('Progress: %d'%(time%100))
AppDelegate.barItem.menu().itemChanged_(AppDelegate.barItem)
Oui, je l'ai fait aussi. Aucun effet. – Uncommon
Probablement le moment de poster votre code. –
Exemple de code posté. – Uncommon