import obd from widgets import widgets from PyQt4 import QtCore, QtGui class Widget(QtGui.QWidget): def __init__(self, parent, config): super(Widget, self).__init__(parent) self.config = config # temporary coloring until display widgets get implemented # self.setAutoFillBackground(True) # palette = self.palette() # palette.setColor(self.backgroundRole(), QtGui.QColor(255, 255, 255, 50)) # self.setPalette(palette) # make the context menu self.menu = QtGui.QMenu() self.menu.addAction(self.config["sensor"]).setDisabled(True) subMenu = self.menu.addMenu("Widget Type") for w in widgets: a = subMenu.addAction(w) a.setData(widgets[w]) self.menu.addAction("Delete Widget", self.delete) # instantiate the requested graphics object self.graphics = widgets[config["type"]](self, config) self.move(self.position()) self.show() def sizeHint(self): if (self.config['w'] is not None) and \ (self.config['h'] is not None): size = QtCore.QSize(self.config['w'], self.config['h']) self.graphics.setFixedSize(size) return size else: s = self.graphics.sizeHint() self.config['w'] = s.width() self.config['h'] = s.height() return s def position(self): return QtCore.QPoint(self.config['x'], self.config['y']) def moveEvent(self, e): pos = e.pos() self.config['x'] = pos.x() self.config['y'] = pos.y() def delete(self): self.parent().delete_widget(self) def mouseMoveEvent(self, e): if e.buttons() == QtCore.Qt.LeftButton: mimeData = QtCore.QMimeData() mimeData.setText('%d,%d' % (e.x(), e.y())) # show the ghost image while dragging pixmap = QtGui.QPixmap.grabWidget(self) painter = QtGui.QPainter(pixmap) painter.fillRect(pixmap.rect(), QtGui.QColor(0, 0, 0, 127)) painter.end() drag = QtGui.QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(e.pos()) drag.exec_(QtCore.Qt.MoveAction) def contextMenuEvent(self, e): action = self.menu.exec_(self.mapToGlobal(e.pos())) def get_command(self): s = self.config["sensor"] if s in obd.commands: return obd.commands[s] else: raise KeyError("'%s' is not a valid OBDCommand" % s) def render(self, response): if not response.is_null(): self.graphics.render(response)