|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a menu to select the user agent string. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import QByteArray, QXmlStreamReader |
|
11 from PyQt4.QtGui import QMenu, QAction, QActionGroup, QMessageBox, QInputDialog, \ |
|
12 QLineEdit |
|
13 |
|
14 from .UserAgentDefaults import UserAgentDefaults |
|
15 |
|
16 from Helpviewer.HelpBrowserWV import HelpWebPage |
|
17 |
|
18 class UserAgentMenu(QMenu): |
|
19 """ |
|
20 Class implementing a menu to select the user agent string. |
|
21 """ |
|
22 def __init__(self, title, parent = None): |
|
23 """ |
|
24 Constructor |
|
25 |
|
26 @param title title of the menu (string) |
|
27 @param parent reference to the parent widget (QWidget) |
|
28 """ |
|
29 QMenu.__init__(self, title, parent) |
|
30 |
|
31 self.aboutToShow.connect(self.__populateMenu) |
|
32 |
|
33 def __populateMenu(self): |
|
34 """ |
|
35 Private slot to populate the menu. |
|
36 """ |
|
37 self.aboutToShow.disconnect(self.__populateMenu) |
|
38 |
|
39 # add default action |
|
40 self.__defaultUserAgent = QAction(self) |
|
41 self.__defaultUserAgent.setText(self.trUtf8("Default")) |
|
42 self.__defaultUserAgent.setCheckable(True) |
|
43 self.__defaultUserAgent.triggered.connect(self.__switchToDefaultUserAgent) |
|
44 self.__defaultUserAgent.setChecked(HelpWebPage().userAgent() == "") |
|
45 self.addAction(self.__defaultUserAgent) |
|
46 |
|
47 # add default extra user agents |
|
48 self.__addDefaultActions() |
|
49 |
|
50 # add other action |
|
51 self.addSeparator() |
|
52 self.__otherUserAgent = QAction(self) |
|
53 self.__otherUserAgent.setText(self.trUtf8("Other...")) |
|
54 self.__otherUserAgent.setCheckable(True) |
|
55 self.__otherUserAgent.triggered.connect(self.__switchToOtherUserAgent) |
|
56 self.addAction(self.__otherUserAgent) |
|
57 |
|
58 usingCustomUserAgent = True |
|
59 actionGroup = QActionGroup(self) |
|
60 for act in self.actions(): |
|
61 actionGroup.addAction(act) |
|
62 if act.isChecked(): |
|
63 usingCustomUserAgent = False |
|
64 self.__otherUserAgent.setChecked(usingCustomUserAgent) |
|
65 |
|
66 def __switchToDefaultUserAgent(self): |
|
67 """ |
|
68 Private slot to set the default user agent. |
|
69 """ |
|
70 HelpWebPage().setUserAgent("") |
|
71 |
|
72 def __switchToOtherUserAgent(self): |
|
73 """ |
|
74 Private slot to set a custom user agent string. |
|
75 """ |
|
76 userAgent, ok = QInputDialog.getText( |
|
77 self, |
|
78 self.trUtf8("Custom user agent"), |
|
79 self.trUtf8("User agent:"), |
|
80 QLineEdit.Normal, |
|
81 HelpWebPage().userAgent(resolveEmpty = True)) |
|
82 if ok: |
|
83 HelpWebPage().setUserAgent(userAgent) |
|
84 |
|
85 def __changeUserAgent(self): |
|
86 """ |
|
87 Private slot to change the user agent. |
|
88 """ |
|
89 act = self.sender() |
|
90 HelpWebPage().setUserAgent(act.data()) |
|
91 |
|
92 def __addDefaultActions(self): |
|
93 """ |
|
94 Private slot to add the default user agent entries. |
|
95 """ |
|
96 defaultUserAgents = QByteArray(UserAgentDefaults) |
|
97 |
|
98 currentUserAgentString = HelpWebPage().userAgent() |
|
99 xml = QXmlStreamReader(defaultUserAgents) |
|
100 while not xml.atEnd(): |
|
101 xml.readNext() |
|
102 if xml.isStartElement() and xml.name() == "separator": |
|
103 self.addSeparator() |
|
104 continue |
|
105 |
|
106 if xml.isStartElement() and xml.name() == "useragent": |
|
107 attributes = xml.attributes() |
|
108 title = attributes.value("description") |
|
109 userAgent = attributes.value("useragent") |
|
110 |
|
111 act = QAction(self) |
|
112 act.setText(title) |
|
113 act.setData(userAgent) |
|
114 act.setToolTip(userAgent) |
|
115 act.setCheckable(True) |
|
116 act.setChecked(userAgent == currentUserAgentString) |
|
117 act.triggered.connect(self.__changeUserAgent) |
|
118 self.addAction(act) |
|
119 |
|
120 if xml.hasError(): |
|
121 QMessageBox.critical(None, |
|
122 self.trUtf8("Parsing default user agents"), |
|
123 self.trUtf8("""<p>Error parsing default user agents.</p><p>{0}</p>""")\ |
|
124 .format(xml.errorString())) |
|
125 |