Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
13 commits
Select commit Hold shift + click to select a range
0a80625
サムネイル画像の拡大表示を行うMediaViewerLightDialogを追加
upsilon Apr 20, 2018
950604f
MediaViewerLightDialogがロード中に閉じられた場合は画像の読み込みをキャンセルする
upsilon Apr 24, 2018
2638368
画像の拡大表示中に矢印キーが押された場合は前後の画像に切り替える
upsilon Apr 27, 2018
9378254
画像の拡大表示時に表示中の画像のインデックスをダイアログのタイトルに設定する
upsilon Apr 27, 2018
52958cc
画像の拡大表示中にEnterキーが押されたらブラウザを起動して画像を開く
upsilon Apr 27, 2018
e1f5345
画像の詳細表示の種類を SettingLocal.xml で設定可能にする
upsilon Apr 27, 2018
5be8238
画像を埋め込みブラウザで表示する MediaViewerWebBrowserDialog を追加
upsilon Apr 29, 2018
a0e57b1
MediaViewerWebBrowserDialogでの動画の再生機能を追加
upsilon Apr 29, 2018
0e5b70d
埋め込みブラウザに表示するHTMLの生成を別クラスに分離
upsilon Apr 30, 2018
9cd35c3
MediaViewerWebBrowserで表示中の画像のインデックスを持たせる
upsilon Apr 30, 2018
95ff048
MediaViewerWebBrowserDialogに軽量ビューアー版と同様のキーバインドを追加
upsilon Apr 30, 2018
d989a1c
MediaViewer読み込み完了後に画像にフォーカスを当てる
upsilon Aug 4, 2018
727d646
MediaViewerで閲覧中の画像にツールチップでalt_textを表示する
upsilon Aug 4, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions OpenTween/MediaHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// OpenTween - Client of Twitter
// Copyright (c) 2018 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
// All rights reserved.
//
// This file is part of OpenTween.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.

#nullable enable

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenTween.Models;
using OpenTween.Thumbnail;

namespace OpenTween
{
public enum MediaHandlerType
{
/// <summary>外部ブラウザで開く</summary>
ExternalBrowser,

/// <summary>軽量ビューアーで開く</summary>
LightViewer,

/// <summary>埋め込みブラウザで開く</summary>
WebBrowserViewer,
}

public class MediaHandler
{
public MediaHandlerType MediaHandlerType { get; set; }

public Func<IWin32Window, string, Task>? OpenInBrowser { get; set; }

public async Task OpenMediaViewer(IWin32Window owner, ThumbnailInfo[] thumbnails, int displayIndex)
{
switch (this.MediaHandlerType)
{
case MediaHandlerType.ExternalBrowser:
await this.OpenMediaInExternalBrowser(owner, thumbnails, displayIndex);
break;
case MediaHandlerType.LightViewer:
await this.OpenMediaInLightViewer(owner, thumbnails, displayIndex);
break;
case MediaHandlerType.WebBrowserViewer:
this.OpenMediaInWebBrowserViewer(owner, thumbnails, displayIndex);
break;
default:
throw new InvalidEnumArgumentException();
}
}

public async Task OpenMediaInExternalBrowser(IWin32Window owner, ThumbnailInfo[] thumbnails, int displayIndex)
{
var mediaUrl = thumbnails[displayIndex].MediaPageUrl;
if (this.OpenInBrowser != null)
await this.OpenInBrowser(owner, mediaUrl);
}

public async Task OpenMediaInLightViewer(IWin32Window owner, ThumbnailInfo[] thumbnails, int displayIndex)
{
using var viewer = new MediaViewerLight();
using var viewerDialog = new MediaViewerLightDialog(viewer);

viewer.SetMediaItems(thumbnails);
var loadTask = Task.Run(() => viewer.SelectMedia(displayIndex));

viewerDialog.OpenInBrowser = this.OpenInBrowser;
viewerDialog.ShowDialog(owner);

await loadTask;
}

public void OpenMediaInWebBrowserViewer(IWin32Window owner, ThumbnailInfo[] thumbnails, int displayIndex)
{
var viewer = new MediaViewerWebBrowser();
viewer.SetMediaItems(thumbnails);
viewer.SelectMedia(displayIndex);

using var viewerDialog = new MediaViewerWebBrowserDialog(viewer);
viewerDialog.OpenInBrowser = this.OpenInBrowser;
viewerDialog.ShowDialog(owner);
}
}
}
82 changes: 82 additions & 0 deletions OpenTween/MediaViewerLightDialog.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

165 changes: 165 additions & 0 deletions OpenTween/MediaViewerLightDialog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
// OpenTween - Client of Twitter
// Copyright (c) 2018 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
// All rights reserved.
//
// This file is part of OpenTween.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.

#nullable enable

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenTween.Models;

namespace OpenTween
{
public partial class MediaViewerLightDialog : OTBaseForm
{
public Func<IWin32Window, string, Task>? OpenInBrowser;

private readonly MediaViewerLight model;

public MediaViewerLightDialog(MediaViewerLight model)
{
this.InitializeComponent();

this.model = model;
this.model.PropertyChanged +=
(s, e) => this.InvokeAsync(() => this.Model_PropertyChanged(s, e));

this.UpdateAll();
}

private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(MediaViewerLight.MediaItems):
case nameof(MediaViewerLight.DisplayMediaIndex):
this.UpdateTitle();
break;
case nameof(MediaViewerLight.LoadState):
this.UpdateLoadState();
break;
case nameof(MediaViewerLight.ImageSize):
case nameof(MediaViewerLight.ReceivedSize):
this.UpdateLoadProgress();
break;
case nameof(MediaViewerLight.Image):
this.UpdateImage();
break;
case "":
case null:
this.UpdateAll();
break;
default:
break;
}
}

private void UpdateAll()
{
this.UpdateTitle();
this.UpdateLoadState();
this.UpdateLoadProgress();
this.UpdateImage();
}

private void UpdateTitle()
{
const string TITLE_TEMPLATE = "{0}/{1}";

var mediaCount = this.model.MediaItems.Length;
var displayIndex = this.model.DisplayMediaIndex;

if (mediaCount == 1)
this.Text = "";
else
this.Text = string.Format(TITLE_TEMPLATE, displayIndex + 1, mediaCount);
}

private void UpdateLoadState()
{
switch (this.model.LoadState)
{
case MediaViewerLight.LoadStateEnum.BeforeLoad:
case MediaViewerLight.LoadStateEnum.HeaderArrived:
this.progressBar.Visible = true;
this.pictureBox.Visible = false;
break;
case MediaViewerLight.LoadStateEnum.LoadSuccessed:
this.progressBar.Visible = false;
this.pictureBox.Visible = true;
break;
case MediaViewerLight.LoadStateEnum.LoadError:
this.progressBar.Visible = false;
this.pictureBox.Visible = true;
this.pictureBox.ShowErrorImage();
break;
default:
break;
}
}

private void UpdateLoadProgress()
{
if (this.model.ImageSize != null && this.model.ReceivedSize != null)
{
this.progressBar.Maximum = (int?)this.model.ImageSize ?? 0;
this.progressBar.Value = (int?)this.model.ReceivedSize ?? 0;
this.progressBar.Style = ProgressBarStyle.Continuous;
}
else
{
this.progressBar.Style = ProgressBarStyle.Marquee;
}
}

private void UpdateImage()
=> this.pictureBox.Image = this.model.Image;

private async void MediaViewerLightDialog_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.Up:
case Keys.Left:
await this.model.SelectPreviousMedia();
break;
case Keys.Down:
case Keys.Right:
await this.model.SelectNextMedia();
break;
case Keys.Enter:
this.Close();
if (this.OpenInBrowser != null)
await this.OpenInBrowser(this, this.model.DisplayMedia.MediaPageUrl);
break;
case Keys.Escape:
this.Close();
break;
default:
break;
}
}

private void MediaViewerLightDialog_FormClosing(object sender, FormClosingEventArgs e)
=> this.model.AbortLoad();
}
}
7 changes: 7 additions & 0 deletions OpenTween/MediaViewerLightDialog.resx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?><root xml:space="preserve">
<resheader name="resmimetype"><value>text/microsoft-resx</value></resheader>
<resheader name="version"><value>2.0</value></resheader>
<resheader name="reader"><value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader>
<resheader name="writer"><value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader>

</root>
Loading