Changeset 1901:3b54fcf76ce2 in orange-bioinformatics


Ignore:
Timestamp:
11/11/13 16:10:53 (5 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Implemented support for editing the set titles.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/widgets/OWVennDiagram.py

    r1900 r1901  
    1515    QComboBox, QGraphicsScene, QGraphicsView, QGraphicsWidget, 
    1616    QGraphicsPathItem, QGraphicsTextItem, QPainterPath, QPainter, 
    17     QTransform, QColor, QBrush, QPen, QStyle, QPalette 
     17    QTransform, QColor, QBrush, QPen, QStyle, QPalette, 
     18    QApplication 
    1819) 
    1920 
     
    4546    def __init__(self, parent=None, signalManager=None, 
    4647                 title="Venn Diagram"): 
    47         super(OWVennDiagram, self).__init__(parent, signalManager, title) 
     48        super(OWVennDiagram, self).__init__(parent, signalManager, title, 
     49                                            wantGraph=True) 
    4850 
    4951        self.autocommit = False 
     
    9799        self.vennwidget = VennDiagram() 
    98100        self.vennwidget.resize(400, 400) 
     101        self.vennwidget.itemTextEdited.connect(self._on_itemTextEdited) 
    99102        self.scene.selectionChanged.connect(self._on_selectionChanged) 
    100103 
     
    105108 
    106109        self._queue = [] 
     110        self.graphButton.clicked.connect(self.saveImage) 
    107111 
    108112    def setData(self, data, key=None): 
     
    328332        self._createDiagram() 
    329333 
     334    def _on_itemTextEdited(self, index, text): 
     335        text = str(text) 
     336        key = self.itemsets.keys()[index] 
     337        self.itemsets[key] = self.itemsets[key]._replace(name=text) 
     338 
    330339    def invalidateOutput(self): 
    331340        if self.autocommit: 
     
    362371 
    363372        self.send("Data", data) 
     373 
     374    def saveImage(self): 
     375        from Orange.OrangeWidgets.OWDlgs import OWChooseImageSizeDlg 
     376        dlg = OWChooseImageSizeDlg(self.scene, parent=self) 
     377        dlg.exec_() 
    364378 
    365379 
     
    521535 
    522536 
     537class GraphicsTextEdit(QGraphicsTextItem): 
     538    #: Edit triggers 
     539    NoEditTriggers, DoubleClicked = 0, 1 
     540 
     541    editingFinished = Signal() 
     542    editingStarted = Signal() 
     543 
     544    documentSizeChanged = Signal() 
     545 
     546    def __init__(self, *args, **kwargs): 
     547        super(GraphicsTextEdit, self).__init__(*args, **kwargs) 
     548        self.setTabChangesFocus(True) 
     549        self._edittrigger = GraphicsTextEdit.DoubleClicked 
     550        self._editing = False 
     551        self.document().documentLayout().documentSizeChanged.connect( 
     552            self.documentSizeChanged 
     553        ) 
     554 
     555    def mouseDoubleClickEvent(self, event): 
     556        super(GraphicsTextEdit, self).mouseDoubleClickEvent(event) 
     557        if self._edittrigger == GraphicsTextEdit.DoubleClicked: 
     558            self._start() 
     559 
     560    def focusOutEvent(self, event): 
     561        super(GraphicsTextEdit, self).focusOutEvent(event) 
     562 
     563        if self._editing: 
     564            self._end() 
     565 
     566    def _start(self): 
     567        self._editing = True 
     568        self.setTextInteractionFlags(Qt.TextEditorInteraction) 
     569        self.setFocus(Qt.MouseFocusReason) 
     570        self.editingStarted.emit() 
     571 
     572    def _end(self): 
     573        self._editing = False 
     574        self.setTextInteractionFlags(Qt.NoTextInteraction) 
     575        self.editingFinished.emit() 
     576 
     577 
    523578class VennDiagram(QGraphicsWidget): 
    524579    # rect and petal are for future work 
    525580    Circle, Ellipse, Rect, Petal = 1, 2, 3, 4 
     581 
     582    TitleFormat = "<center><h4>{0}</h4>{1}</center>" 
     583 
     584    selectionChanged = Signal() 
     585    itemTextEdited = Signal(int, str) 
    526586 
    527587    def __init__(self, parent=None): 
     
    555615            item.setVisible(True) 
    556616 
    557         fmt = '<center><h4>{0}</h4>{1}</center>'.format 
     617        fmt = self.TitleFormat.format 
     618 
    558619        font = self.font() 
    559620        font.setPixelSize(14) 
    560621 
    561622        for item in items: 
    562             text = QGraphicsTextItem(self) 
     623            text = GraphicsTextEdit(self) 
    563624            text.setFont(font) 
    564625            text.setDefaultTextColor(QColor("#333")) 
    565626            text.setHtml(fmt(escape(item.text), item.count)) 
    566627            text.adjustSize() 
     628            text.editingStarted.connect(self._on_editingStarted) 
     629            text.editingFinished.connect(self._on_editingFinished) 
     630            text.documentSizeChanged.connect( 
     631                self._on_itemTextSizeChanged 
     632            ) 
     633 
    567634            self._textitems.append(text) 
    568635 
    569         self._vennareas = [VennIntersectionArea(parent=self) 
    570                            for i in range(2 ** len(items))] 
     636        self._vennareas = [ 
     637            VennIntersectionArea(parent=self) 
     638            for i in range(2 ** len(items)) 
     639        ] 
    571640        self._subsettextitems = [ 
    572641            QGraphicsTextItem(parent=self) 
     
    579648        scene = self.scene() 
    580649        items = self.vennareas() + self.items() + self._textitems 
     650 
     651        for item in self._textitems: 
     652            item.editingStarted.disconnect(self._on_editingStarted) 
     653            item.editingFinished.disconnect(self._on_editingFinished) 
     654            item.documentSizeChanged.disconnect( 
     655                self._on_itemTextSizeChanged 
     656            ) 
    581657 
    582658        self._items = [] 
     
    686762        super(VennDiagram, self).paint(painter, option, w) 
    687763#         painter.drawRect(self.boundingRect()) 
     764 
     765    def _on_editingStarted(self): 
     766        item = self.sender() 
     767        index = self._textitems.index(item) 
     768        text = self._items[index].text 
     769        item.setTextWidth(-1) 
     770        item.setHtml(self.TitleFormat.format(escape(text), "<br/>")) 
     771 
     772    def _on_editingFinished(self): 
     773        item = self.sender() 
     774        index = self._textitems.index(item) 
     775        text = item.toPlainText() 
     776        if text != self._items[index].text: 
     777            self._items[index].text = text 
     778 
     779            self.itemTextEdited.emit(index, text) 
     780 
     781        item.setHtml( 
     782            self.TitleFormat.format(escape(text), self._items[index].count)) 
     783        item.adjustSize() 
     784 
     785    def _on_itemTextSizeChanged(self): 
     786        item = self.sender() 
     787        index = self._textitems.index(item) 
     788        self._updateTextItemPos(index) 
    688789 
    689790 
     
    9451046 
    9461047 
    947 from PyQt4.QtGui import QApplication 
    948  
    9491048if __name__ == "__main__": 
    9501049    app = QApplication([]) 
Note: See TracChangeset for help on using the changeset viewer.