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