diff --git a/NodeGraphQt/base/graph.py b/NodeGraphQt/base/graph.py index 93491d27..2654ebb0 100644 --- a/NodeGraphQt/base/graph.py +++ b/NodeGraphQt/base/graph.py @@ -164,13 +164,6 @@ def _wire_signals(self): """ Connect up all the signals and slots here. """ - # TODO: refactor hard coded tab search logic into - # "graph_actions.py" module. - # hard coded tab search. - tab = QtWidgets.QShortcut( - QtGui.QKeySequence(QtCore.Qt.Key_Tab), self._viewer) - tab.activated.connect(self._toggle_tab_search) - self._viewer.show_tab_search.connect(self._toggle_tab_search) # internal signals. self._viewer.search_triggered.connect(self._on_search_triggered) @@ -221,14 +214,6 @@ def _on_insert_node(self, pipe, node_id, prev_node_pos): self._on_nodes_moved(prev_node_pos) self._undo_stack.endMacro() - def _toggle_tab_search(self): - """ - toggle the tab search widget. - """ - if self._viewer.underMouse(): - self._viewer.tab_search_set_nodes(self._node_factory.names) - self._viewer.tab_search_toggle() - def _on_property_bin_changed(self, node_id, prop_name, prop_value): """ called when a property widget has changed in a properties bin. @@ -477,6 +462,14 @@ def undo_view(self): self._undo_view.setWindowTitle('Undo History') return self._undo_view + def toggle_node_search(self): + """ + toggle the node search widget visibility. + """ + if self._viewer.underMouse(): + self._viewer.tab_search_set_nodes(self._node_factory.names) + self._viewer.tab_search_toggle() + def show(self): """ Show node graph widget this is just a convenience diff --git a/NodeGraphQt/base/graph_actions.py b/NodeGraphQt/base/graph_actions.py index 488e14ee..69e2c226 100644 --- a/NodeGraphQt/base/graph_actions.py +++ b/NodeGraphQt/base/graph_actions.py @@ -63,6 +63,8 @@ def build_context_menu(graph): # "Node" menu. # -------------------------------------------------------------------------- node_menu = graph_menu.add_menu('&Nodes') + node_menu.add_command('Node Search', _toggle_node_search, 'Tab') + node_menu.add_separator() node_menu.add_command( 'Auto Layout Up Stream', _layout_graph_up, 'L') node_menu.add_command( @@ -312,3 +314,10 @@ def _layout_graph_up(graph): """ nodes = graph.selected_nodes() or graph.all_nodes() graph.auto_layout_nodes(nodes=nodes, down_stream=False) + + +def _toggle_node_search(graph): + """ + show/hide the node search widget. + """ + graph.toggle_node_search() diff --git a/NodeGraphQt/widgets/tab_search.py b/NodeGraphQt/widgets/tab_search.py index d35b3085..5500c226 100644 --- a/NodeGraphQt/widgets/tab_search.py +++ b/NodeGraphQt/widgets/tab_search.py @@ -49,16 +49,14 @@ def setModel(self, model): self._using_orig_model = True -class TabSearchMenuWidget(QtWidgets.QMenu): - - search_submitted = QtCore.Signal(str) +class TabSearchLineEditWidget(QtWidgets.QLineEdit): - def __init__(self, node_dict=None): - super(TabSearchMenuWidget, self).__init__() + tab_pressed = QtCore.Signal() - self.line_edit = QtWidgets.QLineEdit() - self.line_edit.setAttribute(QtCore.Qt.WA_MacShowFocusRect, 0) - self.line_edit.setMinimumSize(200, 22) + def __init__(self, parent=None): + super(TabSearchLineEditWidget, self).__init__(parent) + self.setAttribute(QtCore.Qt.WA_MacShowFocusRect, 0) + self.setMinimumSize(200, 22) text_color = self.palette().text().color().toTuple() selected_color = self.palette().highlight().color().toTuple() style_dict = { @@ -81,7 +79,23 @@ def __init__(self, node_dict=None): style += ' {}:{};\n'.format(elm_name, elm_val) style += '}\n' stylesheet += style - self.line_edit.setStyleSheet(stylesheet) + self.setStyleSheet(stylesheet) + + def keyPressEvent(self, event): + super(TabSearchLineEditWidget, self).keyPressEvent(event) + if event.key() == QtCore.Qt.Key_Tab: + self.tab_pressed.emit() + + +class TabSearchMenuWidget(QtWidgets.QMenu): + + search_submitted = QtCore.Signal(str) + + def __init__(self, node_dict=None): + super(TabSearchMenuWidget, self).__init__() + + self.line_edit = TabSearchLineEditWidget() + self.line_edit.tab_pressed.connect(self._close) self._node_dict = node_dict or {} if self._node_dict: @@ -91,6 +105,8 @@ def __init__(self, node_dict=None): search_widget.setDefaultWidget(self.line_edit) self.addAction(search_widget) + text_color = self.palette().text().color().toTuple() + selected_color = self.palette().highlight().color().toTuple() style_dict = { 'QMenu': { 'color': 'rgb({0},{1},{2})'.format(*text_color), @@ -179,7 +195,8 @@ def _clear_actions(self): del self._searched_actions[:] def _set_menu_visible(self, visible): - [menu.menuAction().setVisible(visible) for menu in self._menus.values()] + for menu in self._menus.values(): + menu.menuAction().setVisible(visible) def _close(self): self._set_menu_visible(False) diff --git a/NodeGraphQt/widgets/viewer.py b/NodeGraphQt/widgets/viewer.py index 83fdd415..b1984a11 100644 --- a/NodeGraphQt/widgets/viewer.py +++ b/NodeGraphQt/widgets/viewer.py @@ -38,7 +38,6 @@ class NodeViewer(QtWidgets.QGraphicsView): insert_node = QtCore.Signal(object, str, dict) node_name_changed = QtCore.Signal(str, str) node_backdrop_updated = QtCore.Signal(str, str, object) - show_tab_search = QtCore.Signal() # pass through signals that are translated into "NodeGraph()" signals. node_selected = QtCore.Signal(str) @@ -315,8 +314,7 @@ def contextMenuEvent(self, event): ctx_menu.exec_(event.globalPos()) else: return super(NodeViewer, self).contextMenuEvent(event) - else: - self.show_tab_search.emit() + return super(NodeViewer, self).contextMenuEvent(event) def mousePressEvent(self, event): @@ -893,22 +891,22 @@ def tab_search_set_nodes(self, nodes): self._search_widget.set_nodes(nodes) def tab_search_toggle(self): - if isinstance(self._search_widget, TabSearchMenuWidget): + state = self._search_widget.isVisible() + if not state: + self._search_widget.setVisible(state) + self.setFocus() return pos = self._previous_pos - state = not self._search_widget.isVisible() - if state: - rect = self._search_widget.rect() - new_pos = QtCore.QPoint(int(pos.x() - rect.width() / 2), - int(pos.y() - rect.height() / 2)) - self._search_widget.move(new_pos) - self._search_widget.setVisible(state) - rect = self.mapToScene(rect).boundingRect() - self.scene().update(rect) - else: - self._search_widget.setVisible(state) - self.clearFocus() + rect = self._search_widget.rect() + new_pos = QtCore.QPoint(int(pos.x() - rect.width() / 2), + int(pos.y() - rect.height() / 2)) + self._search_widget.move(new_pos) + self._search_widget.setVisible(state) + self._search_widget.setFocus() + + rect = self.mapToScene(rect).boundingRect() + self.scene().update(rect) def rebuild_tab_search(self): if isinstance(self._search_widget, TabSearchMenuWidget):