Network: integrated former hardware view from add-on.

* The interfaces logic is within the main application, so is the
  new interface view.
* Disabling/renegotiating does not work yet.
* Reveals a bug in some interface code; when you click on an ethernet
  device first, there is no place for the wireless menu. When you then
  press on a wireless device, it crashes in BMenuField code.
  In the other direction, there is then an empty space.
* Fixed list item width reporting.
This commit is contained in:
Axel Dörfler
2015-03-27 13:08:44 +01:00
parent d5dd8637bb
commit f6c7cf44b5
8 changed files with 314 additions and 187 deletions
@@ -41,8 +41,9 @@ public:
const BNetworkProfile* const BNetworkProfile*
Profile() const; Profile() const;
virtual status_t Save() = 0; virtual status_t Apply() = 0;
virtual status_t Revert() = 0; virtual status_t Revert() = 0;
virtual bool IsRevertable() = 0;
private: private:
const BNetworkProfile* const BNetworkProfile*
+90 -45
View File
@@ -28,7 +28,7 @@
#undef B_TRANSLATION_CONTEXT #undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "InterfacesListView" #define B_TRANSLATION_CONTEXT "InterfaceListItem"
InterfaceListItem::InterfaceListItem(const char* name) InterfaceListItem::InterfaceListItem(const char* name)
@@ -74,57 +74,38 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
list->FillRect(bounds); list->FillRect(bounds);
} }
BString interfaceState;
BBitmap* stateIcon(NULL);
// TODO: only update periodically // TODO: only update periodically
bool disabled = (fInterface.Flags() & IFF_UP) == 0; _UpdateState();
if (disabled) { BBitmap* stateIcon = _StateIcon();
interfaceState = "disabled"; const char* stateText = _StateText();
stateIcon = fIconOffline;
} else if (!fInterface.HasLink()) {
interfaceState = "no link";
stateIcon = fIconOffline;
// TODO!
// } else if ((fSettings->IPAddr(AF_INET).IsEmpty()
// && fSettings->IPAddr(AF_INET6).IsEmpty())
// && (fSettings->AutoConfigure(AF_INET)
// || fSettings->AutoConfigure(AF_INET6))) {
// interfaceState = "connecting" B_UTF8_ELLIPSIS;
// stateIcon = fIconPending;
} else {
interfaceState = "connected";
stateIcon = fIconOnline;
}
// Set the initial bounds of item contents // Set the initial bounds of item contents
BPoint iconPt = bounds.LeftTop(); BPoint iconPoint = bounds.LeftTop();
BPoint namePt = bounds.LeftTop(); BPoint namePoint = bounds.LeftTop();
BPoint line2Pt = bounds.LeftTop(); BPoint line2Point = bounds.LeftTop();
BPoint line3Pt = bounds.LeftTop(); BPoint line3Point = bounds.LeftTop();
BPoint statePt = bounds.RightTop(); BPoint statePoint = bounds.RightTop();
iconPt += BPoint(4, 4); iconPoint += BPoint(4, 4);
statePt += BPoint(0, fFirstlineOffset); statePoint += BPoint(0, fFirstlineOffset);
namePt += BPoint(ICON_SIZE + 12, fFirstlineOffset); namePoint += BPoint(ICON_SIZE + 12, fFirstlineOffset);
line2Pt += BPoint(ICON_SIZE + 12, fSecondlineOffset); line2Point += BPoint(ICON_SIZE + 12, fSecondlineOffset);
line3Pt += BPoint(ICON_SIZE + 12, fThirdlineOffset); line3Point += BPoint(ICON_SIZE + 12, fThirdlineOffset);
statePt -= BPoint( statePoint -= BPoint(be_plain_font->StringWidth(stateText) + 4.0f, 0);
be_plain_font->StringWidth(interfaceState.String()) + 4.0f, 0);
if (disabled) { if (fDisabled) {
list->SetDrawingMode(B_OP_ALPHA); list->SetDrawingMode(B_OP_ALPHA);
list->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); list->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
list->SetHighColor(0, 0, 0, 32); list->SetHighColor(0, 0, 0, 32);
} else } else
list->SetDrawingMode(B_OP_OVER); list->SetDrawingMode(B_OP_OVER);
list->DrawBitmapAsync(fIcon, iconPt); list->DrawBitmapAsync(fIcon, iconPoint);
list->DrawBitmapAsync(stateIcon, iconPt); list->DrawBitmapAsync(stateIcon, iconPoint);
if (disabled) { if (fDisabled) {
rgb_color textColor; rgb_color textColor;
if (IsSelected()) if (IsSelected())
textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR); textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR);
@@ -144,12 +125,9 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
list->SetFont(be_bold_font); list->SetFont(be_bold_font);
BString name = Name(); list->DrawString(fDeviceName, namePoint);
name.RemoveFirst("/dev/net/");
list->DrawString(name, namePt);
list->SetFont(be_plain_font); list->SetFont(be_plain_font);
list->DrawString(interfaceState, statePt); list->DrawString(stateText, statePoint);
// TODO! // TODO!
/* if (!disabled) { /* if (!disabled) {
@@ -160,7 +138,7 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
else else
ipv4Str << " " << BString(fSettings->IP(AF_INET)); ipv4Str << " " << BString(fSettings->IP(AF_INET));
list->DrawString(ipv4Str, line2Pt); list->DrawString(ipv4Str, line2Point);
} }
// Render IPv6 Address (if present) // Render IPv6 Address (if present)
@@ -168,7 +146,7 @@ InterfaceListItem::DrawItem(BView* owner, BRect /*bounds*/, bool complete)
BString ipv6Str(B_TRANSLATE_COMMENT("IPv6:", "IPv6 address label")); BString ipv6Str(B_TRANSLATE_COMMENT("IPv6:", "IPv6 address label"));
ipv6Str << " " << BString(fSettings->IP(AF_INET6)); ipv6Str << " " << BString(fSettings->IP(AF_INET6));
list->DrawString(ipv6Str, line3Pt); list->DrawString(ipv6Str, line3Point);
} }
*/ */
owner->PopState(); owner->PopState();
@@ -189,6 +167,11 @@ InterfaceListItem::Update(BView* owner, const BFont* font)
fSecondlineOffset = fFirstlineOffset + lineHeight; fSecondlineOffset = fFirstlineOffset + lineHeight;
fThirdlineOffset = fFirstlineOffset + (lineHeight * 2); fThirdlineOffset = fFirstlineOffset + (lineHeight * 2);
_UpdateState();
SetWidth(fIcon->Bounds().Width() + 24
+ be_bold_font->StringWidth(fDeviceName.String())
+ owner->StringWidth(_StateText()));
SetHeight(std::max(3 * lineHeight + 4, fIcon->Bounds().Height() + 8)); SetHeight(std::max(3 * lineHeight + 4, fIcon->Bounds().Height() + 8));
// either to the text height or icon height, whichever is taller // either to the text height or icon height, whichever is taller
} }
@@ -279,3 +262,65 @@ InterfaceListItem::_PopulateBitmaps(const char* mediaType)
BIconUtils::GetVectorIcon(onlineHVIF, iconSize, fIconOnline); BIconUtils::GetVectorIcon(onlineHVIF, iconSize, fIconOnline);
} }
} }
void
InterfaceListItem::_UpdateState()
{
fDeviceName = Name();
fDeviceName.RemoveFirst("/dev/net/");
fDisabled = (fInterface.Flags() & IFF_UP) == 0;
fHasLink = fInterface.HasLink();
fConnecting = (fInterface.Flags() & IFF_CONFIGURING) != 0;
int32 count = fInterface.CountAddresses();
size_t addressIndex = 0;
for (int32 index = 0; index < count; index++) {
if (addressIndex >= sizeof(fAddress) / sizeof(fAddress[0]))
break;
BNetworkInterfaceAddress address;
if (fInterface.GetAddressAt(index, address) == B_OK)
fAddress[addressIndex++] = address.Address().ToString();
}
}
BBitmap*
InterfaceListItem::_StateIcon() const
{
if (fDisabled)
return fIconOffline;
if (!fHasLink)
return fIconOffline;
// TODO!
// } else if ((fSettings->IPAddr(AF_INET).IsEmpty()
// && fSettings->IPAddr(AF_INET6).IsEmpty())
// && (fSettings->AutoConfigure(AF_INET)
// || fSettings->AutoConfigure(AF_INET6))) {
// interfaceState = "connecting" B_UTF8_ELLIPSIS;
// stateIcon = fIconPending;
return fIconOnline;
}
const char*
InterfaceListItem::_StateText() const
{
if (fDisabled)
return B_TRANSLATE("disabled");
if (!fInterface.HasLink())
return B_TRANSLATE("no link");
// TODO!
// } else if ((fSettings->IPAddr(AF_INET).IsEmpty()
// && fSettings->IPAddr(AF_INET6).IsEmpty())
// && (fSettings->AutoConfigure(AF_INET)
// || fSettings->AutoConfigure(AF_INET6))) {
// interfaceState = "connecting" B_UTF8_ELLIPSIS;
// stateIcon = fIconPending;
return B_TRANSLATE("connected");
}
@@ -33,7 +33,11 @@ public:
private: private:
void _Init(); void _Init();
void _PopulateBitmaps(const char* mediaType); void _PopulateBitmaps(const char* mediaType);
void _UpdateState();
BBitmap* _StateIcon() const;
const char* _StateText() const;
private:
BBitmap* fIcon; BBitmap* fIcon;
BBitmap* fIconOffline; BBitmap* fIconOffline;
BBitmap* fIconPending; BBitmap* fIconPending;
@@ -45,6 +49,12 @@ private:
float fFirstlineOffset; float fFirstlineOffset;
float fSecondlineOffset; float fSecondlineOffset;
float fThirdlineOffset; float fThirdlineOffset;
BString fDeviceName;
bool fDisabled;
bool fHasLink;
bool fConnecting;
BString fAddress[2];
}; };
@@ -1,80 +1,81 @@
/* /*
* Copyright 2004-2013 Haiku, Inc. All rights reserved. * Copyright 2004-2015 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Axel Dörfler, <axeld@pinc-software.de>
* Alexander von Gluck, kallisti5@unixzen.com * Alexander von Gluck, kallisti5@unixzen.com
* John Scipione, jscipione@gmail.com * John Scipione, jscipione@gmail.com
*/ */
#include "InterfaceHardwareView.h"
#include "InterfaceView.h" #include "InterfaceView.h"
#include "NetworkSettings.h"
#include "WirelessNetworkMenuItem.h" #include <set>
#include <net/if_media.h>
#include <Button.h> #include <Button.h>
#include <Catalog.h> #include <Catalog.h>
#include <ControlLook.h> #include <ControlLook.h>
#include <LayoutBuilder.h> #include <LayoutBuilder.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <NetworkAddress.h> #include <NetworkAddress.h>
#include <Screen.h> #include <NetworkDevice.h>
#include <Size.h>
#include <StringForSize.h> #include <StringForSize.h>
#include <StringView.h> #include <StringView.h>
#include <TextControl.h> #include <TextControl.h>
#include <set> #include "MediaTypes.h"
#include <stdio.h> #include "WirelessNetworkMenuItem.h"
static const uint32 kMsgInterfaceToggle = 'onof';
static const uint32 kMsgInterfaceRenegotiate = 'redo';
static const uint32 kMsgJoinNetwork = 'join';
#undef B_TRANSLATION_CONTEXT #undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "IntefaceHardwareView" #define B_TRANSLATION_CONTEXT "IntefaceView"
// #pragma mark - InterfaceHardwareView // #pragma mark - InterfaceView
InterfaceHardwareView::InterfaceHardwareView(NetworkSettings* settings) InterfaceView::InterfaceView()
: :
BGroupView(B_VERTICAL), BGroupView(B_VERTICAL)
fSettings(settings)
{ {
SetLayout(new BGroupLayout(B_VERTICAL));
SetFlags(Flags() | B_PULSE_NEEDED); SetFlags(Flags() | B_PULSE_NEEDED);
// TODO : Small graph of throughput? // TODO: Small graph of throughput?
float minimumWidth = be_control_look->DefaultItemSpacing() * 16; float minimumWidth = be_control_look->DefaultItemSpacing() * 16;
BStringView* status = new BStringView("status label", B_TRANSLATE("Status:")); BStringView* statusLabel = new BStringView("status label",
status->SetAlignment(B_ALIGN_RIGHT); B_TRANSLATE("Status:"));
statusLabel->SetAlignment(B_ALIGN_RIGHT);
fStatusField = new BStringView("status field", ""); fStatusField = new BStringView("status field", "");
fStatusField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fStatusField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
BStringView* macAddress = new BStringView("mac address label", BStringView* macAddressLabel = new BStringView("mac address label",
B_TRANSLATE("MAC address:")); B_TRANSLATE("MAC address:"));
macAddress->SetAlignment(B_ALIGN_RIGHT); macAddressLabel->SetAlignment(B_ALIGN_RIGHT);
fMacAddressField = new BStringView("mac address field", ""); fMacAddressField = new BStringView("mac address field", "");
fMacAddressField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fMacAddressField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
BStringView* linkSpeed = new BStringView("link speed label", BStringView* linkSpeedLabel = new BStringView("link speed label",
B_TRANSLATE("Link speed:")); B_TRANSLATE("Link speed:"));
linkSpeed->SetAlignment(B_ALIGN_RIGHT); linkSpeedLabel->SetAlignment(B_ALIGN_RIGHT);
fLinkSpeedField = new BStringView("link speed field", ""); fLinkSpeedField = new BStringView("link speed field", "");
fLinkSpeedField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fLinkSpeedField->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
// TODO: These metrics may be better in a BScrollView? // TODO: These metrics may be better in a BScrollView?
BStringView* linkTx = new BStringView("tx label", BStringView* linkTxLabel = new BStringView("tx label",
B_TRANSLATE("Sent:")); B_TRANSLATE("Sent:"));
linkTx->SetAlignment(B_ALIGN_RIGHT); linkTxLabel->SetAlignment(B_ALIGN_RIGHT);
fLinkTxField = new BStringView("tx field", ""); fLinkTxField = new BStringView("tx field", "");
fLinkTxField ->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fLinkTxField ->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
BStringView* linkRx = new BStringView("rx label", BStringView* linkRxLabel = new BStringView("rx label",
B_TRANSLATE("Received:")); B_TRANSLATE("Received:"));
linkRx->SetAlignment(B_ALIGN_RIGHT); linkRxLabel->SetAlignment(B_ALIGN_RIGHT);
fLinkRxField = new BStringView("rx field", ""); fLinkRxField = new BStringView("rx field", "");
fLinkRxField ->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); fLinkRxField ->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET));
@@ -93,43 +94,44 @@ InterfaceHardwareView::InterfaceHardwareView(NetworkSettings* settings)
BLayoutBuilder::Group<>(this) BLayoutBuilder::Group<>(this)
.AddGrid() .AddGrid()
.Add(status, 0, 0) .Add(statusLabel, 0, 0)
.Add(fStatusField, 1, 0) .Add(fStatusField, 1, 0)
.Add(fNetworkMenuField->CreateLabelLayoutItem(), 0, 1) .Add(fNetworkMenuField->CreateLabelLayoutItem(), 0, 1)
.Add(fNetworkMenuField->CreateMenuBarLayoutItem(), 1, 1) .Add(fNetworkMenuField->CreateMenuBarLayoutItem(), 1, 1)
.Add(macAddress, 0, 2) .Add(macAddressLabel, 0, 2)
.Add(fMacAddressField, 1, 2) .Add(fMacAddressField, 1, 2)
.Add(linkSpeed, 0, 3) .Add(linkSpeedLabel, 0, 3)
.Add(fLinkSpeedField, 1, 3) .Add(fLinkSpeedField, 1, 3)
.Add(linkTx, 0, 4) .Add(linkTxLabel, 0, 4)
.Add(fLinkTxField, 1, 4) .Add(fLinkTxField, 1, 4)
.Add(linkRx, 0, 5) .Add(linkRxLabel, 0, 5)
.Add(fLinkRxField, 1, 5) .Add(fLinkRxField, 1, 5)
.End() .End()
.AddGlue() .AddGlue()
.AddGroup(B_HORIZONTAL) .AddGroup(B_HORIZONTAL)
.Add(fOnOff)
.AddGlue() .AddGlue()
.Add(fOnOff)
.Add(fRenegotiate) .Add(fRenegotiate)
.End() .End();
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING);
} }
InterfaceHardwareView::~InterfaceHardwareView() InterfaceView::~InterfaceView()
{ {
} }
// #pragma mark - InterfaceHardwareView virtual methods
void void
InterfaceHardwareView::AttachedToWindow() InterfaceView::SetTo(const char* name)
{ {
Update(); fInterface.SetTo(name);
}
void
InterfaceView::AttachedToWindow()
{
_Update();
// Populate the fields // Populate the fields
fOnOff->SetTarget(this); fOnOff->SetTarget(this);
@@ -138,25 +140,35 @@ InterfaceHardwareView::AttachedToWindow()
void void
InterfaceHardwareView::MessageReceived(BMessage* message) InterfaceView::MessageReceived(BMessage* message)
{ {
switch (message->what) { switch (message->what) {
case kMsgNetwork: case kMsgJoinNetwork:
{ {
fSettings->SetWirelessNetwork(message->FindString("name")); const char* name;
BNetworkAddress address;
if (message->FindString("name", &name) == B_OK
&& message->FindFlat("address", &address) == B_OK) {
BNetworkDevice device(fInterface.Name());
status_t status = device.JoinNetwork(address);
if (status != B_OK) {
// This does not really matter, as it's stored this way,
// anyway.
}
// TODO: store value
}
break; break;
} }
case kMsgInterfaceToggle: case kMsgInterfaceToggle:
{ {
fSettings->SetDisabled(!fSettings->IsDisabled()); // TODO: disable/enable interface
Update(); _Update();
Window()->FindView("interfaces")->Invalidate();
break; break;
} }
case kMsgInterfaceRenegotiate: case kMsgInterfaceRenegotiate:
{ {
fSettings->RenegotiateAddresses(); // TODO: renegotiate addresses
break; break;
} }
@@ -167,31 +179,25 @@ InterfaceHardwareView::MessageReceived(BMessage* message)
void void
InterfaceHardwareView::Pulse() InterfaceView::Pulse()
{ {
// TODO maybe not everything needs to be updated here. // Update the wireless network menu every 5 seconds
Update(); _Update((fPulseCount++ % 5) == 0);
}
// #pragma mark - InterfaceHardwareView public methods
status_t
InterfaceHardwareView::Revert()
{
Update();
return B_OK;
} }
status_t status_t
InterfaceHardwareView::Update() InterfaceView::_Update(bool updateWirelessNetworks)
{ {
BNetworkDevice device(fInterface.Name());
bool isWireless = device.IsWireless();
bool disabled = (fInterface.Flags() & IFF_UP) == 0;
// Populate fields with current settings // Populate fields with current settings
if (fSettings->HasLink()) { if (fInterface.HasLink()) {
if (fSettings->IsWireless()) { if (isWireless) {
BString network = fSettings->WirelessNetwork(); // TODO!
BString network = "---";
network.Prepend(" ("); network.Prepend(" (");
network.Prepend(B_TRANSLATE("connected")); network.Prepend(B_TRANSLATE("connected"));
network.Append(")"); network.Append(")");
@@ -202,34 +208,39 @@ InterfaceHardwareView::Update()
} else } else
fStatusField->SetText(B_TRANSLATE("disconnected")); fStatusField->SetText(B_TRANSLATE("disconnected"));
fMacAddressField->SetText(fSettings->HardwareAddress()); BNetworkAddress hardwareAddress;
if (device.GetHardwareAddress(hardwareAddress) == B_OK)
fMacAddressField->SetText(hardwareAddress.ToString());
else
fMacAddressField->SetText("-");
// TODO : Find how to get link speed int media = fInterface.Media();
fLinkSpeedField->SetText("100 Mb/s"); if ((media & IFM_ACTIVE) != 0)
fLinkSpeedField->SetText(media_type_to_string(media));
else
fLinkSpeedField->SetText("-");
// Update Link stats // Update Link stats
ifreq_stats stats; ifreq_stats stats;
char buffer[100]; if (fInterface.GetStats(stats) == B_OK) {
fSettings->Stats(&stats); char buffer[100];
string_for_size(stats.send.bytes, buffer, sizeof(buffer)); string_for_size(stats.send.bytes, buffer, sizeof(buffer));
fLinkTxField->SetText(buffer); fLinkTxField->SetText(buffer);
string_for_size(stats.receive.bytes, buffer, sizeof(buffer)); string_for_size(stats.receive.bytes, buffer, sizeof(buffer));
fLinkRxField->SetText(buffer); fLinkRxField->SetText(buffer);
// TODO move the wireless info to a separate tab. We should have a
// BListView of available networks, rather than a menu, to make them more
// readable and easier to browse and select.
if (fNetworkMenuField->IsHidden(fNetworkMenuField)
&& fSettings->IsWireless()) {
fNetworkMenuField->Show();
} else if (!fNetworkMenuField->IsHidden(fNetworkMenuField)
&& !fSettings->IsWireless()) {
fNetworkMenuField->Hide();
} }
if (fSettings->IsWireless()) { // TODO: move the wireless info to a separate tab. We should have a
// BListView of available networks, rather than a menu, to make them more
// readable and easier to browse and select.
if (fNetworkMenuField->IsHidden(fNetworkMenuField) && isWireless)
fNetworkMenuField->Show();
else if (!fNetworkMenuField->IsHidden(fNetworkMenuField) && !isWireless)
fNetworkMenuField->Hide();
if (isWireless && updateWirelessNetworks) {
// Rebuild network menu // Rebuild network menu
BMenu* menu = fNetworkMenuField->Menu(); BMenu* menu = fNetworkMenuField->Menu();
menu->RemoveItems(0, menu->CountItems(), true); menu->RemoveItems(0, menu->CountItems(), true);
@@ -237,17 +248,18 @@ InterfaceHardwareView::Update()
std::set<BNetworkAddress> associated; std::set<BNetworkAddress> associated;
BNetworkAddress address; BNetworkAddress address;
uint32 cookie = 0; uint32 cookie = 0;
while (fSettings->GetNextAssociatedNetwork(cookie, address) == B_OK) while (device.GetNextAssociatedNetwork(cookie, address) == B_OK)
associated.insert(address); associated.insert(address);
wireless_network network; wireless_network network;
int32 count = 0; int32 count = 0;
cookie = 0; cookie = 0;
while (fSettings->GetNextNetwork(cookie, network) == B_OK) { while (device.GetNextNetwork(cookie, network) == B_OK) {
BMessage* message = new BMessage(kMsgNetwork); BMessage* message = new BMessage(kMsgJoinNetwork);
message->AddString("device", fSettings->Name()); message->AddString("device", fInterface.Name());
message->AddString("name", network.name); message->AddString("name", network.name);
message->AddFlat("address", &network.address);
BMenuItem* item = new WirelessNetworkMenuItem(network.name, BMenuItem* item = new WirelessNetworkMenuItem(network.name,
network.signal_strength, network.signal_strength,
@@ -274,15 +286,8 @@ InterfaceHardwareView::Update()
menu->SetTargetForItems(this); menu->SetTargetForItems(this);
} }
fRenegotiate->SetEnabled(!fSettings->IsDisabled()); fRenegotiate->SetEnabled(!disabled);
fOnOff->SetLabel(fSettings->IsDisabled() ? "Enable" : "Disable"); fOnOff->SetLabel(disabled ? "Enable" : "Disable");
return B_OK; return B_OK;
} }
status_t
InterfaceHardwareView::Save()
{
return B_OK;
}
@@ -1,48 +1,44 @@
/* /*
* Copyright 2004-2013 Haiku, Inc. All rights reserved. * Copyright 2004-2015 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Axel Dörfler, <axeld@pinc-software.de>
* Alexander von Gluck, kallisti5@unixzen.com * Alexander von Gluck, kallisti5@unixzen.com
* John Scipione, jscipione@gmail.com * John Scipione, jscipione@gmail.com
*/ */
#ifndef INTERFACE_HARDWARE_VIEW_H #ifndef INTERFACE_VIEW_H
#define INTERFACE_HARDWARE_VIEW_H #define INTERFACE_VIEW_H
#include "NetworkSettings.h"
#include <GroupView.h> #include <GroupView.h>
#include <NetworkInterface.h>
static const uint32 kMsgInterfaceToggle = 'onof';
static const uint32 kMsgInterfaceRenegotiate = 'redo';
class BButton; class BButton;
class BMenuField; class BMenuField;
class BMessage; class BMessage;
class BRect;
class BStringView; class BStringView;
class InterfaceHardwareView : public BGroupView {
class InterfaceView : public BGroupView {
public: public:
InterfaceHardwareView( InterfaceView();
NetworkSettings* settings); virtual ~InterfaceView();
virtual ~InterfaceHardwareView();
void SetTo(const char* name);
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
virtual void AttachedToWindow(); virtual void AttachedToWindow();
void Pulse(); virtual void Pulse();
status_t Revert();
status_t Save();
private: private:
status_t Update(); status_t _Update(bool updateWirelessNetworks = true);
void _EnableFields(bool enabled); void _EnableFields(bool enabled);
NetworkSettings* fSettings; private:
BNetworkInterface fInterface;
int fPulseCount;
BStringView* fStatusField; BStringView* fStatusField;
BStringView* fMacAddressField; BStringView* fMacAddressField;
+7 -2
View File
@@ -3,7 +3,8 @@ SubDir HAIKU_TOP src preferences network ;
UsePublicHeaders [ FDirName add-ons network_settings ] ; UsePublicHeaders [ FDirName add-ons network_settings ] ;
UsePrivateHeaders net shared ; UsePrivateHeaders net shared ;
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ] ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps networkstatus ]
[ FDirName $(HAIKU_TOP) src bin network ifconfig ] ;
Preference Network : Preference Network :
Network.cpp Network.cpp
@@ -11,12 +12,16 @@ Preference Network :
NetworkProfile.cpp NetworkProfile.cpp
NetworkSettingsAddOn.cpp NetworkSettingsAddOn.cpp
InterfaceListItem.cpp InterfaceListItem.cpp
InterfaceView.cpp
# from NetworkStatus # from NetworkStatus
RadioView.cpp RadioView.cpp
WirelessNetworkMenuItem.cpp WirelessNetworkMenuItem.cpp
: be root bnetapi [ TargetLibstdc++ ] localestub # from ifconfig
MediaTypes.cpp
: be bnetapi libshared.a [ TargetLibstdc++ ] localestub
: Network.rdef InterfaceIcons.rdef : Network.rdef InterfaceIcons.rdef
; ;
+72 -11
View File
@@ -40,6 +40,7 @@
#endif #endif
#include "InterfaceListItem.h" #include "InterfaceListItem.h"
#include "InterfaceView.h"
const char* kNetworkStatusSignature = "application/x-vnd.Haiku-NetworkStatus"; const char* kNetworkStatusSignature = "application/x-vnd.Haiku-NetworkStatus";
@@ -59,7 +60,7 @@ static const uint32 kMsgItemSelected = 'ItSl';
NetworkWindow::NetworkWindow() NetworkWindow::NetworkWindow()
: :
BWindow(BRect(100, 100, 300, 300), B_TRANSLATE("Network"), B_TITLED_WINDOW, 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)
{ {
// Profiles section // Profiles section
@@ -98,6 +99,12 @@ NetworkWindow::NetworkWindow()
BScrollView* scrollView = new BScrollView("ScrollView", fListView, BScrollView* scrollView = new BScrollView("ScrollView", fListView,
0, false, true); 0, false, true);
fAddOnShellView = new BView("add-on shell", 0,
new BGroupLayout(B_VERTICAL));
fAddOnShellView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fInterfaceView = new InterfaceView();
// Build the layout // Build the layout
BLayoutBuilder::Group<>(this, B_VERTICAL) BLayoutBuilder::Group<>(this, B_VERTICAL)
.SetInsets(B_USE_DEFAULT_SPACING) .SetInsets(B_USE_DEFAULT_SPACING)
@@ -110,7 +117,7 @@ NetworkWindow::NetworkWindow()
#endif #endif
.AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING) .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
.Add(scrollView) .Add(scrollView)
.AddGlue() .Add(fAddOnShellView)
.End() .End()
.Add(showReplicantCheckBox) .Add(showReplicantCheckBox)
.AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING) .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING)
@@ -122,7 +129,11 @@ NetworkWindow::NetworkWindow()
_ScanInterfaces(); _ScanInterfaces();
_ScanAddOns(); _ScanAddOns();
fAddOnView = NULL; // Set preferred size of the list view from its contents
float width;
float height;
fListView->GetPreferredSize(&width, &height);
fListView->SetExplicitMinSize(BSize(width, std::min(height, 400.f)));
CenterOnScreen(); CenterOnScreen();
} }
@@ -162,19 +173,29 @@ NetworkWindow::MessageReceived(BMessage* message)
} }
case kMsgItemSelected: case kMsgItemSelected:
{
BListItem* listItem = fListView->FullListItemAt(
fListView->FullListCurrentSelection());
if (listItem == NULL)
break;
_SelectItem(listItem);
break; break;
}
case kMsgRevert: case kMsgRevert:
{ {
for (int index = 0; index < fItems.CountItems(); index++) SettingsMap::const_iterator iterator = fSettingsMap.begin();
fItems.ItemAt(index)->Revert(); for (; iterator != fSettingsMap.end(); iterator++)
iterator->second->Revert();
break; break;
} }
case kMsgApply: case kMsgApply:
{ {
for (int index = 0; index < fItems.CountItems(); index++) SettingsMap::const_iterator iterator = fSettingsMap.begin();
fItems.ItemAt(index)->Save(); for (; iterator != fSettingsMap.end(); iterator++)
iterator->second->Apply();
break; break;
} }
@@ -328,7 +349,7 @@ NetworkWindow::_ScanAddOns()
if (item == NULL) if (item == NULL)
break; break;
fItems.AddItem(item); fSettingsMap[item->ListItem()] = item;
// TODO: sort // TODO: sort
fListView->AddUnder(interfaceItem, item->ListItem()); fListView->AddUnder(interfaceItem, item->ListItem());
} }
@@ -341,17 +362,29 @@ NetworkWindow::_ScanAddOns()
if (item == NULL) if (item == NULL)
break; break;
fItems.AddItem(item); fSettingsMap[item->ListItem()] = item;
// TODO: sort // TODO: sort
fListView->AddUnder(_ItemFor(item->Type()), item->ListItem()); fListView->AddUnder(_ListItemFor(item->Type()),
item->ListItem());
} }
} }
} }
} }
BNetworkSettingsItem*
NetworkWindow::_SettingsItemFor(BListItem* item)
{
SettingsMap::const_iterator found = fSettingsMap.find(item);
if (found != fSettingsMap.end())
return found->second;
return NULL;
}
BListItem* BListItem*
NetworkWindow::_ItemFor(BNetworkSettingsType type) NetworkWindow::_ListItemFor(BNetworkSettingsType type)
{ {
switch (type) { switch (type) {
case B_NETWORK_SETTINGS_TYPE_SERVICE: case B_NETWORK_SETTINGS_TYPE_SERVICE:
@@ -378,6 +411,34 @@ NetworkWindow::_ItemFor(BNetworkSettingsType type)
} }
void
NetworkWindow::_SelectItem(BListItem* listItem)
{
if (fAddOnShellView->CountChildren() > 0)
fAddOnShellView->ChildAt(0)->RemoveSelf();
BView* nextView = NULL;
BNetworkSettingsItem* item = _SettingsItemFor(listItem);
if (item != NULL) {
nextView = item->View();
} else {
InterfaceListItem* item = dynamic_cast<InterfaceListItem*>(
listItem);
if (item != NULL) {
fInterfaceView->SetTo(item->Name());
nextView = fInterfaceView;
}
}
if (nextView != NULL)
fAddOnShellView->AddChild(nextView);
fAddOnShellView->Invalidate();
InvalidateLayout();
}
void void
NetworkWindow::_ShowReplicant(bool show) NetworkWindow::_ShowReplicant(bool show)
{ {
+9 -5
View File
@@ -20,10 +20,9 @@
using namespace BNetworkKit; using namespace BNetworkKit;
class BTabView;
class BButton; class BButton;
class BMenu; class BMenu;
class InterfaceView;
class NetworkWindow : public BWindow { class NetworkWindow : public BWindow {
@@ -40,7 +39,10 @@ private:
void _BuildProfilesMenu(BMenu* menu, int32 what); void _BuildProfilesMenu(BMenu* menu, int32 what);
void _ScanInterfaces(); void _ScanInterfaces();
void _ScanAddOns(); void _ScanAddOns();
BListItem* _ItemFor(BNetworkSettingsType type); BNetworkSettingsItem*
_SettingsItemFor(BListItem* item);
BListItem* _ListItemFor(BNetworkSettingsType type);
void _SelectItem(BListItem* listItem);
bool _IsReplicantInstalled(); bool _IsReplicantInstalled();
void _ShowReplicant(bool show); void _ShowReplicant(bool show);
@@ -49,6 +51,7 @@ private:
typedef BObjectList<BNetworkSettingsAddOn> AddOnList; typedef BObjectList<BNetworkSettingsAddOn> AddOnList;
typedef BObjectList<BNetworkSettingsItem> ItemList; typedef BObjectList<BNetworkSettingsItem> ItemList;
typedef std::map<BString, BListItem*> ItemMap; typedef std::map<BString, BListItem*> ItemMap;
typedef std::map<BListItem*, BNetworkSettingsItem*> SettingsMap;
BButton* fRevertButton; BButton* fRevertButton;
BButton* fApplyButton; BButton* fApplyButton;
@@ -61,9 +64,10 @@ private:
BListItem* fDialUpItem; BListItem* fDialUpItem;
BListItem* fOtherItem; BListItem* fOtherItem;
ItemList fItems; SettingsMap fSettingsMap;
BView* fAddOnView; InterfaceView* fInterfaceView;
BView* fAddOnShellView;
}; };