#! /bin/sh /usr/share/dpatch/dpatch-run ## 11_sort_options.dpatch by Darren Salt and Luca Olivetti <luca@ventoso.org> ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: [LO] Add sort-by-source options. ## DP: [DS] Add sort-by-provider-then-channel-number options. @DPATCH@ diff -urNad vdr-1.5.15~/menu.c vdr-1.5.15/menu.c --- vdr-1.5.15~/menu.c 2008-02-17 21:05:46.000000000 +0100 +++ vdr-1.5.15/menu.c 2008-02-17 21:09:06.000000000 +0100 @@ -359,14 +359,18 @@ class cMenuChannelItem : public cOsdItem { public: - enum eChannelSortMode { csmNumber, csmName, csmProvider }; + enum eChannelSortMode { + csmNumber, csmName, csmProvider, csmProviderNumber, + csmSourceNumber, csmSourceName, csmSourceProvider, csmSourceProviderNumber, + csmLAST + }; private: static eChannelSortMode sortMode; cChannel *channel; public: cMenuChannelItem(cChannel *Channel); static void SetSortMode(eChannelSortMode SortMode) { sortMode = SortMode; } - static void IncSortMode(void) { sortMode = eChannelSortMode((sortMode == csmProvider) ? csmNumber : sortMode + 1); } + static void IncSortMode(void) { sortMode = eChannelSortMode(sortMode + 1); if (sortMode == csmLAST) sortMode = csmNumber; } static eChannelSortMode SortMode(void) { return sortMode; } virtual int Compare(const cListObject &ListObject) const; virtual void Set(void); @@ -383,13 +387,46 @@ Set(); } +static int snum(int source) +{ + int stype = (source & cSource::st_Mask); + // arbitrary order: sat, cable, terrestrial, none + int r; + switch(stype) { + case cSource::stCable: + r=0x7FF0; + break; + case cSource::stTerr: + r=0x7FF2; + break; + case cSource::stSat: + r=source & cSource::st_Pos; + if (source & cSource::st_Neg) r*=-1; + break; + default: //stNone or unknown + r=0x7FFF; + } + return r; +} + int cMenuChannelItem::Compare(const cListObject &ListObject) const { cMenuChannelItem *p = (cMenuChannelItem *)&ListObject; int r = -1; - if (sortMode == csmProvider) + if (sortMode >= csmSourceNumber) { + int rsource = snum(channel->Source()) - snum(p->channel->Source()); + if (sortMode == csmSourceProvider && rsource == 0) + r = strcoll(channel->Provider(), p->channel->Provider()); + if ((sortMode == csmSourceName || + (r == 0 && sortMode != csmSourceProviderNumber)) && rsource == 0) + r = strcoll(channel->Name(), p->channel->Name()); + if ((sortMode == csmSourceNumber || r == 0) && rsource == 0) + r = channel->Number() - p->channel->Number(); + return ((rsource == 0) ? r : rsource); + } + if (sortMode == csmProvider || sortMode == csmProviderNumber) r = strcoll(channel->Provider(), p->channel->Provider()); - if (sortMode == csmName || r == 0) + if (sortMode == csmName || (r == 0 && sortMode != csmProviderNumber)) r = strcoll(channel->Name(), p->channel->Name()); if (sortMode == csmNumber || r == 0) r = channel->Number() - p->channel->Number(); @@ -400,10 +437,17 @@ { cString buffer; if (!channel->GroupSep()) { - if (sortMode == csmProvider) - buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); - else - buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); + if (sortMode >= csmSourceNumber) { + if (sortMode == csmSourceProvider || sortMode == csmSourceProviderNumber) + buffer = cString::sprintf("%d\t%s - %s - %s", channel->Number(), *cSource::ToString(channel->Source()), channel->Provider(), channel->Name()); + else + buffer = cString::sprintf("%d\t%s - %s", channel->Number(), *cSource::ToString(channel->Source()), channel->Name()); + } else { + if (sortMode == csmProvider || sortMode == csmProviderNumber) + buffer = cString::sprintf("%d\t%s - %s", channel->Number(), channel->Provider(), channel->Name()); + else + buffer = cString::sprintf("%d\t%s", channel->Number(), channel->Name()); + } } else buffer = cString::sprintf("---\t%s ----------------------------------------------------------------", channel->Name());