Skip to content

Commit

Permalink
Generalised pre set notifications for parameters and reworked alphabe…
Browse files Browse the repository at this point in the history
…t history.

fixes dasher-project#93
  • Loading branch information
ipomoena authored and prlw1 committed Apr 21, 2016
1 parent 15cd0b6 commit 3ee90e7
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 24 deletions.
1 change: 0 additions & 1 deletion Src/DasherCore/DashIntfSettings.cpp
Expand Up @@ -28,6 +28,5 @@ void CDashIntfSettings::SetLongParameter(int iParameter, long lValue) {
}

void CDashIntfSettings::SetStringParameter(int iParameter, const string &strValue) {
CDasherInterfaceBase::PreSetNotify(iParameter, strValue);
CDasherInterfaceBase::SetStringParameter(iParameter, strValue);
}
49 changes: 31 additions & 18 deletions Src/DasherCore/DasherInterfaceBase.cpp
Expand Up @@ -81,9 +81,17 @@ static char THIS_FILE[] = __FILE__;
#endif
#endif

CDasherInterfaceBase::CDasherInterfaceBase(CSettingsStore *pSettingsStore, CFileUtils* fileUtils) : CSettingsUser(pSettingsStore), m_pDasherModel(new CDasherModel()), m_pFramerate(new CFrameRate(this)), m_pSettingsStore(pSettingsStore), m_pLockLabel(NULL) {
CDasherInterfaceBase::CDasherInterfaceBase(CSettingsStore *pSettingsStore, CFileUtils* fileUtils)
: CSettingsUser(pSettingsStore),
m_pDasherModel(new CDasherModel()),
m_pFramerate(new CFrameRate(this)),
m_pSettingsStore(pSettingsStore),
m_pLockLabel(NULL),
m_preSetObserver(*pSettingsStore){

pSettingsStore->Register(this);
pSettingsStore->PreSetObservable().Register(&m_preSetObserver);

m_fileUtils = fileUtils;

// Ensure that pointers to 'owned' objects are set to NULL.
Expand Down Expand Up @@ -195,26 +203,31 @@ CDasherInterfaceBase::~CDasherInterfaceBase() {

delete m_pFramerate;
}

void CDasherInterfaceBase::PreSetNotify(int iParameter, const std::string &sNewValue) {
// FIXME - make this a more general 'pre-set' event in the message
// infrastructure

void CDasherInterfaceBase::CPreSetObserver::HandleEvent(int iParameter) {
switch(iParameter) {
case SP_ALPHABET_ID:
string value = m_settingsStore.GetStringParameter(SP_ALPHABET_ID);
// Cycle the alphabet history
if(GetStringParameter(SP_ALPHABET_ID) != sNewValue) {
if(GetStringParameter(SP_ALPHABET_1) != sNewValue) {
if(GetStringParameter(SP_ALPHABET_2) != sNewValue) {
if(GetStringParameter(SP_ALPHABET_3) != sNewValue)
SetStringParameter(SP_ALPHABET_4, GetStringParameter(SP_ALPHABET_3));
SetStringParameter(SP_ALPHABET_3, GetStringParameter(SP_ALPHABET_2));
}
SetStringParameter(SP_ALPHABET_2, GetStringParameter(SP_ALPHABET_1));
}
SetStringParameter(SP_ALPHABET_1, GetStringParameter(SP_ALPHABET_ID));
}

vector<string> newHistory;
newHistory.push_back(value);
string v;
if ((v = m_settingsStore.GetStringParameter(SP_ALPHABET_1)) != value)
newHistory.push_back(v);
if ((v = m_settingsStore.GetStringParameter(SP_ALPHABET_2)) != value)
newHistory.push_back(v);
if ((v = m_settingsStore.GetStringParameter(SP_ALPHABET_3)) != value)
newHistory.push_back(v);
if ((v = m_settingsStore.GetStringParameter(SP_ALPHABET_4)) != value)
newHistory.push_back(v);

// Fill empty slots.
while (newHistory.size() < 4)
newHistory.push_back("");

m_settingsStore.SetStringParameter(SP_ALPHABET_1, newHistory[0]);
m_settingsStore.SetStringParameter(SP_ALPHABET_2, newHistory[1]);
m_settingsStore.SetStringParameter(SP_ALPHABET_3, newHistory[2]);
m_settingsStore.SetStringParameter(SP_ALPHABET_4, newHistory[3]);
break;
}
}
Expand Down
11 changes: 9 additions & 2 deletions Src/DasherCore/DasherInterfaceBase.h
Expand Up @@ -147,8 +147,6 @@ class Dasher::CDasherInterfaceBase : public CMessageDisplay, public Observable<c

virtual void HandleEvent(int iParameter);

void PreSetNotify(int iParameter, const std::string &sValue);

///Locks/unlocks Dasher. The default here stores the lock message and percentage
/// in m_strLockMessage, such that NewFrame renders this instead of the canvas
/// if we are locked. Subclasses may override to implement better (GUI)
Expand Down Expand Up @@ -528,6 +526,15 @@ class Dasher::CDasherInterfaceBase : public CMessageDisplay, public Observable<c
/// this interface was created, as ClSet and ResetParameter need to access it.
/// (TODO _could_ move these into CSettingsUser, but that seems uglier given so few clients?)
CSettingsStore * const m_pSettingsStore;

class CPreSetObserver : public Observer<int> {
CSettingsStore& m_settingsStore;
public:
CPreSetObserver(CSettingsStore& settingsStore) : m_settingsStore(settingsStore) {};
void HandleEvent(int evt) override;
};

CPreSetObserver m_preSetObserver;
CFileUtils* m_fileUtils;

//The default expansion policy to use - an amortized policy depending on the LP_NODE_BUDGET parameter.
Expand Down
1 change: 0 additions & 1 deletion Src/DasherCore/Observable.h
Expand Up @@ -22,7 +22,6 @@ template <typename T> class Observable {
Observable();
void Register(Observer<T> *pLstnr);
void Unregister(Observer<T> *pLstnr);
protected:
void DispatchEvent(T t);
private:
typedef typename std::list< Observer<T>* > ListenerList;
Expand Down
6 changes: 6 additions & 0 deletions Src/DasherCore/SettingsStore.cpp
Expand Up @@ -141,6 +141,8 @@ void CSettingsStore::SetBoolParameter(int iParameter, bool bValue) {
if(bValue == GetBoolParameter(iParameter))
return;

pre_set_observable_.DispatchEvent(iParameter);

// Set the value
p->second.bool_value = bValue;

Expand All @@ -160,6 +162,8 @@ void CSettingsStore::SetLongParameter(int iParameter, long lValue) {
if(lValue == GetLongParameter(iParameter))
return;

pre_set_observable_.DispatchEvent(iParameter);

// Set the value
p->second.long_value = lValue;

Expand All @@ -179,6 +183,8 @@ void CSettingsStore::SetStringParameter(int iParameter, const std::string sValue
if(sValue == GetStringParameter(iParameter))
return;

pre_set_observable_.DispatchEvent(iParameter);

// Set the value
p->second.string_value = sValue;

Expand Down
4 changes: 3 additions & 1 deletion Src/DasherCore/SettingsStore.h
Expand Up @@ -36,7 +36,7 @@ namespace Dasher {
/// The public interface uses UTF-8 strings. All Keys should be
/// in American English and encodable in ASCII. However,
/// string Values may contain special characters where appropriate.
class CSettingsStore : public Observable<int> {
class CSettingsStore : public Observable<int> {
public:

CSettingsStore();
Expand All @@ -61,6 +61,7 @@ namespace Dasher {
void AddParameters(const Settings::bp_table* table, size_t count);
void AddParameters(const Settings::lp_table* table, size_t count);
void AddParameters(const Settings::sp_table* table, size_t count);
Observable<int>& PreSetObservable() { return pre_set_observable_; }

protected:
///Loads all (persistent) prefs from disk, using+storing default values when no
Expand Down Expand Up @@ -124,6 +125,7 @@ namespace Dasher {
};

std::unordered_map<int, Parameter> parameters_;
Observable<int> pre_set_observable_;
};
/// Superclass for anything that wants to use/access/store persistent settings.
/// (The nearest thing remaining to the old CDasherComponent,
Expand Down
6 changes: 5 additions & 1 deletion Src/Win32/Widgets/StatusControl.cpp
Expand Up @@ -10,7 +10,11 @@ CStatusControl::CStatusControl(Dasher::CSettingsUser *pCreateFrom, CAppSettings

void CStatusControl::HandleEvent(int iParameter) {
switch (iParameter) {
case SP_ALPHABET_ID:
case SP_ALPHABET_ID:
case SP_ALPHABET_1:
case SP_ALPHABET_2:
case SP_ALPHABET_3:
case SP_ALPHABET_4:
PopulateCombo();
break;
case LP_MAX_BITRATE:
Expand Down

0 comments on commit 3ee90e7

Please sign in to comment.