added 2 changesets to branch 'refs/remotes/axeld-github/network-preferences' old head: 557c74fbfc685880a6657774fff7e9ec2822248e new head: 574e5c855fc9092e14d5fae76384f4fec8664e5e overview: https://github.com/axeld/haiku/compare/557c74fbfc68...574e5c855fc9 ---------------------------------------------------------------------------- a36204afab63: Network: also notify interface list items * When the network configuration changes. 574e5c855fc9: DriverSettingsMessageAdapter: optional field converter. * You can now optionally specify a converter that does the actual message to settings conversion, and vice versa. * This allows for more sophisticated and custom conversions. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- 6 files changed, 88 insertions(+), 25 deletions(-) .../shared/DriverSettingsMessageAdapter.h | 20 ++++++- src/kits/shared/DriverSettingsMessageAdapter.cpp | 62 +++++++++++++++----- src/preferences/network/InterfaceListItem.cpp | 10 +++- src/preferences/network/InterfaceListItem.h | 2 + src/preferences/network/NetworkWindow.cpp | 14 ++++- src/preferences/network/NetworkWindow.h | 5 +- ############################################################################ Commit: a36204afab63acf02fce9840bc32d0507ee30965 Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Tue Mar 3 22:47:36 2015 UTC Network: also notify interface list items * When the network configuration changes. ---------------------------------------------------------------------------- diff --git a/src/preferences/network/InterfaceListItem.cpp b/src/preferences/network/InterfaceListItem.cpp index d6ac0bd..f295576 100644 --- a/src/preferences/network/InterfaceListItem.cpp +++ b/src/preferences/network/InterfaceListItem.cpp @@ -71,9 +71,6 @@ InterfaceListItem::DrawItem(BView* owner, BRect bounds, bool complete) list->FillRect(bounds); } - // TODO: only update periodically - _UpdateState(); - BBitmap* stateIcon = _StateIcon(); const char* stateText = _StateText(); @@ -154,6 +151,13 @@ InterfaceListItem::Update(BView* owner, const BFont* font) } +void +InterfaceListItem::ConfigurationUpdated(const BMessage& message) +{ + _UpdateState(); +} + + // #pragma mark - InterfaceListItem private methods diff --git a/src/preferences/network/InterfaceListItem.h b/src/preferences/network/InterfaceListItem.h index ac8e6e0..6141a37 100644 --- a/src/preferences/network/InterfaceListItem.h +++ b/src/preferences/network/InterfaceListItem.h @@ -30,6 +30,8 @@ public: inline const char* Name() { return fInterface.Name(); } + void ConfigurationUpdated(const BMessage& message); + private: void _Init(); void _PopulateBitmaps(const char* mediaType); diff --git a/src/preferences/network/NetworkWindow.cpp b/src/preferences/network/NetworkWindow.cpp index 1b5deca..ada463a 100644 --- a/src/preferences/network/NetworkWindow.cpp +++ b/src/preferences/network/NetworkWindow.cpp @@ -294,7 +294,7 @@ NetworkWindow::_ScanInterfaces() InterfaceListItem* item = new InterfaceListItem(interface.Name()); item->SetExpanded(true); - fInterfaceItemMap.insert(std::pair<BString, BListItem*>( + fInterfaceItemMap.insert(std::pair<BString, InterfaceListItem*>( BString(interface.Name()), item)); fListView->AddItem(item); } @@ -349,10 +349,11 @@ NetworkWindow::_ScanAddOns() fAddOns.AddItem(addOn); // Per interface items - ItemMap::const_iterator iterator = fInterfaceItemMap.begin(); + InterfaceItemMap::const_iterator iterator + = fInterfaceItemMap.begin(); for (; iterator != fInterfaceItemMap.end(); iterator++) { const BString& interface = iterator->first; - BListItem* interfaceItem = iterator->second; + InterfaceListItem* interfaceItem = iterator->second; uint32 cookie = 0; while (true) { @@ -462,9 +463,16 @@ NetworkWindow::_BroadcastSettingsUpdate(uint32 type) void NetworkWindow::_BroadcastConfigurationUpdate(const BMessage& message) { + InterfaceItemMap::const_iterator itemIterator = fInterfaceItemMap.begin(); + for (; itemIterator != fInterfaceItemMap.end(); itemIterator++) + itemIterator->second->ConfigurationUpdated(message); + SettingsMap::const_iterator iterator = fSettingsMap.begin(); for (; iterator != fSettingsMap.end(); iterator++) iterator->second->ConfigurationUpdated(message); + + // TODO: improve invalidated region to the one that matters + fListView->Invalidate(); } diff --git a/src/preferences/network/NetworkWindow.h b/src/preferences/network/NetworkWindow.h index 75ab6ec..b08b0d5 100644 --- a/src/preferences/network/NetworkWindow.h +++ b/src/preferences/network/NetworkWindow.h @@ -23,6 +23,7 @@ using namespace BNetworkKit; class BButton; class BMenu; +class InterfaceListItem; class InterfaceView; @@ -54,14 +55,14 @@ private: private: typedef BObjectList<BNetworkSettingsAddOn> AddOnList; typedef BObjectList<BNetworkSettingsItem> ItemList; - typedef std::map<BString, BListItem*> ItemMap; + typedef std::map<BString, InterfaceListItem*> InterfaceItemMap; typedef std::map<BListItem*, BNetworkSettingsItem*> SettingsMap; BNetworkSettings fSettings; AddOnList fAddOns; BOutlineListView* fListView; - ItemMap fInterfaceItemMap; + InterfaceItemMap fInterfaceItemMap; BListItem* fServicesItem; BListItem* fDialUpItem; BListItem* fOtherItem; ############################################################################ Commit: 574e5c855fc9092e14d5fae76384f4fec8664e5e Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Tue Mar 3 22:48:26 2015 UTC DriverSettingsMessageAdapter: optional field converter. * You can now optionally specify a converter that does the actual message to settings conversion, and vice versa. * This allows for more sophisticated and custom conversions. ---------------------------------------------------------------------------- diff --git a/headers/private/shared/DriverSettingsMessageAdapter.h b/headers/private/shared/DriverSettingsMessageAdapter.h index 3068d99..f08aa53 100644 --- a/headers/private/shared/DriverSettingsMessageAdapter.h +++ b/headers/private/shared/DriverSettingsMessageAdapter.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2015, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -14,11 +14,27 @@ #include <Message.h> +class DriverSettingsConverter { +public: + DriverSettingsConverter(); + virtual ~DriverSettingsConverter(); + + virtual status_t ConvertFromDriverSettings( + const driver_parameter& parameter, + const char* name, uint32 type, + BMessage& target) = 0; + virtual status_t ConvertToDriverSettings(const BMessage& source, + const char* name, int32 index, + uint32 type, BString& value) = 0; +}; + + struct settings_template { uint32 type; const char* name; const settings_template* sub_template; bool parent_value; + DriverSettingsConverter* converter; }; @@ -49,7 +65,7 @@ private: const settings_template* _FindParentValueTemplate( const settings_template* settingsTemplate); status_t _AddParameter(const driver_parameter& parameter, - const char* name, uint32 type, + const settings_template& settingsTemplate, BMessage& message); status_t _ConvertFromDriverParameter( diff --git a/src/kits/shared/DriverSettingsMessageAdapter.cpp b/src/kits/shared/DriverSettingsMessageAdapter.cpp index 08b8d91..e88a63b 100644 --- a/src/kits/shared/DriverSettingsMessageAdapter.cpp +++ b/src/kits/shared/DriverSettingsMessageAdapter.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2015, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -18,6 +18,19 @@ #include <String.h> +DriverSettingsConverter::DriverSettingsConverter() +{ +} + + +DriverSettingsConverter::~DriverSettingsConverter() +{ +} + + +// #pragma mark - + + DriverSettingsMessageAdapter::DriverSettingsMessageAdapter() { } @@ -152,30 +165,42 @@ DriverSettingsMessageAdapter::_FindParentValueTemplate( status_t DriverSettingsMessageAdapter::_AddParameter(const driver_parameter& parameter, - const char* name, uint32 type, BMessage& message) + const settings_template& settingsTemplate, BMessage& message) { for (int32 i = 0; i < parameter.value_count; i++) { - switch (type) { + if (settingsTemplate.converter != NULL) { + status_t status + = settingsTemplate.converter->ConvertFromDriverSettings( + parameter, settingsTemplate.name, settingsTemplate.type, + message); + if (status == B_OK) + continue; + if (status != B_NOT_SUPPORTED) + return status; + } + + switch (settingsTemplate.type) { case B_STRING_TYPE: - message.AddString(name, parameter.values[i]); + message.AddString(settingsTemplate.name, parameter.values[i]); break; case B_INT32_TYPE: - message.AddInt32(name, atoi(parameter.values[i])); + message.AddInt32(settingsTemplate.name, + atoi(parameter.values[i])); break; case B_BOOL_TYPE: if (!strcasecmp(parameter.values[i], "true") || !strcasecmp(parameter.values[i], "on") || !strcasecmp(parameter.values[i], "enabled") || !strcasecmp(parameter.values[i], "1")) - message.AddBool(name, true); + message.AddBool(settingsTemplate.name, true); else - message.AddBool(name, false); + message.AddBool(settingsTemplate.name, false); break; } } - if (type == B_BOOL_TYPE && parameter.value_count == 0) { - // boolean parameters are always true - message.AddBool(name, true); + if (settingsTemplate.type == B_BOOL_TYPE && parameter.value_count == 0) { + // Empty boolean parameters are always true + return message.AddBool(settingsTemplate.name, true); } return B_OK; @@ -193,7 +218,7 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter( return B_BAD_VALUE; } - _AddParameter(parameter, parameter.name, settingsTemplate->type, message); + _AddParameter(parameter, *settingsTemplate, message); if (settingsTemplate->type == B_MESSAGE_TYPE && parameter.parameter_count > 0) { @@ -207,10 +232,8 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter( const settings_template* parentValueTemplate = _FindParentValueTemplate(settingsTemplate); - if (parentValueTemplate != NULL) { - _AddParameter(parameter, parentValueTemplate->name, - parentValueTemplate->type, subMessage); - } + if (parentValueTemplate != NULL) + _AddParameter(parameter, *parentValueTemplate, subMessage); } if (status == B_OK) message.AddMessage(parameter.name, &subMessage); @@ -251,6 +274,15 @@ DriverSettingsMessageAdapter::_AppendSettings( if (valueIndex > 0 && type != B_MESSAGE_TYPE) settings.Append(" "); + if (valueTemplate->converter != NULL) { + status_t status = valueTemplate->converter->ConvertToDriverSettings( + message, name, type, valueIndex, settings); + if (status == B_OK) + continue; + if (status != B_NOT_SUPPORTED) + return status; + } + switch (type) { case B_BOOL_TYPE: {