dev
Revision | 295f006683a0ec1c27413ad93f4fecf39ed642b3 (tree) |
---|---|
Time | 2013-05-10 06:19:15 |
Author | moccos <tt.izawa@gmai...> |
Commiter | moccos |
Implemented similar image search context menu.
@@ -1,7 +1,7 @@ | ||
1 | 1 | //------------------------------------------------------------------------------ |
2 | 2 | // <auto-generated> |
3 | 3 | // このコードはツールによって生成されました。 |
4 | -// ランタイム バージョン:4.0.30319.18033 | |
4 | +// ランタイム バージョン:4.0.30319.18034 | |
5 | 5 | // |
6 | 6 | // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 |
7 | 7 | // コードが再生成されるときに損失したりします。 |
@@ -626,17 +626,17 @@ namespace OpenTween.Properties { | ||
626 | 626 | /// 更新履歴 |
627 | 627 | /// |
628 | 628 | ///==== Ver 1.1.0-beta1(2013/xx/xx) |
629 | + /// * NEW: タブの表示位置を画面上部に変更可能に (thx @aokomoriuta!) | |
630 | + /// * NEW: mobile.twitter.com/<スクリーン名>/status/<ステータスID> のURLも関連発言表示の対象に追加 | |
631 | + /// * NEW: Favstarなどサードパーティ製サービスのパーマリンクURLも関連発言表示の対象に追加 | |
632 | + /// * FIX: スペースが含まれているURLをブラウザで開こうとするとURLが分断されて複数のタブが開いてしまう問題を修正 (thx @5px!) | |
633 | + /// * FIX: 画面更新時にInvalidOperationExceptionのエラーが発生する不具合を修正 | |
629 | 634 | /// |
630 | 635 | ///==== Ver 1.0.9(2013/04/07) |
631 | 636 | /// * CHG: APIレートリミット関連の実装を修正 |
632 | 637 | /// * FIX: アイコンキャッシュの破棄時にエラーが出ることがある問題を修正 |
633 | 638 | /// * FIX: UserStreamsのunfollowイベントでエラーが起きていたのを修正 |
634 | - /// * FIX: プロフィール画像・サムネイルの表示切り替え時にエラーが起きる場合がある問題を修正 | |
635 | - /// * FIX: タイムライン上のアイコンが空白のまま表示されない場合がある問題を修正 (thx @5px!) | |
636 | - /// * FIX: アカウント追加時の初回認証に失敗する問題を修正 (thx @polka_roco_!) | |
637 | - /// * FIX: ツールバー上のAPIレートリミット表示が正しく動作しなくなった問題を修正 | |
638 | - /// * FIX: ツイタマなど一部のTwitterクライアントから投稿されたツイートの改行が正しく表示されない問題を修正 (thx @ohta8801, @kossetsu_inryo!) | |
639 | - /// * FIX: プロフィール編集画面で入力した [残りの文字列は切り詰められました]"; に類似しているローカライズされた文字列を検索します。 | |
639 | + /// * FIX: プロフィール画像・サムネイルの表示切り替え時にエ [残りの文字列は切り詰められました]"; に類似しているローカライズされた文字列を検索します。 | |
640 | 640 | /// </summary> |
641 | 641 | internal static string ChangeLog { |
642 | 642 | get { |
@@ -2197,6 +2197,15 @@ namespace OpenTween.Properties { | ||
2197 | 2197 | } |
2198 | 2198 | |
2199 | 2199 | /// <summary> |
2200 | + /// 類似画像を検索 に類似しているローカライズされた文字列を検索します。 | |
2201 | + /// </summary> | |
2202 | + internal static string SearchSimilarImageText { | |
2203 | + get { | |
2204 | + return ResourceManager.GetString("SearchSimilarImageText", resourceCulture); | |
2205 | + } | |
2206 | + } | |
2207 | + | |
2208 | + /// <summary> | |
2200 | 2209 | /// [ユーザ・・・{0}] に類似しているローカライズされた文字列を検索します。 |
2201 | 2210 | /// </summary> |
2202 | 2211 | internal static string SetFiltersText1 { |
@@ -1077,4 +1077,7 @@ | ||
1077 | 1077 | <data name="DeleteMenuText2" xml:space="preserve"> |
1078 | 1078 | <value>Undo Retweet (&D)</value> |
1079 | 1079 | </data> |
1080 | + <data name="SearchSimilarImageText" xml:space="preserve"> | |
1081 | + <value>Search similar images</value> | |
1082 | + </data> | |
1080 | 1083 | </root> |
\ No newline at end of file |
@@ -1135,4 +1135,7 @@ | ||
1135 | 1135 | <data name="BrowserStartFailed" xml:space="preserve"> |
1136 | 1136 | <value>ブラウザの起動に失敗しました。エラーコード: {0}</value> |
1137 | 1137 | </data> |
1138 | + <data name="SearchSimilarImageText" xml:space="preserve"> | |
1139 | + <value>類似画像を検索</value> | |
1140 | + </data> | |
1138 | 1141 | </root> |
\ No newline at end of file |
@@ -34,6 +34,7 @@ namespace OpenTween.Thumbnail.Services | ||
34 | 34 | { |
35 | 35 | protected Regex regex; |
36 | 36 | protected string replacement; |
37 | + protected string file_replacement; | |
37 | 38 | |
38 | 39 | public SimpleThumbnailService(string pattern, string replacement) |
39 | 40 | { |
@@ -41,6 +42,13 @@ namespace OpenTween.Thumbnail.Services | ||
41 | 42 | this.replacement = replacement; |
42 | 43 | } |
43 | 44 | |
45 | + public SimpleThumbnailService(string pattern, string replacement, string file_replacement) | |
46 | + { | |
47 | + this.regex = new Regex(pattern, RegexOptions.IgnoreCase); | |
48 | + this.replacement = replacement; | |
49 | + this.file_replacement = file_replacement; | |
50 | + } | |
51 | + | |
44 | 52 | public override ThumbnailInfo GetThumbnailInfo(string url, PostClass post) |
45 | 53 | { |
46 | 54 | var thumbnailUrl = this.ReplaceUrl(url); |
@@ -51,14 +59,21 @@ namespace OpenTween.Thumbnail.Services | ||
51 | 59 | ImageUrl = url, |
52 | 60 | ThumbnailUrl = thumbnailUrl, |
53 | 61 | TooltipText = null, |
62 | + ImageFileUrl = ReplaceUrl(url, this.file_replacement) | |
54 | 63 | }; |
55 | 64 | } |
56 | 65 | |
57 | 66 | protected string ReplaceUrl(string url) |
58 | 67 | { |
68 | + return ReplaceUrl(url, this.replacement); | |
69 | + } | |
70 | + | |
71 | + protected string ReplaceUrl(string url, string replacement) | |
72 | + { | |
73 | + if (replacement == null) return null; | |
59 | 74 | var match = this.regex.Match(url); |
60 | 75 | |
61 | - return match.Success ? match.Result(this.replacement) : null; | |
76 | + return match.Success ? match.Result(replacement) : null; | |
62 | 77 | } |
63 | 78 | } |
64 | 79 | } |
@@ -51,7 +51,10 @@ namespace OpenTween.Thumbnail | ||
51 | 51 | new SimpleThumbnailService(@"^http://(?:i\.)?imgur\.com/(\w+)(?:\..{3})?$", "http://img.imgur.com/${1}l.jpg"), |
52 | 52 | |
53 | 53 | // Twitpic |
54 | - new SimpleThumbnailService(@"^http://(www\.)?twitpic\.com/(?<photoId>\w+)(/full/?)?$", "http://twitpic.com/show/thumb/${photoId}"), | |
54 | + new SimpleThumbnailService( | |
55 | + @"^http://(www\.)?twitpic\.com/(?<photoId>\w+)(/full/?)?$", | |
56 | + "http://twitpic.com/show/thumb/${photoId}", | |
57 | + "http://twitpic.com/show/large/${photoId}"), | |
55 | 58 | |
56 | 59 | // yfrog |
57 | 60 | new SimpleThumbnailService(@"^http://yfrog\.com/(\w+)$", "${0}:small"), |
@@ -30,6 +30,7 @@ namespace OpenTween.Thumbnail | ||
30 | 30 | { |
31 | 31 | public string ImageUrl { get; set; } |
32 | 32 | public string ThumbnailUrl { get; set; } |
33 | - public string TooltipText { get; set; } | |
33 | + public string TooltipText { get; set; } | |
34 | + public string ImageFileUrl { get; set; } | |
34 | 35 | } |
35 | 36 | } |
@@ -13221,8 +13221,8 @@ namespace OpenTween | ||
13221 | 13221 | } |
13222 | 13222 | |
13223 | 13223 | private void tweetThumbnail1_ThumbnailDoubleClick(object sender, ThumbnailDoubleClickEventArgs e) |
13224 | - { | |
13225 | - this.OpenThumbnailPicture(e.Thumbnail); | |
13224 | + { | |
13225 | + this.OpenUriAsync(Uri.EscapeUriString(e.Uri)); | |
13226 | 13226 | } |
13227 | 13227 | |
13228 | 13228 | private void OpenThumbnailPicture(ThumbnailInfo thumbnail) |
@@ -79,6 +79,7 @@ namespace OpenTween | ||
79 | 79 | |
80 | 80 | picbox.Tag = thumb; |
81 | 81 | picbox.LoadAsync(thumb.ThumbnailUrl); |
82 | + picbox.ContextMenu = CreateContextMenu(thumb); | |
82 | 83 | |
83 | 84 | var tooltipText = thumb.TooltipText; |
84 | 85 | if (!string.IsNullOrEmpty(tooltipText)) |
@@ -105,6 +106,42 @@ namespace OpenTween | ||
105 | 106 | return this.task; |
106 | 107 | } |
107 | 108 | |
109 | + private ContextMenu CreateContextMenu(ThumbnailInfo thumb) | |
110 | + { | |
111 | + var contextMenu = new ContextMenu(); | |
112 | + var contextItemSearch = new MenuItem(); | |
113 | + contextItemSearch.Text = Properties.Resources.SearchSimilarImageText; | |
114 | + string search_targe_url = | |
115 | + thumb.ImageFileUrl != null | |
116 | + ? thumb.ImageFileUrl | |
117 | + : thumb.ThumbnailUrl != null | |
118 | + ? thumb.ThumbnailUrl | |
119 | + : null; | |
120 | + | |
121 | + if (search_targe_url != null) | |
122 | + { | |
123 | + contextItemSearch.Click += (sender, e) => | |
124 | + { | |
125 | + string uri = GetImageSearchUri(search_targe_url); | |
126 | + if (this.ThumbnailDoubleClick != null) | |
127 | + { | |
128 | + this.ThumbnailDoubleClick(this, new ThumbnailDoubleClickEventArgs(uri)); | |
129 | + } | |
130 | + }; | |
131 | + } | |
132 | + else | |
133 | + { | |
134 | + contextItemSearch.Enabled = false; | |
135 | + } | |
136 | + contextMenu.MenuItems.Add(contextItemSearch); | |
137 | + return contextMenu; | |
138 | + } | |
139 | + | |
140 | + private string GetImageSearchUri(string image_uri) | |
141 | + { | |
142 | + return @"https://www.google.co.jp/searchbyimage?image_url=" + image_uri; | |
143 | + } | |
144 | + | |
108 | 145 | protected virtual List<ThumbnailInfo> GetThumbailInfo(PostClass post) |
109 | 146 | { |
110 | 147 | return ThumbnailGenerator.GetThumbnails(post); |
@@ -216,18 +253,18 @@ namespace OpenTween | ||
216 | 253 | |
217 | 254 | if (this.ThumbnailDoubleClick != null) |
218 | 255 | { |
219 | - this.ThumbnailDoubleClick(this, new ThumbnailDoubleClickEventArgs(thumb)); | |
256 | + this.ThumbnailDoubleClick(this, new ThumbnailDoubleClickEventArgs(thumb.ImageUrl)); | |
220 | 257 | } |
221 | 258 | } |
222 | 259 | } |
223 | 260 | |
224 | 261 | public class ThumbnailDoubleClickEventArgs : EventArgs |
225 | 262 | { |
226 | - public ThumbnailInfo Thumbnail { get; private set; } | |
263 | + public string Uri { get; private set; } | |
227 | 264 | |
228 | - public ThumbnailDoubleClickEventArgs(ThumbnailInfo thumbnail) | |
265 | + public ThumbnailDoubleClickEventArgs(string uri) | |
229 | 266 | { |
230 | - this.Thumbnail = thumbnail; | |
267 | + this.Uri = uri; | |
231 | 268 | } |
232 | 269 | } |
233 | 270 | } |