aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2016-01-13 00:48:02 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2016-01-13 00:48:02 +0900
commit90f1e51266618a1835f1fd72f0ff5aa840bcebaf (patch)
tree07ed309f60ec98daeb65c9e3bbc74fdcf5946eae
parent9ce82cf4e56ab4e21cac63f99ad3bcd454935c76 (diff)
downloadmikutter-90f1e51266618a1835f1fd72f0ff5aa840bcebaf.tar.gz
in reply to statusを表示するSubPartsを再実装 refs #809
SubPartsMessageBaseを利用。区分を明確にするため、フレームの横にバッジを 表示できるようにした
-rw-r--r--core/mui/cairo_replyviewer.rb3
-rw-r--r--core/mui/cairo_sub_parts_message_base.rb54
-rw-r--r--core/mui/cairo_sub_parts_quote.rb11
-rw-r--r--core/plugin/set_view/set_view.rb2
-rw-r--r--core/skin/data/quote.pngbin9108 -> 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
index d63bafee..942050fb 100644
--- a/core/skin/data/quote.png
+++ b/core/skin/data/quote.png
Binary files differ