Changeset 8546:057da98c5536 in orange


Ignore:
Timestamp:
07/31/11 11:34:17 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
38f58cdf85c3a81fa952cc9c55f69116f2194fcc
Message:

Improve the new ZoomSelectToolbar and test-use it in NxExplorerQt

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Prototypes/OWNxExplorerQt.py

    r8519 r8546  
    241241        OWGUI.checkBox(ib, self, 'checkSendMarkedNodes', 'Send marked vertices', callback = self.setSendMarkedNodes, disabled=0) 
    242242         
     243        G = self.networkCanvas.gui 
     244         
     245        self.zoomSelectToolbar = G.zoom_select_toolbar(self.hcontroArea, orientation = Qt.Vertical, 
     246                                    buttons =  
     247                                        [G.Spacing] * 2 +  
     248                                        G.default_zoom_select_buttons +  
     249                                        [ 
     250                                            ("buttonM2S", "Add marked to selection", None, None, "markedToSelection", 'Dlg_Mark2Sel') 
     251                                        ]) 
    243252         
    244253        T = OWToolbars.NavigateSelectToolbar 
  • orange/OrangeWidgets/plot/owplotgui.py

    r8540 r8546  
    55 
    66from PyQt4.QtGui import QWidget, QToolButton, QGroupBox, QVBoxLayout, QHBoxLayout, QIcon 
    7 from PyQt4.QtCore import Qt, pyqtSignal 
     7from PyQt4.QtCore import Qt, pyqtSignal, qDebug 
     8 
    89 
    910class OrientedWidget(QWidget): 
     
    1617        self.setLayout(self._layout) 
    1718 
     19class OWToolbar(OrientedWidget): 
     20    def __init__(self, gui, text, orientation, buttons, parent): 
     21        OrientedWidget.__init__(self, orientation, parent) 
     22        self.buttons = {} 
     23        self.groups = {} 
     24        i = 0 
     25        n = len(buttons) 
     26        while i < n: 
     27            if buttons[i] == gui.StateButtonsBegin: 
     28                state_buttons = [] 
     29                for j in range(i+1, n): 
     30                    if buttons[j] == gui.StateButtonsEnd: 
     31                        qDebug('Adding state buttons ' + repr(state_buttons) + ' to layout ' + repr(self.layout())) 
     32                        s = gui.state_buttons(state_buttons, orientation, self) 
     33                        self.buttons.update(s.buttons) 
     34                        self.groups[buttons[i+1]] = s 
     35                        i = j 
     36                        break 
     37                    else: 
     38                        state_buttons.append(buttons[j]) 
     39            elif buttons[i] == gui.Spacing: 
     40                self.layout().addSpacing(10) 
     41            elif type(buttons[i] == int): 
     42                self.buttons[buttons[i]] = gui.tool_button(buttons[i], self) 
     43            elif len(buttons[i] == 4): 
     44                gui.tool_button(buttons[i], self) 
     45            else: 
     46                self.buttons[buttons[i][0]] = gui.tool_button(buttons[i], self) 
     47            i = i + 1 
     48        self.layout().addStretch() 
     49 
     50 
    1851class StateButtonContainer(OrientedWidget): 
    1952    def __init__(self, gui, ids, orientation, parent): 
    2053        OrientedWidget.__init__(self, orientation, parent) 
    2154        self.buttons = {} 
     55        self.layout().setContentsMargins(0, 0, 0, 0) 
     56        self._clicked_button = None 
    2257        for i in ids: 
    2358            b = gui.tool_button(i, self) 
     
    2863    def button_clicked(self, checked): 
    2964        sender = self.sender() 
     65        self._clicked_button = sender 
    3066        for button in self.buttons.itervalues(): 
    3167            button.setDown(button is sender) 
     
    3369    def button(self, id): 
    3470        return self.buttons[id] 
     71         
     72    def setEnabled(self, enabled): 
     73        OrientedWidget.setEnabled(self, enabled) 
     74        if enabled and self._clicked_button: 
     75            self._clicked_button.click() 
    3576                     
    36 class AttributeChangeButton(QToolButton): 
    37     def __init__(self, plot, attr_name, attr_value, parent): 
     77class OWButton(QToolButton): 
     78    def __init__(self, plot, attr_name, attr_value, callback, parent): 
    3879        QToolButton.__init__(self, parent) 
    3980        self.setMinimumSize(30, 30) 
    4081        self.plot = plot 
    41         self.attr_name = attr_name 
    42         self.attr_value = attr_value 
    43         self.clicked.connect(self.button_clicked) 
    44          
    45     def button_clicked(self, clicked): 
    46         setattr(self.plot, self.attr_name, self.attr_value) 
    47      
    48     downChanged = pyqtSignal('bool') 
    49      
    50     def setDown(self, down): 
    51         self.downChanged.emit(down) 
    52         QToolButton.setDown(self, down) 
    53      
    54 class CallbackButton(QToolButton): 
    55     def __init__(self, plot, callback, parent): 
    56         QToolButton.__init__(self, parent) 
    57         self.setMinimumSize(30, 30) 
    5882        if type(callback) == str: 
    5983            callback = getattr(plot, callback, None) 
    6084        if callback: 
    6185            self.clicked.connect(callback) 
     86        if attr_name: 
     87            self.attr_name = attr_name 
     88            self.attr_value = attr_value 
     89            self.clicked.connect(self.set_attribute) 
     90         
     91    def set_attribute(self, clicked): 
     92        setattr(self.plot, self.attr_name, self.attr_value) 
     93     
     94    downChanged = pyqtSignal('bool') 
     95     
     96    def setDown(self, down): 
     97        self.downChanged.emit(down) 
     98        QToolButton.setDown(self, down) 
    6299                     
    63100class OWPlotGUI: 
     
    68105    def __init__(self, plot): 
    69106        self._plot = plot 
     107         
     108    Spacing = 0 
    70109         
    71110    Antialiasing = 1 
     
    81120    Select = 13 
    82121     
     122    ZoomSelection = 15 
     123     
    83124    SelectionAdd = 21 
    84125    SelectionRemove = 22 
     
    89130    ClearSelection = 32 
    90131     
     132    StateButtonsBegin = 35 
     133    StateButtonsEnd = 36 
     134     
     135    UserButton = 100 
     136     
     137    default_zoom_select_buttons = [ 
     138        StateButtonsBegin, 
     139            Zoom, 
     140            Pan,  
     141            Select, 
     142        StateButtonsEnd, 
     143        Spacing, 
     144        StateButtonsBegin, 
     145            SelectionOne, 
     146            SelectionAdd,  
     147            SelectionRemove, 
     148        StateButtonsEnd, 
     149        Spacing, 
     150        SendSelection, 
     151        ClearSelection 
     152    ] 
     153     
    91154    ''' 
    92155        A map of  
    93         id : (name, attr_name, attr_value, icon_name) 
    94     ''' 
    95     _attribute_buttons = { 
    96         Zoom : ('Zoom', 'state', ZOOMING, 'Dlg_zoom'), 
    97         Pan : ('Pan', 'state', PANNING, 'Dlg_pan_hand'), 
    98         Select : ('Select', 'state', SELECT, 'Dlg_arrow'), 
    99         SelectionAdd : ('Add to selection', 'selection_behavior', SELECTION_ADD, ''), 
    100         SelectionRemove : ('Remove from selection', 'selection_behavior', SELECTION_REMOVE, ''), 
    101         SelectionToggle : ('Toggle selection', 'selection_behavior', SELECTION_TOGGLE, ''), 
    102         SelectionOne : ('Replace selection', 'selection_behavior', SELECTION_REPLACE, '') 
    103     } 
    104      
    105     _action_buttons = { 
    106         SendSelection : ('Send selection', None, 'Dlg_send'), 
    107         ClearSelection : ('Clear selection', 'clear_selection', 'Dlg_clear') 
     156        id : (name, attr_name, attr_value, callback, icon_name) 
     157    ''' 
     158    _buttons = { 
     159        Zoom : ('Zoom', 'state', ZOOMING, None, 'Dlg_zoom'), 
     160        Pan : ('Pan', 'state', PANNING, None, 'Dlg_pan_hand'), 
     161        Select : ('Select', 'state', SELECT, None, 'Dlg_arrow'), 
     162        SelectionAdd : ('Add to selection', 'selection_behavior', SELECTION_ADD, None, ''), 
     163        SelectionRemove : ('Remove from selection', 'selection_behavior', SELECTION_REMOVE, None, ''), 
     164        SelectionToggle : ('Toggle selection', 'selection_behavior', SELECTION_TOGGLE, None, ''), 
     165        SelectionOne : ('Replace selection', 'selection_behavior', SELECTION_REPLACE, None, ''), 
     166        SendSelection : ('Send selection', None, None, 'send_selection', 'Dlg_send'), 
     167        ClearSelection : ('Clear selection', None, None, 'clear_selection', 'Dlg_clear') 
    108168    } 
    109169 
     
    177237         
    178238    def tool_button(self, id, widget): 
    179         if id in self._attribute_buttons: 
    180             name, attr_name, attr_value, icon_name = self._attribute_buttons[id] 
    181             b = AttributeChangeButton(self._plot, attr_name, attr_value, widget) 
    182         elif id in self._action_buttons: 
    183             name, cb, icon_name = self._action_buttons[id] 
    184             b = CallbackButton(self._plot, cb, widget) 
     239        if type(id) == int: 
     240            name, attr_name, attr_value, callback, icon_name = self._buttons[id] 
     241        elif len(id) == 4: 
     242            name, attr_name, attr_value, callback, icon_name = id 
    185243        else: 
    186             return 
     244            id, name, attr_name, attr_value, callback, icon_name = id 
     245        b = OWButton(self._plot, attr_name, attr_value, callback, widget) 
    187246        b.setToolTip(name) 
    188247        b.setIcon(QIcon(os.path.dirname(__file__) + "/../icons/" + icon_name + '.png')) 
    189         if widget.layout(): 
     248        if widget.layout() is not None: 
    190249            widget.layout().addWidget(b) 
    191250        return b 
     
    196255            may be checked at a time.  
    197256        ''' 
    198         return StateButtonContainer(self, ids, orientation, widget) 
    199          
    200     def zoom_select_toolbar(self, widget, orientation = Qt.Horizontal, send_selection_callback = None): 
    201         o = 'vertial' if orientation == Qt.Vertical else 'horizontal' 
    202         t = OWGUI.widgetBox(widget, 'Zoom / Select', orientation=o) 
    203         zps = self.state_buttons([OWPlotGUI.Zoom, OWPlotGUI.Pan, OWPlotGUI.Select], orientation, t) 
    204         t.layout().addWidget(zps) 
    205         selection_modes = self.state_buttons([OWPlotGUI.SelectionOne, OWPlotGUI.SelectionAdd, OWPlotGUI.SelectionRemove], orientation, t) 
    206         t.layout().addSpacing(10) 
    207         t.layout().addWidget(selection_modes) 
    208         zps.button(OWPlotGUI.Select).downChanged.connect(selection_modes.setEnabled) 
    209         zps.button(OWPlotGUI.Select).downChanged.connect(selection_modes.button(OWPlotGUI.SelectionOne).click) 
    210         zps.button(OWPlotGUI.Zoom).click() 
    211         t.layout().addSpacing(10) 
    212         self.tool_button(OWPlotGUI.ClearSelection, t) 
    213         b = self.tool_button(OWPlotGUI.SendSelection, t) 
    214         if send_selection_callback: 
    215             b.clicked.connect(send_selection_callback) 
     257        c = StateButtonContainer(self, ids, orientation, widget) 
     258        if widget.layout() is not None: 
     259            widget.layout().addWidget(c) 
     260        return c 
     261         
     262    def toolbar(self, widget, text, orientation, buttons): 
     263        t = OWToolbar(self, text, orientation, buttons, widget) 
     264        if widget.layout() is not None: 
     265            widget.layout().addWidget(t) 
    216266        return t 
     267         
     268    def zoom_select_toolbar(self, widget, text = 'Zoom / Select', orientation = Qt.Horizontal, buttons = default_zoom_select_buttons): 
     269        t = self.toolbar(widget, text, orientation, buttons) 
     270        t.groups[self.SelectionOne].setEnabled(t.buttons[self.Select].isDown()) 
     271        t.buttons[self.Select].downChanged.connect(t.groups[self.SelectionOne].setEnabled) 
     272        t.buttons[self.Select].click() 
     273        t.buttons[self.SelectionOne].click() 
     274        return t 
     275     
Note: See TracChangeset for help on using the changeset viewer.