topic_completer.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 
00003 # Copyright (c) 2011, Dorian Scholz, TU Darmstadt
00004 # All rights reserved.
00005 #
00006 # Redistribution and use in source and binary forms, with or without
00007 # modification, are permitted provided that the following conditions
00008 # are met:
00009 #
00010 #   * Redistributions of source code must retain the above copyright
00011 #     notice, this list of conditions and the following disclaimer.
00012 #   * Redistributions in binary form must reproduce the above
00013 #     copyright notice, this list of conditions and the following
00014 #     disclaimer in the documentation and/or other materials provided
00015 #     with the distribution.
00016 #   * Neither the name of the TU Darmstadt nor the names of its
00017 #     contributors may be used to endorse or promote products derived
00018 #     from this software without specific prior written permission.
00019 #
00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 # POSSIBILITY OF SUCH DAMAGE.
00032 
00033 import roslib
00034 import rospy
00035 
00036 from python_qt_binding.QtCore import qWarning
00037 
00038 from .message_tree_model import MessageTreeModel
00039 from .tree_model_completer import TreeModelCompleter
00040 
00041 
00042 class TopicCompleter(TreeModelCompleter):
00043 
00044     def __init__(self, parent=None):
00045         super(TopicCompleter, self).__init__(parent)
00046         self.setModel(MessageTreeModel())
00047 
00048     def splitPath(self, path):
00049         # to handle array subscriptions, e.g. /topic/field[1]/subfield[2]
00050         # we need to separate array subscriptions by an additional /
00051         return super(TopicCompleter,self).splitPath(path.replace('[','/['))
00052 
00053     def update_topics(self):
00054         self.model().clear()
00055         topic_list = rospy.get_published_topics()
00056         for topic_path, topic_type in topic_list:
00057             topic_name = topic_path.strip('/')
00058             message_class = roslib.message.get_message_class(topic_type)
00059             if message_class is None:
00060                 qWarning('TopicCompleter.update_topics(): could not get message class for topic type "%s" on topic "%s"' % (topic_type, topic_path))
00061                 continue
00062             message_instance = message_class()
00063             self.model().add_message(message_instance, topic_name, topic_type, topic_path)
00064 
00065 
00066 if __name__ == '__main__':
00067     import sys
00068     from python_qt_binding.QtGui import QApplication, QComboBox, QLineEdit, QMainWindow, QTreeView, QVBoxLayout, QWidget
00069     app = QApplication(sys.argv)
00070     mw = QMainWindow()
00071     widget = QWidget(mw)
00072     layout = QVBoxLayout(widget)
00073 
00074     edit = QLineEdit()
00075     edit_completer = TopicCompleter(edit)
00076     #edit_completer.setCompletionMode(QCompleter.InlineCompletion)
00077     edit.setCompleter(edit_completer)
00078 
00079     combo = QComboBox()
00080     combo.setEditable(True)
00081     combo_completer = TopicCompleter(combo)
00082     #combo_completer.setCompletionMode(QCompleter.InlineCompletion)
00083     combo.lineEdit().setCompleter(combo_completer)
00084 
00085     model_tree = QTreeView()
00086     model_tree.setModel(combo_completer.model())
00087     model_tree.expandAll()
00088     for column in range(combo_completer.model().columnCount()):
00089         model_tree.resizeColumnToContents(column)
00090 
00091     completion_tree = QTreeView()
00092     completion_tree.setModel(combo_completer.completionModel())
00093     completion_tree.expandAll()
00094     for column in range(combo_completer.completionModel().columnCount()):
00095         completion_tree.resizeColumnToContents(column)
00096 
00097     layout.addWidget(model_tree)
00098     layout.addWidget(completion_tree)
00099     layout.addWidget(edit)
00100     layout.addWidget(combo)
00101     layout.setStretchFactor(model_tree, 1)
00102     widget.setLayout(layout)
00103     mw.setCentralWidget(widget)
00104 
00105     mw.move(300, 0)
00106     mw.resize(800, 900)
00107     mw.show()
00108     app.exec_()


rqt_py_common
Author(s): Dorian Scholz, Isaac Saito
autogenerated on Wed May 3 2017 02:24:14