Merge lp:~nixternal/apport/apport-kde into lp:~apport-hackers/apport/trunk

Proposed by Rich Johnson
Status: Merged
Merged at revision: not available
Proposed branch: lp:~nixternal/apport/apport-kde
Merge into: lp:~apport-hackers/apport/trunk
Diff against target: None lines
To merge this branch: bzr merge lp:~nixternal/apport/apport-kde
Reviewer Review Type Date Requested Status
Martin Pitt (community) Needs Information
Review via email: mp+7315@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Rich Johnson (nixternal) wrote :

apport-kde allows better integration into the Kubuntu desktop than apport-qt does and fixes some of the inconsistencies that tend to occur with the PyQt4 version. This is done with PyKDE4.

Revision history for this message
Martin Pitt (pitti) wrote :

Thanks! However, I don't think we want to maintain a qt4 _and_ a KDE UI. I suppose the *.ui files are compatible between both, so we should have just one set. And the kde/apport-kde code is not all that different either.

I see two options here:

 - Drop apport-qt entirely and just use kde/.

 - If you think that it's useful for something to have a pure Qt version, do you think it's feasible to try and import PyKDE, and on ImportError provide some Qt fallback in the code?

review: Needs Information
Revision history for this message
Rich Johnson (nixternal) wrote :

Ya, no reason to keep both honestly, however I can't picture a reason to fall back to PyQt on an ImportError, but at the same time it does make sense especially during the dev cycle, as we have been known to break pykde4 for a day :)

So maybe drop the qt4/ directory, add apport-qt to the kde/ directory, and it can utilize the ui files in kde/, and then do the ImportError stuff.

Revision history for this message
Martin Pitt (pitti) wrote :

OK, I merged your's and dropped the qt4/ directory. I updated the build system, i18n, etc. for kde.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'kde'
=== added file 'kde/Makefile'
--- kde/Makefile 1970-01-01 00:00:00 +0000
+++ kde/Makefile 2009-06-11 02:18:16 +0000
@@ -0,0 +1,9 @@
1top_srcdir = ..
2
3all: apport-kde.desktop apport-kde-mime.desktop apport-kde-mimelnk.desktop
4
5%.desktop : %.desktop.in
6 intltool-merge -d ${top_srcdir}/po/ $< $@
7
8clean:
9 rm -f *.desktop
010
=== added file 'kde/apport-kde'
--- kde/apport-kde 1970-01-01 00:00:00 +0000
+++ kde/apport-kde 2009-06-11 02:18:16 +0000
@@ -0,0 +1,417 @@
1#!/usr/bin/python
2
3''' KDE 4 Apport User Interface
4
5Copyright (C) 2007-2009 Canonical Ltd.
6Author: Richard A. Johnson <nixternal@ubuntu.com>
7
8This program is free software; you can redistribute it and/or modify it
9under the terms of the GNU General Public License as published by the
10Free Software Foundation; either version 2 of the License, or (at your
11option) any later version. See http://www.gnu.org/copyleft/gpl.html for
12the full text of the license.
13'''
14
15import os.path
16import subprocess
17import sys
18
19try:
20 from PyQt4.QtCore import *
21 from PyQt4.QtGui import (QDialog, QLabel, QCheckBox, QRadioButton,
22 QTreeWidget, QTreeWidgetItem, QMessageBox,
23 QVBoxLayout, QFileDialog, QDialogButtonBox,
24 QProgressBar, QGroupBox)
25 from PyQt4 import uic
26 from PyKDE4.kdecore import (i18n, ki18n, KAboutData, KCmdLineArgs,
27 KLocalizedString)
28 from PyKDE4.kdeui import (KApplication, KNotification, KMessageBox, KIcon,
29 KStandardGuiItem)
30 import apport.ui
31except ImportError, e:
32 # this can happen while upgrading python packages
33 print >> sys.stderr, 'Could not import module, is a package upgrade in progress? Error:', e
34 sys.exit(1)
35
36def translate(self, prop):
37 ''' Reimplement method from uic to change it to use gettext '''
38 if prop.get("notr", None) == "true":
39 return self._cstring(prop)
40 else:
41 if prop.text is None:
42 return ""
43 text = prop.text.encode("UTF-8")
44 return i18n(text)
45
46uic.properties.Properties._string = translate
47
48class Dialog(QDialog):
49 ''' Main dialog wrapper '''
50
51 def __init__(self, ui, title, heading, text):
52 QDialog.__init__(self, None, Qt.Window)
53
54 uic.loadUi(os.path.join(os.path.dirname(sys.argv[0]), ui), self)
55
56 self.setWindowTitle(title)
57 if self.findChild(QLabel, 'heading'):
58 self.findChild(QLabel, 'heading').setText('<h2>%s</h2>' % heading)
59 self.findChild(QLabel, 'text').setText(text)
60
61 def on_buttons_clicked(self, button):
62 self.actionbutton = button
63 if self.sender().buttonRole(button) == QDialogButtonBox.ActionRole:
64 button.window().done(2)
65
66 def addbutton(self, button):
67 return self.findChild(QDialogButtonBox, 'buttons').addButton(button,
68 QDialogButtonBox.ActionRole)
69
70class ErrorDialog(Dialog):
71 ''' Error dialog wrapper '''
72
73 def __init__(self, title, heading, text, checker=None):
74 Dialog.__init__(self, 'error.ui', title, heading, text)
75
76 self.setMaximumSize(1, 1)
77 self.findChild(QLabel, 'icon').setPixmap(
78 QMessageBox.standardIcon(QMessageBox.Critical))
79
80 self.checker = self.findChild(QCheckBox, 'checker')
81 if checker:
82 self.checker.setText(checker)
83 else:
84 self.checker.hide()
85
86 def checked(self):
87 return self.checker.isChecked()
88
89class ChoicesDialog(Dialog):
90 ''' Choices dialog wrapper '''
91
92 def __init__(self, title, text):
93 Dialog.__init__(self, 'choices.ui', title, None, text)
94
95 self.setMaximumSize(1, 1)
96
97 def on_buttons_clicked(self, button):
98 Dialog.on_buttons_clicked(self, button)
99 if self.sender().buttonRole(button) == QDialogButtonBox.RejectRole:
100 sys.exit(0)
101
102class ProgressDialog(Dialog):
103 ''' Progress dialog wrapper '''
104
105 def __init__(self, title, heading, text):
106 Dialog.__init__(self, 'progress.ui', title, heading, text)
107
108 self.setMaximumSize(1, 1)
109
110 def on_buttons_clicked(self, button):
111 Dialog.on_buttons_clicked(self, button)
112 if self.sender().buttonRole(button) == QDialogButtonBox.RejectRole:
113 sys.exit(0)
114
115 def set(self, value=None):
116 progress = self.findChild(QProgressBar, 'progress')
117 if not value:
118 progress.setRange(0, 0)
119 progress.setValue(0)
120 else:
121 progress.setRange(0, 1000)
122 progress.setValue(value * 1000)
123
124class ReportDialog(Dialog):
125 ''' Report dialog wrapper '''
126
127 def __init__(self, title, heading, text):
128 Dialog.__init__(self, 'bugreport.ui', title, heading, text)
129
130 self.details = self.addbutton(i18n("&Details..."))
131 self.details.setCheckable(True)
132
133 self.treeview = self.findChild(QTreeWidget, 'details')
134 self.showtree(False)
135
136 def on_buttons_clicked(self, button):
137 if self.details == button:
138 self.showtree(button.isChecked())
139 else:
140 Dialog.on_buttons_clicked(self, button)
141 if self.sender().buttonRole(button) == QDialogButtonBox.RejectRole:
142 sys.exit(0)
143
144 def showtree(self, visible):
145 self.treeview.setVisible(visible)
146 if visible:
147 self.setMaximumSize(16777215, 16777215)
148 else:
149 self.setMaximumSize(1, 1)
150
151class MainUserInterface(apport.ui.UserInterface):
152 ''' The main user interface presented to the user '''
153
154 def __init__(self):
155 apport.ui.UserInterface.__init__(self)
156
157 self.run_argv()
158
159 #
160 # ui_* implementation of abstract UserInterface classes
161 #
162
163 def ui_present_crash(self, desktop_entry):
164 # adapt dialog heading and label appropriately
165 if desktop_entry:
166 name = desktop_entry.getName()
167 heading = i18n('Sorry, %s closed unexpectedly') % name
168 elif self.report.has_key('ExecutablePath'):
169 name = os.path.basename(self.report['ExecutablePath'])
170 heading = i18n('Sorry, the program "%s" closed unexpectedly.') % name
171 else:
172 name = self.cur_package
173 heading = i18n('Sorry, %s closed unexpectedly.') % name
174
175 dialog = ErrorDialog(name, heading,
176 i18n('If you were not doing anything confidential (entering '
177 'passwords or other private information), you can help '
178 'to improve the application by reporting the problem.'),
179 i18n('&Ignore future crashes of this program version'))
180
181 reportbutton = dialog.addbutton(i18n('&Report Problem...'))
182
183 if desktop_entry and self.report.has_key('ExecutablePath') and \
184 os.path.dirname(self.report['ExecutablePath']) in \
185 os.environ['PATH'].split(':') and subprocess.call(['pgrep',
186 '-x', os.path.basename(self.report['ExecutablePath']),
187 '-u', str(os.getuid())], stdout=subprocess.PIPE) != 0:
188 restartbutton = dialog.addbutton(i18n('Restart &Program'))
189
190 # show crash notification dialog
191 response = dialog.exec_()
192 blacklist = dialog.checked()
193
194 if response == QDialog.Rejected:
195 return {'action': 'cancel', 'blacklist': blacklist}
196 if dialog.actionbutton == reportbutton:
197 return {'action': 'report', 'blacklist': blacklist}
198 if dialog.actionbutton == restartbutton:
199 return {'action': 'restart', 'blacklist': blacklist}
200 # Fallback
201 return {'action': 'cancel', 'blacklist': blacklist}
202
203 def ui_present_package_error(self):
204 name = self.report['Package']
205 dialog = ErrorDialog(name,
206 i18n('Sorry, the package "%s" failed to install or upgrade.') %
207 name,
208 i18n('You can help the developers to fix the package by '
209 'reporting the problem.'))
210
211 reportbutton = dialog.addbutton(i18n('&Report Problem...'))
212
213 response = dialog.exec_()
214
215 if response == QDialog.Rejected:
216 return 'cancel'
217 if dialog.actionbutton == reportbutton:
218 return 'report'
219 # Fallback
220 return 'cancel'
221
222 def ui_present_kernel_error(self):
223 message = i18n('Your system encountered a serious kernel problem.')
224 annotate = ''
225 if self.report.has_key('Annotation'):
226 annotate = self.report['Annotation'] + '\n\n'
227 annotate += i18n('You can help the developers to fix the problem by '
228 'reporting it.')
229
230 dialog = ErrorDialog(i18n('Kernel problem'), message, annotate)
231
232 reportbutton = dialog.addbutton(i18n('&Report Problem...'))
233
234 response = dialog.exec_()
235
236 if response == QDialog.Rejected:
237 return 'cancel'
238 if dialog.actionbutton == reportbutton:
239 return 'report'
240 # Fallback
241 return 'cancel'
242
243 def ui_present_report_details(self):
244 dialog = ReportDialog(self.report.get('Package',
245 i18n('Generic error')).split()[0],
246 i18n('Send problem report to the developers?'),
247 i18n('After the problem report has been sent, please fill out '
248 'the form in the automatically opened web browser.'))
249
250 sendbutton = dialog.addbutton(i18n('&Send'))
251 sendbutton.setDefault(True)
252
253 # report contents
254 details = dialog.findChild(QTreeWidget, 'details')
255 for key in self.report:
256 keyitem = QTreeWidgetItem([key])
257 details.addTopLevelItem(keyitem)
258
259 # string value
260 if not hasattr(self.report[key], 'gzipvalue') and \
261 hasattr(self.report[key], 'isspace') and \
262 not self.report._is_binary(self.report[key]):
263 lines = self.report[key].splitlines()
264 for line in lines:
265 QTreeWidgetItem(keyitem, [line])
266 if len(lines) < 4:
267 keyitem.setExpanded(True)
268 else:
269 QTreeWidgetItem(keyitem, [i18n('(binary data)')])
270
271 details.header().hide()
272
273 # complete/reduce radio buttons
274 if self.report.has_key('CoreDump') and \
275 self.report.has_useful_stacktrace():
276 dialog.findChild(QRadioButton, 'complete').setText(
277 i18n('Complete report (recommended; %s)') %
278 self.format_filesize(self.get_complete_size()))
279 dialog.findChild(QRadioButton, 'reduced').setText(
280 i18n('Reduced report (slow Internet connection; %s)') %
281 self.format_filesize(self.get_reduced_size()))
282 else:
283 dialog.findChild(QGroupBox, 'options').hide()
284
285 response = dialog.exec_()
286
287 if response == QDialog.Rejected:
288 return 'cancel'
289 # Fallback
290 if dialog.actionbutton != sendbutton:
291 return 'cancel'
292 if dialog.findChild(QRadioButton, 'reduced').isChecked():
293 return 'reduced'
294 if dialog.findChild(QRadioButton, 'complete').isChecked():
295 return 'full'
296 # Fallback
297 return 'cancel'
298
299 def ui_info_message(self, title, text):
300 KMessageBox.information(None, i18n(text), i18n(title))
301
302 def ui_error_message(self, title, text):
303 KMessageBox.information(None, i18n(text), i18n(title))
304
305 def ui_start_info_collection_progress(self):
306 self.progress = ProgressDialog(
307 i18n('Collecting Problem Information'),
308 i18n('Collecting problem information'),
309 i18n('The collected information can be sent to the developers '
310 'to improve the application. This might take a few '
311 'minutes.'))
312 self.progress.set()
313 self.progress.show()
314
315 def ui_pulse_info_collection_progress(self):
316 self.progress.set()
317 KApplication.processEvents()
318
319 def ui_stop_info_collection_progress(self):
320 self.progress.hide()
321
322 def ui_start_upload_progress(self):
323 self.progress = ProgressDialog(
324 i18n('Uploading Problem Information'),
325 i18n('Uploading problem information'),
326 i18n('The collected information is being sent to the bug '
327 'tracking system. This might take a few minutes.'))
328 self.progress.show()
329
330 def ui_set_upload_progress(self, progress):
331 if progress:
332 self.progress.set(progress)
333 else:
334 self.progress.set()
335 KApplication.processEvents()
336
337 def ui_stop_upload_progress(self):
338 self.progress.hide()
339
340 def ui_question_yesno(self, text):
341 response = KMessageBox.questionYesNoCancel(None, i18n(text), QString(),
342 KStandardGuiItem.yes(), KStandardGuiItem.no(),
343 KStandardGuiItem.cancel())
344 if response == KMessageBox.Yes:
345 return True
346 if response == KMessageBox.No:
347 return False
348 return None
349
350 def ui_question_choice(self, text, options, multiple):
351 ''' Show a question with predefined choices.
352
353 @options is a list of strings to present.
354 @multiple - if True, choices should be QCheckBoxes, if False then
355 should be QRadioButtons.
356
357 Return list of selected option indexes, or None if the user cancelled.
358 If multiple is False, the list will always have one element.
359 '''
360
361 dialog = ChoicesDialog(i18n("Apport"), text)
362
363 b = None
364 for option in options:
365 if multiple:
366 b = QCheckBox(option)
367 else:
368 b = QRadioButton(option)
369 dialog.vbox_choices.insertWidget(0, b)
370
371 response = dialog.exec_()
372
373 if response == QDialog.Rejected:
374 return 'cancel'
375
376 response = [c for c in range(0, dialog.vbox_choices.count()) if \
377 dialog.vbox_choices.itemAt(c).widget().isChecked()]
378
379 return response
380
381 def ui_question_file(self, text):
382 ''' Show a file selector dialog.
383
384 Return path if the user selected a file, or None if cancelled.
385 '''
386
387 response = QFileDialog.getOpenFileName(None, unicode(text, 'UTF-8'))
388 if response.length() == 0:
389 return None
390 return str(response)
391
392if __name__ == '__main__':
393 appName = "apport-kde"
394 catalog = "apport-kde"
395 programName = ki18n("Apport KDE")
396 version = "1.0"
397 description = ki18n("KDE 4 frontend for the apport crash report system")
398 license = KAboutData.License_GPL
399 copyright = ki18n("2009 Canonical Ltd.")
400 text = KLocalizedString()
401 homePage = "https://wiki.ubuntu.com/AutomatedProblemReports"
402 bugEmail = "kubuntu-devel@lists.ubuntu.com"
403
404 aboutData = KAboutData(appName, catalog, programName, version, description,
405 license, copyright, text, homePage, bugEmail)
406
407 aboutData.addAuthor(ki18n("Richard A. Johnson"), ki18n("Author"))
408 aboutData.addAuthor(ki18n("Michael Hofmann"), ki18n("Original Qt4 Author"))
409
410 KCmdLineArgs.init([""], aboutData)
411
412 app = KApplication()
413 app.setWindowIcon(KIcon("apport"))
414
415 UserInterface = MainUserInterface()
416 UserInterface.show()
417 app.exec_()
0418
=== added file 'kde/apport-kde-mime.desktop.in'
--- kde/apport-kde-mime.desktop.in 1970-01-01 00:00:00 +0000
+++ kde/apport-kde-mime.desktop.in 2009-06-11 02:18:16 +0000
@@ -0,0 +1,11 @@
1[Desktop Entry]
2_Name=Report a problem...
3_Comment=Report a malfunction to the developers
4Exec=/usr/share/apport/apport-kde -c %f
5Icon=apport
6Terminal=false
7Type=Application
8MimeType=text/x-apport;
9Categories=KDE;Core;System;
10NoDisplay=true
11StartupNotify=true
012
=== added file 'kde/apport-kde-mimelnk.desktop.in'
--- kde/apport-kde-mimelnk.desktop.in 1970-01-01 00:00:00 +0000
+++ kde/apport-kde-mimelnk.desktop.in 2009-06-11 02:18:16 +0000
@@ -0,0 +1,9 @@
1[Desktop Entry]
2# This is a deprecated method for KDE3 to make it recognize this MimeType
3Type=MimeType
4_Comment=Apport crash file
5Hidden=false
6Icon=apport
7# This must not have a trailing ";" for KDE3
8MimeType=text/x-apport
9Patterns=*.crash
010
=== added file 'kde/apport-kde.desktop.in'
--- kde/apport-kde.desktop.in 1970-01-01 00:00:00 +0000
+++ kde/apport-kde.desktop.in 2009-06-11 02:18:16 +0000
@@ -0,0 +1,10 @@
1[Desktop Entry]
2_Name=Report a problem...
3_Comment=Report a malfunction to the developers
4Exec=/usr/share/apport/apport-kde -f
5Icon=apport
6Terminal=false
7Type=Application
8Categories=KDE;System;
9OnlyShowIn=KDE;
10StartupNotify=true
011
=== added file 'kde/bugreport.ui'
--- kde/bugreport.ui 1970-01-01 00:00:00 +0000
+++ kde/bugreport.ui 2009-06-11 02:18:16 +0000
@@ -0,0 +1,125 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>CrashDialog</class>
4 <widget class="QDialog" name="CrashDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>500</width>
10 <height>371</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Dialog</string>
15 </property>
16 <layout class="QGridLayout" name="gridLayout_2">
17 <item row="0" column="0">
18 <widget class="QLabel" name="heading">
19 <property name="sizePolicy">
20 <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
21 <horstretch>0</horstretch>
22 <verstretch>0</verstretch>
23 </sizepolicy>
24 </property>
25 <property name="text">
26 <string>heading</string>
27 </property>
28 </widget>
29 </item>
30 <item row="1" column="0">
31 <widget class="QLabel" name="text">
32 <property name="sizePolicy">
33 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
34 <horstretch>0</horstretch>
35 <verstretch>0</verstretch>
36 </sizepolicy>
37 </property>
38 <property name="text">
39 <string>text</string>
40 </property>
41 <property name="alignment">
42 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
43 </property>
44 <property name="wordWrap">
45 <bool>true</bool>
46 </property>
47 </widget>
48 </item>
49 <item row="2" column="0">
50 <widget class="QGroupBox" name="options">
51 <property name="title">
52 <string/>
53 </property>
54 <layout class="QGridLayout" name="gridLayout">
55 <item row="0" column="0">
56 <widget class="QRadioButton" name="complete">
57 <property name="text">
58 <string>complete</string>
59 </property>
60 </widget>
61 </item>
62 <item row="1" column="0">
63 <widget class="QRadioButton" name="reduced">
64 <property name="text">
65 <string>reduced</string>
66 </property>
67 </widget>
68 </item>
69 </layout>
70 </widget>
71 </item>
72 <item row="3" column="0">
73 <widget class="QTreeWidget" name="details">
74 <column>
75 <property name="text">
76 <string notr="true">1</string>
77 </property>
78 </column>
79 </widget>
80 </item>
81 <item row="4" column="0">
82 <widget class="QDialogButtonBox" name="buttons">
83 <property name="standardButtons">
84 <set>QDialogButtonBox::Close</set>
85 </property>
86 </widget>
87 </item>
88 </layout>
89 </widget>
90 <resources/>
91 <connections>
92 <connection>
93 <sender>buttons</sender>
94 <signal>accepted()</signal>
95 <receiver>CrashDialog</receiver>
96 <slot>accept()</slot>
97 <hints>
98 <hint type="sourcelabel">
99 <x>96</x>
100 <y>343</y>
101 </hint>
102 <hint type="destinationlabel">
103 <x>249</x>
104 <y>185</y>
105 </hint>
106 </hints>
107 </connection>
108 <connection>
109 <sender>buttons</sender>
110 <signal>rejected()</signal>
111 <receiver>CrashDialog</receiver>
112 <slot>reject()</slot>
113 <hints>
114 <hint type="sourcelabel">
115 <x>96</x>
116 <y>343</y>
117 </hint>
118 <hint type="destinationlabel">
119 <x>249</x>
120 <y>185</y>
121 </hint>
122 </hints>
123 </connection>
124 </connections>
125</ui>
0126
=== added file 'kde/choices.ui'
--- kde/choices.ui 1970-01-01 00:00:00 +0000
+++ kde/choices.ui 2009-06-11 02:18:16 +0000
@@ -0,0 +1,95 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>DialogChoices</class>
4 <widget class="QDialog" name="DialogChoices">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>182</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Dialog</string>
15 </property>
16 <layout class="QGridLayout" name="gridLayout_2">
17 <item row="0" column="0">
18 <widget class="QLabel" name="text">
19 <property name="sizePolicy">
20 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
21 <horstretch>0</horstretch>
22 <verstretch>0</verstretch>
23 </sizepolicy>
24 </property>
25 <property name="text">
26 <string>text</string>
27 </property>
28 <property name="alignment">
29 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
30 </property>
31 <property name="wordWrap">
32 <bool>true</bool>
33 </property>
34 <property name="indent">
35 <number>1</number>
36 </property>
37 </widget>
38 </item>
39 <item row="1" column="0">
40 <widget class="QGroupBox" name="groupBox">
41 <property name="title">
42 <string/>
43 </property>
44 <layout class="QGridLayout" name="gridLayout">
45 <item row="0" column="0">
46 <layout class="QVBoxLayout" name="vbox_choices"/>
47 </item>
48 </layout>
49 </widget>
50 </item>
51 <item row="2" column="0">
52 <widget class="QDialogButtonBox" name="buttons">
53 <property name="standardButtons">
54 <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
55 </property>
56 </widget>
57 </item>
58 </layout>
59 </widget>
60 <resources/>
61 <connections>
62 <connection>
63 <sender>buttons</sender>
64 <signal>accepted()</signal>
65 <receiver>DialogChoices</receiver>
66 <slot>accept()</slot>
67 <hints>
68 <hint type="sourcelabel">
69 <x>199</x>
70 <y>164</y>
71 </hint>
72 <hint type="destinationlabel">
73 <x>199</x>
74 <y>90</y>
75 </hint>
76 </hints>
77 </connection>
78 <connection>
79 <sender>buttons</sender>
80 <signal>rejected()</signal>
81 <receiver>DialogChoices</receiver>
82 <slot>reject()</slot>
83 <hints>
84 <hint type="sourcelabel">
85 <x>199</x>
86 <y>164</y>
87 </hint>
88 <hint type="destinationlabel">
89 <x>199</x>
90 <y>90</y>
91 </hint>
92 </hints>
93 </connection>
94 </connections>
95</ui>
096
=== added file 'kde/error.ui'
--- kde/error.ui 1970-01-01 00:00:00 +0000
+++ kde/error.ui 2009-06-11 02:18:16 +0000
@@ -0,0 +1,136 @@
1<ui version="4.0" >
2 <class>ErrorDialog</class>
3 <widget class="QDialog" name="ErrorDialog" >
4 <property name="geometry" >
5 <rect>
6 <x>0</x>
7 <y>0</y>
8 <width>270</width>
9 <height>191</height>
10 </rect>
11 </property>
12 <property name="windowTitle" >
13 <string>Dialog</string>
14 </property>
15 <layout class="QGridLayout" >
16 <property name="margin" >
17 <number>9</number>
18 </property>
19 <property name="spacing" >
20 <number>6</number>
21 </property>
22 <item row="2" column="1" >
23 <widget class="QCheckBox" name="checker" >
24 <property name="text" >
25 <string>checker</string>
26 </property>
27 </widget>
28 </item>
29 <item rowspan="3" row="0" column="0" >
30 <widget class="QLabel" name="icon" >
31 <property name="sizePolicy" >
32 <sizepolicy>
33 <hsizetype>0</hsizetype>
34 <vsizetype>1</vsizetype>
35 <horstretch>0</horstretch>
36 <verstretch>0</verstretch>
37 </sizepolicy>
38 </property>
39 <property name="text" >
40 <string/>
41 </property>
42 <property name="alignment" >
43 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
44 </property>
45 </widget>
46 </item>
47 <item row="0" column="1" >
48 <widget class="QLabel" name="heading" >
49 <property name="sizePolicy" >
50 <sizepolicy>
51 <hsizetype>1</hsizetype>
52 <vsizetype>0</vsizetype>
53 <horstretch>0</horstretch>
54 <verstretch>0</verstretch>
55 </sizepolicy>
56 </property>
57 <property name="text" >
58 <string>heading</string>
59 </property>
60 <property name="indent" >
61 <number>6</number>
62 </property>
63 </widget>
64 </item>
65 <item row="1" column="1" >
66 <widget class="QLabel" name="text" >
67 <property name="sizePolicy" >
68 <sizepolicy>
69 <hsizetype>5</hsizetype>
70 <vsizetype>1</vsizetype>
71 <horstretch>0</horstretch>
72 <verstretch>0</verstretch>
73 </sizepolicy>
74 </property>
75 <property name="text" >
76 <string>text</string>
77 </property>
78 <property name="alignment" >
79 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
80 </property>
81 <property name="wordWrap" >
82 <bool>true</bool>
83 </property>
84 <property name="indent" >
85 <number>6</number>
86 </property>
87 </widget>
88 </item>
89 <item row="3" column="0" colspan="2" >
90 <widget class="QDialogButtonBox" name="buttons" >
91 <property name="orientation" >
92 <enum>Qt::Horizontal</enum>
93 </property>
94 <property name="standardButtons" >
95 <set>QDialogButtonBox::Close</set>
96 </property>
97 </widget>
98 </item>
99 </layout>
100 </widget>
101 <resources/>
102 <connections>
103 <connection>
104 <sender>buttons</sender>
105 <signal>accepted()</signal>
106 <receiver>ErrorDialog</receiver>
107 <slot>accept()</slot>
108 <hints>
109 <hint type="sourcelabel" >
110 <x>248</x>
111 <y>254</y>
112 </hint>
113 <hint type="destinationlabel" >
114 <x>157</x>
115 <y>274</y>
116 </hint>
117 </hints>
118 </connection>
119 <connection>
120 <sender>buttons</sender>
121 <signal>rejected()</signal>
122 <receiver>ErrorDialog</receiver>
123 <slot>reject()</slot>
124 <hints>
125 <hint type="sourcelabel" >
126 <x>316</x>
127 <y>260</y>
128 </hint>
129 <hint type="destinationlabel" >
130 <x>286</x>
131 <y>274</y>
132 </hint>
133 </hints>
134 </connection>
135 </connections>
136</ui>
0137
=== added file 'kde/progress.ui'
--- kde/progress.ui 1970-01-01 00:00:00 +0000
+++ kde/progress.ui 2009-06-11 02:18:16 +0000
@@ -0,0 +1,115 @@
1<ui version="4.0" >
2 <class>ProgressDialog</class>
3 <widget class="QDialog" name="ProgressDialog" >
4 <property name="geometry" >
5 <rect>
6 <x>0</x>
7 <y>0</y>
8 <width>422</width>
9 <height>191</height>
10 </rect>
11 </property>
12 <property name="windowTitle" >
13 <string>Dialog</string>
14 </property>
15 <layout class="QVBoxLayout" >
16 <property name="margin" >
17 <number>9</number>
18 </property>
19 <property name="spacing" >
20 <number>6</number>
21 </property>
22 <item>
23 <widget class="QLabel" name="heading" >
24 <property name="sizePolicy" >
25 <sizepolicy>
26 <hsizetype>1</hsizetype>
27 <vsizetype>0</vsizetype>
28 <horstretch>0</horstretch>
29 <verstretch>0</verstretch>
30 </sizepolicy>
31 </property>
32 <property name="text" >
33 <string>heading</string>
34 </property>
35 </widget>
36 </item>
37 <item>
38 <widget class="QLabel" name="text" >
39 <property name="sizePolicy" >
40 <sizepolicy>
41 <hsizetype>5</hsizetype>
42 <vsizetype>1</vsizetype>
43 <horstretch>0</horstretch>
44 <verstretch>0</verstretch>
45 </sizepolicy>
46 </property>
47 <property name="text" >
48 <string>text</string>
49 </property>
50 <property name="alignment" >
51 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
52 </property>
53 <property name="wordWrap" >
54 <bool>true</bool>
55 </property>
56 </widget>
57 </item>
58 <item>
59 <widget class="QProgressBar" name="progress" >
60 <property name="textVisible" >
61 <bool>false</bool>
62 </property>
63 <property name="invertedAppearance" >
64 <bool>false</bool>
65 </property>
66 </widget>
67 </item>
68 <item>
69 <widget class="QDialogButtonBox" name="buttons" >
70 <property name="orientation" >
71 <enum>Qt::Horizontal</enum>
72 </property>
73 <property name="standardButtons" >
74 <set>QDialogButtonBox::Cancel</set>
75 </property>
76 </widget>
77 </item>
78 </layout>
79 </widget>
80 <resources/>
81 <connections>
82 <connection>
83 <sender>buttons</sender>
84 <signal>accepted()</signal>
85 <receiver>ProgressDialog</receiver>
86 <slot>accept()</slot>
87 <hints>
88 <hint type="sourcelabel" >
89 <x>248</x>
90 <y>254</y>
91 </hint>
92 <hint type="destinationlabel" >
93 <x>157</x>
94 <y>274</y>
95 </hint>
96 </hints>
97 </connection>
98 <connection>
99 <sender>buttons</sender>
100 <signal>rejected()</signal>
101 <receiver>ProgressDialog</receiver>
102 <slot>reject()</slot>
103 <hints>
104 <hint type="sourcelabel" >
105 <x>316</x>
106 <y>260</y>
107 </hint>
108 <hint type="destinationlabel" >
109 <x>286</x>
110 <y>274</y>
111 </hint>
112 </hints>
113 </connection>
114 </connections>
115</ui>

Subscribers

People subscribed via source and target branches