summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2010-12-02 17:53:42 +0100
committerJiri Moskovcak <jmoskovc@redhat.com>2010-12-02 17:53:42 +0100
commit3433c06718591fe930b9ae99501d0aa0f52b3f9c (patch)
tree0aecf5dc9411caeccc87cbc122a0d61c1a820b45 /src/gui
parent0e2f5ab4c66a65ce5c60297cb7915c1ce1a3bd42 (diff)
downloadabrt-3433c06718591fe930b9ae99501d0aa0f52b3f9c.tar.gz
abrt-3433c06718591fe930b9ae99501d0aa0f52b3f9c.tar.xz
abrt-3433c06718591fe930b9ae99501d0aa0f52b3f9c.zip
GUI: optimized the log window (possibly fixes rhbz#596592)
- we used to change the whole textbuffer and redraw the whole textview, now we just add the last line - possibly fixes *gtk_text_mark_get_buffer bugs
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/CReporterAssistant.py68
-rw-r--r--src/gui/progress_window.glade19
2 files changed, 50 insertions, 37 deletions
diff --git a/src/gui/CReporterAssistant.py b/src/gui/CReporterAssistant.py
index d998b870..300ddc3f 100644
--- a/src/gui/CReporterAssistant.py
+++ b/src/gui/CReporterAssistant.py
@@ -23,12 +23,48 @@ MISSING_BACKTRACE_TEXT = _("Crash info doesn't contain a backtrace")
DEFAULT_WIDTH = 800
DEFAULT_HEIGHT = 500
+
+class Log(gtk.ScrolledWindow):
+ def __init__(self, log=""):
+ gtk.ScrolledWindow.__init__(self)
+ self.tv = gtk.TextView()
+ self.tv.set_editable(False)
+ self.add(self.tv)
+ # FIXME: log shouldn't be None
+ self.buff = gtk.TextBuffer()
+ self.buff.set_text(log)
+ self.tv.set_buffer(self.buff)
+ self.scroll = False
+
+ def append_line(self, text):
+ end_iter = self.buff.get_end_iter()
+ self.buff.insert(end_iter, "%s\n" % text)
+ self.scroll_to_end()
+
+
+ def append_warning(self, text):
+ """ stub """
+ pass
+
+ def append_error(self, text):
+ """ do we need this? shouldn't error be an exception? """
+ pass
+
+ def set_scroll(self, scroll):
+ """ enables/disables scrolling to end, when new text is added """
+ self.scroll = scroll
+
+ def scroll_to_end(self):
+ if self.scroll:
+ mark = self.buff.get_insert()
+ self.tv.scroll_mark_onscreen(mark)
+
class ReporterAssistant():
def __init__(self, report, daemon, log=None, parent=None):
self.connected_signals = []
self.plugins_cb = []
self.daemon = daemon
- self.updates = ""
+ self.updates = []
self.pdict = {}
self.report = report
self.parent = parent
@@ -37,6 +73,8 @@ class ReporterAssistant():
self.report_has_bt = False
self.selected_report_events = []
self.ev_warning = None
+ self.log = Log()
+ self.log.set_scroll(True)
""" create the assistant """
self.assistant = gtk.Assistant()
self.assistant.set_icon_name("abrt")
@@ -61,6 +99,8 @@ class ReporterAssistant():
self.pBarWindow = self.builder.get_object("pBarWindow")
if self.pBarWindow:
self.connect_signal(self.pBarWindow, "delete_event", self.sw_delete_event_cb)
+ pb_log_expander = self.builder.get_object("pb_log_expander")
+ pb_log_expander.add(self.log)
self.connect_signal(daemon, "analyze-complete", self.on_analyze_complete_cb, self.pBarWindow)
self.connect_signal(daemon, "report-done", self.on_report_done_cb)
@@ -82,15 +122,10 @@ class ReporterAssistant():
viewer.set_transient_for(self.assistant)
vbox = gtk.VBox()
viewer.add(vbox)
- log_tev = gtk.TextView()
- log_tev.set_editable(False)
- log_buff = gtk.TextBuffer()
- log_buff.set_text(self.updates)
- log_sw = gtk.ScrolledWindow()
- log_sw.add(log_tev)
- log_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- log_tev.set_buffer(log_buff)
- vbox.pack_start(log_sw)
+ log = Log()
+ for line in self.updates:
+ log.append_line(line)
+ vbox.pack_start(log)
b_close = gtk.Button(stock=gtk.STOCK_CLOSE)
b_close.connect("clicked",lambda *w: viewer.destroy())
vbox.pack_start(b_close, False)
@@ -159,17 +194,10 @@ class ReporterAssistant():
gtk.main_quit()
def update_cb(self, daemon, message):
- self.updates += message
- if self.updates[-1] != '\n':
- self.updates += '\n'
+ self.updates.append(message)
message = message.replace('\n',' ')
self.builder.get_object("lStatus").set_text(message)
- buff = gtk.TextBuffer()
- buff.set_text(self.updates)
- end = buff.get_insert()
- tvUpdates = self.builder.get_object("tvUpdates")
- tvUpdates.set_buffer(buff)
- tvUpdates.scroll_mark_onscreen(end)
+ self.log.append_line(message)
def sw_delete_event_cb(self, widget, event, data=None):
if self.timer:
@@ -1093,9 +1121,7 @@ class ReporterAssistant():
self.prepare_page_3()
self.prepare_page_4()
self.prepare_page_5()
- self.updates = ""
# FIXME don't duplicate the code, move to function
- #self.pBar.show()
self.show_progress()
self.timer = gobject.timeout_add(100, self.progress_update_cb)
diff --git a/src/gui/progress_window.glade b/src/gui/progress_window.glade
index af48ee55..6fae1486 100644
--- a/src/gui/progress_window.glade
+++ b/src/gui/progress_window.glade
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
@@ -12,7 +12,6 @@
<child>
<object class="GtkVBox" id="vbox9">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="lStatus">
@@ -35,23 +34,11 @@
</packing>
</child>
<child>
- <object class="GtkExpander" id="expander1">
+ <object class="GtkExpander" id="pb_log_expander">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <property name="shadow_type">etched-in</property>
- <child>
- <object class="GtkTextView" id="tvUpdates">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </object>
- </child>
- </object>
+ <placeholder/>
</child>
<child type="label">
<object class="GtkLabel" id="lUpdates">