diff --git a/rigo/rigo/models/noticeboard.py b/rigo/rigo/models/noticeboard.py
index 21455763e..25a3eda51 100644
--- a/rigo/rigo/models/noticeboard.py
+++ b/rigo/rigo/models/noticeboard.py
@@ -108,11 +108,10 @@ class Notice(object):
Return ConfigurationUpdate markup text.
"""
msg = "%s\n%s, " + \
- "%s\n%s\n\n%s"
+ "%s\n%s"
msg = msg % (
escape_markup(self.title()),
escape_markup(self.repository()),
escape_markup(self.date()),
- escape_markup(self.link()),
- escape_markup(self.description()))
+ escape_markup(self.link()))
return prepare_markup(msg)
diff --git a/rigo/rigo/ui/gtk3/controllers/noticeboard.py b/rigo/rigo/ui/gtk3/controllers/noticeboard.py
index 2734b9edf..c89228514 100644
--- a/rigo/rigo/ui/gtk3/controllers/noticeboard.py
+++ b/rigo/rigo/ui/gtk3/controllers/noticeboard.py
@@ -21,6 +21,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
import os
import hashlib
import errno
+import tempfile
from gi.repository import GObject, GLib
@@ -28,8 +29,12 @@ from rigo.paths import CONF_DIR
from rigo.ui.gtk3.widgets.notifications import \
NoticeBoardNotificationBox
from rigo.enums import RigoViewStates
+from rigo.utils import open_url
from entropy.cache import EntropyCacher
+from entropy.const import etpConst
+
+import entropy.tools
class NoticeBoardViewController(GObject.Object):
@@ -100,6 +105,7 @@ class NoticeBoardViewController(GObject.Object):
Setup the ConfigUpdatesViewController resources.
"""
self._view.set_model(self._store)
+ self._view.connect("show-notice", self._on_show_notice)
self._view.show()
def set_notification_controller(self, nc):
@@ -194,3 +200,39 @@ class NoticeBoardViewController(GObject.Object):
box.connect("let-me-see", _nb_let_me_see)
box.connect("stop-annoying", _nb_stop_annoying)
self._nc.append(box)
+
+ def _on_show_notice(self, view, notice):
+ print notice
+ tmp_fd, tmp_path = None, None
+ try:
+ fname = notice.title().replace("/", "-")
+ tmp_fd, tmp_path = tempfile.mkstemp(prefix=fname, suffix=".html")
+ with entropy.tools.codecs_fdopen(
+ tmp_fd, "w", etpConst['conf_encoding']) as tmp_f:
+ tmp_f.write("")
+ tmp_f.write(notice.title())
+ tmp_f.write("")
+ tmp_f.write("\n
")
+ tmp_f.write(notice.date())
+ tmp_f.write(", ")
+ tmp_f.write(notice.repository())
+ tmp_f.write("\n\n
")
+ tmp_f.write(notice.description())
+ tmp_f.write("
\n\n
")
+ tmp_f.write("URL: ")
+ tmp_f.write(notice.link())
+ tmp_f.write("")
+ tmp_f.write("\n
")
+ tmp_f.flush()
+ finally:
+ if tmp_fd is not None:
+ try:
+ os.close(tmp_fd)
+ except OSError:
+ pass
+ # leaks, but xdg-open is async
+
+ if tmp_path is not None:
+ open_url(tmp_path)
diff --git a/rigo/rigo/ui/gtk3/widgets/cellrenderers.py b/rigo/rigo/ui/gtk3/widgets/cellrenderers.py
index e7a0f718e..d3c118a48 100644
--- a/rigo/rigo/ui/gtk3/widgets/cellrenderers.py
+++ b/rigo/rigo/ui/gtk3/widgets/cellrenderers.py
@@ -69,7 +69,6 @@ class CellRendererAppView(Gtk.CellRendererText):
self.pixbuf_width = 0
self.apptitle_width = 0
self.apptitle_height = 0
- self.markup_height = 0
self.normal_height = 0
self.selected_height = 0
self.show_ratings = show_ratings
@@ -431,7 +430,6 @@ class CellRendererConfigUpdateView(Gtk.CellRendererText):
self.pixbuf_width = 0
self.title_width = 0
self.title_height = 0
- self.markup_height = 0
self.normal_height = 0
self.selected_height = 0
@@ -614,6 +612,9 @@ class CellRendererConfigUpdateView(Gtk.CellRendererText):
context.restore()
+class NoticeCellButtonIDs:
+
+ SHOW = 0
class CellRendererNoticeView(Gtk.CellRendererText):
@@ -640,7 +641,6 @@ class CellRendererNoticeView(Gtk.CellRendererText):
self.pixbuf_width = 0
self.title_width = 0
self.title_height = 0
- self.markup_height = 0
self.normal_height = 0
self.selected_height = 0
@@ -687,18 +687,11 @@ class CellRendererNoticeView(Gtk.CellRendererText):
Gdk.cairo_set_source_pixbuf(cr, icon, x, y)
cr.paint()
- def _calculate_height(self, markup):
- l = Gtk.Label()
- l.set_markup(markup)
- w, h = l.get_layout().get_size()
- return h / Pango.SCALE
-
def _render_summary(self, context, cr, cu,
cell_area, layout, xpad, ypad,
is_rtl):
markup = cu.get_markup()
- self.markup_height = self._calculate_height(markup)
layout.set_markup(markup, -1)
@@ -866,7 +859,6 @@ class CellRendererRepositoryView(Gtk.CellRendererText):
self.pixbuf_width = 0
self.title_width = 0
self.title_height = 0
- self.markup_height = 0
self.normal_height = 0
self.selected_height = 0
@@ -913,18 +905,11 @@ class CellRendererRepositoryView(Gtk.CellRendererText):
Gdk.cairo_set_source_pixbuf(cr, icon, x, y)
cr.paint()
- def _calculate_height(self, markup):
- l = Gtk.Label()
- l.set_markup(markup)
- w, h = l.get_layout().get_size()
- return h / Pango.SCALE
-
def _render_summary(self, context, cr, repo,
cell_area, layout, xpad, ypad,
is_rtl):
markup = repo.get_markup()
- self.markup_height = self._calculate_height(markup)
layout.set_markup(markup, -1)
@@ -1088,7 +1073,6 @@ class CellRendererPreferenceView(Gtk.CellRendererText):
self.pixbuf_width = 0
self.title_width = 0
self.title_height = 0
- self.markup_height = 0
self.normal_height = 0
self.selected_height = 0
@@ -1133,12 +1117,6 @@ class CellRendererPreferenceView(Gtk.CellRendererText):
Gdk.cairo_set_source_pixbuf(cr, icon, x, y)
cr.paint()
- def _calculate_height(self, markup):
- l = Gtk.Label()
- l.set_markup(markup)
- w, h = l.get_layout().get_size()
- return h / Pango.SCALE
-
def _render_summary(self, context, cr, cu,
cell_area, layout, xpad, ypad,
is_rtl):
diff --git a/rigo/rigo/ui/gtk3/widgets/generictreeview.py b/rigo/rigo/ui/gtk3/widgets/generictreeview.py
index a7b886715..06f74a769 100644
--- a/rigo/rigo/ui/gtk3/widgets/generictreeview.py
+++ b/rigo/rigo/ui/gtk3/widgets/generictreeview.py
@@ -116,10 +116,7 @@ class GenericTreeView(Gtk.TreeView):
btn_h = btn.height
normal_height = max(32 + 4*ypad, em(2.5) + 4*ypad)
- markup_height = tr.markup_height
- if markup_height > 0:
- normal_height -= max(0, markup_height)
- tr.normal_height = normal_height + markup_height
+ tr.normal_height = normal_height
tr.selected_height = tr.normal_height + btn_h + StockEms.MEDIUM
def _on_style_updated(self, widget, tr):
diff --git a/rigo/rigo/ui/gtk3/widgets/noticeboardtreeview.py b/rigo/rigo/ui/gtk3/widgets/noticeboardtreeview.py
index 15a2b99ba..f584193ae 100644
--- a/rigo/rigo/ui/gtk3/widgets/noticeboardtreeview.py
+++ b/rigo/rigo/ui/gtk3/widgets/noticeboardtreeview.py
@@ -18,9 +18,10 @@ You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"""
-from gi.repository import Gtk
+from gi.repository import Gtk, GObject
-from cellrenderers import CellButtonRenderer, CellRendererNoticeView
+from cellrenderers import CellButtonRenderer, CellRendererNoticeView, \
+ NoticeCellButtonIDs
from rigo.utils import open_url
from rigo.ui.gtk3.models.noticeboardliststore import NoticeBoardListStore
@@ -30,6 +31,16 @@ from rigo.ui.gtk3.widgets.generictreeview import GenericTreeView
class NoticeBoardTreeView(GenericTreeView):
+ VARIANT_SHOW = 0
+
+ __gsignals__ = {
+ # Show Notice
+ "show-notice" : (GObject.SignalFlags.RUN_LAST,
+ None,
+ (GObject.TYPE_PYOBJECT,),
+ ),
+ }
+
def __init__(self, icons, icon_size):
Gtk.TreeView.__init__(self)
@@ -39,11 +50,18 @@ class NoticeBoardTreeView(GenericTreeView):
tr.set_pixbuf_width(icon_size)
GenericTreeView.__init__(
- self, self._row_activated_callback, None, tr)
+ self, self._row_activated_callback,
+ self._button_activated_callback, tr)
column = Gtk.TreeViewColumn("Notices", tr,
notice=self.COL_ROW_DATA)
+ show_notice = CellButtonRenderer(
+ self, name=NoticeCellButtonIDs.SHOW)
+ show_notice.set_markup_variants(
+ {self.VARIANT_SHOW: _("Show"),})
+ tr.button_pack_end(show_notice)
+
column.set_cell_data_func(tr, self._cell_data_func_cb)
column.set_fixed_width(350)
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
@@ -51,3 +69,10 @@ class NoticeBoardTreeView(GenericTreeView):
def _row_activated_callback(self, path, rowref):
open_url(rowref.link())
+
+ def _button_activated_callback(self, btn, btn_id, notice, store, path):
+ if isinstance(store, Gtk.TreeModelFilter):
+ store = store.get_model()
+ if btn_id == NoticeCellButtonIDs.SHOW:
+ self.emit("show-notice", notice)
+ return False