[haiku-commits] r38519 - haiku/trunk/src/apps/codycam

  • From: yourpalal2@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 3 Sep 2010 10:36:23 +0200 (CEST)

Author: yourpalal
Date: 2010-09-03 10:36:23 +0200 (Fri, 03 Sep 2010)
New Revision: 38519
Changeset: http://dev.haiku-os.org/changeset/38519

Modified:
   haiku/trunk/src/apps/codycam/CodyCam.cpp
   haiku/trunk/src/apps/codycam/CodyCam.h
   haiku/trunk/src/apps/codycam/Settings.cpp
   haiku/trunk/src/apps/codycam/Settings.h
Log:
* Fix regression in CodyCam from r38512, and do some refactoring too.
* Instead of passing a different message constant for each possible rate of 
capture, we pass a single message with a int32 'seconds' field.
* switch to templatized layout builders, make use of AddMenuField and 
AddTextControl methods.
* Changed semantics of VideoWindow::_BuildCaptureControls to only construct 
views, not add them, the window layout is now built in the VideoWindow 
constructor.
* EnumeratedStringValueSetting now takes a function pointer to get its strings, 
instead of a const char**.
* kUploadClients and kCaptureRates arrays are not NULL terminated anymore, 
there is a size constant associated with each one.
* Style fixes




Modified: haiku/trunk/src/apps/codycam/CodyCam.cpp
===================================================================
--- haiku/trunk/src/apps/codycam/CodyCam.cpp    2010-09-03 04:49:56 UTC (rev 
38518)
+++ haiku/trunk/src/apps/codycam/CodyCam.cpp    2010-09-03 08:36:23 UTC (rev 
38519)
@@ -6,9 +6,7 @@
 
 #include <Alert.h>
 #include <Button.h>
-#include <GridLayout.h>
-#include <GroupLayout.h>
-#include <GroupLayoutBuilder.h>
+#include <LayoutBuilder.h>
 #include <MediaDefs.h>
 #include <MediaNode.h>
 #include <MediaRoster.h>
@@ -18,7 +16,6 @@
 #include <MenuItem.h>
 #include <PopUpMenu.h>
 #include <scheduler.h>
-#include <SpaceLayoutItem.h>
 #include <TabView.h>
 #include <TextControl.h>
 #include <TimeSource.h>
@@ -46,9 +43,6 @@
 const int32 kButtonHeight = 15;
 const int32 kSliderViewRectHeight = 40;
 
-static void ErrorAlert(const char* message, status_t err, BWindow *window);
-static status_t AddTranslationItems(BMenu* intoMenu, uint32 fromType);
-
 #define        CALL            printf
 #define ERROR          printf
 #define FTPINFO                printf
@@ -57,7 +51,9 @@
 
 // Utility functions
 
-static void
+namespace {
+
+void
 ErrorAlert(const char* message, status_t err, BWindow *window = NULL)
 {
        BAlert *alert = new BAlert("", message, B_TRANSLATE("OK"));
@@ -121,11 +117,30 @@
 }
 
 
+// functions for EnumeratedStringValueSettings
+
+const char* CaptureRateAt(int32 i)
+{
+       return (i >= 0 && i < kCaptureRatesCount) ? kCaptureRates[i].name : 
NULL;
+}
+
+
+const char* UploadClientAt(int32 i)
+{
+       return (i >= 0 && i < kUploadClientsCount) ? kUploadClients[i] : NULL;
+}
+
+
+}; // end anonymous namespace
+
+
+
 //     #pragma mark -
 
 
 CodyCam::CodyCam()
-       : BApplication("application/x-vnd.Haiku.CodyCam"),
+       :
+       BApplication("application/x-vnd.Haiku.CodyCam"),
        fMediaRoster(NULL),
        fVideoConsumer(NULL),
        fWindow(NULL),
@@ -133,24 +148,24 @@
        fVideoControlWindow(NULL)
 {
        int32 index = 0;
-       kCaptureRate[index++] = B_TRANSLATE("Every 15 seconds");
-       kCaptureRate[index++] = B_TRANSLATE("Every 30 seconds");
-       kCaptureRate[index++] = B_TRANSLATE("Every minute");
-       kCaptureRate[index++] = B_TRANSLATE("Every 5 minutes");
-       kCaptureRate[index++] = B_TRANSLATE("Every 10 minutes");
-       kCaptureRate[index++] = B_TRANSLATE("Every 15 minutes");
-       kCaptureRate[index++] = B_TRANSLATE("Every 30 minutes");
-       kCaptureRate[index++] = B_TRANSLATE("Every hour");
-       kCaptureRate[index++] = B_TRANSLATE("Every 2 hours");
-       kCaptureRate[index++] = B_TRANSLATE("Every 4 hours");
-       kCaptureRate[index++] = B_TRANSLATE("Every 8 hours");
-       kCaptureRate[index++] = B_TRANSLATE("Every 24 hours");
-       kCaptureRate[index++] = B_TRANSLATE("Never");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 15 seconds");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 30 seconds");
+       kCaptureRates[index++].name = B_TRANSLATE("Every minute");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 5 minutes");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 10 minutes");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 15 minutes");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 30 minutes");
+       kCaptureRates[index++].name = B_TRANSLATE("Every hour");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 2 hours");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 4 hours");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 8 hours");
+       kCaptureRates[index++].name = B_TRANSLATE("Every 24 hours");
+       kCaptureRates[index++].name = B_TRANSLATE("Never");
 
        index = 0;
-       kUploadClient[index++] = B_TRANSLATE("FTP");
-       kUploadClient[index++] = B_TRANSLATE("SFTP");
-       kUploadClient[index++] = B_TRANSLATE("Local");
+       kUploadClients[index++] = B_TRANSLATE("FTP");
+       kUploadClients[index++] = B_TRANSLATE("SFTP");
+       kUploadClients[index++] = B_TRANSLATE("Local");
 
        chdir("/boot/home");
 }
@@ -454,7 +469,6 @@
        :
        BWindow(frame, title, type, flags),
        fPortPtr(consumerPort),
-       fView(NULL),
        fVideoView(NULL)
 {
        fFtpInfo.port = 0;
@@ -509,16 +523,21 @@
 
        menuBar->AddItem(menu);
 
-       /* give it a gray background view */
-       fView = new BView(B_TRANSLATE("Background View"), B_WILL_DRAW);
-       fView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
-
        /* add some controls */
-       _BuildCaptureControls(fView);
+       _BuildCaptureControls();
 
-       SetLayout(new BGroupLayout(B_VERTICAL));
-       AddChild(menuBar);
-       AddChild(fView);
+       BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
+               .SetInsets(0, 0, 0, 0)
+               .Add(menuBar)
+               .AddGroup(B_VERTICAL, kYBuffer)
+                       .SetInsets(kXBuffer, kYBuffer, kXBuffer, kYBuffer)
+                       .Add(fVideoView)
+                       .AddGroup(B_HORIZONTAL, kXBuffer)
+                               .SetInsets(0, 0, 0, 0)
+                               .Add(fCaptureSetupBox)
+                               .Add(fFtpSetupBox)
+                               .End()
+                       .Add(fStatusLine);
 
        Show();
 }
@@ -549,76 +568,25 @@
        switch (message->what) {
                case msg_filename:
                        if (control != NULL) {
-                               strncpy(fFtpInfo.fileNameText, 
((BTextControl*)control)->Text(), 63);
+                               strncpy(fFtpInfo.fileNameText,
+                                       ((BTextControl*)control)->Text(), 63);
                                FTPINFO("file is '%s'\n", 
fFtpInfo.fileNameText);
                        }
                        break;
 
-               case msg_rate_15s:
-                       FTPINFO("fifteen seconds\n");
-                       fFtpInfo.rate = (bigtime_t)(15 * 1000000);
+               case msg_rate_changed: {
+                       int32 seconds;
+                       message->FindInt32("seconds", &seconds);
+                       if (seconds == 0) {
+                               FTPINFO("never\n");
+                               fFtpInfo.rate = (bigtime_t)(B_INFINITE_TIMEOUT);
+                       } else {
+                               FTPINFO("%ld seconds\n", (long)seconds);
+                               fFtpInfo.rate = (bigtime_t)(seconds * 
1000000LL);
+                       }
                        break;
+               }
 
-               case msg_rate_30s:
-                       FTPINFO("thirty seconds\n");
-                       fFtpInfo.rate = (bigtime_t)(30 * 1000000);
-                       break;
-
-               case msg_rate_1m:
-                       FTPINFO("one minute\n");
-                       fFtpInfo.rate = (bigtime_t)(1 * 60 * 1000000);
-                       break;
-
-               case msg_rate_5m:
-                       FTPINFO("five minute\n");
-                       fFtpInfo.rate = (bigtime_t)(5 * 60 * 1000000);
-                       break;
-
-               case msg_rate_10m:
-                       FTPINFO("ten minute\n");
-                       fFtpInfo.rate = (bigtime_t)(10 * 60 * 1000000);
-                       break;
-
-               case msg_rate_15m:
-                       FTPINFO("fifteen minute\n");
-                       fFtpInfo.rate = (bigtime_t)(15 * 60 * 1000000);
-                       break;
-
-               case msg_rate_30m:
-                       FTPINFO("thirty minute\n");
-                       fFtpInfo.rate = (bigtime_t)(30 * 60 * 1000000);
-                       break;
-
-               case msg_rate_1h:
-                       FTPINFO("one hour\n");
-                       fFtpInfo.rate = (bigtime_t)(60LL * 60LL * 1000000LL);
-                       break;
-
-               case msg_rate_2h:
-                       FTPINFO("two hour\n");
-                       fFtpInfo.rate = (bigtime_t)(2LL * 60LL * 60LL * 
1000000LL);
-                       break;
-
-               case msg_rate_4h:
-                       FTPINFO("four hour\n");
-                       fFtpInfo.rate = (bigtime_t)(4LL * 60LL * 60LL * 
1000000LL);
-                       break;
-
-               case msg_rate_8h:
-                       FTPINFO("eight hour\n");
-                       fFtpInfo.rate = (bigtime_t)(8LL * 60LL * 60LL * 
1000000LL);
-                       break;
-
-               case msg_rate_24h:
-                       FTPINFO("24 hour\n");
-                       fFtpInfo.rate = (bigtime_t)(24LL * 60LL * 60LL * 
1000000LL);
-                       break;
-
-               case msg_rate_never:
-                       FTPINFO("never\n");
-                       fFtpInfo.rate = (bigtime_t)(B_INFINITE_TIMEOUT);
-                       break;
-
                case msg_translate:
                        message->FindInt32("be:type", 
(int32*)&(fFtpInfo.imageFormat));
                        message->FindInt32("be:translator", 
&(fFtpInfo.translator));
@@ -632,28 +600,32 @@
 
                case msg_server:
                        if (control != NULL) {
-                               strncpy(fFtpInfo.serverText, 
((BTextControl*)control)->Text(), 64);
+                               strncpy(fFtpInfo.serverText,
+                                       ((BTextControl*)control)->Text(), 64);
                                FTPINFO("server = '%s'\n", fFtpInfo.serverText);
                        }
                        break;
 
                case msg_login:
                        if (control != NULL) {
-                               strncpy(fFtpInfo.loginText, 
((BTextControl*)control)->Text(), 64);
+                               strncpy(fFtpInfo.loginText,
+                                       ((BTextControl*)control)->Text(), 64);
                                FTPINFO("login = '%s'\n", fFtpInfo.loginText);
                        }
                        break;
 
                case msg_password:
                        if (control != NULL) {
-                               strncpy(fFtpInfo.passwordText, 
((BTextControl*)control)->Text(), 64);
+                               strncpy(fFtpInfo.passwordText,
+                                       ((BTextControl*)control)->Text(), 64);
                                FTPINFO("password = '%s'\n", 
fFtpInfo.passwordText);
                        }
                        break;
 
                case msg_directory:
                        if (control != NULL) {
-                               strncpy(fFtpInfo.directoryText, 
((BTextControl*)control)->Text(), 64);
+                               strncpy(fFtpInfo.directoryText,
+                                       ((BTextControl*)control)->Text(), 64);
                                FTPINFO("directory = '%s'\n", 
fFtpInfo.directoryText);
                        }
                        break;
@@ -692,7 +664,7 @@
 
 
 void
-VideoWindow::_BuildCaptureControls(BView* theView)
+VideoWindow::_BuildCaptureControls()
 {
        // a view to hold the video image
        fVideoView = new BView("Video View", B_WILL_DRAW);
@@ -707,10 +679,12 @@
        controlsLayout->SetInsets(10, 15, 5, 5);
        fCaptureSetupBox->SetLayout(controlsLayout);
 
+       // file name
        fFileName = new BTextControl("File Name", B_TRANSLATE("File name:"),
                fFilenameSetting->Value(), new BMessage(msg_filename));
        fFileName->SetTarget(BMessenger(NULL, this));
 
+       // format menu
        fImageFormatMenu = new BPopUpMenu(B_TRANSLATE("Image Format Menu"));
        AddTranslationItems(fImageFormatMenu, B_TRANSLATOR_BITMAP);
        fImageFormatMenu->SetTargetForItems(this);
@@ -727,58 +701,33 @@
        fImageFormatSelector = new BMenuField("Format", B_TRANSLATE("Format:"),
                fImageFormatMenu, NULL);
 
+       // capture rate
        fCaptureRateMenu = new BPopUpMenu(B_TRANSLATE("Capture Rate Menu"));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[0],
-               new BMessage(msg_rate_15s)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[1],
-               new BMessage(msg_rate_30s)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[2],
-               new BMessage(msg_rate_1m)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[3],
-               new BMessage(msg_rate_5m)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[4],
-               new BMessage(msg_rate_10m)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[5],
-               new BMessage(msg_rate_15m)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[6],
-               new BMessage(msg_rate_30m)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[7],
-               new BMessage(msg_rate_1h)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[8],
-               new BMessage(msg_rate_2h)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[9],
-               new BMessage(msg_rate_4h)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[10],
-               new BMessage(msg_rate_8h)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[11],
-               new BMessage(msg_rate_24h)));
-       fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRate[12],
-               new BMessage(msg_rate_never)));
+       for (int32 i = 0; i < kCaptureRatesCount; i++) {
+               BMessage* itemMessage = new BMessage(msg_rate_changed);
+               itemMessage->AddInt32("seconds", kCaptureRates[i].seconds);
+               fCaptureRateMenu->AddItem(new BMenuItem(kCaptureRates[i].name,
+                       itemMessage));
+       }
        fCaptureRateMenu->SetTargetForItems(this);
        
fCaptureRateMenu->FindItem(fCaptureRateSetting->Value())->SetMarked(true);
        fCaptureRateSelector = new BMenuField("Rate", B_TRANSLATE("Rate:"),
                fCaptureRateMenu, NULL);
 
-       controlsLayout->AddItem(fFileName->CreateLabelLayoutItem(), 0, 0);
-       controlsLayout->AddItem(fFileName->CreateTextViewLayoutItem(), 1, 0);
-       controlsLayout->AddItem(fImageFormatSelector->CreateLabelLayoutItem(), 
0, 
-               1);
-       
controlsLayout->AddItem(fImageFormatSelector->CreateMenuBarLayoutItem(), 1,
-               1);
-       controlsLayout->AddItem(fCaptureRateSelector->CreateLabelLayoutItem(), 
0,
-               2);
-       
controlsLayout->AddItem(fCaptureRateSelector->CreateMenuBarLayoutItem(), 1,
-               2);
-       controlsLayout->AddItem(BSpaceLayoutItem::CreateGlue(), 0, 3, 2);
+       BLayoutBuilder::Grid<>(controlsLayout)
+               .AddTextControl(fFileName, 0, 0)
+               .AddMenuField(fImageFormatSelector, 0, 1)
+               .AddMenuField(fCaptureRateSelector, 0, 2)
+               .Add(BSpaceLayoutItem::CreateGlue(), 0, 3, 2, 1);
 
        // FTP setup box
-       fFtpSetupBox = new BBox(B_TRANSLATE("FTP Setup"), B_WILL_DRAW);
+       fFtpSetupBox = new BBox("FTP Setup", B_WILL_DRAW);
 
        fUploadClientMenu = new BPopUpMenu(B_TRANSLATE("Send to" 
B_UTF8_ELLIPSIS));
-       for (int i = 0; kUploadClient[i]; i++) {
+       for (int i = 0; i < kUploadClientsCount; i++) {
                BMessage *m = new BMessage(msg_upl_client);
                m->AddInt32("client", i);
-               fUploadClientMenu->AddItem(new BMenuItem(kUploadClient[i], m));
+               fUploadClientMenu->AddItem(new BMenuItem(kUploadClients[i], m));
        }
        fUploadClientMenu->SetTargetForItems(this);
        
fUploadClientMenu->FindItem(fUploadClientSetting->Value())->SetMarked(true);
@@ -818,38 +767,16 @@
        fPassiveFtp->SetTarget(this);
        fPassiveFtp->SetValue(fPassiveFtpSetting->Value());
 
-       ftpLayout->AddItem(fUploadClientSelector->CreateLabelLayoutItem(), 0, 
0);
-       ftpLayout->AddItem(fUploadClientSelector->CreateMenuBarLayoutItem(), 1, 
0);
-       ftpLayout->AddItem(fServerName->CreateLabelLayoutItem(), 0, 1);
-       ftpLayout->AddItem(fServerName->CreateTextViewLayoutItem(), 1, 1);
-       ftpLayout->AddItem(fLoginId->CreateLabelLayoutItem(), 0, 2);
-       ftpLayout->AddItem(fLoginId->CreateTextViewLayoutItem(), 1, 2);
-       ftpLayout->AddItem(fPassword->CreateLabelLayoutItem(), 0, 3);
-       ftpLayout->AddItem(fPassword->CreateTextViewLayoutItem(), 1, 3);
-       ftpLayout->AddItem(fDirectory->CreateLabelLayoutItem(), 0, 4);
-       ftpLayout->AddItem(fDirectory->CreateTextViewLayoutItem(), 1, 4);
-       ftpLayout->AddView(fPassiveFtp, 0, 5, 2);
+       BLayoutBuilder::Grid<>(ftpLayout)
+               .AddMenuField(fUploadClientSelector, 0, 0)
+               .AddTextControl(fServerName, 0, 1)
+               .AddTextControl(fLoginId, 0, 2)
+               .AddTextControl(fPassword, 0, 3)
+               .AddTextControl(fDirectory, 0, 4)
+               .Add(fPassiveFtp, 0, 5, 2, 1);
 
-       fStatusLine = new BStringView("Status Line", B_TRANSLATE("Waiting" 
B_UTF8_ELLIPSIS));
-
-       BGroupLayout *groupLayout = new BGroupLayout(B_VERTICAL);
-       groupLayout->SetInsets(kXBuffer, kYBuffer, kXBuffer, kYBuffer);
-
-       theView->SetLayout(groupLayout);
-
-       theView->AddChild(BSpaceLayoutItem::CreateVerticalStrut(kYBuffer));
-       theView->AddChild(BGroupLayoutBuilder(B_HORIZONTAL)
-               .Add(BSpaceLayoutItem::CreateHorizontalStrut(0.0))
-               .Add(fVideoView)
-               .Add(BSpaceLayoutItem::CreateHorizontalStrut(0.0))
-       );
-       theView->AddChild(BSpaceLayoutItem::CreateVerticalStrut(kYBuffer));
-       theView->AddChild(BGroupLayoutBuilder(B_HORIZONTAL, kXBuffer)
-               .Add(fCaptureSetupBox)
-               .Add(fFtpSetupBox)
-       );
-       theView->AddChild(BSpaceLayoutItem::CreateVerticalStrut(kYBuffer));
-       theView->AddChild(fStatusLine);
+       fStatusLine = new BStringView("Status Line",
+               B_TRANSLATE("Waiting" B_UTF8_ELLIPSIS));
 }
 
 
@@ -880,24 +807,32 @@
        fSettings = new Settings(filename, dirname);
 
        fServerSetting = new StringValueSetting("Server", "ftp.my.server",
-               B_TRANSLATE("server address expected"), "");
+               B_TRANSLATE("server address expected"));
+
        fLoginSetting = new StringValueSetting("Login", "loginID",
-               B_TRANSLATE("login ID expected"), "");
+               B_TRANSLATE("login ID expected"));
+
        fPasswordSetting = new StringValueSetting("Password", 
-               B_TRANSLATE("password"), B_TRANSLATE("password expected"), "");
+               B_TRANSLATE("password"), B_TRANSLATE("password expected"));
+
        fDirectorySetting = new StringValueSetting("Directory", "web/images",
-               B_TRANSLATE("destination directory expected"), "");
+               B_TRANSLATE("destination directory expected"));
+
        fPassiveFtpSetting = new BooleanValueSetting("PassiveFtp", 1);
+
        fFilenameSetting = new StringValueSetting("StillImageFilename",
-               "codycam.jpg", B_TRANSLATE("still image filename expected"), 
"");
+               "codycam.jpg", B_TRANSLATE("still image filename expected"));
+
        fImageFormatSettings = new StringValueSetting("ImageFileFormat",
-               B_TRANSLATE("JPEG image"), B_TRANSLATE("image file format 
expected"), 
-               "");
+               B_TRANSLATE("JPEG image"), B_TRANSLATE("image file format 
expected"));
+
        fCaptureRateSetting = new EnumeratedStringValueSetting("CaptureRate",
-               kCaptureRate[3], kCaptureRate, B_TRANSLATE("capture rate 
expected"),
+               kCaptureRates[3].name, &CaptureRateAt,
+               B_TRANSLATE("capture rate expected"),
                "unrecognized capture rate specified");
+
        fUploadClientSetting = new EnumeratedStringValueSetting("UploadClient",
-               B_TRANSLATE("FTP"), kUploadClient, 
+               B_TRANSLATE("FTP"), &UploadClientAt, 
                B_TRANSLATE("upload client name expected"),
                B_TRANSLATE("unrecognized upload client specified"));
 
@@ -950,8 +885,9 @@
 
 ControlWindow::ControlWindow(const BRect& frame, BView* controls, 
        media_node node)
-       : BWindow(frame, B_TRANSLATE("Video settings"), B_TITLED_WINDOW, 
-       B_ASYNCHRONOUS_CONTROLS)
+       :
+       BWindow(frame, B_TRANSLATE("Video settings"), B_TITLED_WINDOW, 
+               B_ASYNCHRONOUS_CONTROLS)
 {
        fView = controls;
        fNode = node;

Modified: haiku/trunk/src/apps/codycam/CodyCam.h
===================================================================
--- haiku/trunk/src/apps/codycam/CodyCam.h      2010-09-03 04:49:56 UTC (rev 
38518)
+++ haiku/trunk/src/apps/codycam/CodyCam.h      2010-09-03 08:36:23 UTC (rev 
38519)
@@ -25,19 +25,7 @@
 enum {
        msg_filename    = 'file',
 
-       msg_rate_15s    = 'r15s',
-       msg_rate_30s    = 'r30s',
-       msg_rate_1m             = 'r1m ',
-       msg_rate_5m             = 'r5m ',
-       msg_rate_10m    = 'r10m',
-       msg_rate_15m    = 'r15m',
-       msg_rate_30m    = 'r30m',
-       msg_rate_1h             = 'r1h ',       
-       msg_rate_2h             = 'r2h ',       
-       msg_rate_4h             = 'r4h ',       
-       msg_rate_8h             = 'r8h ',       
-       msg_rate_24h    = 'r24h',
-       msg_rate_never  = 'nevr',       
+       msg_rate_changed = 'rate',
 
        msg_translate   = 'tran',
 
@@ -60,34 +48,44 @@
 };
 
 
-const char* kCaptureRate[] = {
-       // NOTE: These are translated once the app catalog is loaded.
-       "Every 15 seconds",
-       "Every 30 seconds",
-       "Every minute",
-       "Every 5 minutes",
-       "Every 10 minutes",
-       "Every 15 minutes",
-       "Every 30 minutes",
-       "Every hour",
-       "Every 2 hours",
-       "Every 4 hours",
-       "Every 8 hours",
-       "Every 24 hours",
-       "Never",        
-       0
+struct capture_rate {
+       const char* name;
+       time_t          seconds;
 };
 
 
-const char* kUploadClient[] = {
+// NOTE: These are translated once the app catalog is loaded.
+capture_rate kCaptureRates[] = {
+       {"Every 15 seconds", 15 },
+       {"Every 30 seconds", 30 },
+       {"Every minute", 60 },
+       {"Every 5 minutes", 5 * 60 },
+       {"Every 10 minutes", 10 * 60 },
+       {"Every 15 minutes", 15 * 60 },
+       {"Every 30 minutes", 30 * 60 },
+       {"Every hour", 60 * 60 },
+       {"Every 2 hours", 2 * 60 * 60 },
+       {"Every 4 hours", 4 * 60 * 60 },
+       {"Every 8 hours", 8 * 60 * 60 },
+       {"Every 24 hours", 24 * 60 * 60 },
+       {"Never", 0 }
+};
+
+
+const int32 kCaptureRatesCount = sizeof(kCaptureRates) / sizeof(capture_rate);
+
+
+const char* kUploadClients[] = {
        // NOTE: These are translated once the app catalog is loaded.
        "FTP",
        "SFTP",
-       "Local",
-       0
+       "Local"
 };
 
 
+const int32 kUploadClientsCount = sizeof(kUploadClients) / sizeof(char*);
+
+
 class CodyCam : public BApplication {
 public:
                                                        CodyCam();
@@ -129,7 +127,7 @@
                        BStringView*    StatusLine();
 
 private:
-                       void                    _BuildCaptureControls(BView* 
theView);
+                       void                    _BuildCaptureControls();
 
                        void                    _SetUpSettings(const char* 
filename,
                                                                const char* 
dirname);
@@ -140,7 +138,6 @@
                        media_node*             fProducer;
                        port_id*                fPortPtr;
 
-                       BView*                  fView;
                        BView*                  fVideoView;
 
                        BTextControl*   fFileName;

Modified: haiku/trunk/src/apps/codycam/Settings.cpp
===================================================================
--- haiku/trunk/src/apps/codycam/Settings.cpp   2010-09-03 04:49:56 UTC (rev 
38518)
+++ haiku/trunk/src/apps/codycam/Settings.cpp   2010-09-03 08:36:23 UTC (rev 
38519)
@@ -16,9 +16,11 @@
 Settings* settings = NULL;
 
 
-StringValueSetting::StringValueSetting(const char* name, const char* 
defaultValue,
-       const char* valueExpectedErrorString, const char* wrongValueErrorString)
-       : SettingsArgvDispatcher(name),
+StringValueSetting::StringValueSetting(const char* name,
+       const char* defaultValue, const char* valueExpectedErrorString,
+       const char* wrongValueErrorString)
+       :
+       SettingsArgvDispatcher(name),
        fDefaultValue(defaultValue),
        fValueExpectedErrorString(valueExpectedErrorString),
        fWrongValueErrorString(wrongValueErrorString),
@@ -55,7 +57,7 @@
 void 
 StringValueSetting::SaveSettingValue(Settings* settings)
 {
-       printf("-------StringValueSetting::SaveSettingValue %s %s\n", Name(), 
fValue);
+       printf("-----StringValueSetting::SaveSettingValue %s %s\n", Name(), 
fValue);
        settings->Write("\"%s\"", fValue);
 }
 
@@ -83,11 +85,13 @@
 
 
 EnumeratedStringValueSetting::EnumeratedStringValueSetting(const char* name,
-       const char* defaultValue, const char *const *values,
+       const char* defaultValue, StringEnumerator enumerator,
        const char* valueExpectedErrorString,
        const char* wrongValueErrorString)
-       : StringValueSetting(name, defaultValue, valueExpectedErrorString, 
wrongValueErrorString),
-       fValues(values)
+       :
+       StringValueSetting(name, defaultValue, valueExpectedErrorString,
+               wrongValueErrorString),
+       fEnumerator(enumerator)
 {
 }
 
@@ -97,16 +101,7 @@
 {
 #if DEBUG
        // must be one of the enumerated values
-       bool found = false;
-       for (int32 index = 0; ; index++) {
-               if (!fValues[index])
-                       break;
-               if (strcmp(fValues[index], newValue) != 0) 
-                       continue;
-               found = true;
-               break;
-       }
-       ASSERT(found);
+       ASSERT(_ValidateString(newValue));
 #endif
        StringValueSetting::ValueChanged(newValue);
 }
@@ -118,18 +113,8 @@
        if (!*++argv) 
                return fValueExpectedErrorString;
 
-       printf("-----EnumeratedStringValueSetting::Handle %s %s\n", *(argv-1), 
*argv);
-       bool found = false;
-       for (int32 index = 0; ; index++) {
-               if (!fValues[index])
-                       break;
-               if (strcmp(fValues[index], *argv) != 0) 
-                       continue;
-               found = true;
-               break;
-       }       
-                               
-       if (!found)
+       printf("---EnumeratedStringValueSetting::Handle %s %s\n", *(argv-1), 
*argv);
+       if (!_ValidateString(*argv))
                return fWrongValueErrorString;
        
        ValueChanged(*argv);    
@@ -137,6 +122,20 @@
 }
 
 
+bool
+EnumeratedStringValueSetting::_ValidateString(const char* string)
+{
+       for (int32 i = 0;; i++) {
+               const char* enumString = fEnumerator(i);
+               if (!enumString)
+                       return false;
+               if (strcmp(enumString, string) == 0)
+                       return true;
+       }
+       return false;
+}
+
+
 //     #pragma mark -
 
 

Modified: haiku/trunk/src/apps/codycam/Settings.h
===================================================================
--- haiku/trunk/src/apps/codycam/Settings.h     2010-09-03 04:49:56 UTC (rev 
38518)
+++ haiku/trunk/src/apps/codycam/Settings.h     2010-09-03 08:36:23 UTC (rev 
38519)
@@ -9,80 +9,90 @@
 class StringValueSetting : public SettingsArgvDispatcher {
        // simple string setting
 public:
-       StringValueSetting(const char* name, const char* defaultValue, 
-               const char* valueExpectedErrorString,
-               const char* wrongValueErrorString);
+                                                               
StringValueSetting(const char* name,
+                                                                       const 
char* defaultValue, 
+                                                                       const 
char* valueExpectedErrorString,
+                                                                       const 
char* wrongValueErrorString = "");
 
-       virtual ~StringValueSetting();
+       virtual                                         ~StringValueSetting();
 
-       void ValueChanged(const char* newValue);
-       const char* Value() const;
-       virtual const char* Handle(const char *const *argv);    
+                       void                            ValueChanged(const 
char* newValue);
+                       const char*                     Value() const;
+       virtual const char*                     Handle(const char *const 
*argv);        
 
 protected:
-       virtual void SaveSettingValue(Settings*);
-       virtual bool NeedsSaving() const;
+       virtual void                            SaveSettingValue(Settings*);
+       virtual bool                            NeedsSaving() const;
 
-       const char* fDefaultValue;
-       const char* fValueExpectedErrorString;
-       const char* fWrongValueErrorString;
-       char* fValue;
+                       const char*                     fDefaultValue;
+                       const char*                     
fValueExpectedErrorString;
+                       const char*                     fWrongValueErrorString;
+                       char*                           fValue;
 };
 
 
+// string setting, values that do not match string enumeration
+// are rejected
 class EnumeratedStringValueSetting : public StringValueSetting {
-       // string setting, values that do not match string enumeration
-       // are rejected
-       public:
-               EnumeratedStringValueSetting(const char* name, const char* 
defaultValue, 
-                       const char *const *values, const char* 
valueExpectedErrorString,
-                       const char* wrongValueErrorString);
+public:
+       // A pointer to a function returning a string for an index, or NULL
+       // if the index is out of bounds.
+       typedef const char* (*StringEnumerator)(int32);
 
-               void ValueChanged(const char* newValue);
-               virtual const char* Handle(const char *const *argv);    
+                                                               
EnumeratedStringValueSetting(const char* name,
+                                                                       const 
char* defaultValue,
+                                                                       
StringEnumerator enumerator,
+                                                                       const 
char* valueExpectedErrorString,
+                                                                       const 
char* wrongValueErrorString);
 
-       protected:
-               const char *const *fValues;
-               char* fValue;
+                       void                            ValueChanged(const 
char* newValue);
+       virtual const char*                     Handle(const char *const 
*argv);        
+
+private:
+                       bool                            _ValidateString(const 
char* string);
+                       StringEnumerator        fEnumerator;
 };
 
 
+// simple int32 setting
 class ScalarValueSetting : public SettingsArgvDispatcher {
-       // simple int32 setting
 public:
-       ScalarValueSetting(const char* name, int32 defaultValue,
-               const char* valueExpectedErrorString, const char* 
wrongValueErrorString,
-               int32 min = LONG_MIN, int32 max = LONG_MAX);
-       virtual ~ScalarValueSetting();
+                                                               
ScalarValueSetting(const char* name,
+                                                                       int32 
defaultValue,
+                                                                       const 
char* valueExpectedErrorString,
+                                                                       const 
char* wrongValueErrorString,
+                                                                       int32 
min = LONG_MIN, int32 max = LONG_MAX);
+       virtual                                         ~ScalarValueSetting();
 
-       void ValueChanged(int32 newValue);
-       int32 Value() const;
-       void GetValueAsString(char*) const;
-       virtual const char* Handle(const char *const *argv);    
+                       void                            ValueChanged(int32 
newValue);
+                       int32                           Value() const;
+                       void                            GetValueAsString(char*) 
const;
+       virtual const char*                     Handle(const char *const 
*argv);        
 
 protected:
-       virtual void SaveSettingValue(Settings*);
-       virtual bool NeedsSaving() const;
+       virtual void                            SaveSettingValue(Settings*);
+       virtual bool                            NeedsSaving() const;
 
-       int32 fDefaultValue;
-       int32 fValue;
-       int32 fMax;
-       int32 fMin;
-       const char* fValueExpectedErrorString;
-       const char* fWrongValueErrorString;
+                       int32                           fDefaultValue;
+                       int32                           fValue;
+                       int32                           fMax;
+                       int32                           fMin;
+                       const char*                     
fValueExpectedErrorString;
+                       const char*                     fWrongValueErrorString;
 };
 
+
 class BooleanValueSetting : public ScalarValueSetting {
-       // on-off setting
-       public:
-               BooleanValueSetting(const char* name, bool defaultValue);
-               virtual ~BooleanValueSetting();
+public:
+                                                               
BooleanValueSetting(const char* name,
+                                                                       bool 
defaultValue);
+       virtual                                         ~BooleanValueSetting();
 
-               bool Value() const;
-               virtual const char* Handle(const char *const *argv);    
+                       bool                            Value() const;
+       virtual const char*                     Handle(const char *const 
*argv);        
 
-       protected:
-               virtual void SaveSettingValue(Settings *);
+protected:
+       virtual void                            SaveSettingValue(Settings *);
 };
 
 #endif // SETTINGS_H


Other related posts:

  • » [haiku-commits] r38519 - haiku/trunk/src/apps/codycam - yourpalal2