From d7e473d3101f43c187273eae5736f32ac51d4081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 3 Apr 2007 12:24:32 +0000 Subject: [PATCH] The network status icons are now correctly read from the resources (I even forgot to add them to the server before :-)). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20532 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/net/Jamfile | 2 +- src/servers/net/NetServer.cpp | 2 +- src/servers/net/StatusReplicant.cpp | 116 +++++++++++++++++++--------- src/servers/net/StatusReplicant.h | 17 ++-- 4 files changed, 90 insertions(+), 47 deletions(-) diff --git a/src/servers/net/Jamfile b/src/servers/net/Jamfile index 03c97a3cc3..8223371bed 100644 --- a/src/servers/net/Jamfile +++ b/src/servers/net/Jamfile @@ -7,7 +7,7 @@ UseLibraryHeaders icon ; #UseHeaders [ FDirName $(HAIKU_TOP) src add-ons kernel network ppp shared libkernelppp headers ] ; #UseHeaders [ FDirName $(HAIKU_TOP) src tests kits net DialUpPreflet ] ; -AddResources net_server : net_server.rdef ; +AddResources net_server : net_server.rdef NetworkStatusIcons.rdef ; Server net_server : NetServer.cpp diff --git a/src/servers/net/NetServer.cpp b/src/servers/net/NetServer.cpp index 1478215923..9b6ec6c468 100644 --- a/src/servers/net/NetServer.cpp +++ b/src/servers/net/NetServer.cpp @@ -986,7 +986,7 @@ NetServer::_UpdateReplicantStatus() BMessage message(kStatusUpdate); for (StatusMap::iterator it = fStatusMap.begin(); - it != fStatusMap.end(); ++it) { + it != fStatusMap.end(); ++it) { if (it->second > prevaling) prevaling = it->second; diff --git a/src/servers/net/StatusReplicant.cpp b/src/servers/net/StatusReplicant.cpp index 348438fc2e..3715c4d607 100644 --- a/src/servers/net/StatusReplicant.cpp +++ b/src/servers/net/StatusReplicant.cpp @@ -30,12 +30,12 @@ const char *kStatusReplicant = "NetStatusView"; static const uint32 kShowConfiguration = 'shcf'; -static const uint8 kStatusColors[kStatusCount][3] = { - { 0, 0, 0 }, // Unknown - { 255, 0, 0 }, // NoLink - { 0, 0, 255 }, // LinkNoConfig - { 0, 255, 0 }, // Connected - { 255, 255, 0 }, // Preparing +static const rgb_color kStatusColors[kStatusCount] = { + { 0, 0, 0 }, // Unknown + { 255, 0, 0 }, // NoLink + { 0, 0, 255 }, // LinkNoConfig + { 0, 255, 0 }, // Connected + { 255, 255, 0 }, // Preparing }; struct information_entry { @@ -59,17 +59,36 @@ static const char *kStatusDescriptions[] = { }; -StatusReplicant::StatusReplicant() - : BView(BRect(0, 0, 15, 15), kStatusReplicant, B_FOLLOW_ALL, 0), - fPopUp("", false, false) +static status_t +our_image(image_info *image) { - _Init(); + int32 cookie = 0; + while (get_next_image_info(B_CURRENT_TEAM, &cookie, image) == B_OK) { + if ((char *)our_image >= (char *)image->text && + (char *)our_image <= (char *)image->text + image->text_size) + return B_OK; + } + + return B_ERROR; +} + + +// #pragma mark - + + +StatusReplicant::StatusReplicant() + : BView(BRect(0, 0, 15, 15), kStatusReplicant, B_FOLLOW_ALL, B_WILL_DRAW), + fPopUp("", false, false), + fStatus(kStatusUnknown) +{ + _Init(false); } StatusReplicant::StatusReplicant(BMessage *message) : BView(message), - fPopUp("", false, false) + fPopUp("", false, false), + fStatus(kStatusUnknown) { _Init(); } @@ -136,6 +155,18 @@ StatusReplicant::MessageReceived(BMessage *message) } +void +StatusReplicant::Draw(BRect updateRect) +{ + if (fBitmaps[fStatus] == NULL) + return; + + SetDrawingMode(B_OP_ALPHA); + DrawBitmap(fBitmaps[fStatus]); + SetDrawingMode(B_OP_COPY); +} + + void StatusReplicant::MouseDown(BPoint point) { @@ -151,31 +182,42 @@ StatusReplicant::MouseDown(BPoint point) void -StatusReplicant::_Init() +StatusReplicant::_Init(bool isReplicant) { // Load status bitmaps from resources - BResources* resources = BApplication::AppResources(); - for (int i = 0; i < kStatusCount; i++) { fBitmaps[i] = NULL; + } - if (resources != NULL) { - const void* data = NULL; - size_t size; - data = resources->LoadResource(B_VECTOR_ICON_TYPE, - kNetworkStatusNoDevice + i, &size); - if (data != NULL) { - BBitmap* icon = new BBitmap(Bounds(), B_RGB32); - if (icon->InitCheck() == B_OK - && BIconUtils::GetVectorIcon((const uint8 *)data, - size, icon) == B_OK) { - fBitmaps[i] = icon; - } else - delete icon; + if (!isReplicant) + return; - free((void*)data); - } + image_info info; + if (our_image(&info) != B_OK) + return; + + BFile file(info.name, B_READ_ONLY); + if (file.InitCheck() < B_OK) + return; + + BResources resources(&file); + if (resources.InitCheck() < B_OK) + return; + + for (int i = 0; i < kStatusCount; i++) { + const void* data = NULL; + size_t size; + data = resources.LoadResource(B_VECTOR_ICON_TYPE, + kNetworkStatusNoDevice + i, &size); + if (data != NULL) { + BBitmap* icon = new BBitmap(Bounds(), B_RGB32); + if (icon->InitCheck() == B_OK + && BIconUtils::GetVectorIcon((const uint8 *)data, + size, icon) == B_OK) { + fBitmaps[i] = icon; + } else + delete icon; } } } @@ -306,15 +348,15 @@ StatusReplicant::_PrepareMenu(const InterfaceStatusList &status) void StatusReplicant::_ChangeStatus(int newStatus) { - if (fBitmaps[newStatus]) { + if (fStatus == newStatus) + return; + + fStatus = newStatus; + + if (fBitmaps[newStatus]) SetViewColor(Parent()->ViewColor()); - SetViewBitmap(fBitmaps[newStatus]); - } else { - ClearViewBitmap(); - SetViewColor(kStatusColors[newStatus][0], - kStatusColors[newStatus][1], - kStatusColors[newStatus][2]); - } + else + SetViewColor(kStatusColors[newStatus]); Invalidate(); } diff --git a/src/servers/net/StatusReplicant.h b/src/servers/net/StatusReplicant.h index 7c11a5d522..f7295ea9a9 100644 --- a/src/servers/net/StatusReplicant.h +++ b/src/servers/net/StatusReplicant.h @@ -31,25 +31,26 @@ class StatusReplicant : public BView { virtual ~StatusReplicant(); static StatusReplicant *Instantiate(BMessage *archive); - status_t Archive(BMessage *archive, bool deep) const; + virtual status_t Archive(BMessage *archive, bool deep) const; - void AttachedToWindow(); - void MessageReceived(BMessage *message); - - void MouseDown(BPoint point); + virtual void AttachedToWindow(); + virtual void MessageReceived(BMessage *message); + virtual void Draw(BRect updateRect); + virtual void MouseDown(BPoint point); private: typedef std::pair InterfaceStatus; typedef std::vector InterfaceStatusList; - void _Init(); + void _Init(bool isReplicant = true); void _UpdateFromMessage(BMessage *message); void _ShowConfiguration(BMessage *message); void _PrepareMenu(const InterfaceStatusList &list); void _ChangeStatus(int newStatus); - BPopUpMenu fPopUp; - BBitmap *fBitmaps[kStatusCount]; + BPopUpMenu fPopUp; + BBitmap* fBitmaps[kStatusCount]; + int32 fStatus; }; #endif // _STATUS_REPLICANT_H