]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Big code cleanup
authorChris Tallon <chris@vomp.tv>
Wed, 14 Dec 2005 22:18:02 +0000 (22:18 +0000)
committerChris Tallon <chris@vomp.tv>
Wed, 14 Dec 2005 22:18:02 +0000 (22:18 +0000)
Less messages used now because master mutex exists
Fixed okmenu text display in vreclist
Cleaned up how vreclist works
Stopped the mad redrawing and selection line moving in vreclist

30 files changed:
CREDITS
box.cc
box.h
command.cc
message.h
playervideo.cc
timers.cc
timers.h
vchannelselect.cc
vconnect.cc
vepg.cc
view.cc
view.h
vlivebanner.cc
vlivebanner.h
vmute.cc
voptions.cc
voptions.h
vquestion.cc
vquestion.h
vrecordinglist.cc
vrecordinglist.h
vrecordingmenu.cc
vserverselect.cc
vserverselect.h
vvideolive.cc
vvideolive.h
vvolume.cc
vwelcome.cc
vwelcome.h

diff --git a/CREDITS b/CREDITS
index 73e5821329c19942da8c8361b676755c34f89bbe..34fcd58a62effba980ae3df72cd98f5010405bcc 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -6,6 +6,10 @@ Chris Tallon
 
 Thanks to the following people for their contributions to VOMP:
 
+Mark Calderbank
+  Demuxer
+  GUI box splitting algorithm
+
 Dave Pickles
   VDR 1.3 compatibility
   Options view code cleanup
diff --git a/box.cc b/box.cc
index f110d62e70a8695a99cdfe8a7b40ed07ad645726..96c085c44e380ca04e62b3cccd166a57969d0646 100644 (file)
--- a/box.cc
+++ b/box.cc
@@ -67,11 +67,6 @@ void Box::setGap(UINT tgap)
   gap = tgap;
 }
 
-void Box::show()
-{
-  blt(area);
-}
-
 void Box::blt(Region& r)
 {
   Log::getInstance()->log("Box", Log::DEBUG, "Show region %p %u %u %u %u", surface, r.x, r.y, r.w, r.h);
diff --git a/box.h b/box.h
index 4d9feb8b6bbdfa51db8c546a7e2f08aea369b56f..bf3462287138cdeaf317d9e763fad9b03ff5f827 100644 (file)
--- a/box.h
+++ b/box.h
@@ -39,7 +39,6 @@ class Box
     void setSurfaceOffset(UINT x, UINT y);
     void setGap(UINT gap);
 
-    void show(); // Obselete
     void blt(Region& r); // For use only by ViewMan
 
     virtual void draw();
index a21a09731f0cd3fd7a6b04de0d7cf0f73abe63f9..23e332374bac86beab1c7cd56b8877866a930a9c 100644 (file)
@@ -197,12 +197,7 @@ void Command::processMessage(Message* m)
     }
     case Message::STREAM_END:
     {
-      // post a message to ViewMan and then run the viewman message queue
-      Message* m2 = new Message();
-      m2->message = Message::STREAM_END;
-      m2->to = VVideoLive::getInstance();
-      viewman->postMessage(m2);
-      handleCommand(Remote::NA_NONE);
+      VVideoLive::getInstance()->streamEnd();
       break;
     }
     case Message::VDR_CONNECTED:
@@ -269,7 +264,7 @@ void Command::handleCommand(int button)
 void Command::sig1()
 {
 #ifdef DEV
-  Message* m = new Message();
+  Message* m = new Message(); // break into master mutex
   m->message = Message::SCREENSHOT;
   m->to = this;
   postMessage(m);
index 7c0f478a7ddc32e3a8b07a4bf3988c23a8cb40fe..3fe32a2418d66f00c7f53910f6fba62c24bd0aaa 100644 (file)
--- a/message.h
+++ b/message.h
 #include <stdio.h>
 #include "defines.h"
 
-class View;
+// Usage of messages is more dubious now that the single master mutex lock
+// protects all gui actions. Reason(s) for usage:
+// 1. View A wants something to be done by View B *after* View A has been deleted
+// 2. A thread wants its object/view deleting *after* the thread has exited
+
+// Put a justification line after call to Message* m = new  Message() line
+// So that the sources can be grepped for proper message useage
 
 class Message
 {
@@ -48,16 +54,12 @@ class Message
     const static ULONG STOP_PLAYBACK = 9;
     const static ULONG SERVER_SELECTED = 10;
     const static ULONG VDR_CONNECTED = 11;
-    const static ULONG REDRAW_DATA = 12;
-    const static ULONG ADD_VIEW = 13;
-    const static ULONG CHANNEL_UP = 14;
-    const static ULONG CHANNEL_DOWN = 15;
-    const static ULONG STREAM_END = 16;
-    const static ULONG CHILD_CLOSE = 17;
-    const static ULONG REDRAW_LANG = 18;
-    const static ULONG TIMER = 19;
-    const static ULONG EPG = 20;
-    const static ULONG EPG_CLOSE = 21;
+    const static ULONG ADD_VIEW = 12;
+    const static ULONG STREAM_END = 13;
+    const static ULONG REDRAW_LANG = 14;
+    const static ULONG TIMER = 15;
+    const static ULONG EPG = 16;
+    const static ULONG EPG_CLOSE = 17;
 };
 
 #endif
index 5ef741ed1c63bbca3301ac3752dbafb01e034774..a0e572abb76c4b69db4ff29afe0ea56aaf9b41a6 100644 (file)
@@ -635,7 +635,7 @@ void PlayerVideo::threadMethod()
 
   // end of recording
   Log::getInstance()->log("Player", Log::DEBUG, "Recording playback ends");
-  Message* m = new Message();
+  Message* m = new Message(); // Must be done after this thread finishes, and must break into master mutex
   if (streamLength) m->message = Message::STOP_PLAYBACK;  // recording
   else m->message = Message::STREAM_END;                  // live
   Log::getInstance()->log("Player", Log::DEBUG, "Posting message to %p...", commandMessageQueue);
index 280cc73f2d772b3591cc1d42208adc57e39893dd..5b5b79f6ae3233058b3dd7d751924528b6c52414 100755 (executable)
--- a/timers.cc
+++ b/timers.cc
@@ -250,7 +250,7 @@ void Timers::threadMethod()
 \r
 \r
       //logger->log("Timers", Log::DEBUG, "about to un-LOCK -TIMERS- MUTEX (1)");\r
-      threadWaitForSignalTimed(&nextTime); // FIXME does this work if the time is in the past?\r
+      threadWaitForSignalTimed(&nextTime);\r
       //logger->log("Timers", Log::DEBUG, "LOCKED -TIMERS- MUTEX 5");\r
 \r
       // unlocks in the wait\r
@@ -280,7 +280,7 @@ void Timers::threadMethod()
     // send this timer to the timer receiver, via the command message queue\r
     // so that the gui mutex is locked when it happens\r
 \r
-    Message* m = new Message();\r
+    Message* m = new Message(); // Timer call, must be injected into master mutex (this is generated outside the mutex)\r
     m->from = this;\r
     m->to = nextTimer->client;\r
     m->message = Message::TIMER;\r
index c9e20ecb2bf09d2d23db3a1e3488c1cae616d092..1044b1f24e98745b7c465c2d522a311f857a245f 100755 (executable)
--- a/timers.h
+++ b/timers.h
@@ -31,8 +31,6 @@
 #include "command.h"\r
 #include "timerreceiver.h"\r
 \r
-// FIXME - ensure all objects that call settimer call cancel timer if they are being deleted\r
-\r
 /*\r
 \r
 Timers documentation\r
index bd773152e9e4a85370b364327d7c1ddf4e23bd66..37a0a4b8556c661e0d1be64b249743d672ceda7d 100644 (file)
@@ -115,22 +115,18 @@ int VChannelSelect::handleCommand(int command)
 
       if (numGot == 3)
       {
-        Message* m = new Message();
-        m->from = this;
-        m->to = ViewMan::getInstance();
-        m->message = Message::CLOSE_ME;
-        ViewMan::getInstance()->postMessage(m);
-
         // Is there valid data?
         if ((first > 0) || (second > 0) || (third > 0))
         {
-          m = new Message();
+          Message* m = new Message();
           m->from = this;
           m->to = videoLive;
           m->message = Message::CHANNEL_CHANGE;
           m->parameter = (first * 100) + (second * 10) + third;
           ViewMan::getInstance()->postMessage(m);
         }
+
+        return 4;
       }
 
       return 2;
@@ -146,7 +142,7 @@ void VChannelSelect::timercall(int clientReference)
   Log::getInstance()->log("VChannelSelect", Log::DEBUG, "Timer call");
 
   // Close me
-  Message* m = new Message();
+  Message* m = new Message(); // Delete self
   m->from = this;
   m->to = ViewMan::getInstance();
   m->message = Message::CLOSE_ME;
@@ -168,7 +164,7 @@ void VChannelSelect::timercall(int clientReference)
         newChannel += third;
     }
 
-    m = new Message();
+    m = new Message(); // Must be done after this view deleted
     m->from = this;
     m->to = videoLive;
     m->message = Message::CHANNEL_CHANGE;
index eab08b1f7bb6a6a6844dfa96462ada1fee5bd432..c86a5f399877c97bd10341f7f103189521aacfdd 100644 (file)
@@ -91,8 +91,7 @@ void VConnect::threadMethod()
     else
     {
       selectedServer = -1;
-      VServerSelect* vs = new VServerSelect(&serverIPs);
-      vs->setParent(this);
+      VServerSelect* vs = new VServerSelect(&serverIPs, this);
       vs->draw();
       viewman->add(vs);  // FIXME - do this better - perhaps post message to Command
                          // Otherwise it will be using ViewMan without the Command mutex locked
@@ -153,7 +152,7 @@ void VConnect::threadMethod()
 
   } while(!success);
 
-  Message* m = new Message();
+  Message* m = new Message(); // Must be done after this thread ends
   m->from = this;
   m->message = Message::VDR_CONNECTED;
   Command::getInstance()->postMessage(m);
diff --git a/vepg.cc b/vepg.cc
index 4b65cb11b593bab637ed7892bfb260b74d5f9b9e..2559feefbf2454ce159e9d8057c198a4aef5519d 100644 (file)
--- a/vepg.cc
+++ b/vepg.cc
@@ -348,12 +348,8 @@ int VEpg::handleCommand(int command)
     case Remote::GO:\r
     case Remote::OK:\r
     { // select programme and display menu TODO currently just changes to selected channel\r
-      Message* m = new Message();\r
-      m->from = this;\r
-      m->to = videoLive;\r
-      m->message = Message::CHANNEL_CHANGE;\r
-      m->parameter = (*chanList)[chanListbox.getCurrentOption()]->number;\r
-      ViewMan::getInstance()->postMessage(m);\r
+      videoLive->channelChange(VVideoLive::NUMBER, (*chanList)[chanListbox.getCurrentOption()]->number);
+
       if(command == Remote::GO)\r
         return 2;\r
       // GO just changes channel in preview, PLAY changes channel and returns to normal TV\r
@@ -364,7 +360,7 @@ int VEpg::handleCommand(int command)
       // return to normal TV mode\r
       if (videoLive) // ptr check done in case being tested from videorec\r
       {\r
-        Message* m = new Message();
+        Message* m = new Message(); // Must be done after this view deleted
         m->from = this;
         m->to = videoLive;
         m->message = Message::EPG_CLOSE;
@@ -372,25 +368,16 @@ int VEpg::handleCommand(int command)
       }
       return 4;\r
     }\r
-    case Remote::CHANNELUP:\r
-    {\r
-    // change up channel on live TV\r
-      Message* m = new Message();\r
-      m->from = this;\r
-      m->to = videoLive;\r
-      m->message = Message::CHANNEL_UP;\r
-      ViewMan::getInstance()->postMessage(m);\r
-      return 2;\r
-    }\r
-    case Remote::CHANNELDOWN:\r
-    { // change down channel on live TV\r
-      Message* m = new Message();\r
-      m->from = this;\r
-      m->to = videoLive;\r
-      m->message = Message::CHANNEL_DOWN;\r
-      ViewMan::getInstance()->postMessage(m);\r
-      return 2;\r
-    }\r
+    case Remote::CHANNELUP:
+    {
+      videoLive->channelChange(VVideoLive::OFFSET, VVideoLive::UP);
+      return 2;
+    }
+    case Remote::CHANNELDOWN:
+    {
+      videoLive->channelChange(VVideoLive::OFFSET, VVideoLive::DOWN);
+      return 2;
+    }
   }\r
   // stop command getting to any more views\r
   return 1;\r
diff --git a/view.cc b/view.cc
index c0e348d6e92c9ee9e8fc63ec2b23f4486f6e4faf..b58991004e0021c489aa60a55a70a09204badf0f 100644 (file)
--- a/view.cc
+++ b/view.cc
@@ -24,10 +24,6 @@ char View::numViews = 0;
 
 View::View()
 {
-  delSec = 0;
-  delNSec = 0;
-  seconds = 0;
-
   titleBarOn = 0;
   borderOn = 0;
 
@@ -113,8 +109,3 @@ void View::setBorderOn(UCHAR on)
 {
   borderOn = on;
 }
-
-void View::setParent(View* tParent)
-{
-  parent = tParent;
-}
diff --git a/view.h b/view.h
index ce97743ab873d3aba977414d83cb58f667564a28..1a9d7108efd04af66fe02eceab7d6654649ec972 100644 (file)
--- a/view.h
+++ b/view.h
@@ -38,21 +38,13 @@ class View : public Box
 
     virtual void draw();
     virtual int handleCommand(int command);
+    virtual void processMessage(Message* m);
 
     void setBorderOn(UCHAR on);
     void setTitleBarOn(UCHAR on);
     void setTitleText(char* title);
     void setBackgroundColour(Colour& colour);
     void setTitleBarColour(Colour& colour);
-    void setParent(View* parent);
-
-    // For use by ViewMan
-    long delSec;
-    long delNSec;
-    int seconds;
-    //
-
-    virtual void processMessage(Message* m);
 
   private:
     static char numViews;
@@ -65,7 +57,6 @@ class View : public Box
 
   protected:
     Colour titleBarColour;
-    View* parent;
 };
 
 #endif
index e1770b4ff3e4f0f042083eca115f45648c938d77..9323b74bd3282372a02f95f0720829c5b1d3784d 100644 (file)
 
 VLiveBanner* VLiveBanner::instance = NULL;
 
-VLiveBanner::VLiveBanner(View* tparent, Channel* channel, bool bannerTakesCommands)
+VLiveBanner::VLiveBanner(VVideoLive* tvvideoLive, Channel* channel, bool bannerTakesCommands)
 {
   instance = this;
   eventList = NULL;
-  parent = tparent;
+  vvideoLive = tvvideoLive;
   takeCommands = bannerTakesCommands;
 
   clockRegion.x = 440;
@@ -192,24 +192,14 @@ int VLiveBanner::handleCommand(int command)
     {
       // cancel timer so this view is still here later
       Timers::getInstance()->cancelTimer(this, 1); // if it exists
-
-      Message* m = new Message();
-      m->from = this;
-      m->to = parent;
-      m->message = Message::CHANNEL_UP;
-      ViewMan::getInstance()->postMessage(m);
+      vvideoLive->channelChange(VVideoLive::OFFSET, VVideoLive::UP);
       return 2;
     }
     case Remote::CHANNELDOWN:
     {
       // cancel timer so this view is still here later
       Timers::getInstance()->cancelTimer(this, 1); // if it exists
-
-      Message* m = new Message();
-      m->from = this;
-      m->to = parent;
-      m->message = Message::CHANNEL_DOWN;
-      ViewMan::getInstance()->postMessage(m);
+      vvideoLive->channelChange(VVideoLive::OFFSET, VVideoLive::DOWN);
       return 2;
     }
     case Remote::GREEN:
@@ -258,9 +248,9 @@ int VLiveBanner::handleCommand(int command)
     {
       // full epg
       Timers::getInstance()->cancelTimer(this, 1); // if it exists
-      Message* m = new Message();
+      Message* m = new Message(); // Must be done after this view deleted
       m->message = Message::EPG;
-      m->to = parent;
+      m->to = vvideoLive;
       m->from = this;
       ViewMan::getInstance()->postMessage(m);
       return 4;
@@ -275,7 +265,7 @@ void VLiveBanner::timercall(int clientReference)
   if (clientReference == 1)
   {
     // delete me!
-    Message* m = new Message();
+    Message* m = new Message();  // Delete self
     m->message = Message::CLOSE_ME;
     m->to = ViewMan::getInstance();
     m->from = this;
index 05f2f78051e121661dbd3eef4f87b1f8183749d8..5ea6f3838f8951e6df2ff49b5da7f9ab8d37ef07 100644 (file)
 #include "i18n.h"
 #include "timerreceiver.h"
 #include "timers.h"
+//#include "vvideolive.h"
+
+class VVideoLive;
 
 class VLiveBanner : public View, public TimerReceiver
 {
   public:
-    VLiveBanner(View* parent, Channel* channel, bool bannerTakesCommands);
+    VLiveBanner(VVideoLive* tvvideoLive, Channel* channel, bool bannerTakesCommands);
     ~VLiveBanner();
     static VLiveBanner* getInstance();
     void delData();
@@ -55,7 +58,7 @@ class VLiveBanner : public View, public TimerReceiver
 
   private:
     static VLiveBanner* instance;
-    View* parent;
+    VVideoLive* vvideoLive;
     WSelectList sl;
     Channel* currentChannel;
     EventList* eventList;
index d4444b3dd2c8437253b2721a13ec9429f78636e5..292914a8a2579d10fd9a44b1c515620004ac1d9c 100644 (file)
--- a/vmute.cc
+++ b/vmute.cc
@@ -60,7 +60,7 @@ void VMute::draw()
 void VMute::timercall(int clientReference)
 {
   // delete me!
-  Message* m = new Message();
+  Message* m = new Message(); // Delete self
   m->message = Message::CLOSE_ME;
   m->to = ViewMan::getInstance();
   m->from = this;
index ca26fd4634198b4eeed73272e733ec1f76a733cb..caf5b2f96d99b59dd9608002e269672d09f8112f 100644 (file)
@@ -20,8 +20,9 @@
 
 #include "voptions.h"
 
-VOptions::VOptions()
+VOptions::VOptions(VWelcome* tvwelcome)
 {
+  vwelcome = tvwelcome;
   viewman = ViewMan::getInstance();
 
   create(530, 85+(NUM_OPTIONS*30));
@@ -220,10 +221,7 @@ void VOptions::doSave()
   if (result[1] != optionsAtStart[1])
   {
     I18n::initialize();
-    Message *m = new Message();
-    m->to = VWelcome::getInstance();
-    m->message = Message::REDRAW_LANG;
-    viewman->postMessage(m);
+    vwelcome->redrawLang();
   }
 
   if (result[2] != optionsAtStart[2])
index 918d4c29cf19c21d1d9b5107ed381e5ab86f73f7..790ac38d1ff4e353a982f78b640c234e51e33bc8 100644 (file)
@@ -63,10 +63,12 @@ const static OPTIONDATA optionData[NUM_OPTIONS] =
   {"VDR-Pri 0=OK !See forums!","General", "Live priority",    21, 0, options6 }
 };
 
+class VWelcome;
+
 class VOptions : public View
 {
   public:
-    VOptions();
+    VOptions(VWelcome* tvwelcome);
     ~VOptions();
 
     int handleCommand(int command);
@@ -81,6 +83,7 @@ class VOptions : public View
     VDR* vdr;
     int* optionsAtStart;
     ViewMan* viewman;
+    VWelcome* vwelcome;
 };
 
 #endif
index 2b792ec10e6d16e6b49013b7793132916e17c404..b14509c84102cebf59a87cdea465d99256168fd6 100644 (file)
@@ -20,8 +20,9 @@
 
 #include "vquestion.h"
 
-VQuestion::VQuestion()
+VQuestion::VQuestion(void* treplyTo)
 {
+  replyTo = treplyTo;
   mainText = NULL;
   selectedOption = NO;
 
@@ -101,9 +102,9 @@ int VQuestion::handleCommand(int command)
     {
       if (selectedOption != YES) return 4;
 
-      Message* m = new Message();
+      Message* m = new Message(); // Question/answer mech
       m->from = this;
-      m->to = parent;
+      m->to = replyTo;
       m->message = Message::QUESTION_YES;
       ViewMan::getInstance()->postMessage(m);
 
index 5a96d2d83d4011630878574a7c7ccf61e53aa341..d69f8fba161fd0bacf39e571f051d1e22787154c 100644 (file)
@@ -34,7 +34,7 @@
 class VQuestion : public View
 {
   public:
-    VQuestion();
+    VQuestion(void* replyTo);
     ~VQuestion();
     void setDefault(UCHAR option);
     void setMainText(char* title);
@@ -46,6 +46,7 @@ class VQuestion : public View
     const static UCHAR YES = 1;
 
   private:
+    void* replyTo;
     char* mainText;
 
     void swap();
index ce14abe864a9c966136f6e0ada91a6717f8c2693..f7bc4856989fad7488115b9924efd51a741cc232 100644 (file)
 
 #include "vrecordinglist.h"
 
-VRecordingList::VRecordingList(VRecordingList* tparent)
+VRecordingList::VRecordingList(VRecordingList* tparent, Directory* tdir)
 {
   myParent = tparent;
-  dataInvalid = 0;
   viewman = ViewMan::getInstance();
+  recDir = tdir;
 
   create(570, 420);
   if (Video::getInstance()->getFormat() == Video::PAL)
@@ -47,42 +47,43 @@ VRecordingList::VRecordingList(VRecordingList* tparent)
 
 VRecordingList::~VRecordingList()
 {
-  // if this is a child window, inform the parent of our destruct
   if (myParent)
   {
-    Message* m = new Message();
-    m->to = myParent;
-    m->message = Message::CHILD_CLOSE;
-    viewman->postMessage(m);
+    // if this is a sub, there can only be recordings. if there are none left, get this dir deleted by parent
+    if (recDir->getNumRecordings() == 0) myParent->zeroCheck();
+    // recDir is now deleted if it was empty
   }
-
-  // only delete the list if this is not a sub dir window
-  if (recDir->isRoot)
+  else
   {
+    // only delete the list if this is not a sub dir window
     delete recDir;
   }
 }
 
-void VRecordingList::setDir(Directory* tdir)
+void VRecordingList::zeroCheck()
 {
-  recDir = tdir;
-
-  drawData();
-
-  char title[300];
-  if (!recDir->isRoot)
-  {
-    snprintf(title, 299, tr("Recordings - %s"), recDir->name);
-    setTitleText(title);
-  }
-  else
+  // go through to delete 1 empty dir if necessary (there will only ever be 1)
+  Directory* dir;
+  DirectoryList::iterator i;
+  for (i = recDir->dirList.begin(); i != recDir->dirList.end(); i++)
   {
-    setTitleText(tr("Recordings"));
+    dir = *i;
+    if (dir->getNumRecordings() == 0)
+    {
+      delete dir;
+      recDir->dirList.erase(i);
+      break;
+    }
   }
+  drawData();
+  viewman->updateView(this);
 }
 
 void VRecordingList::drawData()
 {
+  int saveIndex = sl.getCurrentOption();
+  int saveTop = sl.getTopOption();
+
   sl.clear();
   sl.addColumn(0);
   sl.addColumn(110);
@@ -95,26 +96,6 @@ void VRecordingList::drawData()
 
   Directory* dir;
   DirectoryList::iterator i;
-
-  if (dataInvalid == 2) // special case, a child list has closed, check for 0 dir entries
-  {
-
-    // First go through to delete 1 empty dir if necessary
-
-    for (i = recDir->dirList.begin(); i != recDir->dirList.end(); i++)
-    {
-      dir = *i;
-      if (dir->getNumRecordings() == 0)
-      {
-        delete dir;
-        recDir->dirList.erase(i);
-        break;
-      }
-    }
-  }
-
-  // Then go through again to draw data. Don't merge these two loops!
-
   for (i = recDir->dirList.begin(); i != recDir->dirList.end(); i++)
   {
     dir = *i;
@@ -125,7 +106,6 @@ void VRecordingList::drawData()
 
   // FIXME convert the whole program to time_t's
 
-
   Recording* rec;
   for (UINT j = 0; j < recDir->recList.size(); j++)
   {
@@ -137,18 +117,32 @@ void VRecordingList::drawData()
     first = 0;
   }
 
-  dataInvalid = 0;
+  sl.hintSetCurrent(saveIndex);
+  sl.hintSetTop(saveTop);
+  sl.draw();
 }
 
 void VRecordingList::draw()
 {
-  View::draw();
+  char title[300];
+  if (myParent)
+  {
+    snprintf(title, 299, tr("Recordings - %s"), recDir->name);
+    setTitleText(title);
+  }
+  else
+  {
+    setTitleText(tr("Recordings"));
+  }
 
-  if (dataInvalid) drawData();
+  View::draw();
 
-  sl.draw();
+  char freeSpace[50];
+  int gigFree = Directory::freeSpace / 1024;
+  snprintf(freeSpace, 49, tr("%lu%% used, %iGB free"), Directory::usedPercent, gigFree);
+  drawTextRJ(freeSpace, 560, 5, Colour::LIGHTTEXT);
 
-  // Put the status stuff at the bottom
+  // Symbols
 
   WSymbol w;
   w.setSurface(surface);
@@ -173,15 +167,13 @@ void VRecordingList::draw()
   w.setSurfaceOffset(150, 385);
   w.draw();
 
-  // FIXME Right justify this!
-  drawText(tr("[ok] = menu"), 450, 385, Colour::LIGHTTEXT);
+  drawTextRJ("[ok] = menu", 560, 385, Colour::LIGHTTEXT);
 
-  doShowingBar();
+  // All static stuff done
 
-  char freeSpace[50];
-  int gigFree = Directory::freeSpace / 1024;
-  snprintf(freeSpace, 49, tr("%lu%% used, %iGB free"), Directory::usedPercent, gigFree);
-  drawTextRJ(freeSpace, 560, 5, Colour::LIGHTTEXT);
+  drawData();
+  sl.draw();
+  doShowingBar();
 }
 
 void VRecordingList::doShowingBar()
@@ -189,21 +181,12 @@ void VRecordingList::doShowingBar()
   int topOption = sl.getTopOption() + 1;
   if (sl.getNumOptions() == 0) topOption = 0;
 
+  rectangle(220, 385, 180, 25, Colour::VIEWBACKGROUND);
   char showing[200];
   sprintf(showing, tr("%i to %i of %i"), topOption, sl.getBottomOption(), sl.getNumOptions());
-
-//  Box b;
-//  b.setSurfaceOffset(220, 385);
-//  b.setDimensions(160, 25);
-//  b.fillColour(Colour::VIEWBACKGROUND);
-//  b.drawText(showing, 0, 0, Colour::LIGHTTEXT);
-
-  rectangle(220, 385, 220+160, 385+25, Colour::VIEWBACKGROUND);
   drawText(showing, 220, 385, Colour::LIGHTTEXT);
 }
 
-
-
 void VRecordingList::processMessage(Message* m)
 {
   Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message);
@@ -225,34 +208,15 @@ void VRecordingList::processMessage(Message* m)
     doResume();
     return;
   }
-
-  if (m->message == Message::REDRAW_DATA)
-  {
-    dataInvalid = 1;
-    draw();
-    return;
-  }
-
-  if (m->message == Message::CHILD_CLOSE)
-  {
-    dataInvalid = 2;
-    draw();
-    show();
-    return;
-  }
 }
 
 void VRecordingList::doDeleteSelected()
 {
+  Log::getInstance()->log("VRecordingList", Log::DEBUG, "Parent = %p, isRoot = %i", myParent, recDir->isRoot);
   Recording* toDelete = getCurrentOptionRecording();
 
-  int saveIndex;
-  int saveTop;
-
   if (toDelete)
   {
-    saveIndex = toDelete->index;
-    saveTop = sl.getTopOption();
     Log::getInstance()->log("VRecordingList", Log::DEBUG, "FOUND: %i %s %s", toDelete->index, toDelete->getProgName(), toDelete->fileName);
 
     VDR* vdr = VDR::getInstance();
@@ -269,22 +233,13 @@ void VRecordingList::doDeleteSelected()
       }
     }
 
-    sl.clear();
-    setDir(recDir);
-    sl.hintSetCurrent(saveIndex);
-    sl.hintSetTop(saveTop);
-    draw();
-  }
+    drawData();
+    viewman->updateView(this);
 
-  if (myParent) // if this is not root send a message to parent to say redraw data
-  { // FIXME not really necessary any more ?
-    Message* m1 = new Message();
-    m1->to = myParent;
-    m1->message = Message::REDRAW_DATA;
-    viewman->postMessage(m1);
+    if (myParent) myParent->drawData(); // if this is not root get parent to redraw data
   }
 
-  show();
+  Log::getInstance()->log("VRecordingList", Log::DEBUG, "Parent = %p, isRoot = %i", myParent, recDir->isRoot);
 }
 
 int VRecordingList::doPlay()
@@ -385,13 +340,10 @@ int VRecordingList::handleCommand(int command)
         curDir = recDir->dirList[i];
         if (curDir->index == sl.getCurrentOption())
         {
-          VRecordingList* sub = new VRecordingList(this);
-          sub->setDir(curDir);
-          viewman->add(sub);
-
+          VRecordingList* sub = new VRecordingList(this, curDir);
           sub->draw();
-          sub->show();
-
+          viewman->add(sub);
+          viewman->updateView(sub);
           return 2;
         }
       }
@@ -405,9 +357,9 @@ int VRecordingList::handleCommand(int command)
         VRecordingMenu* v = new VRecordingMenu();
         v->setParent(this);
         v->setRecording(current);
-        viewman->add(v);
         v->draw();
-        v->show();
+        viewman->add(v);
+        viewman->updateView(v);
         return 2;
       }
       // should not get to here
index f3a39d96cd8cfd8659f6a6eb456940aa5ad55962..306704fa33f884546a32fcc0153db3647976d017 100644 (file)
 class VRecordingList : public View
 {
   public:
-    VRecordingList(VRecordingList* parent);
+    VRecordingList(VRecordingList* parent, Directory* dir);
     ~VRecordingList();
 
-    void setDir(Directory* dir);
-    void drawData();
-
     int handleCommand(int command);
     void processMessage(Message* m);
     void draw();
 
+    void drawData();
+    void zeroCheck();
+
   private:
     VRecordingList* myParent;
     Directory* recDir;
     ViewMan* viewman;
 
     WSelectList sl;
-    int dataInvalid;
 
     void doShowingBar();
     void doDeleteSelected();
index 23494fce9b400724c4cf64331c5e2da3f7bc1506..eaa887979babdbd05aae751f797bc16ac3642949 100644 (file)
@@ -94,7 +94,7 @@ int VRecordingMenu::handleCommand(int command)
     {
       if (sl.getCurrentOption() == 0)
       {
-        Message* m = new Message();
+        Message* m = new Message(); // Must be done after this view deleted
         m->from = this;
         m->to = vRecList;
         m->message = Message::PLAY_SELECTED_RECORDING;
@@ -104,7 +104,7 @@ int VRecordingMenu::handleCommand(int command)
 
       if (sl.getCurrentOption() == 1)
       {
-        Message* m = new Message();
+        Message* m = new Message(); // Must be done after this view deleted
         m->from = this;
         m->to = vRecList;
         m->message = Message::RESUME_SELECTED_RECORDING;
@@ -141,9 +141,8 @@ int VRecordingMenu::handleCommand(int command)
       }
       else if (sl.getCurrentOption() == 3)
       {
-        VQuestion* v = new VQuestion();
+        VQuestion* v = new VQuestion(this);
         v->create(260, 180);
-        v->setParent(this);
         v->setBackgroundColour(Colour::VIEWBACKGROUND);
         v->setTitleBarColour(Colour::DANGER);
         v->setTitleBarOn(1);
@@ -181,13 +180,13 @@ void VRecordingMenu::processMessage(Message* m)
   {
     if (sl.getCurrentOption() == 3)
     {
-      Message* m2 = new Message();
+      Message* m2 = new Message(); // Delete self
       m2->from = this;
       m2->to = ViewMan::getInstance();
       m2->message = Message::CLOSE_ME;
       ViewMan::getInstance()->postMessage(m2);
 
-      m2 = new Message();
+      m2 = new Message(); // OK. Want this to delete before this message does its job
       m2->from = this;
       m2->to = vRecList;
       m2->message = Message::DELETE_SELECTED_RECORDING;
index d0dc172c41431b25bcf230f9ed08075caa2d902f..4718f60d7f065750a56b72aaab988742c8f70a3f 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "vserverselect.h"
 
-VServerSelect::VServerSelect(std::vector<char*>* serverIPs)
+VServerSelect::VServerSelect(std::vector<char*>* serverIPs, void* treplyTo)
 {
   // I tried the whole passing using a reference here, but
   // the program segfaulted when settitletext tried to new
@@ -51,6 +51,8 @@ VServerSelect::VServerSelect(std::vector<char*>* serverIPs)
   {
     sl.addOption((*serverIPs)[k], 0);
   }
+
+  replyTo = treplyTo;
 }
 
 VServerSelect::~VServerSelect()
@@ -85,8 +87,8 @@ int VServerSelect::handleCommand(int command)
     }
     case Remote::OK:
     {
-      Message* m = new Message();
-      m->to = parent;
+      Message* m = new Message(); // Question/Answer mech. Better being messages
+      m->to = replyTo;
       m->message = Message::SERVER_SELECTED;
       m->parameter = sl.getCurrentOption();
       ViewMan::getInstance()->postMessage(m);
index 2a9ecd2835a4854234203fa0dd123bce2b4c2bce..c01c144ed7bdb34ce820b1be0f6d35f7b615f592 100644 (file)
@@ -37,7 +37,7 @@
 class VServerSelect : public View
 {
   public:
-    VServerSelect(std::vector<char*>* tserverIPs);
+    VServerSelect(std::vector<char*>* tserverIPs, void* replyTo);
     ~VServerSelect();
 
     int handleCommand(int command);
@@ -45,6 +45,7 @@ class VServerSelect : public View
 
   private:
     WSelectList sl;
+    void* replyTo;
 };
 
 #endif
index 1c10622c74e7db3672f5e8d1ed6e1031f45864f2..74554f1765063dd9a40154c473a4771032ecd8cb 100644 (file)
@@ -187,45 +187,31 @@ void VVideoLive::channelChange(UCHAR changeType, UINT newData)
 
   VEpg* vepg = VEpg::getInstance();
   if(vepg) vepg->setCurrentChannel((*chanList)[currentChannel]->name);
+
+  VLiveBanner* vlb = VLiveBanner::getInstance();
+  if (vlb)
+  {
+    vlb->setChannel((*chanList)[currentChannel]);
+    vlb->draw();
+    viewman->updateView(vlb);
+  }
+
   play();
 }
 
+void VVideoLive::streamEnd()
+{
+  Log::getInstance()->log("VVideoLive", Log::DEBUG, "streamEnd");
+  stop();
+  showUnavailable(1);
+}
+
 void VVideoLive::processMessage(Message* m)
 {
   if (m->message == Message::CHANNEL_CHANGE)
   {
     channelChange(NUMBER, m->parameter);
   }
-  else if (m->message == Message::CHANNEL_UP)
-  {
-    // this message is from vlivebanner
-    channelChange(OFFSET, UP);
-    if(!VEpg::getInstance())
-    {
-      VLiveBanner* vlb = VLiveBanner::getInstance(); // guaranteed to be one
-      vlb->setChannel((*chanList)[currentChannel]);
-      vlb->draw();
-      viewman->updateView(vlb);
-    }
-  }
-  else if (m->message == Message::CHANNEL_DOWN)
-  {
-    // this message is from vlivebanner
-    channelChange(OFFSET, DOWN);
-    if(!VEpg::getInstance())
-    {
-      VLiveBanner* vlb = VLiveBanner::getInstance(); // guaranteed to be one
-      vlb->setChannel((*chanList)[currentChannel]);
-      vlb->draw();
-      viewman->updateView(vlb);
-    }
-  }
-  else if (m->message == Message::STREAM_END)
-  {
-    Log::getInstance()->log("VVideoLive", Log::DEBUG, "streamEnd");
-    stop();
-    showUnavailable(1);
-  }
   else if (m->message == Message::EPG)
   {
     Log::getInstance()->log("VVideoLive", Log::DEBUG, "EPG requested from live banner");
index 75cf2751f7f3d00d2c3824b1dfb39f78c10e548c..1cc8bb8e4c2656640f209c0a83e998a3c93fedb8 100644 (file)
@@ -53,6 +53,7 @@ class VVideoLive : public View
     void draw();
     int handleCommand(int command);
     void processMessage(Message* m);
+    void streamEnd(); // from command
 
     void channelChange(UCHAR changeType, UINT newData);
     // changeType = INDEX = (newData is a channel index in the list)
index b67039e7eb0659a191f0cd2c006a7ad6e019d5d3..b423722f124a60b3b78a65b3e76e66bf2cc01cf0 100644 (file)
@@ -75,7 +75,7 @@ void VVolume::draw()
 void VVolume::timercall(int clientReference)
 {
   // delete me!
-  Message* m = new Message();
+  Message* m = new Message(); // Delete self
   m->message = Message::CLOSE_ME;
   m->to = ViewMan::getInstance();
   m->from = this;
index d18a0ceb650894d9134b21d243663d6f7cd46e29..a06520654dcfc4d32bb08d0405f12d731e4a49da 100644 (file)
 
 #include "vwelcome.h"
 
-VWelcome* VWelcome::instance = NULL;
-
 VWelcome::VWelcome()
 {
-  instance = this;
   viewman = ViewMan::getInstance();
 
   clockRegion.x = 400;
@@ -59,12 +56,6 @@ VWelcome::VWelcome()
 VWelcome::~VWelcome()
 {
   Timers::getInstance()->cancelTimer(this, 1);
-  instance = NULL;
-}
-
-VWelcome* VWelcome::getInstance()
-{
-  return instance;
 }
 
 void VWelcome::setup()
@@ -156,7 +147,7 @@ int VWelcome::handleCommand(int command)
     }
     case Remote::FIVE:
     {
-      Message* m = new Message();
+      Message* m = new Message(); // Must be done after this view deleted
       m->message = Message::STANDBY;
       Command::getInstance()->postMessage(m);
       return 4;
@@ -190,7 +181,7 @@ int VWelcome::handleCommand(int command)
       }
       else if (option == 4)
       {
-        Message* m = new Message();
+        Message* m = new Message(); // Must be done after this view deleted
         m->message = Message::STANDBY;
         Command::getInstance()->postMessage(m);
         return 4;
@@ -207,7 +198,6 @@ int VWelcome::handleCommand(int command)
   return 1;
 }
 
-
 void VWelcome::doChannelsList()
 {
   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::VIDEO);
@@ -220,14 +210,6 @@ void VWelcome::doChannelsList()
     vchan->draw();
     viewman->add(vchan);
     viewman->updateView(vchan);
-
-
-//        Message* m = new Message();
-//        m->from = this;
-//        m->to = ViewMan::getInstance();
-//        m->message = Message::SWAP_ME_FOR;
-//        m->parameter = (ULONG)vchan;
-//        ViewMan::getInstance()->postMessage(m);
   }
 }
 
@@ -268,8 +250,7 @@ void VWelcome::doRecordingsList()
 
   if (recDir)
   {
-    VRecordingList* vrec = new VRecordingList(NULL);
-    vrec->setDir(recDir);
+    VRecordingList* vrec = new VRecordingList(NULL, recDir);
     vrec->draw();
 
     viewman->add(vrec);
@@ -283,19 +264,15 @@ void VWelcome::doRecordingsList()
 
 void VWelcome::doOptions()
 {
-  VOptions* voptions = new VOptions();
+  VOptions* voptions = new VOptions(this);
   voptions->draw();
   viewman->add(voptions);
   viewman->updateView(voptions);
 }
 
-void VWelcome::processMessage(Message* m)
+void VWelcome::redrawLang()
 {
-  if (m->message == Message::REDRAW_LANG)
-  {
-    Log::getInstance()->log("VWelcome", Log::DEBUG, "Got redraw lang message");
-    setup();
-    draw();
-    viewman->updateView(this);
-  }
+  Log::getInstance()->log("VWelcome", Log::DEBUG, "Got redraw lang message");
+  setup();
+  draw();
 }
index 97d0b2c6d98f61f99870e3fdf05892dcf6a614eb..06440b5f2b06ddb63c35a8bd217db5ff05b051fc 100644 (file)
@@ -45,16 +45,14 @@ class VWelcome : public View, public TimerReceiver
   public:
     VWelcome();
     ~VWelcome();
-    static VWelcome* getInstance();
 
     void setup();
     int handleCommand(int command);
-    void processMessage(Message* m);
     void draw();
     void timercall(int clientReference);
+    void redrawLang();
 
   private:
-    static VWelcome* instance;
     WSelectList sl;
     WJpeg jpeg;