mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-05-14 20:34:08 +02:00
142 lines
4.5 KiB
C#
142 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using TweetDuck.Plugins;
|
|
using System.Windows.Forms;
|
|
using TweetDuck.Core.Utils;
|
|
|
|
namespace TweetDuck.Core.Notification{
|
|
sealed partial class FormNotificationTweet : FormNotificationMain{
|
|
private const int NonIntrusiveIdleLimit = 30;
|
|
private const int TrimMinimum = 32;
|
|
|
|
private bool IsCursorOverNotificationArea => new Rectangle(PrimaryLocation, Size).Contains(Cursor.Position);
|
|
|
|
private readonly Queue<TweetNotification> tweetQueue = new Queue<TweetNotification>(4);
|
|
private bool needsTrim;
|
|
|
|
public FormNotificationTweet(FormBrowser owner, PluginManager pluginManager) : base(owner, pluginManager, true){
|
|
InitializeComponent();
|
|
|
|
Program.UserConfig.MuteToggled += Config_MuteToggled;
|
|
Disposed += (sender, args) => Program.UserConfig.MuteToggled -= Config_MuteToggled;
|
|
|
|
if (Program.UserConfig.MuteNotifications){
|
|
PauseNotification();
|
|
}
|
|
}
|
|
|
|
private void FormNotificationTweet_FormClosing(object sender, FormClosingEventArgs e){
|
|
if (e.CloseReason == CloseReason.UserClosing){
|
|
tweetQueue.Clear(); // already canceled
|
|
TrimQueue();
|
|
}
|
|
}
|
|
|
|
private void TrimQueue(){
|
|
if (needsTrim){
|
|
tweetQueue.TrimExcess();
|
|
needsTrim = false;
|
|
}
|
|
}
|
|
|
|
// event handlers
|
|
|
|
private void Config_MuteToggled(object sender, EventArgs e){
|
|
if (Program.UserConfig.MuteNotifications){
|
|
PauseNotification();
|
|
}
|
|
else{
|
|
ResumeNotification();
|
|
}
|
|
}
|
|
|
|
private void timerCursorCheck_Tick(object sender, EventArgs e){
|
|
if (!IsCursorOverNotificationArea){
|
|
ResumeNotification();
|
|
timerCursorCheck.Stop();
|
|
}
|
|
}
|
|
|
|
private void timerIdlePauseCheck_Tick(object sender, EventArgs e){
|
|
if (NativeMethods.GetIdleSeconds() < Program.UserConfig.NotificationIdlePauseSeconds){
|
|
ResumeNotification();
|
|
timerIdlePauseCheck.Stop();
|
|
}
|
|
}
|
|
|
|
// notification methods
|
|
|
|
public override void ShowNotification(TweetNotification notification){
|
|
if (IsPaused){
|
|
tweetQueue.Enqueue(notification);
|
|
}
|
|
else{
|
|
tweetQueue.Enqueue(notification);
|
|
UpdateTitle();
|
|
|
|
if (totalTime == 0){
|
|
LoadNextNotification();
|
|
}
|
|
}
|
|
|
|
needsTrim |= tweetQueue.Count >= TrimMinimum;
|
|
}
|
|
|
|
public override void FinishCurrentNotification(){
|
|
if (tweetQueue.Count > 0){
|
|
LoadNextNotification();
|
|
}
|
|
else{
|
|
HideNotification(true);
|
|
TrimQueue();
|
|
}
|
|
}
|
|
|
|
public override void ResumeNotification(){
|
|
bool wasPaused = IsPaused;
|
|
base.ResumeNotification();
|
|
|
|
if (wasPaused && !IsPaused && !pausedDuringNotification && tweetQueue.Count > 0){
|
|
LoadNextNotification();
|
|
}
|
|
}
|
|
|
|
private void LoadNextNotification(){
|
|
if (!IsNotificationVisible){
|
|
if (Program.UserConfig.NotificationNonIntrusiveMode && IsCursorOverNotificationArea && NativeMethods.GetIdleSeconds() < NonIntrusiveIdleLimit){
|
|
if (!timerCursorCheck.Enabled){
|
|
PauseNotification();
|
|
timerCursorCheck.Start();
|
|
}
|
|
|
|
return;
|
|
}
|
|
else if (Program.UserConfig.NotificationIdlePauseSeconds > 0 && NativeMethods.GetIdleSeconds() >= Program.UserConfig.NotificationIdlePauseSeconds){
|
|
if (!timerIdlePauseCheck.Enabled){
|
|
PauseNotification();
|
|
timerIdlePauseCheck.Start();
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
LoadTweet(tweetQueue.Dequeue());
|
|
}
|
|
|
|
protected override void UpdateTitle(){
|
|
base.UpdateTitle();
|
|
|
|
if (tweetQueue.Count > 0){
|
|
Text = Text+" ("+tweetQueue.Count+" more left)";
|
|
}
|
|
}
|
|
|
|
protected override void OnNotificationReady(){
|
|
UpdateTitle();
|
|
base.OnNotificationReady();
|
|
}
|
|
}
|
|
}
|