Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 import os
00034 import rospkg
00035 
00036 from python_qt_binding import loadUi
00037 from python_qt_binding.QtCore import Qt, QUrl
00038 from python_qt_binding.QtGui import QCompleter, QIcon, QWidget
00039 from python_qt_binding.QtWebKit import QWebPage, QWebView
00040 
00041 
00042 class WebWidget(QWidget):
00043     def __init__(self, url=None):
00044         """
00045         Class to load a webpage in a widget.
00046 
00047         :param url: If url is empty then a navigation bar is shown otherwise the url is loaded and the navigation bar is hidden, ''str''
00048         """
00049         super(WebWidget, self).__init__()
00050         rp = rospkg.RosPack()
00051         ui_file = os.path.join(rp.get_path('rqt_web'), 'resource', 'web_widget.ui')
00052         loadUi(ui_file, self)
00053         self.setObjectName('WebWidget')
00054 
00055         self._loading = False
00056         self._stop_icon = QIcon.fromTheme('process-stop')
00057         self._reload_icon = QIcon.fromTheme('view-refresh')
00058         self._working_icon = QIcon.fromTheme('process-working')
00059 
00060         self._completer_word_list = ['']
00061         self._view = QWebView()
00062         self.verticalLayout.addWidget(self._view)
00063         if url is None:
00064             self.set_url("http://ros.org", True)
00065         else:
00066             self.set_url(url, False)
00067 
00068         self.url_lineedit.returnPressed.connect(self._handle_url_change)
00069         self._view.loadFinished[bool].connect(self._handle_load_finished)
00070         self.reload_button.clicked.connect(self._handle_reload_clicked)
00071         self._view.linkClicked.connect(self._handle_link_clicked)
00072         self._view.urlChanged[QUrl].connect(self._handle_url_changed)
00073 
00074     def set_url(self, url, showinput=False):
00075         """
00076         Sets the url and begins loading that page
00077         :param url: url to load in the webview, ''str or QUrl''
00078         :param showinput: if true the input bar will be shown, else hidden, ''bool''
00079         """
00080         if url is not None:
00081             self._url = QUrl(url)
00082             self.set_show_url_input(showinput)
00083             self._view.setUrl(self._url)
00084 
00085     def set_show_url_input(self, showinput):
00086         """
00087         Sets the value of the show_url_input flag and hides/shows the widgets as required
00088         :param showinput: true - show inputbar false - hide , ''bool''
00089         """
00090         self._show_url_input = showinput
00091         self.url_lineedit.setVisible(self._show_url_input)
00092         self.reload_button.setVisible(self._show_url_input)
00093         if self._show_url_input:
00094             self._view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
00095         else:
00096             self._view.page().setLinkDelegationPolicy(QWebPage.DontDelegateLinks)
00097 
00098     def save_settings(self, settings):
00099         settings.set_value('url_completion', self._pack(self._completer_word_list))
00100         settings.set_value('url_current', self._url.toString())
00101 
00102     def restore_settings(self, settings):
00103         self._completer_word_list += self._unpack(settings.value('url_completion'))
00104         self._completer_word_list = list(set(self._completer_word_list))
00105         url = settings.value('url_current')
00106         if url:
00107             self.set_url(url, self._show_url_input)
00108 
00109     def _handle_url_change(self):
00110         self.set_url(self.url_lineedit.text(), True)
00111 
00112     def _handle_link_clicked(self, url):
00113         self.set_url(url, True)
00114 
00115     def _handle_reload_clicked(self):
00116         if self._loading:
00117             self._view.stop()
00118             self._loading = False
00119             self.reload_button.setIcon(self._reload_icon)
00120         else:
00121             self._view.reload()
00122             self._loading = True
00123             self.reload_button.setIcon(self._stop_icon)
00124 
00125     def _handle_url_changed(self, url):
00126         
00127         self.url_lineedit.setText(url.toString())
00128         self.reload_button.setIcon(self._stop_icon)
00129         self._loading = True
00130 
00131     def _handle_load_finished(self, ok):
00132         self._loading = False
00133         self.reload_button.setIcon(self._reload_icon)
00134         if ok:
00135             self._add_completer_list_item(self._url.toString())
00136         else:
00137             
00138             self._view.loadFinished[bool].disconnect(self._handle_load_finished)
00139             self._view.page().currentFrame().setHtml('<html><h2>The url you entered seems to be faulty.</h2></html>')
00140             self._view.loadFinished[bool].connect(self._handle_load_finished)
00141 
00142     def _add_completer_list_item(self, url):
00143         self._completer_word_list.append(self.url_lineedit.text())
00144         self._completer_word_list = list(set(self._completer_word_list))
00145         self._completer = QCompleter(self._completer_word_list)
00146         self._completer.setCaseSensitivity(Qt.CaseInsensitive)
00147         self._completer.setCompletionMode(QCompleter.PopupCompletion)
00148         self.url_lineedit.setCompleter(self._completer)
00149 
00150     @staticmethod
00151     def _pack(data):
00152         """
00153         Packs 'data' into a form that can be easily and readably written to an ini file
00154         :param data: A list of strings to be flattened into a string ''list''
00155         :return: A string suitable for output to ini files ''str''
00156         """
00157         if len(data) == 0:
00158             return ''
00159         if len(data) == 1:
00160             return data[0]
00161         return data
00162 
00163     @staticmethod
00164     def _unpack(data):
00165         """
00166         Unpacks the values read from an ini file
00167         :param data: An entry taken from an ini file ''list or string''
00168         :return: A list of strings ''list''
00169         """
00170         if data is None or data == '':
00171             data = []
00172         elif isinstance(data, basestring):
00173             data = [data]
00174         return data