def launch_pa(self): self.pa.connect_veromix_service() # FIXME: singleton initialization ContextMenu.get_instance(self) self.pa.connect("on_sink_info", self.sink_box.on_sink_info) self.pa.connect("on_sink_remove", self.sink_box.on_sink_remove) self.pa.connect("on_sink_input_info", self.sink_box.on_sink_input_info) self.pa.connect("on_sink_input_remove", self.sink_box.on_sink_remove) self.pa.connect("on_source_info", self.source_box.on_source_info) self.pa.connect("on_source_remove", self.source_box.on_sink_remove) self.pa.connect("on_source_output_info", self.source_box.on_source_output_info) self.pa.connect("on_source_output_remove", self.source_box.on_sink_remove) self.pa.connect("on_module_info", self.sink_box.on_module_info) self.pa.connect("on_volume_meter_sink", self.sink_box.on_volume_meter_sink) self.pa.connect("on_volume_meter_sink_input", self.sink_box.on_volume_meter_sink_input) self.pa.connect("on_volume_meter_source", self.source_box.on_volume_meter_source) self.pa.connect("mpris2_player_added", self.sink_box.on_media_player_added) self.pa.connect("mpris2_player_removed", self.sink_box.on_media_player_removed) self.pa.requestInfo()
def show_popupmenu(self, widget, button=0, time=0): self.menu = Gtk.Menu() self.menu.connect("selection-done", self.on_menu_button_released) instance = ContextMenu.get_instance() instance.populate_menu(self.pa_sink_proxy(), self.menu, self.slider) self.menu.show_all() self.menu.popup(None, None, None, None, 0, 0) return False
def getContextMenu(self): """Returns the context menu used by the widget.""" if not self.contextmenu: self.contextmenu = ContextMenu(self) # NOTE 20080508 jkg: seems like we can drop .getMenu() but I dont see why that works return self.contextmenu.getMenu()
class QuarterWidget(QtOpenGL.QGLWidget): _sensormanager = None _imagereader = None def __init__(self, *args, **kwargs): """ Constructs a QuarterWidget. QuarterWidget(QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") QuarterWidget(QGLContext context, QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") QuarterWidget(QGLFormat format, QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") """ params = ["parent", "sharewidget"] values = {"parent": None, "sharewidget": None, "f": 0, "scxml": "coin:scxml/navigation/examiner.xml"} values.update(kwargs) if len(args) > 0 and isinstance(args[0], QtOpenGL.QGLContext) or "context" in kwargs: params.insert(0, "context") elif len(args) > 0 and isinstance(args[0], QtOpenGL.QGLFormat) or "format" in kwargs: params.insert(0, "format") if len(args) > len(params): values["f"] = args[len(params)] if len(args) > len(params) + 1: values["scxml"] = args[len(params) + 1] for i in range(len(args), len(params)): args += (values[params[i]],) QtOpenGL.QGLWidget.__init__(self, *args[:len(params)]) if values["f"]: self.setWindowFlags(values["f"]) # initialize Sensormanager and ImageReader instances only once if not QuarterWidget._sensormanager: QuarterWidget._sensormanager = SensorManager() if not QuarterWidget._imagereader: QuarterWidget._imagereader = ImageReader() self.cachecontext_list = [] self.cachecontext = self.findCacheContext(self, values["sharewidget"]) self.statecursormap = {} self.scene = None self.contextmenu = None self.contextmenuenabled = True self.sorendermanager = coin.SoRenderManager() self.soeventmanager = coin.SoEventManager() # Mind the order of initialization as the XML state machine uses # callbacks which depends on other state being initialized self.eventmanager = EventManager(self) self.devicemanager = DeviceManager(self) statemachine = coin.ScXML.readFile(values["scxml"]) if statemachine and statemachine.isOfType(coin.SoScXMLStateMachine.getClassTypeId()): sostatemachine = coin.cast(statemachine, "SoScXMLStateMachine") statemachine.addStateChangeCallback(statechangeCB, self) self.soeventmanager.addSoScXMLStateMachine(sostatemachine) sostatemachine.initialize() else: raise "could not initialize statemachine, given file not found?" self.headlight = coin.SoDirectionalLight() self.sorendermanager.setAutoClipping(coin.SoRenderManager.VARIABLE_NEAR_PLANE) self.sorendermanager.setRenderCallback(renderCB, self) self.sorendermanager.setBackgroundColor(coin.SbColor4f(0, 0, 0, 0)) self.sorendermanager.activate() self.sorendermanager.addPreRenderCallback(prerenderCB, self) self.sorendermanager.addPostRenderCallback(postrenderCB, self) self.soeventmanager.setNavigationState(coin.SoEventManager.MIXED_NAVIGATION) self.devicemanager.registerDevice(MouseHandler()) self.devicemanager.registerDevice(KeyboardHandler()) self.eventmanager.registerEventHandler(DragDropHandler()) # set up a cache context for the default SoGLRenderAction self.sorendermanager.getGLRenderAction().setCacheContext(self.getCacheContextId()) self.setStateCursor("interact", QtCore.Qt.ArrowCursor) self.setStateCursor("idle", QtCore.Qt.OpenHandCursor) self.setStateCursor("rotate", QtCore.Qt.ClosedHandCursor) self.setStateCursor("pan", QtCore.Qt.SizeAllCursor) self.setStateCursor("zoom", QtCore.Qt.SizeVerCursor) self.setStateCursor("seek", QtCore.Qt.CrossCursor) self.setStateCursor("spin", QtCore.Qt.OpenHandCursor) self.setMouseTracking(True) self.setFocusPolicy(QtCore.Qt.StrongFocus); def setSceneGraph(self, node): if node and self.scene==node: return camera = None superscene = None viewall = False if node: self.scene = node self.scene.ref() superscene = coin.SoSeparator() superscene.addChild(coin.SoDepthBuffer()) superscene.addChild(self.headlight) camera = self.searchForCamera(node) if not camera: camera = coin.SoPerspectiveCamera() superscene.addChild(camera) viewall = True superscene.addChild(node) self.soeventmanager.setSceneGraph(superscene) self.sorendermanager.setSceneGraph(superscene) self.soeventmanager.setCamera(camera) self.sorendermanager.setCamera(camera) if viewall: self.viewAll() if superscene: superscene.touch() def viewAll(self): """ Reposition the current camera to display the entire scene""" viewallevent = coin.SbName("sim.coin3d.coin.navigation.ViewAll") for c in range(self.soeventmanager.getNumSoScXMLStateMachines()): sostatemachine = self.soeventmanager.getSoScXMLStateMachine(c) if (sostatemachine.isActive()): sostatemachine.queueEvent(viewallevent) sostatemachine.processEventQueue() def resizeGL(self, width, height): vp = coin.SbViewportRegion(width, height) self.sorendermanager.setViewportRegion(vp) self.soeventmanager.setViewportRegion(vp) def paintGL(self): self.actualRedraw() def actualRedraw(self): self.sorendermanager.render(True, True) def event(self, qevent): """Translates Qt Events into Coin events and passes them on to the scenemanager for processing. If the event can not be translated or processed, it is forwarded to Qt and the method returns false. This method could be overridden in a subclass in order to catch events of particular interest to the application programmer.""" if self.eventmanager.handleEvent(qevent): return True soevent = self.devicemanager.translateEvent(qevent) if (soevent and self.soeventmanager.processEvent(soevent)): return True # NOTE jkg: we must return True or False return QtOpenGL.QGLWidget.event(self, qevent) def setStateCursor(self, state, cursor): self.statecursormap[state] = cursor def searchForCamera(self, root): sa = coin.SoSearchAction() sa.setInterest(coin.SoSearchAction.FIRST) sa.setType(coin.SoCamera.getClassTypeId()) sa.apply(root) if sa.getPath(): node = sa.getPath().getTail() if node and node.isOfType(coin.SoCamera.getClassTypeId()): return node return None def getCacheContextId(self): return self.cachecontext.id def findCacheContext(self, widget, sharewidget): class QuarterWidgetP_cachecontext: def __init__(self): self.widgetlist = [] self.id = None for cachecontext in self.cachecontext_list: for widget in cachecontext.widgetlist: if (widget == sharewidget): cachecontext.widgetlist.append(widget) return cachecontext; cachecontext = QuarterWidgetP_cachecontext() cachecontext.id = coin.SoGLCacheContextElement.getUniqueCacheContext() cachecontext.widgetlist.append(widget) self.cachecontext_list.append(cachecontext) return cachecontext def getSoRenderManager(self): return self.sorendermanager def getSoEventManager(self): return self.soeventmanager def setBackgroundColor(self, color): """Set backgroundcolor to a given QColor Remember that QColors are given in integers between 0 and 255, as opposed to SbColor4f which is in [0 ,1]. The default alpha value for a QColor is 255, but you'll probably want to set it to zero before using it as an OpenGL clear color.""" bgcolor = coin.SbColor4f(max(0, min(1, color.red() / 255.0)), max(0, min(1, color.green() / 255.0)), max(0, min(1, color.blue() / 255.0)), max(0, min(1, color.alpha() / 255.0))) self.sorendermanager.setBackgroundColor(bgcolor) def getBackgroundColor(self): """ Returns color used for clearing the rendering area before rendering the scene.""" bg = self.sorendermanager.getBackgroundColor() return QtGui.QColor(max(0, min(255, int(bg[0] * 255.0))), max(0, min(255, int(bg[1] * 255.0))), max(0, min(255, int(bg[2] * 255.0))), max(0, min(255, int(bg[3] * 255.0)))) def getContextMenu(self): """Returns the context menu used by the widget.""" if not self.contextmenu: self.contextmenu = ContextMenu(self) # NOTE 20080508 jkg: seems like we can drop .getMenu() but I dont see why that works return self.contextmenu.getMenu() def contextMenuEnabled(self): return contextmenuenabled def enableContextMenu(self, yesno): self.contextmenuenabled = yesno def setTransparencyType(self, type): """This method sets the transparency type to be used for the scene.""" assert(self.sorendermanager) self.sorendermanager.getGLRenderAction().setTransparencyType(type) self.sorendermanager.scheduleRedraw() def enableHeadlight(self, onoff): """ Enable/disable the headlight. This wille toggle the SoDirectionalLigh::on field (returned from getHeadlight()).""" self.headlight.on = onoff def getHeadlight(self): """Returns the light used for the headlight.""" return self.headlight
def show(self,e): contextMenu = ContextMenu(e,self.s) contextMenu.show(e.getComponent(), e.getX(), e.getY())
class QuarterWidget(QtOpenGL.QGLWidget): _sensormanager = None _imagereader = None def __init__(self, *args, **kwargs): """ Constructs a QuarterWidget. QuarterWidget(QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") QuarterWidget(QGLContext context, QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") QuarterWidget(QGLFormat format, QWidget parent = None, QGLWidget sharewidget = None, Qt.WindowFlags f = 0, scxml = "coin:scxml/navigation/examiner.xml") """ params = ["parent", "sharewidget"] values = { "parent": None, "sharewidget": None, "f": 0, "scxml": "coin:scxml/navigation/examiner.xml" } values.update(kwargs) if len(args) > 0 and isinstance( args[0], QtOpenGL.QGLContext) or "context" in kwargs: params.insert(0, "context") elif len(args) > 0 and isinstance( args[0], QtOpenGL.QGLFormat) or "format" in kwargs: params.insert(0, "format") if len(args) > len(params): values["f"] = args[len(params)] if len(args) > len(params) + 1: values["scxml"] = args[len(params) + 1] for i in range(len(args), len(params)): args += (values[params[i]], ) QtOpenGL.QGLWidget.__init__(self, *args[:len(params)]) if values["f"]: self.setWindowFlags(values["f"]) # initialize Sensormanager and ImageReader instances only once if not QuarterWidget._sensormanager: QuarterWidget._sensormanager = SensorManager() if not QuarterWidget._imagereader: QuarterWidget._imagereader = ImageReader() self.cachecontext_list = [] self.cachecontext = self.findCacheContext(self, values["sharewidget"]) self.statecursormap = {} self.scene = None self.contextmenu = None self.contextmenuenabled = True self.sorendermanager = coin.SoRenderManager() self.soeventmanager = coin.SoEventManager() # Mind the order of initialization as the XML state machine uses # callbacks which depends on other state being initialized self.eventmanager = EventManager(self) self.devicemanager = DeviceManager(self) statemachine = coin.ScXML.readFile(values["scxml"]) if statemachine and statemachine.isOfType( coin.SoScXMLStateMachine.getClassTypeId()): sostatemachine = coin.cast(statemachine, "SoScXMLStateMachine") statemachine.addStateChangeCallback(statechangeCB, self) self.soeventmanager.addSoScXMLStateMachine(sostatemachine) sostatemachine.initialize() else: raise "could not initialize statemachine, given file not found?" self.headlight = coin.SoDirectionalLight() self.sorendermanager.setAutoClipping( coin.SoRenderManager.VARIABLE_NEAR_PLANE) self.sorendermanager.setRenderCallback(renderCB, self) self.sorendermanager.setBackgroundColor(coin.SbColor4f(0, 0, 0, 0)) self.sorendermanager.activate() self.sorendermanager.addPreRenderCallback(prerenderCB, self) self.sorendermanager.addPostRenderCallback(postrenderCB, self) self.soeventmanager.setNavigationState( coin.SoEventManager.MIXED_NAVIGATION) self.devicemanager.registerDevice(MouseHandler()) self.devicemanager.registerDevice(KeyboardHandler()) self.eventmanager.registerEventHandler(DragDropHandler()) # set up a cache context for the default SoGLRenderAction self.sorendermanager.getGLRenderAction().setCacheContext( self.getCacheContextId()) self.setStateCursor("interact", QtCore.Qt.ArrowCursor) self.setStateCursor("idle", QtCore.Qt.OpenHandCursor) self.setStateCursor("rotate", QtCore.Qt.ClosedHandCursor) self.setStateCursor("pan", QtCore.Qt.SizeAllCursor) self.setStateCursor("zoom", QtCore.Qt.SizeVerCursor) self.setStateCursor("seek", QtCore.Qt.CrossCursor) self.setStateCursor("spin", QtCore.Qt.OpenHandCursor) self.setMouseTracking(True) self.setFocusPolicy(QtCore.Qt.StrongFocus) def setSceneGraph(self, node): if node and self.scene == node: return camera = None superscene = None viewall = False if node: self.scene = node self.scene.ref() superscene = coin.SoSeparator() superscene.addChild(coin.SoDepthBuffer()) superscene.addChild(self.headlight) camera = self.searchForCamera(node) if not camera: camera = coin.SoPerspectiveCamera() superscene.addChild(camera) viewall = True superscene.addChild(node) self.soeventmanager.setSceneGraph(superscene) self.sorendermanager.setSceneGraph(superscene) self.soeventmanager.setCamera(camera) self.sorendermanager.setCamera(camera) if viewall: self.viewAll() if superscene: superscene.touch() def viewAll(self): """ Reposition the current camera to display the entire scene""" viewallevent = coin.SbName("sim.coin3d.coin.navigation.ViewAll") for c in range(self.soeventmanager.getNumSoScXMLStateMachines()): sostatemachine = self.soeventmanager.getSoScXMLStateMachine(c) if (sostatemachine.isActive()): sostatemachine.queueEvent(viewallevent) sostatemachine.processEventQueue() def resizeGL(self, width, height): vp = coin.SbViewportRegion(width, height) self.sorendermanager.setViewportRegion(vp) self.soeventmanager.setViewportRegion(vp) def paintGL(self): self.actualRedraw() def actualRedraw(self): self.sorendermanager.render(True, True) def event(self, qevent): """Translates Qt Events into Coin events and passes them on to the scenemanager for processing. If the event can not be translated or processed, it is forwarded to Qt and the method returns false. This method could be overridden in a subclass in order to catch events of particular interest to the application programmer.""" if self.eventmanager.handleEvent(qevent): return True soevent = self.devicemanager.translateEvent(qevent) if (soevent and self.soeventmanager.processEvent(soevent)): return True # NOTE jkg: we must return True or False return QtOpenGL.QGLWidget.event(self, qevent) def setStateCursor(self, state, cursor): self.statecursormap[state] = cursor def searchForCamera(self, root): sa = coin.SoSearchAction() sa.setInterest(coin.SoSearchAction.FIRST) sa.setType(coin.SoCamera.getClassTypeId()) sa.apply(root) if sa.getPath(): node = sa.getPath().getTail() if node and node.isOfType(coin.SoCamera.getClassTypeId()): return node return None def getCacheContextId(self): return self.cachecontext.id def findCacheContext(self, widget, sharewidget): class QuarterWidgetP_cachecontext: def __init__(self): self.widgetlist = [] self.id = None for cachecontext in self.cachecontext_list: for widget in cachecontext.widgetlist: if (widget == sharewidget): cachecontext.widgetlist.append(widget) return cachecontext cachecontext = QuarterWidgetP_cachecontext() cachecontext.id = coin.SoGLCacheContextElement.getUniqueCacheContext() cachecontext.widgetlist.append(widget) self.cachecontext_list.append(cachecontext) return cachecontext def getSoRenderManager(self): return self.sorendermanager def getSoEventManager(self): return self.soeventmanager def setBackgroundColor(self, color): """Set backgroundcolor to a given QColor Remember that QColors are given in integers between 0 and 255, as opposed to SbColor4f which is in [0 ,1]. The default alpha value for a QColor is 255, but you'll probably want to set it to zero before using it as an OpenGL clear color.""" bgcolor = coin.SbColor4f(max(0, min(1, color.red() / 255.0)), max(0, min(1, color.green() / 255.0)), max(0, min(1, color.blue() / 255.0)), max(0, min(1, color.alpha() / 255.0))) self.sorendermanager.setBackgroundColor(bgcolor) def getBackgroundColor(self): """ Returns color used for clearing the rendering area before rendering the scene.""" bg = self.sorendermanager.getBackgroundColor() return QtGui.QColor(max(0, min(255, int(bg[0] * 255.0))), max(0, min(255, int(bg[1] * 255.0))), max(0, min(255, int(bg[2] * 255.0))), max(0, min(255, int(bg[3] * 255.0)))) def getContextMenu(self): """Returns the context menu used by the widget.""" if not self.contextmenu: self.contextmenu = ContextMenu(self) # NOTE 20080508 jkg: seems like we can drop .getMenu() but I dont see why that works return self.contextmenu.getMenu() def contextMenuEnabled(self): return contextmenuenabled def enableContextMenu(self, yesno): self.contextmenuenabled = yesno def setTransparencyType(self, type): """This method sets the transparency type to be used for the scene.""" assert (self.sorendermanager) self.sorendermanager.getGLRenderAction().setTransparencyType(type) self.sorendermanager.scheduleRedraw() def enableHeadlight(self, onoff): """ Enable/disable the headlight. This wille toggle the SoDirectionalLigh::on field (returned from getHeadlight()).""" self.headlight.on = onoff def getHeadlight(self): """Returns the light used for the headlight.""" return self.headlight