- support for individually sorted favorite lists (Panasonic, Samsung E+F)

- FIX: "insert after" when dropping a channel from right list
This commit is contained in:
hbeham
2013-07-02 23:55:02 +02:00
parent dc2ce9fa65
commit 3bb80ed6bb
13 changed files with 404 additions and 117 deletions

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -8,38 +9,43 @@ namespace ChanSort.Api
{
public DataRoot DataRoot;
public ChannelList ChannelList;
public int SubListIndex;
private UnsortedChannelMode unsortedChannelMode;
#region AddChannels()
public ChannelInfo AddChannels(IList<ChannelInfo> channels)
{
int count = channels.Count(channel => channel.NewProgramNr == -1);
int count = channels.Count(channel => channel.GetPosition(this.SubListIndex) == -1);
if (count == 0) return null;
ChannelInfo lastInsertedChannel = null;
int progNr = this.ChannelList.InsertProgramNumber;
int relativeChannelNumber = 0;
int progNrCopy = progNr; // prevent "access to modified closure" warning
foreach(var channel in this.ChannelList.Channels.Where(c => c.NewProgramNr>=progNrCopy).OrderBy(c=>c.NewProgramNr))
foreach (
var channel in
this.ChannelList.Channels.Where(c => c.GetPosition(this.SubListIndex) >= progNrCopy)
.OrderBy(c => c.GetPosition(this.SubListIndex)))
{
int gap = count - (channel.NewProgramNr - progNr - relativeChannelNumber);
var curPos = channel.GetPosition(this.SubListIndex);
int gap = count - (curPos - progNr - relativeChannelNumber);
if (gap > 0)
{
channel.NewProgramNr += gap;
channel.SetPosition(this.SubListIndex, curPos + gap);
++relativeChannelNumber;
}
}
foreach (var channel in channels)
{
if (channel.NewProgramNr != -1)
if (channel.GetPosition(this.SubListIndex) != -1)
{
// TODO notify user
continue;
}
channel.NewProgramNr = progNr++;
channel.SetPosition(this.SubListIndex, progNr++);
lastInsertedChannel = channel;
}
this.ChannelList.InsertProgramNumber += count;
@@ -47,6 +53,7 @@ namespace ChanSort.Api
this.DataRoot.NeedsSaving |= lastInsertedChannel != null;
return lastInsertedChannel;
}
#endregion
#region RemoveChannels()
@@ -55,27 +62,30 @@ namespace ChanSort.Api
{
if (channels.Count == 0) return;
this.ChannelList.InsertProgramNumber = channels[0].NewProgramNr;
var orderedChannelList = this.ChannelList.Channels.Where(c => c.NewProgramNr != -1).OrderBy(c => c.NewProgramNr);
this.ChannelList.InsertProgramNumber = channels[0].GetPosition(this.SubListIndex);
var orderedChannelList =
this.ChannelList.Channels.Where(c => c.GetPosition(this.SubListIndex) != -1)
.OrderBy(c => c.GetPosition(this.SubListIndex));
foreach (var channel in channels)
{
if (channel.NewProgramNr == -1)
if (channel.GetPosition(this.SubListIndex) == -1)
continue;
if (closeGap)
{
int prevNr = channel.NewProgramNr;
int prevNr = channel.GetPosition(this.SubListIndex);
foreach (var channel2 in orderedChannelList)
{
if (channel2.NewProgramNr > channel.NewProgramNr)
if (channel2.GetPosition(this.SubListIndex) > channel.GetPosition(this.SubListIndex))
{
if (prevNr != -1 && channel2.NewProgramNr != prevNr + 1) // don't pull down numbers after a gap
if (prevNr != -1 && channel2.GetPosition(this.SubListIndex) != prevNr + 1)
// don't pull down numbers after a gap
break;
prevNr = channel2.NewProgramNr;
--channel2.NewProgramNr;
prevNr = channel2.GetPosition(this.SubListIndex);
channel2.ChangePosition(this.SubListIndex, -1);
}
}
}
channel.NewProgramNr = -1;
channel.SetPosition(this.SubListIndex, -1);
}
this.DataRoot.NeedsSaving = true;
@@ -89,17 +99,18 @@ namespace ChanSort.Api
{
if (channels.Count == 0)
return;
if (up && channels[0].NewProgramNr <= this.ChannelList.FirstProgramNumber)
if (up && channels[0].GetPosition(this.SubListIndex) <= this.ChannelList.FirstProgramNumber)
return;
int delta = (up ? - 1 : +1);
int delta = (up ? -1 : +1);
foreach (var channel in (up ? channels : channels.Reverse()))
{
int newProgramNr = channel.NewProgramNr + delta;
ChannelInfo channelAtNewProgramNr = this.ChannelList.Channels.FirstOrDefault(ch => ch.NewProgramNr == newProgramNr);
if (channelAtNewProgramNr != null)
channelAtNewProgramNr.NewProgramNr -= delta;
channel.NewProgramNr += delta;
int newProgramNr = channel.GetPosition(this.SubListIndex) + delta;
ChannelInfo channelAtNewPos =
this.ChannelList.Channels.FirstOrDefault(ch => ch.GetPosition(this.SubListIndex) == newProgramNr);
if (channelAtNewPos != null)
channelAtNewPos.ChangePosition(this.SubListIndex, -delta);
channel.ChangePosition(this.SubListIndex, delta);
}
this.DataRoot.NeedsSaving = true;
}
@@ -107,15 +118,16 @@ namespace ChanSort.Api
#endregion
#region SortSelectedChannels(), ChannelComparerForSortingByName()
public void SortSelectedChannels(List<ChannelInfo> selectedChannels)
{
if (selectedChannels.Count == 0) return;
var sortedChannels = new List<ChannelInfo>(selectedChannels);
sortedChannels.Sort(this.ChannelComparerForSortingByName);
var programNumbers = selectedChannels.Select(ch => ch.NewProgramNr).ToList();
var programNumbers = selectedChannels.Select(ch => ch.GetPosition(this.SubListIndex)).ToList();
for (int i = 0; i < sortedChannels.Count; i++)
sortedChannels[i].NewProgramNr = programNumbers[i];
sortedChannels[i].SetPosition(this.SubListIndex, programNumbers[i]);
this.DataRoot.NeedsSaving = true;
}
@@ -123,9 +135,11 @@ namespace ChanSort.Api
{
return channel1.Name.CompareTo(channel2.Name);
}
#endregion
#region SetSlotNumber()
public void SetSlotNumber(IList<ChannelInfo> channels, int slot, bool swap, bool closeGap)
{
if (channels.Count == 0) return;
@@ -137,9 +151,9 @@ namespace ChanSort.Api
{
var others = this.ChannelList.GetChannelByNewProgNr(slot);
foreach (var other in others)
other.NewProgramNr = channel.NewProgramNr;
other.SetPosition(this.SubListIndex, channel.GetPosition(this.SubListIndex));
}
channel.NewProgramNr = slot++;
channel.SetPosition(this.SubListIndex, slot++);
}
}
else
@@ -150,16 +164,18 @@ namespace ChanSort.Api
}
this.DataRoot.NeedsSaving = true;
}
#endregion
#region RenumberChannels()
public void RenumberChannels(List<ChannelInfo> channels)
{
if (channels.Count == 0) return;
int progNr = channels.Min(ch => ch.NewProgramNr);
foreach(var channel in channels)
int progNr = channels.Min(ch => ch.GetPosition(this.SubListIndex));
foreach (var channel in channels)
{
if (channel.NewProgramNr == progNr)
if (channel.GetPosition(this.SubListIndex) == progNr)
{
++progNr;
continue;
@@ -173,17 +189,18 @@ namespace ChanSort.Api
this.DataRoot.NeedsSaving = true;
}
}
#endregion
#region ApplyReferenceList()
public void ApplyReferenceList(DataRoot refDataRoot)
{
foreach (var channelList in this.DataRoot.ChannelLists)
{
foreach (var channel in channelList.Channels)
channel.NewProgramNr = -1;
channel.SetPosition(this.SubListIndex, -1);
}
StringBuilder log = new StringBuilder();
@@ -198,10 +215,10 @@ namespace ChanSort.Api
foreach (var refChannel in refList.Channels)
{
var tvChannels = tvList.GetChannelByUid(refChannel.Uid);
ChannelInfo tvChannel = tvChannels.FirstOrDefault(c => c.NewProgramNr == -1);
ChannelInfo tvChannel = tvChannels.FirstOrDefault(c => c.GetPosition(this.SubListIndex) == -1);
if (tvChannel != null)
{
tvChannel.NewProgramNr = refChannel.OldProgramNr;
tvChannel.SetPosition(this.SubListIndex, refChannel.OldProgramNr);
tvChannel.Favorites = refChannel.Favorites;
tvChannel.Skip = refChannel.Skip;
tvChannel.Lock = refChannel.Lock;
@@ -210,7 +227,8 @@ namespace ChanSort.Api
}
else
{
tvChannel = new ChannelInfo(refChannel.SignalSource, refChannel.Uid, refChannel.OldProgramNr, refChannel.Name);
tvChannel = new ChannelInfo(refChannel.SignalSource, refChannel.Uid, refChannel.OldProgramNr,
refChannel.Name);
tvList.AddChannel(tvChannel);
}
}
@@ -237,18 +255,19 @@ namespace ChanSort.Api
if (appChannel.NewProgramNr == -1 && mode == UnsortedChannelMode.MarkDeleted)
continue;
int progNr = GetNewProgramNr(appChannel, ref maxProgNr);
int progNr = GetNewPogramNr(appChannel, ref maxProgNr);
appChannel.NewProgramNr = progNr;
}
}
}
#region ChanSortCriteria()
private string ChanSortCriteria(ChannelInfo channel)
{
// explicitly sorted
if (channel.NewProgramNr != -1)
return channel.NewProgramNr.ToString("d4");
if (channel.GetPosition(this.SubListIndex) != -1)
return channel.GetPosition(this.SubListIndex).ToString("d4");
// eventually hide unsorted channels
if (this.unsortedChannelMode == UnsortedChannelMode.MarkDeleted)
@@ -265,10 +284,12 @@ namespace ChanSort.Api
return "C";
return "A" + channel.Name;
}
#endregion
#region GetNewProgramNr()
private int GetNewProgramNr(ChannelInfo appChannel, ref int maxPrNr)
#region GetNewPogramNr()
private int GetNewPogramNr(ChannelInfo appChannel, ref int maxPrNr)
{
int prNr = appChannel.NewProgramNr;
if (prNr > maxPrNr)
@@ -280,8 +301,51 @@ namespace ChanSort.Api
}
return prNr;
}
#endregion
#endregion
#region SetFavorites()
public void SetFavorites(List<ChannelInfo> list, Favorites favorites, bool set)
{
bool sortedFav = this.DataRoot.SortedFavorites;
int favIndex = 0;
if (sortedFav)
{
for (int mask = (int) favorites; (mask & 1) == 0; mask >>= 1)
++favIndex;
}
if (set)
{
int maxPosition = 0;
if (sortedFav)
{
foreach (var channel in this.ChannelList.Channels)
maxPosition = Math.Max(maxPosition, channel.FavIndex[favIndex]);
}
foreach (var channel in list)
{
if (sortedFav && channel.FavIndex[favIndex] == -1)
channel.FavIndex[favIndex] = ++maxPosition;
channel.Favorites |= favorites;
}
}
else
{
foreach (var channel in list)
{
if (sortedFav && channel.FavIndex[favIndex] != -1)
{
channel.FavIndex[favIndex] = -1;
// TODO close gap by pulling down higher numbers
}
channel.Favorites &= ~favorites;
}
}
}
#endregion
}
}

View File

@@ -9,7 +9,6 @@ namespace ChanSort.Api
public bool ChannelNameEdit { get; set; }
public bool FileInformation { get; set; }
public bool CleanUpChannelData { get; set; }
public bool DeviceSettings { get; set; }
}

View File

@@ -5,6 +5,8 @@ namespace ChanSort.Api
{
public class ChannelInfo
{
private const int MAX_FAV_LISTS = 5;
private string uid;
/// <summary>
/// List of channels that have the same UID as this channel and were not added to the channel list directly
@@ -38,6 +40,7 @@ namespace ChanSort.Api
public string Debug { get; private set; }
public string SatPosition { get; set; }
public Transponder Transponder { get; set; }
public IList<int> FavIndex { get; private set; }
public bool IsNameModified { get; set; }
@@ -45,12 +48,15 @@ namespace ChanSort.Api
protected ChannelInfo()
{
this.NewProgramNr = -1;
this.FavIndex = new List<int>(MAX_FAV_LISTS);
for (int i = 0; i < MAX_FAV_LISTS; i++)
this.FavIndex.Add(-1);
}
/// <summary>
/// Constructor for exiting TV channel
/// </summary>
public ChannelInfo(SignalSource source, int index, int oldProgNr, string name)
public ChannelInfo(SignalSource source, int index, int oldProgNr, string name) : this()
{
this.SignalSource = source;
this.RecordIndex = index;
@@ -64,7 +70,7 @@ namespace ChanSort.Api
/// <summary>
/// Constructor for reference list channels which no longer exist in TV list
/// </summary>
public ChannelInfo(SignalSource source, string uid, int newProgNr, string name)
public ChannelInfo(SignalSource source, string uid, int newProgNr, string name) : this()
{
this.SignalSource = source;
this.Uid = uid;
@@ -203,12 +209,47 @@ namespace ChanSort.Api
}
#endregion
#region UpdateRawData()
public virtual void UpdateRawData()
{
}
#endregion
#region ChangeEncoding()
public virtual void ChangeEncoding(System.Text.Encoding encoding)
{
{
}
#endregion
#region GetPosition(), SetPosition(), ChangePosition()
public int GetPosition(int subListIndex)
{
return subListIndex == 0 ? this.NewProgramNr : this.FavIndex[subListIndex - 1];
}
public void SetPosition(int subListIndex, int newPos)
{
if (subListIndex == 0)
this.NewProgramNr = newPos;
else
{
this.FavIndex[subListIndex - 1] = newPos;
int mask = 1 << (subListIndex - 1);
if (newPos == -1)
this.Favorites &= (Favorites)~mask;
else
this.Favorites |= (Favorites)mask;
}
}
internal void ChangePosition(int subListIndex, int delta)
{
if (subListIndex == 0)
this.NewProgramNr += delta;
else
this.FavIndex[subListIndex - 1] += delta;
}
#endregion
}
}

View File

@@ -17,6 +17,7 @@ namespace ChanSort.Api
public bool IsEmpty { get { return this.channelLists.Count == 0; } }
public bool NeedsSaving { get; set; }
public Favorites SupportedFavorites { get; set; }
public bool SortedFavorites { get; set; }
public DataRoot()
{

View File

@@ -55,7 +55,10 @@ namespace ChanSort.Loader.Panasonic
{
int favIndex = r.GetInt32(field["profile" + (i + 1) + "index"]);
if (favIndex > 0)
this.Favorites |= (Favorites)(1 << i);
{
this.Favorites |= (Favorites) (1 << i);
this.FavIndex[i] = favIndex;
}
}
}
#endregion

View File

@@ -302,6 +302,7 @@ namespace ChanSort.Loader.Panasonic
public Serializer(string inputFile) : base(inputFile)
{
this.Features.ChannelNameEdit = true;
this.DataRoot.SortedFavorites = true;
this.DataRoot.AddChannelList(this.avbtChannels);
this.DataRoot.AddChannelList(this.avbcChannels);
@@ -538,8 +539,6 @@ order by s.ntype,major_channel
#region WriteChannels()
private void WriteChannels(SQLiteCommand cmd, ChannelList channelList)
{
int[] favIndex = new int[4];
cmd.CommandText = "update SVL set major_channel=@progNr, sname=@name, profile1index=@fav1, profile2index=@fav2, profile3index=@fav3, profile4index=@fav4, child_lock=@lock, skip=@skip where rowid=@rowid";
cmd.Parameters.Clear();
cmd.Parameters.Add(new SQLiteParameter("@rowid", DbType.Int32));
@@ -560,7 +559,7 @@ order by s.ntype,major_channel
cmd.Parameters["@rowid"].Value = channel.RecordIndex;
cmd.Parameters["@progNr"].Value = channel.NewProgramNr;
for (int fav = 0; fav < 4; fav++)
cmd.Parameters["@fav" + (fav + 1)].Value = ((int) channel.Favorites & (1<<fav)) == 0 ? 0 : ++favIndex[fav];
cmd.Parameters["@fav" + (fav + 1)].Value = Math.Max(0, channel.FavIndex[fav]);
cmd.Parameters["@name"].Value = channel.Name;
cmd.Parameters["@lock"].Value = channel.Lock;
cmd.Parameters["@skip"].Value = channel.Skip;

View File

@@ -71,12 +71,16 @@ namespace ChanSort.Loader.Samsung
// series D,E,F
byte fav = 0;
byte mask = 0x01;
int favIndex = 0;
foreach (int off in offsets)
{
int favValue = BitConverter.ToInt32(this.rawData, baseOffset + off);
if (sortedFavorites && favValue != -1 || !sortedFavorites && favValue != 0)
fav |= mask;
if (sortedFavorites)
this.FavIndex[favIndex] = favValue;
mask <<= 1;
++favIndex;
}
return (Favorites) fav;
}
@@ -135,15 +139,17 @@ namespace ChanSort.Loader.Samsung
// series D,E,F
byte fav = (byte)this.Favorites;
byte mask = 0x01;
int favIndex = 0;
foreach (int off in offsets)
{
int favValue;
if (this.sortedFavorites)
favValue = (fav & mask) != 0 ? this.NewProgramNr : -1;
favValue = (fav & mask) != 0 ? this.FavIndex[favIndex] : -1;
else
favValue = (fav & mask) != 0 ? 1 : 0;
Array.Copy(BitConverter.GetBytes(favValue), 0, this.rawData, baseOffset + off, 4);
mask <<= 1;
++favIndex;
}
}
#endregion

View File

@@ -92,6 +92,7 @@ namespace ChanSort.Loader.Samsung
{
DetectModelConstants(zip);
DataRoot.SupportedFavorites = c.supportedFavorites;
DataRoot.SortedFavorites = c.SortedFavorites;
ReadAnalogFineTuning(zip);
ReadAnalogChannels(zip, "map-AirA", this.avbtChannels, out this.avbtFileContent, this.avbtFrequency);

View File

@@ -163,6 +163,9 @@
this.pageEmpty = new DevExpress.XtraTab.XtraTabPage();
this.mnuContext = new DevExpress.XtraBars.PopupMenu(this.components);
this.timerEditDelay = new System.Windows.Forms.Timer(this.components);
this.grpSubList = new DevExpress.XtraEditors.GroupControl();
this.tabSubList = new DevExpress.XtraTab.XtraTabControl();
this.pageProgNr = new DevExpress.XtraTab.XtraTabPage();
((System.ComponentModel.ISupportInitialize)(this.splitContainerControl1)).BeginInit();
this.splitContainerControl1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.grpOutputList)).BeginInit();
@@ -193,6 +196,10 @@
((System.ComponentModel.ISupportInitialize)(this.tabChannelList)).BeginInit();
this.tabChannelList.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.mnuContext)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.grpSubList)).BeginInit();
this.grpSubList.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tabSubList)).BeginInit();
this.tabSubList.SuspendLayout();
this.SuspendLayout();
//
// splitContainerControl1
@@ -274,6 +281,7 @@
this.gviewLeft.EndSorting += new System.EventHandler(this.gviewLeft_EndSorting);
this.gviewLeft.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(this.gviewLeft_FocusedRowChanged);
this.gviewLeft.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(this.gviewLeft_CellValueChanged);
this.gviewLeft.CustomUnboundColumnData += new DevExpress.XtraGrid.Views.Base.CustomColumnDataEventHandler(this.gview_CustomUnboundColumnData);
this.gviewLeft.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(this.gviewLeft_CustomColumnDisplayText);
this.gviewLeft.LayoutUpgrade += new DevExpress.Utils.LayoutUpgadeEventHandler(this.gviewLeft_LayoutUpgrade);
this.gviewLeft.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.gview_KeyPress);
@@ -300,10 +308,11 @@
resources.ApplyResources(this.colOutSlot, "colOutSlot");
this.colOutSlot.DisplayFormat.FormatString = "d";
this.colOutSlot.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
this.colOutSlot.FieldName = "NewProgramNr";
this.colOutSlot.FieldName = "Position";
this.colOutSlot.Name = "colOutSlot";
this.colOutSlot.OptionsFilter.AllowAutoFilter = false;
this.colOutSlot.OptionsFilter.AllowFilterModeChanging = DevExpress.Utils.DefaultBoolean.False;
this.colOutSlot.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
//
// colOutName
//
@@ -546,6 +555,7 @@
this.gviewRight.ShownEditor += new System.EventHandler(this.gview_ShownEditor);
this.gviewRight.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(this.gviewRight_FocusedRowChanged);
this.gviewRight.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(this.gviewRight_CellValueChanged);
this.gviewRight.CustomUnboundColumnData += new DevExpress.XtraGrid.Views.Base.CustomColumnDataEventHandler(this.gview_CustomUnboundColumnData);
this.gviewRight.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(this.gviewRight_CustomColumnDisplayText);
this.gviewRight.LayoutUpgrade += new DevExpress.Utils.LayoutUpgadeEventHandler(this.gviewRight_LayoutUpgrade);
this.gviewRight.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.gview_KeyPress);
@@ -576,8 +586,9 @@
resources.ApplyResources(this.colSlotNew, "colSlotNew");
this.colSlotNew.DisplayFormat.FormatString = "d";
this.colSlotNew.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
this.colSlotNew.FieldName = "NewProgramNr";
this.colSlotNew.FieldName = "Position";
this.colSlotNew.Name = "colSlotNew";
this.colSlotNew.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
//
// colName
//
@@ -1547,11 +1558,33 @@
this.timerEditDelay.Interval = 500;
this.timerEditDelay.Tick += new System.EventHandler(this.timerEditDelay_Tick);
//
// grpSubList
//
this.grpSubList.Controls.Add(this.tabSubList);
resources.ApplyResources(this.grpSubList, "grpSubList");
this.grpSubList.Name = "grpSubList";
this.grpSubList.ShowCaption = false;
//
// tabSubList
//
resources.ApplyResources(this.tabSubList, "tabSubList");
this.tabSubList.Name = "tabSubList";
this.tabSubList.SelectedTabPage = this.pageProgNr;
this.tabSubList.TabPages.AddRange(new DevExpress.XtraTab.XtraTabPage[] {
this.pageProgNr});
this.tabSubList.SelectedPageChanged += new DevExpress.XtraTab.TabPageChangedEventHandler(this.tabSubList_SelectedPageChanged);
//
// pageProgNr
//
this.pageProgNr.Name = "pageProgNr";
resources.ApplyResources(this.pageProgNr, "pageProgNr");
//
// MainForm
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.splitContainerControl1);
this.Controls.Add(this.grpSubList);
this.Controls.Add(this.grpTopPanel);
this.Controls.Add(this.barDockControlLeft);
this.Controls.Add(this.barDockControlRight);
@@ -1593,6 +1626,10 @@
((System.ComponentModel.ISupportInitialize)(this.tabChannelList)).EndInit();
this.tabChannelList.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.mnuContext)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.grpSubList)).EndInit();
this.grpSubList.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.tabSubList)).EndInit();
this.tabSubList.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -1731,6 +1768,9 @@
private DevExpress.XtraBars.BarButtonItem miExcelExport;
private DevExpress.XtraEditors.Repository.RepositoryItemTextEdit repositoryItemTextEdit1;
private DevExpress.XtraBars.BarButtonItem miPortuguese;
private DevExpress.XtraEditors.GroupControl grpSubList;
private DevExpress.XtraTab.XtraTabControl tabSubList;
private DevExpress.XtraTab.XtraTabPage pageProgNr;
private DevExpress.XtraSplashScreen.SplashScreenManager splashScreenManager1;
}
}

View File

@@ -24,7 +24,7 @@ namespace ChanSort.Ui
{
public partial class MainForm : XtraForm
{
public const string AppVersion = "v2013-06-29.3";
public const string AppVersion = "v2013-07-03";
private const int MaxMruEntries = 5;
@@ -41,14 +41,14 @@ namespace ChanSort.Ui
private class DragDropInfo
{
public readonly GridView SourceView;
public readonly int SourceProgramNumber;
public readonly int SourcePosition;
public EditMode EditMode;
public int DropRowHandle = -1;
public DragDropInfo(GridView source, int sourceProgramNumber)
public DragDropInfo(GridView source, int sourcePosition)
{
this.SourceView = source;
this.SourceProgramNumber = sourceProgramNumber;
this.SourcePosition = sourcePosition;
}
}
#endregion
@@ -65,6 +65,7 @@ namespace ChanSort.Ui
private Encoding defaultEncoding = Encoding.Default;
private readonly List<string> isoEncodings = new List<string>();
private ChannelList currentChannelList;
private int subListIndex;
private GridView lastFocusedGrid;
private EditMode curEditMode = EditMode.InsertAfter;
private bool dontOpenEditor;
@@ -310,6 +311,7 @@ namespace ChanSort.Ui
this.repositoryItemCheckedComboBoxEdit2.Items.Clear();
byte mask = 0x01;
string regex = "[";
int favCount = 0;
for (int bit=0; bit<8; bit++, mask<<=1)
{
if (((int) favorites & mask) != 0)
@@ -322,11 +324,28 @@ namespace ChanSort.Ui
string str = c.ToString();
this.miFavSet.Strings.Add(str);
this.miFavUnset.Strings.Add(str);
++favCount;
}
}
regex += "]*";
this.repositoryItemCheckedComboBoxEdit1.Mask.EditMask = regex;
this.repositoryItemCheckedComboBoxEdit2.Mask.EditMask = regex;
while (this.tabSubList.TabPages.Count > favCount + 1)
this.tabSubList.TabPages.RemoveAt(this.tabSubList.TabPages.Count-1);
while (this.tabSubList.TabPages.Count < favCount + 1)
{
var page = this.tabSubList.TabPages.Add();
page.Text = "Fav " + (char)('A' + this.tabSubList.TabPages.Count - 2);
}
if (!this.dataRoot.SortedFavorites || this.subListIndex >= favCount)
{
this.tabSubList.SelectedTabPageIndex = 0;
this.subListIndex = 0;
}
this.grpSubList.Visible = this.dataRoot.SortedFavorites;
this.colOutFav.OptionsColumn.AllowEdit = !this.dataRoot.SortedFavorites;
this.colFavorites.OptionsColumn.AllowEdit = !this.dataRoot.SortedFavorites;
}
#endregion
@@ -788,7 +807,7 @@ namespace ChanSort.Ui
{
this.gviewLeft.EndDataUpdate();
}
this.UpdateInsertSlotTextBox();
this.UpdateInsertSlotNumber();
}
#endregion
@@ -843,11 +862,11 @@ namespace ChanSort.Ui
this.gviewLeft.BeginDataUpdate();
int maxNr = this.currentChannelList.InsertProgramNumber;
foreach (var channel in this.currentChannelList.Channels)
maxNr = Math.Max(maxNr, channel.NewProgramNr);
maxNr = Math.Max(maxNr, channel.GetPosition(this.subListIndex));
foreach (var channel in this.currentChannelList.Channels)
{
if (channel.NewProgramNr == -1 && !channel.IsDeleted)
channel.NewProgramNr = maxNr++;
if (channel.GetPosition(this.subListIndex) == -1 && !channel.IsDeleted)
channel.SetPosition(this.subListIndex, maxNr++);
}
this.gviewRight.EndDataUpdate();
this.gviewLeft.EndDataUpdate();
@@ -915,6 +934,7 @@ namespace ChanSort.Ui
this.miShowWarningsAfterLoad.Checked = Settings.Default.ShowWarningsAfterLoading;
this.cbCloseGap.Checked = Settings.Default.CloseGaps;
this.ClearLeftFilter();
this.ClearRightFilter();
for (int i = MaxMruEntries-1; i >= 0; i--)
{
@@ -1000,6 +1020,26 @@ namespace ChanSort.Ui
#endregion
#region UpdateInsertSlotNumber()
private void UpdateInsertSlotNumber()
{
var channel = (ChannelInfo)this.gviewLeft.GetFocusedRow();
int programNr;
if (channel == null)
programNr = this.currentChannelList == null ? 1 : this.currentChannelList.FirstProgramNumber;
else
{
programNr = channel.GetPosition(this.subListIndex);
if (this.rbInsertAfter.Checked)
++programNr;
}
if (this.currentChannelList != null)
this.currentChannelList.InsertProgramNumber = programNr;
this.UpdateInsertSlotTextBox();
this.gviewLeft.SelectRow(this.gviewLeft.FocusedRowHandle);
}
#endregion
#region UpdateInsertSlotTextBox()
private void UpdateInsertSlotTextBox()
{
@@ -1054,7 +1094,7 @@ namespace ChanSort.Ui
{
this.gviewLeft.BeginSort();
this.gviewLeft.ClearColumnsFilter();
this.colOutSlot.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1");
this.colOutSlot.FilterInfo = new ColumnFilterInfo("[Position]<>-1");
this.gviewLeft.EndSort();
}
@@ -1136,20 +1176,13 @@ namespace ChanSort.Ui
{
if (string.IsNullOrEmpty(fav)) return;
char ch = Char.ToUpper(fav[0]);
if (ch<'A' || ch>'D') return;
if (ch<'A' || ch>'E' || this.subListIndex == ch-'A'+1) return;
var list = this.GetSelectedChannels(this.lastFocusedGrid);
if (list.Count == 0) return;
this.gviewRight.BeginDataUpdate();
this.gviewLeft.BeginDataUpdate();
Favorites mask = (Favorites)(1 << (ch - 'A'));
foreach(var channel in list)
{
if (set)
channel.Favorites |= mask;
else
channel.Favorites &= ~mask;
}
this.editor.SetFavorites(list, (Favorites) (1 << (ch - 'A')), set);
this.gviewRight.EndDataUpdate();
this.gviewLeft.EndDataUpdate();
}
@@ -1220,11 +1253,11 @@ namespace ChanSort.Ui
this.btnRemoveLeft.Enabled = mayEdit;
this.btnRemoveRight.Enabled = mayEdit;
this.btnRenum.Enabled = mayEdit;
this.btnToggleFavA.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.A) != 0;
this.btnToggleFavB.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.B) != 0;
this.btnToggleFavC.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.C) != 0;
this.btnToggleFavD.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.D) != 0;
this.btnToggleFavE.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.E) != 0;
this.btnToggleFavA.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.A) != 0 && this.subListIndex != 1;
this.btnToggleFavB.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.B) != 0 && this.subListIndex != 2;
this.btnToggleFavC.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.C) != 0 && this.subListIndex != 3;
this.btnToggleFavD.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.D) != 0 && this.subListIndex != 4;
this.btnToggleFavE.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.E) != 0 && this.subListIndex != 5;
this.btnToggleLock.Enabled = mayEdit;
this.miReload.Enabled = fileLoaded;
@@ -1250,7 +1283,8 @@ namespace ChanSort.Ui
bool isLeftGridSortedByNewProgNr = this.IsLeftGridSortedByNewProgNr;
var sel = this.gviewLeft.GetSelectedRows();
var channel = sel.Length == 0 ? null : (ChannelInfo) this.gviewRight.GetRow(sel[0]);
this.miMoveUp.Enabled = this.btnUp.Enabled = mayEdit && isLeftGridSortedByNewProgNr && channel != null && channel.NewProgramNr > this.currentChannelList.FirstProgramNumber;
this.miMoveUp.Enabled = this.btnUp.Enabled = mayEdit && isLeftGridSortedByNewProgNr && channel != null
&& channel.GetPosition(this.subListIndex) > this.currentChannelList.FirstProgramNumber;
this.miMoveDown.Enabled = this.btnDown.Enabled = mayEdit && isLeftGridSortedByNewProgNr;
this.miTvSettings.Enabled = this.currentTvSerializer != null;
@@ -1679,6 +1713,29 @@ namespace ChanSort.Ui
}
#endregion
#region tabSubList_SelectedPageChanged
private void tabSubList_SelectedPageChanged(object sender, TabPageChangedEventArgs e)
{
this.subListIndex = this.tabSubList.SelectedTabPageIndex;
this.editor.SubListIndex = this.subListIndex;
this.gviewLeft.BeginSort();
this.gviewLeft.EndSort();
this.gviewRight.BeginSort();
if (this.subListIndex > 0)
this.colSlotNew.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1");
else
this.colSlotNew.ClearFilter();
this.gviewRight.EndSort();
}
#endregion
private void gview_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e)
{
var channel = (ChannelInfo) e.Row;
if (e.Column.FieldName == "Position")
e.Value = channel.GetPosition(this.subListIndex);
}
#region gview_MouseDown, gview_MouseUp, timerEditDelay_Tick, gview_ShowingEditor
// these 4 event handler in combination override the default row-selection and editor-opening
@@ -1777,7 +1834,7 @@ namespace ChanSort.Ui
// start drag operation
var channel = (ChannelInfo)view.GetRow(downHit.RowHandle);
this.dragDropInfo = new DragDropInfo(view, channel.NewProgramNr);
this.dragDropInfo = new DragDropInfo(view, channel.GetPosition(this.subListIndex));
view.GridControl.DoDragDrop(this.dragDropInfo, DragDropEffects.Move);
this.downHit = null;
}
@@ -1817,7 +1874,7 @@ namespace ChanSort.Ui
var vi = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)this.gviewLeft.GetViewInfo();
var rowInfo = vi.GetGridRowInfo(hit.RowHandle);
ChannelInfo dropChannel = (ChannelInfo)this.gviewLeft.GetRow(hit.RowHandle);
bool moveUp = this.dragDropInfo.SourceProgramNumber < 0 || dropChannel.NewProgramNr <= this.dragDropInfo.SourceProgramNumber;
bool moveUp = this.dragDropInfo.SourcePosition < 0 || dropChannel.GetPosition(this.subListIndex) <= this.dragDropInfo.SourcePosition;
if (moveUp && point.Y < rowInfo.Bounds.Top + rowInfo.Bounds.Height / 2)
this.dragDropInfo.EditMode = EditMode.InsertBefore;
else if (!moveUp && point.Y > rowInfo.Bounds.Top + rowInfo.Bounds.Height / 2)
@@ -1850,17 +1907,19 @@ namespace ChanSort.Ui
var selectedChannels = this.GetSelectedChannels(this.dragDropInfo.SourceView);
int newProgNr;
int dropPos = dropChannel.GetPosition(this.subListIndex);
if (this.dragDropInfo.EditMode != EditMode.InsertAfter || !this.cbCloseGap.Checked)
newProgNr = dropChannel.NewProgramNr;
newProgNr = dropPos;
else
{
int numberOfChannelsToMoveDown = 0;
foreach (var channel in selectedChannels)
{
if (channel.NewProgramNr <= dropChannel.NewProgramNr)
int curPos = channel.GetPosition(this.subListIndex);
if (curPos != -1 && curPos <= dropPos)
++numberOfChannelsToMoveDown;
}
newProgNr = dropChannel.NewProgramNr + 1 - numberOfChannelsToMoveDown;
newProgNr = dropPos + 1 - numberOfChannelsToMoveDown;
}
this.editor.SetSlotNumber(selectedChannels, newProgNr, this.dragDropInfo.EditMode == EditMode.Swap, this.cbCloseGap.Checked);
@@ -1897,16 +1956,7 @@ namespace ChanSort.Ui
private void gviewLeft_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
{
var channel = (ChannelInfo)this.gviewLeft.GetRow(e.FocusedRowHandle);
if (channel == null)
return;
int programNr = channel.NewProgramNr;
if (this.rbInsertAfter.Checked)
++programNr;
if (this.currentChannelList != null)
this.currentChannelList.InsertProgramNumber = programNr;
this.UpdateInsertSlotTextBox();
this.gviewLeft.SelectRow(e.FocusedRowHandle);
TryExecute(UpdateInsertSlotNumber);
}
#endregion
@@ -2064,7 +2114,7 @@ namespace ChanSort.Ui
e.Appearance.ForeColor = Color.Red;
e.Appearance.Options.UseForeColor = true;
}
else if (channel.NewProgramNr != -1)
else if (channel.GetPosition(this.subListIndex) != -1)
{
e.Appearance.ForeColor = Color.Gray;
e.Appearance.Options.UseForeColor = true;
@@ -2300,5 +2350,6 @@ namespace ChanSort.Ui
this.SetActiveGrid(this.gviewRight);
}
#endregion
}
}

View File

@@ -328,7 +328,7 @@
<value>Programplatz für Einfügen und Festlegen</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>ChanSort {0} - Senderlisten-Editor für Samsung, LG und Toshiba TVs</value>
<value>ChanSort {0} - Senderlisten-Editor für Samsung, LG, Panasonic und Toshiba TVs</value>
</data>
<data name="btnToggleLock.ToolTip" xml:space="preserve">
<value>Kindersicherung</value>

View File

@@ -123,7 +123,7 @@
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="splitContainerControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 81</value>
<value>0, 108</value>
</data>
<metadata name="dsChannels.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>361, 17</value>
@@ -234,7 +234,7 @@
<value>Numeric</value>
</data>
<data name="gridLeft.Size" type="System.Drawing.Size, System.Drawing">
<value>382, 445</value>
<value>382, 418</value>
</data>
<data name="gridLeft.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -255,7 +255,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyLeft.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 499</value>
<value>2, 472</value>
</data>
<data name="lblHotkeyLeft.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -293,6 +293,78 @@
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>1474, 599</value>
</data>
<data name="tabSubList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="tabSubList.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 5</value>
</data>
<data name="pageProgNr.Size" type="System.Drawing.Size, System.Drawing">
<value>1463, 0</value>
</data>
<data name="pageProgNr.Text" xml:space="preserve">
<value>Pr#</value>
</data>
<data name="&gt;&gt;pageProgNr.Name" xml:space="preserve">
<value>pageProgNr</value>
</data>
<data name="&gt;&gt;pageProgNr.Type" xml:space="preserve">
<value>DevExpress.XtraTab.XtraTabPage, DevExpress.XtraEditors.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;pageProgNr.Parent" xml:space="preserve">
<value>tabSubList</value>
</data>
<data name="&gt;&gt;pageProgNr.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tabSubList.Size" type="System.Drawing.Size, System.Drawing">
<value>1469, 22</value>
</data>
<data name="tabSubList.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="&gt;&gt;tabSubList.Name" xml:space="preserve">
<value>tabSubList</value>
</data>
<data name="&gt;&gt;tabSubList.Type" xml:space="preserve">
<value>DevExpress.XtraTab.XtraTabControl, DevExpress.XtraEditors.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;tabSubList.Parent" xml:space="preserve">
<value>grpSubList</value>
</data>
<data name="&gt;&gt;tabSubList.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="grpSubList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="grpSubList.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 81</value>
</data>
<data name="grpSubList.Size" type="System.Drawing.Size, System.Drawing">
<value>1474, 27</value>
</data>
<data name="grpSubList.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="grpSubList.Text" xml:space="preserve">
<value>Sub List</value>
</data>
<data name="grpSubList.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;grpSubList.Name" xml:space="preserve">
<value>grpSubList</value>
</data>
<data name="&gt;&gt;grpSubList.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;grpSubList.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;grpSubList.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="rbInsertSwap.Location" type="System.Drawing.Point, System.Drawing">
<value>256, 6</value>
</data>
@@ -497,7 +569,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;barDockControlTop.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="barDockControlBottom.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
@@ -518,7 +590,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;barDockControlBottom.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="barDockControlLeft.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
@@ -539,7 +611,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;barDockControlLeft.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="barDockControlRight.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Right</value>
@@ -560,7 +632,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;barDockControlRight.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="miMoveUp.Caption" xml:space="preserve">
<value>Move up</value>
@@ -726,13 +798,13 @@
<value>5</value>
</data>
<data name="tabChannelList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<value>Bottom, Left, Right</value>
</data>
<data name="tabChannelList.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 33</value>
</data>
<data name="pageEmpty.Size" type="System.Drawing.Size, System.Drawing">
<value>632, 0</value>
<value>1284, 0</value>
</data>
<data name="pageEmpty.Text" xml:space="preserve">
<value>No channel lists</value>
@@ -750,7 +822,7 @@
<value>0</value>
</data>
<data name="tabChannelList.Size" type="System.Drawing.Size, System.Drawing">
<value>638, 22</value>
<value>1290, 22</value>
</data>
<data name="tabChannelList.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@@ -852,7 +924,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;grpTopPanel.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
@@ -1431,7 +1503,7 @@
<value>DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="SharedImageCollection.Timestamp" type="System.DateTime, mscorlib">
<value>06/29/2013 12:47:45</value>
<value>07/02/2013 20:57:05</value>
</data>
<data name="SharedImageCollection.ImageSize" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
@@ -1749,7 +1821,7 @@
<value>0, 0</value>
</data>
<data name="grpOutputList.Size" type="System.Drawing.Size, System.Drawing">
<value>386, 518</value>
<value>386, 491</value>
</data>
<data name="grpOutputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -2085,7 +2157,7 @@
<value>Signal source</value>
</data>
<data name="gridRight.Size" type="System.Drawing.Size, System.Drawing">
<value>1079, 445</value>
<value>1079, 418</value>
</data>
<data name="gridRight.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -2106,7 +2178,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyRight.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 499</value>
<value>2, 472</value>
</data>
<data name="lblHotkeyRight.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -2274,7 +2346,7 @@
<value>0, 0</value>
</data>
<data name="grpInputList.Size" type="System.Drawing.Size, System.Drawing">
<value>1083, 518</value>
<value>1083, 491</value>
</data>
<data name="grpInputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -2298,7 +2370,7 @@
<value>Panel2</value>
</data>
<data name="splitContainerControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1474, 518</value>
<value>1474, 491</value>
</data>
<data name="splitContainerControl1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>

View File

@@ -1,17 +1,18 @@
Version v2013-07-01 ======================================================
Version v2013-07-03 ======================================================
This version is identical to Beta v2013-06-29.3
Changes since last official version v2013-06-24:
- Added support for Panasonic channel list (svl.db and svl.bin format)
- Translated UI to Portuguese (Thanks to Vitor Martins Augusto)
Changes:
- Support for individually sorted favorite lists, if supported by TV
(e.g. Samsung E and F series, Panasonic Viera)
- FIX: "insert after" using drag and drop from right to left list
inserted before instead of after the drop position
The complete change log can be found at the end of this document
About ChanSort ============================================================
ChanSort is a program to manage your Samsung, LG or Toshiba TV's channel
list on your PC.
ChanSort is a program to manage your Samsung, LG, Toshiba or Panasonic TV's
channel list on your PC.
It allows you to change program numbers and channel names, select your
favorites, set a parental lock and much more. With its multi-selection
@@ -103,6 +104,15 @@ OTHER DEALINGS IN THE SOFTWARE.
Change log ================================================================
2013-07-03
- Support for individually sorted favorite lists, if supported by TV
(e.g. Samsung E and F series, Panasonic Viera)
- FIX: "insert after" using drag and drop from right to left list
inserted before instead of after the drop position
2013-07-02
- FIX: wrong version number (caused a popup about a newer version online)
2013-07-01
- Added support for Panasonic channel list (svl.db and svl.bin format)
- Translated UI to Portuguese (Thanks to Vitor Martins Augusto)