diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-01-13 00:48:02 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-01-13 00:48:02 +0900 |
commit | 90f1e51266618a1835f1fd72f0ff5aa840bcebaf (patch) | |
tree | 07ed309f60ec98daeb65c9e3bbc74fdcf5946eae | |
parent | 9ce82cf4e56ab4e21cac63f99ad3bcd454935c76 (diff) | |
download | mikutter-90f1e51266618a1835f1fd72f0ff5aa840bcebaf.tar.gz |
in reply to statusを表示するSubPartsを再実装 refs #809
SubPartsMessageBaseを利用。区分を明確にするため、フレームの横にバッジを
表示できるようにした
-rw-r--r-- | core/mui/cairo_replyviewer.rb | 3 | ||||
-rw-r--r-- | core/mui/cairo_sub_parts_message_base.rb | 54 | ||||
-rw-r--r-- | core/mui/cairo_sub_parts_quote.rb | 11 | ||||
-rw-r--r-- | core/plugin/set_view/set_view.rb | 2 | ||||
-rw-r--r-- | core/skin/data/quote.png | bin | 9108 -> 10631 bytes |
5 files changed, 53 insertions, 17 deletions
diff --git a/core/mui/cairo_replyviewer.rb b/core/mui/cairo_replyviewer.rb index 633ff817..47651ba4 100644 --- a/core/mui/cairo_replyviewer.rb +++ b/core/mui/cairo_replyviewer.rb @@ -14,4 +14,7 @@ class Gdk::ReplyViewer < Gdk::SubPartsMessageBase @messages = Messages.new([reply]).freeze render_messages }.terminate('リプライ描画中にエラーが発生しました') end end + + def badge + Gdk::Pixbuf.new(Skin.get('reply.png'), @badge_radius*2, @badge_radius*2) end end diff --git a/core/mui/cairo_sub_parts_message_base.rb b/core/mui/cairo_sub_parts_message_base.rb index 5290bd29..40181b13 100644 --- a/core/mui/cairo_sub_parts_message_base.rb +++ b/core/mui/cairo_sub_parts_message_base.rb @@ -13,13 +13,19 @@ class Gdk::SubPartsMessageBase < Gdk::SubParts def messages nil end + # 左上に表示するバッジ。nilを還した場合は何も表示しない。 + # ==== Return + # Gdk::Pixbuf 表示する画像 + def badge + nil end + # サブクラスで領域をクリックした時の処理を実装すること - def on_click(this, e, x, y, message) + def on_click(e, message) end def initialize(*args) super - @icon_width, @icon_height, @margin, @edge = 32, 32, 2, 8 end + @icon_width, @icon_height, @margin, @edge, @badge_radius = 32, 32, 2, 8, 6 end def render_messages if not helper.destroyed? @@ -54,13 +60,15 @@ class Gdk::SubPartsMessageBase < Gdk::SubParts def render_single_message(message, context, base_y) render_outline(message, context, base_y) render_header(message, context, base_y) - context.save { + context.save do context.translate(@margin + @edge, @margin + @edge + base_y) context.set_source_pixbuf(main_icon(message)) context.paint - context.translate(icon_width + @margin*2, header_left(message).size[1] / Pango::SCALE) - context.set_source_rgb(*([0,0,0]).map{ |c| c.to_f / 65536 }) - context.show_pango_layout(main_message(message, context)) } + context.save do + context.translate(icon_width + @margin*2, header_left(message).size[1] / Pango::SCALE) + context.set_source_rgb(*([0,0,0]).map{ |c| c.to_f / 65536 }) + context.show_pango_layout(main_message(message, context)) end + render_badge(message, context) end base_y + message_height(message) end @@ -103,7 +111,7 @@ class Gdk::SubPartsMessageBase < Gdk::SubParts context.save{ context.translate(header_w - hr_layout.size[0] / Pango::SCALE, 0) if (hl_layout.size[0] / Pango::SCALE) > header_w - hr_layout.size[0] / Pango::SCALE - 20 - r, g, b = get_backgroundcolor + r, g, b = backgroundcolor(message) grad = Cairo::LinearPattern.new(-20, base_y, hr_layout.size[0] / Pango::SCALE + 20, base_y) grad.add_color_stop_rgba(0.0, r, g, b, 0.0) grad.add_color_stop_rgba(20.0 / (hr_layout.size[0] / Pango::SCALE + 20), r, g, b, 1.0) @@ -134,17 +142,41 @@ class Gdk::SubPartsMessageBase < Gdk::SubParts } } context.fill { - context.set_source_rgb(*([65535, 65535, 65535]).map{ |c| c.to_f / 65536 }) + context.set_source_rgb(*backgroundcolor(message)) context.rounded_rectangle(@edge, @edge + base_y, width - @edge*2, mh - @edge*2, 4) } } end + def render_badge(message, context) + badge_pixbuf = badge() + if badge_pixbuf + context.save { + context.pseudo_blur(4) { + context.fill { + context.set_source_rgb(*([32767, 32767, 32767]).map{ |c| c.to_f / 65536 }) + context.circle(0, 0, @badge_radius) + } + } + context.fill { + context.set_source_rgb(*backgroundcolor(message)) + context.circle(0, 0, @badge_radius) + } + } + + context.translate(-@badge_radius, -@badge_radius) + context.set_source_pixbuf(badge_pixbuf) + context.paint end + end + def main_icon(message) Gdk::WebImageLoader.pixbuf(message[:user][:profile_image_url], icon_width, icon_height){ |pixbuf| helper.on_modify } end - def get_backgroundcolor - [1.0, 1.0, 1.0] - end + def backgroundcolor(message) + color = Plugin.filtering(:message_background_color, message, nil).last + if color.is_a? Array and 3 == color.size + color.map{ |c| c.to_f / 65536 } + else + [1.0]*3 end end end diff --git a/core/mui/cairo_sub_parts_quote.rb b/core/mui/cairo_sub_parts_quote.rb index 9612292b..49f58b1c 100644 --- a/core/mui/cairo_sub_parts_quote.rb +++ b/core/mui/cairo_sub_parts_quote.rb @@ -2,9 +2,6 @@ miquire :mui, 'sub_parts_message_base' -require 'gtk2' -require 'cairo' - class Gdk::SubPartsQuote < Gdk::SubPartsMessageBase register @@ -15,7 +12,7 @@ class Gdk::SubPartsQuote < Gdk::SubPartsMessageBase case e.button when 1 Plugin.filtering(:command, {}).first[:smartthread][:exec].call(Struct.new(:messages).new([message])) - end end + end end def initialize(*args) super @@ -25,4 +22,8 @@ class Gdk::SubPartsQuote < Gdk::SubPartsMessageBase }.next{ |quoting| @messages = Messages.new(quoting).freeze render_messages - }.terminate('コメント付きリツイート描画中にエラーが発生しました') end end end + }.terminate('コメント付きリツイート描画中にエラーが発生しました') end end + + def badge + Gdk::Pixbuf.new(Skin.get('quote.png'), @badge_radius*2, @badge_radius*2) end +end diff --git a/core/plugin/set_view/set_view.rb b/core/plugin/set_view/set_view.rb index 0756d2b4..d6be9fa4 100644 --- a/core/plugin/set_view/set_view.rb +++ b/core/plugin/set_view/set_view.rb @@ -6,7 +6,7 @@ Plugin::create(:set_view) do filter_message_background_color do |message, color| if !color - color = if(message.selected) + color = if(message.respond_to?(:selected) && message.selected) UserConfig[:mumble_selected_bg] elsif(message.to_message.system?) UserConfig[:mumble_system_bg] diff --git a/core/skin/data/quote.png b/core/skin/data/quote.png Binary files differindex d63bafee..942050fb 100644 --- a/core/skin/data/quote.png +++ b/core/skin/data/quote.png |