diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml
index f4ddc1e..a3dbc96 100644
--- a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml
@@ -18,7 +18,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
@@ -40,7 +40,7 @@
-
+
@@ -50,13 +50,14 @@
+
-
+
@@ -65,24 +66,31 @@
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml.cs b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml.cs
index 366eba5..0653c7b 100644
--- a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml.cs
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/ManageQueueDialog.xaml.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
@@ -14,6 +15,7 @@ using XDM.Core.Lib.Common;
using XDM.Core.Lib.UI;
using XDM.Wpf.UI.Common;
using XDM.Wpf.UI.Win32;
+using XDMApp;
namespace XDM.Wpf.UI.Dialogs.QueuesWindow
{
@@ -30,10 +32,59 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
public event EventHandler? QueueStopRequested;
public event EventHandler? WindowClosing;
+ private readonly ObservableCollection queues = new();
+ private readonly ObservableCollection downloads = new();
+
public ManageQueueDialog(IAppUI appUI)
{
InitializeComponent();
+
this.appUI = appUI;
+
+ this.defaultSchedule = new DownloadSchedule
+ {
+ StartTime = DateTime.Now.TimeOfDay,
+ EndTime = DateTime.Now.Date.AddHours(23).AddMinutes(59).TimeOfDay
+ };
+
+ this.SchedulerPanel.Schedule = defaultSchedule;
+
+ this.SchedulerPanel.ValueChanged += (_, _) =>
+ {
+ if (ChkEnableScheduler.IsChecked.HasValue && ChkEnableScheduler.IsChecked.Value)
+ {
+ if (LbQueues.SelectedItem is DownloadQueue queue)
+ {
+ queue.Schedule = this.SchedulerPanel.Schedule;
+ }
+ }
+ };
+
+ this.LbQueues.ItemsSource = queues;
+
+ this.lvFiles.ItemsSource = downloads;
+ this.lvFiles.SelectionChanged += (_, _) => ListSelectionChanged();
+
+ this.ChkEnableScheduler.Checked += (_, _) =>
+ {
+ SchedulerPanel.IsEnabled = true;
+ if (LbQueues.SelectedItem is DownloadQueue queue)
+ {
+ queue.Schedule = this.SchedulerPanel.Schedule;
+ }
+ };
+
+ this.ChkEnableScheduler.Unchecked += (_, _) =>
+ {
+ SchedulerPanel.IsEnabled = false;
+ if (LbQueues.SelectedItem is DownloadQueue queue)
+ {
+ queue.Schedule = null;
+ }
+ };
+
+ Closing += (_, _) =>
+ this.WindowClosing?.Invoke(this, EventArgs.Empty);
}
protected override void OnSourceInitialized(EventArgs e)
@@ -46,17 +97,46 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
private void BtnNew_Click(object sender, RoutedEventArgs e)
{
- new NewQueueWindow(this.appUI, (a, b) => { }, null) { Owner = this }.ShowDialog(this);
+ new NewQueueWindow(this.appUI, (queue, newQueue) =>
+ {
+ this.queues.Add(queue);
+ }, null)
+ { Owner = this }.ShowDialog(this);
}
public void RefreshView()
{
- //throw new NotImplementedException();
+ if (LbQueues.SelectedItem is DownloadQueue queue)
+ {
+ ClearCollection(this.downloads);
+ var realQueue = QueueManager.GetQueue(queue.ID);
+
+ if (realQueue != null)
+ {
+ foreach (var id in realQueue.DownloadIds)
+ {
+ var entry = appUI.GetInProgressDownloadEntry(id);
+ if (entry != null)
+ {
+ this.downloads.Add(entry);
+ }
+ }
+ }
+ }
+ }
+
+ private void ListSelectionChanged()
+ {
+ BtnAdd.IsEnabled = BtnRemove.IsEnabled = BtnUp.IsEnabled = BtnDown.IsEnabled = lvFiles.SelectedItems.Count > 0;
}
public void SetData(IEnumerable queues)
{
- //throw new NotImplementedException();
+ ClearCollection(this.queues);
+ foreach (var item in queues)
+ {
+ this.queues.Add(item);
+ }
}
public void ShowWindow(object peer)
@@ -64,5 +144,199 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
this.Owner = (Window)peer;
NativeMethods.ShowDialog(this, (Window)peer);
}
+
+ private void LoadQueueDetails(DownloadQueue queue)
+ {
+ lvFiles.UnselectAll();
+ ClearCollection(this.downloads);
+ foreach (var id in queue.DownloadIds)
+ {
+ var ent = appUI.GetInProgressDownloadEntry(id);
+ if (ent != null)
+ {
+ this.downloads.Add(ent);
+ }
+ }
+ lvFiles.ItemsSource = this.downloads;
+ ChkEnableScheduler.IsChecked = queue.Schedule.HasValue;
+ if (queue.Schedule.HasValue)
+ {
+ this.SchedulerPanel.Schedule = queue.Schedule.Value;
+ }
+ else
+ {
+ this.SchedulerPanel.Schedule = this.defaultSchedule;
+ }
+ this.SchedulerPanel.Schedule = queue.Schedule ?? default;
+ }
+
+ private void EnableControls(bool enable)
+ {
+ this.Tab.IsEnabled = enable;
+ this.BtnNew.IsEnabled = this.BtnDel.IsEnabled = this.BtnStart.IsEnabled = this.BtnStop.IsEnabled = enable;
+ }
+
+ private void UpdateControls(DownloadQueue? queue)
+ {
+ if (queue != null)
+ {
+ LoadQueueDetails(queue);
+ EnableControls(true);
+ }
+ else
+ {
+ this.SchedulerPanel.Schedule = defaultSchedule;
+ EnableControls(false);
+ }
+ }
+
+ private void ClearCollection(ObservableCollection collection)
+ {
+ for (int i = collection.Count - 1; i >= 0; i--)
+ {
+ collection.RemoveAt(i);
+ }
+ }
+
+ private void BtnSave_Click(object sender, RoutedEventArgs e)
+ {
+ SaveQueues();
+ Close();
+ }
+
+ private void SaveQueues()
+ {
+ QueuesModified?.Invoke(this, new QueueListEventArgs(this.queues.Select(x => x).ToList()));
+ }
+
+ private void BtnStart_Click(object sender, RoutedEventArgs e)
+ {
+ SaveQueues();
+ var queue = (DownloadQueue)LbQueues.SelectedItem;
+ QueueStartRequested?.Invoke(this, new DownloadListEventArgs(queue.DownloadIds));
+ }
+
+ private void BtnStop_Click(object sender, RoutedEventArgs e)
+ {
+ SaveQueues();
+ var queue = (DownloadQueue)LbQueues.SelectedItem;
+ QueueStopRequested?.Invoke(this, new DownloadListEventArgs(queue.DownloadIds));
+ }
+
+ private void BtnDel_Click(object sender, RoutedEventArgs e)
+ {
+ if (LbQueues.SelectedIndex >= 0)
+ {
+ this.queues.RemoveAt(LbQueues.SelectedIndex);
+ }
+ }
+
+ private void BtnCancel_Click(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void BtnAdd_Click(object sender, RoutedEventArgs e)
+ {
+ if (LbQueues.SelectedIndex < 0) return;
+ var newQueueDialog = new NewQueueWindow(appUI, (queue, newQueue) =>
+ {
+ LoadQueueDetails(queue);
+ }, (DownloadQueue)LbQueues.SelectedItem)
+ { Owner = this }.ShowDialog(this);
+ }
+
+ private void BtnRemove_Click(object sender, RoutedEventArgs e)
+ {
+ var selectedQueue = (DownloadQueue)LbQueues.SelectedItem;
+ if (selectedQueue == null) return;
+ foreach (InProgressDownloadEntry entry in this.downloads)
+ {
+ selectedQueue.DownloadIds.Remove(entry.Id);
+ }
+ LoadQueueDetails(selectedQueue);
+ }
+
+ private void BtnUp_Click(object sender, RoutedEventArgs e)
+ {
+ //if (listView1.SelectedIndices.Count > 0 && listView1.SelectedIndices[0] > 0)
+ //{
+ // var lvi = listView1.Items[listView1.SelectedIndices[0] - 1];
+ // listView1.Items.Remove(lvi);
+ // listView1.Items.Insert(listView1.SelectedIndices[listView1.SelectedIndices.Count - 1] + 1, lvi);
+ //}
+ if (lvFiles.SelectedItems.Count > 0 && lvFiles.SelectedIndex > 0)
+ {
+ var index1 = lvFiles.SelectedIndex - 1;
+ var index2 = lvFiles.SelectedIndex + lvFiles.SelectedItems.Count;
+ var value = this.downloads[index1];
+ this.downloads.RemoveAt(index1);
+ this.downloads.Insert(index2, value);
+ }
+ }
+
+ private void BtnDown_Click(object sender, RoutedEventArgs e)
+ {
+ if (lvFiles.SelectedItems.Count > 0 && lvFiles.SelectedItems.Count + lvFiles.SelectedIndex < this.downloads.Count)
+ {
+ var item = this.downloads[lvFiles.SelectedItems.Count + lvFiles.SelectedIndex];
+ this.downloads.RemoveAt(lvFiles.SelectedItems.Count + lvFiles.SelectedIndex);
+ this.downloads.Insert(lvFiles.SelectedIndex, item);
+ }
+ //if (listView1.SelectedIndices.Count > 0 && listView1.SelectedIndices[listView1.SelectedIndices.Count - 1] < listView1.Items.Count - 1)
+ //{
+ // var lvi = listView1.Items[listView1.SelectedIndices[listView1.SelectedIndices.Count - 1] + 1];
+ // listView1.Items.Remove(lvi);
+ // listView1.Items.Insert(listView1.SelectedIndices[0], lvi);
+ //}
+ }
+
+ private void BtnMoveTo_Click(object sender, RoutedEventArgs e)
+ {
+ if (lvFiles.SelectedItems.Count > 0 && queues.Count > 1)
+ {
+ var qsd = new QueueSelectionWindow() { Owner = this };
+ var queues1 = new List(this.queues.Count);
+ var selectedItems = LbQueues.SelectedItems;
+ foreach (DownloadQueue item in queues)
+ {
+ var found = false;
+ foreach (var si in selectedItems)
+ {
+ if (si == item)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ {
+ queues1.Add(item.Name);
+ }
+ }
+ var downloadIds = new string[this.lvFiles.SelectedItems.Count];
+ var index = 0;
+ foreach (InProgressDownloadEntry lvi in this.lvFiles.SelectedItems)
+ {
+ downloadIds[index++] = lvi.Id;
+ }
+ qsd.SetData(queues1, downloadIds);
+ qsd.QueueSelected += QueueSelectionDialog_QueueSelected;
+ qsd.ShowDialog(this);
+ }
+ }
+
+ private void QueueSelectionDialog_QueueSelected(object sender, QueueSelectionEventArgs e)
+ {
+ var queue = (DownloadQueue)queues[e.SelectedQueueIndex];
+ var downloadIds = e.DownloadIds;
+ var selectedQueue = (DownloadQueue)LbQueues.SelectedItem;
+ foreach (var id in downloadIds)
+ {
+ selectedQueue.DownloadIds.Remove(id);
+ queue.DownloadIds.Add(id);
+ }
+ LoadQueueDetails(selectedQueue);
+ }
}
}
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/NewQueueWindow.xaml.cs b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/NewQueueWindow.xaml.cs
index 7bd61fe..c550c75 100644
--- a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/NewQueueWindow.xaml.cs
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/NewQueueWindow.xaml.cs
@@ -48,7 +48,7 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
}
}
- var list = new List();
+ var list = new ObservableCollection();
foreach (var ent in ui.GetAllInProgressDownloads())
{
if (!set.Contains(ent.Id))
@@ -57,16 +57,16 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
}
}
- this.list = new ObservableCollection(list);
+ this.list = list;
lvDownloads.ItemsSource = this.list;
}
- private void OnApproved()
+ private bool OnApproved()
{
if (string.IsNullOrEmpty(TxtQueueName.Text))
{
MessageBox.Show(this, TextResource.GetText("MSG_QUEUE_NAME_MISSING"));
- return;
+ return false;
}
var list2 = new List(this.list.Count);
foreach (var entry in list)
@@ -82,6 +82,7 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
modifyingQueue.DownloadIds.AddRange(list2);
okAction.Invoke(modifyingQueue, false);
}
+ return true;
}
protected override void OnSourceInitialized(EventArgs e)
@@ -94,8 +95,10 @@ namespace XDM.Wpf.UI.Dialogs.QueuesWindow
private void BtnOK_Click(object sender, RoutedEventArgs e)
{
- OnApproved();
- Close();
+ if (OnApproved())
+ {
+ Close();
+ }
}
private void BtnCancel_Click(object sender, RoutedEventArgs e)
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml
new file mode 100644
index 0000000..16dbf0b
--- /dev/null
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml.cs b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml.cs
new file mode 100644
index 0000000..fe4e383
--- /dev/null
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/QueuesWindow/QueueSelectionWindow.xaml.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using XDM.Core.Lib.UI;
+using XDM.Wpf.UI.Common;
+using XDM.Wpf.UI.Win32;
+
+namespace XDM.Wpf.UI.Dialogs.QueuesWindow
+{
+ ///
+ /// Interaction logic for QueueSelectionWindow.xaml
+ ///
+ public partial class QueueSelectionWindow : Window, IDialog, IQueueSelectionDialog
+ {
+ public event EventHandler? QueueSelected;
+ public event EventHandler? ManageQueuesClicked;
+ private string[] downloadIds = new string[0];
+ public bool Result { get; set; } = false;
+
+ public QueueSelectionWindow()
+ {
+ InitializeComponent();
+ }
+
+ public void SetData(IEnumerable items, string[] downloadIds)
+ {
+ this.downloadIds = downloadIds;
+ this.LbQueues.ItemsSource = items;
+ LbQueues.SelectedIndex = 0;
+ }
+
+ public void ShowWindow(IAppWinPeer peer)
+ {
+ NativeMethods.ShowDialog(this, (Window)peer);
+ }
+
+ protected override void OnSourceInitialized(EventArgs e)
+ {
+ base.OnSourceInitialized(e);
+ NativeMethods.DisableMinMaxButton(this);
+ }
+
+ private void BtnOK_Click(object sender, RoutedEventArgs e)
+ {
+ QueueSelected?.Invoke(this, new QueueSelectionEventArgs(LbQueues.SelectedIndex, downloadIds));
+ QueueSelected = null;
+ Close();
+ }
+
+ private void BtnCancel_Click(object sender, RoutedEventArgs e)
+ {
+ QueueSelected = null;
+ Close();
+ }
+ }
+}
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/SchedulerPanel.xaml.cs b/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/SchedulerPanel.xaml.cs
index 1b9fe0c..f00bbe6 100644
--- a/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/SchedulerPanel.xaml.cs
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/SchedulerPanel.xaml.cs
@@ -1,4 +1,6 @@
-using System.Windows.Controls;
+using System;
+using System.Windows.Controls;
+using XDM.Core.Lib.Common;
namespace XDM.Wpf.UI.Dialogs.Scheduler
{
@@ -7,9 +9,101 @@ namespace XDM.Wpf.UI.Dialogs.Scheduler
///
public partial class SchedulerPanel : UserControl
{
+ public event EventHandler? ValueChanged;
+ private byte[] bits;
+ private readonly CheckBox[] checkboxes;
+
public SchedulerPanel()
{
InitializeComponent();
+
+ bits = new byte[]
+ {
+ 0, 1, 2, 4, 8, 16, 32, 64
+ };
+
+ checkboxes = new CheckBox[] { chkSun, chkMon, chkTue, chkWed, chkThu, chkFri, chkSat };
+
+ foreach (var chk in checkboxes)
+ {
+ chk.Unchecked += (a, b) =>
+ {
+ chkEveryday.IsChecked = false;
+ this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ };
+
+ chk.Checked += (a, b) =>
+ {
+ this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ };
+ }
+
+ chkEveryday.Checked += (_, _) =>
+ {
+ foreach (var chk in checkboxes)
+ {
+ chk.IsChecked = true;
+ }
+ };
+
+ StartTime.ValueChanged += (_, _) => this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ EndTime.ValueChanged += (_, _) => this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ }
+
+ private void SetDays(WeekDays days)
+ {
+ var index = 1;
+ var allChecked = true;
+
+ foreach (var chk in checkboxes)
+ {
+ var day = (WeekDays)bits[index];
+ if (((byte)days & (byte)day) == (byte)day)
+ {
+ chk.IsChecked = true;
+ }
+ else
+ {
+ allChecked = false;
+ }
+ index++;
+ }
+
+ chkEveryday.IsChecked = allChecked;
+ }
+
+ private WeekDays GetDaysOfWeek()
+ {
+ var index = 1;
+ var weekdays = WeekDays.None;
+ foreach (var chk in checkboxes)
+ {
+ if (chk.IsChecked.HasValue && chk.IsChecked.Value)
+ {
+ weekdays |= (WeekDays)bits[index];
+ }
+ index++;
+ }
+ return weekdays;
+ }
+
+ public DownloadSchedule Schedule
+ {
+ get
+ {
+ return new DownloadSchedule
+ {
+ StartTime = StartTime.Time,
+ EndTime = EndTime.Time,
+ Days = GetDaysOfWeek()
+ };
+ }
+ set
+ {
+ SetDays(value.Days);
+ StartTime.Time = value.StartTime;
+ EndTime.Time = value.EndTime;
+ }
}
}
}
diff --git a/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/TimePicker.xaml.cs b/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/TimePicker.xaml.cs
index aa6ed3c..1aa1688 100644
--- a/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/TimePicker.xaml.cs
+++ b/app/XDM/XDM.Wpf.UI/Dialogs/Scheduler/TimePicker.xaml.cs
@@ -9,6 +9,7 @@ namespace XDM.Wpf.UI.Dialogs.Scheduler
///
public partial class TimePicker : UserControl
{
+ public event EventHandler? ValueChanged;
public TimePicker()
{
InitializeComponent();
@@ -33,6 +34,10 @@ namespace XDM.Wpf.UI.Dialogs.Scheduler
CmbMinute.SelectedIndex = 0;
CmbAmPm.SelectedIndex = 0;
+
+ CmbHour.SelectionChanged += (_, _) => this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ CmbMinute.SelectionChanged += (_, _) => this.ValueChanged?.Invoke(this, EventArgs.Empty);
+ CmbAmPm.SelectionChanged += (_, _) => this.ValueChanged?.Invoke(this, EventArgs.Empty);
}
public TimeSpan Time