2015-04-05 54 views
1

我想要使用Gtk.Pango以雙線間距顯示Clutter.Text文本。如何使用Pango在Clutter.Text中設置線條高度

注意:在CSS中,我們會使用line-height: 200%我認爲。

我嘗試此代碼,它不工作:

var text_actor = new Clutter.Text.with_text ("Roboto 10", "Long long text") ; 
text_actor.width= SIDE_PANE_WIDTH ; 
text_actor.get_layout().set_spacing (2*Pango.SCALE) ; 

顯然,Clutter.Text保持的Pango.Layout

緩存版本有沒有辦法來實現這一目標?

回答

3

一種方法解決此工作通過直接使用CoglPango:

var t = new Clutter.Actor(); 
t.set_size (300, 300); 

// add some more text to see it 
var text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, ..."; 

var layout = t.create_pango_layout (text); 
layout.set_width (200); 
layout.set_spacing (24 * Pango.SCALE); 

t.paint.connect (() => { 
    Cogl.pango_render_layout (layout, 0, 0, 
           Cogl.Color.from_4ub(0, 0, 0, 255), 0); 
}); 

編輯這確實是解決方案。在此基礎上,下面是我使用的代碼:

  actor = new Text() ; 
      actor.width= SIDE_PANE_WIDTH ; 

      var text = "Some long text<b>Bold</b>" ; 
      var pango_layout = bio_actor.create_pango_layout (""); 
      pango_layout.set_markup (text, text.length) ; 
      pango_layout.set_spacing (2 * Pango.SCALE); 
      pango_layout.set_font_description (Pango.FontDescription.from_string ("Roboto 10")) ; 
      pango_layout.set_width (SIDE_PANE_WIDTH * Pango.SCALE); 
      bio_actor.paint.connect (() => { 
        Cogl.pango_render_layout (pango_layout, 0, 0, Cogl.Color.from_4ub(255, 255, 255, 255), 0); 
      }); 
      int width; 
      int height ; 
      pango_layout.get_size (out width, out height) ; 
      actor.height = height/Pango.SCALE; 
+0

這實際上很糟糕,而且你正在摧毀Text actor緩存PangoLayout的所有機會,並避免重新測量文本,從而放慢了一切。 – ebassi 2015-04-06 10:53:30

+0

@ebassi除了allocate/get_preferred *中的佈局之外,我提議的任何不同之處是什麼?是否有不同的(更好的)功能來繪製佈局? – tom 2015-04-06 13:18:32

+0

如果您重寫「paint」實現並使用您自己的佈局,則所有尺寸都將不正確;剪切以避免在演員的大小以外的文字繪畫是基於分配的大小,你只是在踐踏。你也可以在不阻止原始處理程序運行的情況下重寫paint,這意味着你正在繪製佈局,然後演員將它的佈局繪製在頂部,這隻能在你使用空的Text演員時才起作用。我概述了以下適當的解決方案。 – ebassi 2015-04-08 12:53:48

3

是,ClutterText緩存PangoLayout實例,以避免重新衡量文本中每有檢索首選大小時間。它實際上緩存了最近的三個實例PangoLayout,因爲width-for-height/height-for-width幾何請求,但這只是一個實現細節。對ClutterTextPangoLayout實例

更改屬性也不會導致更新到ClutterText:你必須打電話clutter_actor_queue_redraw()之後,作爲PangoLayout坐鎮比在場景圖的演員一個較低的水平。

一般來說,ClutterText演員不允許你調整它創建的PangoLayout;預計演員負責創建修改佈局,並試圖重寫這會導致性能不佳或未定義的行爲。

如果要引入線間距屬性,那麼你就必須提交一個bug針對ClutterText - 儘管這將意味着,你不得不等到9月用於雜波下一個穩定版本。

如果你並不需要所有的ClutterText不,你只是想顯示的文字,你可以繼承ClutterActor和使用clutter_actor_create_pango_layout()創建PangoLayout,你可以重寫的get_preferred_width()get_preferred_height()內測量,並allocate()虛函數,並在覆蓋內部虛擬功能paint()