Further flesh out GUITeamUISettings to be able to save/restore. This should be

more or less complete now, or at least far enough along to start doing some
things with it.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43112 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent 2011-11-02 14:01:24 +00:00
parent df42e66b1b
commit 9b15fe0a81
2 changed files with 128 additions and 10 deletions

View File

@ -23,12 +23,14 @@ GUITeamUISettings::GUITeamUISettings(const char* settingsID)
GUITeamUISettings::GUITeamUISettings(const GUITeamUISettings& other) GUITeamUISettings::GUITeamUISettings(const GUITeamUISettings& other)
{ {
fID = other.fID; if (_SetTo(other) != B_OK)
throw std::bad_alloc();
} }
GUITeamUISettings::~GUITeamUISettings() GUITeamUISettings::~GUITeamUISettings()
{ {
_Unset();
} }
@ -50,7 +52,11 @@ status_t
GUITeamUISettings::SetTo(const BMessage& archive) GUITeamUISettings::SetTo(const BMessage& archive)
{ {
status_t error = archive.FindString("ID", &fID); status_t error = archive.FindString("ID", &fID);
if (error != B_OK)
return error;
error = archive.FindMessage("values", &fValues);
return error; return error;
} }
@ -61,9 +67,13 @@ GUITeamUISettings::WriteTo(BMessage& archive) const
status_t error = archive.AddString("ID", fID); status_t error = archive.AddString("ID", fID);
if (error != B_OK) if (error != B_OK)
return error; return error;
error = archive.AddInt32("type", Type()); error = archive.AddInt32("type", Type());
if (error != B_OK)
return error;
error = archive.AddMessage("values", &fValues);
return error; return error;
} }
@ -71,15 +81,110 @@ GUITeamUISettings::WriteTo(BMessage& archive) const
TeamUISettings* TeamUISettings*
GUITeamUISettings::Clone() const GUITeamUISettings::Clone() const
{ {
GUITeamUISettings* settings = new GUITeamUISettings(fID.String()); GUITeamUISettings* settings = new(std::nothrow) GUITeamUISettings();
if (settings == NULL)
return NULL;
if (settings->_SetTo(*this) != B_OK) {
delete settings;
return NULL;
}
return settings; return settings;
} }
status_t
GUITeamUISettings::AddSetting(Setting* setting)
{
if (!fSettings.AddItem(setting))
return B_NO_MEMORY;
setting->AcquireReference();
return B_OK;
}
bool
GUITeamUISettings::SetValue(const Setting* setting, const BVariant& value)
{
const char* fieldName = setting->ID();
fValues.RemoveName(fieldName);
return value.AddToMessage(fValues, fieldName) == B_OK;
}
BVariant
GUITeamUISettings::Value(const Setting* setting) const
{
BVariant value;
return value.SetFromMessage(fValues, setting->ID()) == B_OK ?
value : setting->DefaultValue();
}
BVariant
GUITeamUISettings::Value(const char* settingID) const
{
BVariant value;
status_t result = value.SetFromMessage(fValues, settingID);
if (result != B_OK) {
for (int32 i = 0; i < fSettings.CountItems(); i++) {
Setting* setting = fSettings.ItemAt(i);
if (strcmp(setting->ID(), settingID) == 0) {
value = setting->DefaultValue();
break;
}
}
}
return value;
}
GUITeamUISettings& GUITeamUISettings&
GUITeamUISettings::operator=(const GUITeamUISettings& other) GUITeamUISettings::operator=(const GUITeamUISettings& other)
{ {
fID = other.fID; if (_SetTo(other) != B_OK)
throw std::bad_alloc();
return *this; return *this;
} }
status_t
GUITeamUISettings::_SetTo(const GUITeamUISettings& other)
{
_Unset();
for (int32 i = 0; i < other.fSettings.CountItems(); i++) {
Setting* setting = other.fSettings.ItemAt(i);
if (!fSettings.AddItem(setting))
return B_NO_MEMORY;
setting->AcquireReference();
}
fValues = other.fValues;
return B_OK;
}
void
GUITeamUISettings::_Unset()
{
fID.Truncate(0);
for (int32 i = 0; i < fSettings.CountItems(); i++)
fSettings.ItemAt(i)->ReleaseReference();
fSettings.MakeEmpty();
fValues.MakeEmpty();
}

View File

@ -6,14 +6,14 @@
#define GUI_TEAM_UI_SETTINGS_H #define GUI_TEAM_UI_SETTINGS_H
#include <Message.h>
#include <String.h> #include <String.h>
#include <ObjectList.h> #include <ObjectList.h>
#include "Setting.h"
#include "TeamUISettings.h" #include "TeamUISettings.h"
class BMessage;
class GUITeamUISettings : public TeamUISettings { class GUITeamUISettings : public TeamUISettings {
public: public:
@ -30,12 +30,25 @@ public:
virtual status_t WriteTo(BMessage& archive) const; virtual status_t WriteTo(BMessage& archive) const;
virtual TeamUISettings* Clone() const; virtual TeamUISettings* Clone() const;
status_t AddSetting(Setting* setting);
bool SetValue(const Setting* setting,
const BVariant& value);
BVariant Value(const Setting* setting) const;
BVariant Value(const char* settingID) const;
GUITeamUISettings& operator=(const GUITeamUISettings& other); GUITeamUISettings& operator=(const GUITeamUISettings& other);
// throws std::bad_alloc // throws std::bad_alloc
private:
typedef BObjectList<Setting> SettingsList;
private: private:
BString fID; status_t _SetTo(const GUITeamUISettings& other);
void _Unset();
SettingsList fSettings;
BMessage fValues;
BString fID;
}; };