Files
2026-06-17 14:00:51 +02:00

107 lines
3.7 KiB
Python

import java
import java.awt
import java.awt.event
import java.beans
import jmri
import jmri.jmrit.jython.Jynstrument as Jynstrument
import java.awt.CardLayout as CardLayout
import jmri.util.swing.ResizableImagePanel as ResizableImagePanel
import java.awt.event.MouseListener as MouseListener
import java.beans.PropertyChangeListener as PropertyChangeListener
import jmri.jmrit.throttle.interfaces.AddressListener as AddressListener
class Light(Jynstrument, PropertyChangeListener, AddressListener, MouseListener):
# Jynstrument mandatory part
# Here this JYnstrument like to be in a ThrottleFrame and no anywhere else
def getExpectedContextClassName(self):
return "jmri.jmrit.throttle.UIImplementation.ThrottleFrame"
def init(self):
self.setLayout( CardLayout() )
self.labelOff = ResizableImagePanel(self.getFolder() + "/LightOff.png",100,100 )
self.labelOn = ResizableImagePanel(self.getFolder() + "/LightOn.png",100,100 )
self.add(self.labelOff, "off")
self.add(self.labelOn, "on")
self.addComponentListener(self.labelOff)
self.addComponentListener(self.labelOn)
self.addMouseListener(self)
self.getContext().addAddressListener(self)
self.throttle = self.getContext().getThrottle()
self.updateThrottle()
self.setIcon()
def quit(self): # very important to clean up everything to make sure GC will collect us
self.cleanThrottle()
if (self.getContext() != None) :
self.getContext().removeAddressListener(self)
# this is a good way to make sure that we're are actaully GCed
# using memory watcher in development menu, we can force a GC from there
def __del__(self):
print "in destructor"
#Inner workings:
def updateThrottle(self): # update throttle informations when a new one is detected
if self.throttle != None :
self.throttle.addPropertyChangeListener(self)
def cleanThrottle(self): # clean up throttle information when it is deconnected
if self.throttle != None :
self.throttle.removePropertyChangeListener(self)
self.throttle = None
def switch(self): # actually do function value change
if self.throttle != None :
self.throttle.setFunction(0, not self.throttle.getFunction(0) ) # HERE!
self.setIcon()
def setIcon(self): # update appearance
cl = self.getLayout()
if self.throttle == None :
cl.show(self, "off")
elif self.throttle.getFunction(0) :
cl.show(self, "on")
else :
cl.show(self, "off")
#PropertyChangeListener part: to listen for Function 0 changes
def propertyChange(self, event):
if event.getPropertyName() == "F0" :
self.setIcon()
#AddressListener part: to listen for address changes in address panel (release, acquired)
def notifyAddressChosen(self, address):
pass
def notifyAddressThrottleFound(self, throttle):
self.throttle = throttle
self.updateThrottle()
self.setIcon()
def notifyAddressReleased(self, address):
self.cleanThrottle()
self.setIcon()
def notifyConsistAddressChosen(self, address):
self.notifyAddressChosen(address)
def notifyConsistAddressThrottleFound(self, throttle):
self.notifyAddressThrottleFound(throttle)
def notifyConsistAddressReleased(self, address):
self.notifyAddressReleased(address)
#MouseListener part: to listen for mouse events
def mouseReleased(self, event):
self.switch()
def mousePressed(self, event):
pass
def mouseClicked(self, event):
pass
def mouseExited(self, event):
pass
def mouseEntered(self, event):
pass