using System.Diagnostics;\r
using System.Drawing;\r
using System.IO;\r
-using System.Linq;\r
-using System.Net;\r
using System.Windows.Forms;\r
+using KancolleSniffer.Net;\r
+using KancolleSniffer.View;\r
\r
namespace KancolleSniffer\r
{\r
{\r
private readonly Config _config;\r
private readonly MainForm _main;\r
- private readonly NotificationConfigDialog _notificationConfigDialog;\r
\r
- private readonly Dictionary<string, NotificationType> _notificationSettings =\r
- new Dictionary<string, NotificationType>();\r
+ private readonly Dictionary<string, NotificationSpec> _notificationSettings =\r
+ new Dictionary<string, NotificationSpec>();\r
\r
private readonly Dictionary<string, string> _soundSettings = new Dictionary<string, string>();\r
private const string Home = "http://kancollesniffer.osdn.jp/";\r
private Point _prevPosition = new Point(int.MinValue, int.MinValue);\r
\r
+ public List<string> RepeatSettingsChanged { get; } = new List<string>();\r
+ public NotificationConfigDialog NotificationConfigDialog { get; }\r
+\r
public ConfigDialog(Config config, MainForm main)\r
{\r
InitializeComponent();\r
listBoxSoundFile.Items.AddRange(Config.NotificationNames);\r
numericUpDownMaterialLogInterval.Maximum = 1440;\r
\r
- _notificationConfigDialog = new NotificationConfigDialog(_notificationSettings,\r
+ NotificationConfigDialog = new NotificationConfigDialog(_notificationSettings,\r
new Dictionary<NotificationType, CheckBox>\r
{\r
{NotificationType.FlashWindow, checkBoxFlash},\r
{NotificationType.ShowBaloonTip, checkBoxBalloon},\r
- {NotificationType.PlaySound, checkBoxSound}\r
+ {NotificationType.PlaySound, checkBoxSound},\r
+ {NotificationType.Repeat, checkBoxRepeat}\r
});\r
}\r
\r
{\r
if (_prevPosition.X != int.MinValue)\r
Location = _prevPosition;\r
- var version = string.Join(".", Application.ProductVersion.Split('.').Take(2));\r
- labelVersion.Text = "バージョン" + version;\r
- SetLatestVersion(version);\r
+ _main.CheckVersionUp((current, latest) =>\r
+ {\r
+ labelVersion.Text = "バージョン" + current;\r
+ labelLatest.Text = current == latest ? "最新です" : "最新は" + latest + "です";\r
+ });\r
labelCopyright.Text = FileVersionInfo.GetVersionInfo(Application.ExecutablePath).LegalCopyright;\r
\r
checkBoxTopMost.Checked = _config.TopMost;\r
checkBoxHideOnMinimized.Checked = _config.HideOnMinimized;\r
+ checkBoxExitSilently.Checked = _config.ExitSilently;\r
+ checkBoxLocationPerMachine.Checked = _config.SaveLocationPerMachine;\r
comboBoxZoom.SelectedItem = _config.Zoom + "%";\r
\r
- checkBoxFlash.Checked = _config.FlashWindow;\r
- checkBoxBalloon.Checked = _config.ShowBaloonTip;\r
- checkBoxSound.Checked = _config.PlaySound;\r
+ checkBoxFlash.Checked = (_config.NotificationFlags & NotificationType.FlashWindow) != 0;\r
+ checkBoxBalloon.Checked = (_config.NotificationFlags & NotificationType.ShowBaloonTip) != 0;\r
+ checkBoxSound.Checked = (_config.NotificationFlags & NotificationType.PlaySound) != 0;\r
+ checkBoxRepeat.Checked = (_config.NotificationFlags & NotificationType.Repeat) != 0;\r
foreach (var name in Config.NotificationNames)\r
_notificationSettings[name] = _config.Notifications[name];\r
numericUpDownMarginShips.Value = _config.MarginShips;\r
\r
checkBoxReset02.Checked = _config.ResetHours.Contains(2);\r
checkBoxReset14.Checked = _config.ResetHours.Contains(14);\r
- radioButtonResultRankAlways.Checked = _config.AlwaysShowResultRank;\r
- radioButtonResultRankWhenClick.Checked = !_config.AlwaysShowResultRank;\r
+ checkBoxResultRank.Checked = (_config.Spoilers & Spoiler.ResultRank) != 0;\r
+ checkBoxAirBattleResult.Checked = (_config.Spoilers & Spoiler.AirBattleResult) != 0;\r
+ checkBoxBattleResult.Checked = (_config.Spoilers & Spoiler.BattleResult) != 0;\r
+ checkBoxNextCell.Checked = (_config.Spoilers & Spoiler.NextCell) != 0;\r
checkBoxPresetAkashi.Checked = _config.UsePresetAkashi;\r
\r
numericUpDownSoundVolume.Value = _config.Sounds.Volume;\r
LoadProxySettings();\r
LoadLogSettings();\r
LoadDebugSettings();\r
- checkBoxKancolleDbOn.Checked = _config.KancolleDb.On;\r
- textBoxKancolleDbToken.Text = _config.KancolleDb.Token;\r
+\r
+ checkBoxPushbulletOn.Checked = _config.Pushbullet.On;\r
+ textBoxPushbulletToken.Text = _config.Pushbullet.Token;\r
+ checkBoxPushoverOn.Checked = _config.Pushover.On;\r
+ textBoxPushoverApiKey.Text = _config.Pushover.ApiKey;\r
+ textBoxPushoverUserKey.Text = _config.Pushover.UserKey;\r
}\r
\r
private void LoadProxySettings()\r
textBoxDebugLog.Text = _config.DebugLogFile;\r
}\r
\r
- private async void SetLatestVersion(string version)\r
- {\r
- try\r
- {\r
- var req = WebRequest.Create(Home + "version");\r
- var response = await req.GetResponseAsync();\r
- var stream = response.GetResponseStream();\r
- if (stream == null)\r
- return;\r
- using (var reader = new StreamReader(stream))\r
- {\r
- var str = await reader.ReadLineAsync();\r
- try\r
- {\r
- Invoke(new Action(() => { labelLatest.Text = version == str ? "最新です" : "最新は" + str + "です"; }));\r
- }\r
- catch (InvalidOperationException)\r
- {\r
- }\r
- }\r
- }\r
- catch (WebException)\r
- {\r
- }\r
- }\r
-\r
private void buttonOk_Click(object sender, EventArgs e)\r
{\r
- int listen, outbound, server;\r
- if (!ValidatePorts(out listen, out outbound, out server))\r
+ if (!ValidatePorts(out var listen, out var outbound, out _))\r
return;\r
DialogResult = DialogResult.OK;\r
if (!ApplyProxySettings(listen, outbound))\r
DialogResult = DialogResult.None;\r
ApplyLogSettings();\r
ApplyDebugSettings();\r
- _config.KancolleDb.On = checkBoxKancolleDbOn.Checked;\r
- _config.KancolleDb.Token = textBoxKancolleDbToken.Text;\r
+\r
+ _config.Pushbullet.On = checkBoxPushbulletOn.Checked;\r
+ _config.Pushbullet.Token = textBoxPushbulletToken.Text;\r
+ _config.Pushover.On = checkBoxPushoverOn.Checked;\r
+ _config.Pushover.ApiKey = textBoxPushoverApiKey.Text;\r
+ _config.Pushover.UserKey = textBoxPushoverUserKey.Text;\r
\r
_config.TopMost = checkBoxTopMost.Checked;\r
_config.HideOnMinimized = checkBoxHideOnMinimized.Checked;\r
+ _config.ExitSilently = checkBoxExitSilently.Checked;\r
+ _config.SaveLocationPerMachine = checkBoxLocationPerMachine.Checked;\r
_config.Zoom = int.Parse(comboBoxZoom.SelectedItem.ToString().Substring(0, 3));\r
- _config.FlashWindow = checkBoxFlash.Checked;\r
- _config.ShowBaloonTip = checkBoxBalloon.Checked;\r
- _config.PlaySound = checkBoxSound.Checked;\r
- foreach (var name in Config.NotificationNames)\r
- _config.Notifications[name] = _notificationSettings[name];\r
+ _config.NotificationFlags = (checkBoxFlash.Checked ? NotificationType.FlashWindow : 0) |\r
+ (checkBoxBalloon.Checked ? NotificationType.ShowBaloonTip : 0) |\r
+ (checkBoxSound.Checked ? NotificationType.PlaySound : 0) |\r
+ (checkBoxRepeat.Checked ? NotificationType.Repeat : 0);\r
_config.MarginShips = (int)numericUpDownMarginShips.Value;\r
_config.MarginEquips = (int)numericUpDownMarginEquips.Value;\r
\r
+ RepeatSettingsChanged.Clear();\r
+ var repeatOff = (_config.NotificationFlags & NotificationType.Repeat) == 0;\r
+ foreach (var name in Config.NotificationNames)\r
+ {\r
+ var old = _config.Notifications[name];\r
+ var cur = _notificationSettings[name];\r
+ if (repeatOff || old.RepeatInterval != cur.RepeatInterval ||\r
+ (cur.Flags & NotificationType.Repeat) == 0 ||\r
+ (cur.Flags & NotificationType.Cont) == 0)\r
+ {\r
+ RepeatSettingsChanged.Add(name);\r
+ }\r
+ _config.Notifications[name] = cur;\r
+ }\r
+\r
_config.NotifyConditions.Clear();\r
if (checkBoxCond40.Checked)\r
_config.NotifyConditions.Add(40);\r
if (checkBoxReset14.Checked)\r
_config.ResetHours.Add(14);\r
\r
- _config.AlwaysShowResultRank = radioButtonResultRankAlways.Checked;\r
+ _config.Spoilers = (checkBoxResultRank.Checked ? Spoiler.ResultRank : 0) |\r
+ (checkBoxAirBattleResult.Checked ? Spoiler.AirBattleResult : 0) |\r
+ (checkBoxBattleResult.Checked ? Spoiler.BattleResult : 0) |\r
+ (checkBoxNextCell.Checked ? Spoiler.NextCell : 0);\r
_config.UsePresetAkashi = checkBoxPresetAkashi.Checked;\r
\r
_config.Sounds.Volume = (int)numericUpDownSoundVolume.Value;\r
foreach (var name in Config.NotificationNames)\r
- _config.Sounds[name] = _soundSettings[name];\r
+ _config.Sounds[name] = MakePathRooted(_soundSettings[name]);\r
}\r
\r
private bool ValidatePorts(out int listen, out int outbound, out int server)\r
{\r
_config.Log.On = checkBoxOutput.Checked;\r
_config.Log.MaterialLogInterval = (int)numericUpDownMaterialLogInterval.Value;\r
- _config.Log.OutputDir = textBoxOutput.Text;\r
+ _config.Log.OutputDir = MakePathRooted(textBoxOutput.Text);\r
_main.ApplyLogSetting();\r
}\r
\r
private void ApplyDebugSettings()\r
{\r
_config.DebugLogging = checkBoxDebugLog.Checked;\r
- _config.DebugLogFile = textBoxDebugLog.Text;\r
+ _config.DebugLogFile = MakePathRooted(textBoxDebugLog.Text);\r
_main.ApplyDebugLogSetting();\r
}\r
\r
+ private string MakePathRooted(string path)\r
+ {\r
+ try\r
+ {\r
+ return string.IsNullOrWhiteSpace(path)\r
+ ? ""\r
+ : Path.IsPathRooted(path)\r
+ ? path\r
+ : Path.Combine(Config.BaseDir, path);\r
+ }\r
+ catch (ArgumentException)\r
+ {\r
+ return "";\r
+ }\r
+ }\r
+\r
private void textBoxSoundFile_TextChanged(object sender, EventArgs e)\r
{\r
_soundSettings[(string)listBoxSoundFile.SelectedItem] = textBoxSoundFile.Text;\r
\r
private void buttonOpenFile_Click(object sender, EventArgs e)\r
{\r
- openSoundFileDialog.FileName = textBoxSoundFile.Text;\r
- openSoundFileDialog.InitialDirectory = Path.GetDirectoryName(textBoxSoundFile.Text) ?? "";\r
+ SetInitialPath(openSoundFileDialog, textBoxSoundFile.Text);\r
if (openSoundFileDialog.ShowDialog() != DialogResult.OK)\r
return;\r
textBoxSoundFile.Text = openSoundFileDialog.FileName;\r
\r
private void buttonResetAchievement_Click(object sender, EventArgs e)\r
{\r
- _main.ResetAchievemnt();\r
+ _main.ResetAchievement();\r
}\r
\r
private void linkLabelProductName_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\r
ShowToolTip("0より大きい数字を入力してください。", textBox);\r
return false;\r
}\r
+ if (result > 65535)\r
+ {\r
+ ShowToolTip("65535以下の数字を入力してください。", textBox);\r
+ return false;\r
+ }\r
return true;\r
}\r
\r
+ private readonly ResizableToolTip _toolTip =\r
+ new ResizableToolTip {AutomaticDelay = 0, ToolTipIcon = ToolTipIcon.Error};\r
+\r
private void ShowToolTip(string message, Control control)\r
{\r
tabControl.SelectedTab = (TabPage)control.Parent.Parent;\r
- toolTipError.Show(message, control, 0, control.Height, 3000);\r
+ _toolTip.Show(message, control, 0, control.Height, 3000);\r
}\r
\r
private void textBox_Enter(object sender, EventArgs e)\r
{\r
- toolTipError.Hide((Control)sender);\r
+ _toolTip.Hide((Control)sender);\r
}\r
\r
private void buttonDebugLogOpenFile_Click(object sender, EventArgs e)\r
{\r
- openDebugLogDialog.FileName = textBoxDebugLog.Text;\r
- openDebugLogDialog.InitialDirectory = Path.GetDirectoryName(textBoxDebugLog.Text);\r
+ SetInitialPath(openDebugLogDialog, textBoxDebugLog.Text);\r
if (openDebugLogDialog.ShowDialog(this) == DialogResult.OK)\r
textBoxDebugLog.Text = openDebugLogDialog.FileName;\r
textBoxDebugLog.Select(textBoxDebugLog.Text.Length, 0);\r
}\r
\r
+ private void SetInitialPath(OpenFileDialog dialog, string path)\r
+ {\r
+ var dir = Config.BaseDir;\r
+ var file = "";\r
+ if (!string.IsNullOrWhiteSpace(path))\r
+ {\r
+ var res = Path.GetDirectoryName(path);\r
+ if (res == null) // root\r
+ {\r
+ dir = path;\r
+ }\r
+ else if (res != "") // contain directory\r
+ {\r
+ dir = res;\r
+ file = Path.GetFileName(path);\r
+ }\r
+ else\r
+ {\r
+ file = path;\r
+ }\r
+ }\r
+ dialog.InitialDirectory = dir;\r
+ dialog.FileName = file;\r
+ }\r
+\r
private void buttonPlayDebugLog_Click(object sender, EventArgs e)\r
{\r
_main.SetPlayLog(textBoxDebugLog.Text);\r
\r
private void buttonDetailedSettings_Click(object sender, EventArgs e)\r
{\r
- _notificationConfigDialog.ShowDialog(this);\r
+ NotificationConfigDialog.ShowDialog(this);\r
}\r
\r
private void ConfigDialog_FormClosing(object sender, FormClosingEventArgs e)\r
{\r
_prevPosition = Location;\r
}\r
+\r
+ private void buttonPushbulletTest_Click(object sender, EventArgs e)\r
+ {\r
+ try\r
+ {\r
+ PushNotification.PushToPushbullet(textBoxPushbulletToken.Text, "KancolleSniffer", "うまくいったかな?");\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ MessageBox.Show(this, ex.Message, "Pushbulletエラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ }\r
+ }\r
+\r
+ private void buttonPushoverTest_Click(object sender, EventArgs e)\r
+ {\r
+ try\r
+ {\r
+ PushNotification.PushToPushover(textBoxPushoverApiKey.Text, textBoxPushoverUserKey.Text,\r
+ "KancolleSniffer", "うまくいったかな?");\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ MessageBox.Show(this, ex.Message, "Pushoverエラー", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ }\r
+ }\r
+\r
+ protected override void ScaleControl(SizeF factor, BoundsSpecified specified)\r
+ {\r
+ base.ScaleControl(factor, specified);\r
+ if (factor.Height > 1)\r
+ _toolTip.Font = new Font(_toolTip.Font.FontFamily, _toolTip.Font.Size * factor.Height);\r
+ }\r
}\r
}
\ No newline at end of file