From d1f0b8db1d3bb411a3865810709e330f8933e0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 10 Mar 2015 21:35:20 +0000 Subject: [PATCH] Network: fixed top item creation, sort entries. * Need a way to access the NetworkWindow object from a static method in order to sort all entries correctly, though. --- .../network_settings/NetworkSettingsAddOn.h | 2 + .../network/NetworkSettingsAddOn.cpp | 7 ++ src/preferences/network/NetworkWindow.cpp | 112 ++++++++++++++++-- src/preferences/network/NetworkWindow.h | 8 ++ 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h b/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h index 89371a6ca2..6540138ef4 100644 --- a/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h +++ b/headers/os/add-ons/network_settings/NetworkSettingsAddOn.h @@ -92,6 +92,8 @@ public: BNetworkSettings& settings); ~BNetworkInterfaceListItem(); + const char* Label() const; + virtual void DrawItem(BView* owner, BRect bounds, bool complete); virtual void Update(BView* owner, const BFont* font); diff --git a/src/preferences/network/NetworkSettingsAddOn.cpp b/src/preferences/network/NetworkSettingsAddOn.cpp index 7b54fb4ef4..6d1fccf167 100644 --- a/src/preferences/network/NetworkSettingsAddOn.cpp +++ b/src/preferences/network/NetworkSettingsAddOn.cpp @@ -106,6 +106,13 @@ BNetworkInterfaceListItem::~BNetworkInterfaceListItem() } +const char* +BNetworkInterfaceListItem::Label() const +{ + return fLabel; +} + + void BNetworkInterfaceListItem::DrawItem(BView* owner, BRect bounds, bool complete) { diff --git a/src/preferences/network/NetworkWindow.cpp b/src/preferences/network/NetworkWindow.cpp index 03654eca3f..4242d5cb0d 100644 --- a/src/preferences/network/NetworkWindow.cpp +++ b/src/preferences/network/NetworkWindow.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #define ENABLE_PROFILES 0 @@ -62,7 +63,10 @@ static const uint32 kMsgItemSelected = 'ItSl'; NetworkWindow::NetworkWindow() : BWindow(BRect(100, 100, 400, 400), B_TRANSLATE("Network"), B_TITLED_WINDOW, - B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS) + B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS), + fServicesItem(NULL), + fDialUpItem(NULL), + fOtherItem(NULL) { // Profiles section #if ENABLE_PROFILES @@ -362,9 +366,10 @@ NetworkWindow::_ScanAddOns() break; fSettingsMap[item->ListItem()] = item; - // TODO: sort fListView->AddUnder(item->ListItem(), interfaceItem); } + fListView->SortItemsUnder(interfaceItem, true, + NetworkWindow::_CompareListItems); } // Generic items @@ -375,12 +380,18 @@ NetworkWindow::_ScanAddOns() break; fSettingsMap[item->ListItem()] = item; - // TODO: sort fListView->AddUnder(item->ListItem(), _ListItemFor(item->Type())); } + + _SortItemsUnder(fServicesItem); + _SortItemsUnder(fDialUpItem); + _SortItemsUnder(fOtherItem); } } + + fListView->SortItemsUnder(NULL, true, + NetworkWindow::_CompareTopLevelListItems); } @@ -395,28 +406,31 @@ NetworkWindow::_SettingsItemFor(BListItem* item) } +void +NetworkWindow::_SortItemsUnder(BListItem* item) +{ + if (item != NULL) + fListView->SortItemsUnder(item, true, NetworkWindow::_CompareListItems); +} + + BListItem* NetworkWindow::_ListItemFor(BNetworkSettingsType type) { switch (type) { case B_NETWORK_SETTINGS_TYPE_SERVICE: - if (fServicesItem == NULL) { - fServicesItem = new BStringItem(B_TRANSLATE("Services")); - fServicesItem->SetExpanded(true); - } - + if (fServicesItem == NULL) + fServicesItem = _CreateItem(B_TRANSLATE("Services")); return fServicesItem; case B_NETWORK_SETTINGS_TYPE_DIAL_UP: if (fDialUpItem == NULL) - fDialUpItem = new BStringItem(B_TRANSLATE("Dial Up")); - + fDialUpItem = _CreateItem(B_TRANSLATE("Dial Up")); return fDialUpItem; case B_NETWORK_SETTINGS_TYPE_OTHER: if (fOtherItem == NULL) - fOtherItem = new BStringItem(B_TRANSLATE("Other")); - + fOtherItem = _CreateItem(B_TRANSLATE("Other")); return fOtherItem; default: @@ -425,6 +439,16 @@ NetworkWindow::_ListItemFor(BNetworkSettingsType type) } +BListItem* +NetworkWindow::_CreateItem(const char* label) +{ + BListItem* item = new BStringItem(label); + item->SetExpanded(true); + fListView->AddItem(item); + return item; +} + + void NetworkWindow::_SelectItem(BListItem* listItem) { @@ -508,3 +532,67 @@ NetworkWindow::_IsReplicantInstalled() BDeskbar deskbar; return deskbar.HasItem("NetworkStatus"); } + + +/*static*/ const char* +NetworkWindow::_ItemName(const BListItem* item) +{ + if (const BNetworkInterfaceListItem* listItem = dynamic_cast< + const BNetworkInterfaceListItem*>(item)) + return listItem->Label(); + + if (const BStringItem* stringItem = dynamic_cast(item)) + return stringItem->Text(); + + return NULL; +} + + +/*static*/ int +NetworkWindow::_CompareTopLevelListItems(const BListItem* a, const BListItem* b) +{ + if (a == b) + return 0; + + if (const InterfaceListItem* itemA + = dynamic_cast(a)) { + if (const InterfaceListItem* itemB + = dynamic_cast(b)) { + return strcasecmp(itemA->Name(), itemB->Name()); + } + return -1; + } else if (dynamic_cast(b) != NULL) + return 1; +/* + if (a == fDialUpItem) + return -1; + if (b == fDialUpItem) + return 1; + + if (a == fServicesItem) + return -1; + if (b == fServicesItem) + return 1; +*/ + return _CompareListItems(a, b); +} + + +/*static*/ int +NetworkWindow::_CompareListItems(const BListItem* a, const BListItem* b) +{ + if (a == b) + return 0; + + const char* nameA = _ItemName(a); + const char* nameB = _ItemName(b); + + if (nameA != NULL && nameB != NULL) + return strcasecmp(nameA, nameB); + if (nameA != NULL) + return 1; + if (nameB != NULL) + return -1; + + return (addr_t)a > (addr_t)b ? 1 : -1; +} diff --git a/src/preferences/network/NetworkWindow.h b/src/preferences/network/NetworkWindow.h index 5b55745eb8..179ddd4cca 100644 --- a/src/preferences/network/NetworkWindow.h +++ b/src/preferences/network/NetworkWindow.h @@ -43,7 +43,9 @@ private: void _ScanAddOns(); BNetworkSettingsItem* _SettingsItemFor(BListItem* item); + void _SortItemsUnder(BListItem* item); BListItem* _ListItemFor(BNetworkSettingsType type); + BListItem* _CreateItem(const char* label); void _SelectItem(BListItem* listItem); void _BroadcastSettingsUpdate(uint32 type); void _BroadcastConfigurationUpdate( @@ -52,6 +54,12 @@ private: bool _IsReplicantInstalled(); void _ShowReplicant(bool show); + static const char* _ItemName(const BListItem* item); + static int _CompareTopLevelListItems(const BListItem* a, + const BListItem* b); + static int _CompareListItems(const BListItem* a, + const BListItem* b); + private: typedef BObjectList AddOnList; typedef BObjectList ItemList;