In Media preflet:

* rename some variables (eg. fMenu1 -> fInputMenu)
* rearrange some code for improved clarity
* fix an instance of casting BMenuItem*s to dormant_node_info*s before deleting them (now we just delete them as BMenuItems)
* use a BGridView to align the MenuFields in Audio/Video setting views.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39190 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Alex Wilson
2010-10-30 04:20:58 +00:00
parent c489b073c8
commit 6e62e74423
3 changed files with 77 additions and 59 deletions
+59 -43
View File
@@ -21,6 +21,7 @@
#include <Catalog.h> #include <Catalog.h>
#include <Deskbar.h> #include <Deskbar.h>
#include <Entry.h> #include <Entry.h>
#include <GridView.h>
#include <GroupView.h> #include <GroupView.h>
#include <Locale.h> #include <Locale.h>
#include <MediaAddOn.h> #include <MediaAddOn.h>
@@ -45,50 +46,65 @@ SettingsView::SettingsView (bool isVideo)
{ {
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
// create the default box
// input menu
fInputMenu = new BPopUpMenu(B_TRANSLATE("<none>"));
fInputMenu->SetLabelFromMarked(true);
BMenuField* inputMenuField = new BMenuField("inputMenuField",
fIsVideo ? B_TRANSLATE("Video input:")
: B_TRANSLATE("Audio input:"), fInputMenu, NULL);
// output menu
fOutputMenu = new BPopUpMenu(B_TRANSLATE("<none>"));
fOutputMenu->SetLabelFromMarked(true);
BMenuField* outputMenuField = new BMenuField("outputMenuField",
fIsVideo ? B_TRANSLATE("Video output:")
: B_TRANSLATE("Audio output:"), fOutputMenu, NULL);
// channel menu (audio only)
BMenuField* channelMenuField = NULL;
if (!fIsVideo) {
fChannelMenu = new BPopUpMenu(B_TRANSLATE("<none>"));
fChannelMenu->SetLabelFromMarked(true);
channelMenuField = new BMenuField("channelMenuField",
B_TRANSLATE("Channel:"), fChannelMenu, NULL);
channelMenuField->SetDivider(StringWidth(B_TRANSLATE("Channel:"))+5);
}
BBox* defaultsBox = new BBox("defaults"); BBox* defaultsBox = new BBox("defaults");
defaultsBox->SetLabel(fIsVideo ? B_TRANSLATE("Default nodes") defaultsBox->SetLabel(fIsVideo ? B_TRANSLATE("Default nodes")
: B_TRANSLATE("Defaults")); : B_TRANSLATE("Defaults"));
// create the default box // put our menus in a BGridView in our BBox, this way, the BBox makes sure
BGroupLayout* defaultBoxLayout = new BGroupLayout(B_VERTICAL, 5); // we have are not blocking the label.
defaultBoxLayout->SetInsets(10,10,10,10); BGridView* defaultsGridView = new BGridView();
defaultsBox->SetLayout(defaultBoxLayout); defaultsBox->AddChild(defaultsGridView);
defaultBoxLayout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(5));
BGroupView* inputField = new BGroupView(B_HORIZONTAL); BGridLayout* defaultsGrid = defaultsGridView->GridLayout();
BGroupView* outputField = new BGroupView(B_HORIZONTAL); defaultsGrid->SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING,
defaultsBox->GetLayout()->AddView(inputField); B_USE_DEFAULT_SPACING);
defaultsBox->GetLayout()->AddView(outputField);
float divider = StringWidth(fIsVideo ? B_TRANSLATE("Video output:") BLayoutItem* labelItem = inputMenuField->CreateLabelLayoutItem();
: B_TRANSLATE("Audio output:")) + 5; BLayoutItem* menuItem = inputMenuField->CreateMenuBarLayoutItem();
fMenu1 = new BPopUpMenu(B_TRANSLATE("<none>")); defaultsGrid->AddItem(labelItem, 0, 0, 1, 1);
fMenu1->SetLabelFromMarked(true); defaultsGrid->AddItem(menuItem, 1, 0, 3, 1);
BMenuField* menuField1 = new BMenuField("menuField1",
fIsVideo ? B_TRANSLATE("Video input:")
: B_TRANSLATE("Audio input:"), fMenu1, NULL);
menuField1->SetDivider(divider);
fMenu2 = new BPopUpMenu(B_TRANSLATE("<none>")); int32 outputMenuWidth = 3;
fMenu2->SetLabelFromMarked(true); if (channelMenuField) {
BMenuField* menuField2 = new BMenuField("menuField2", outputMenuWidth = 1;
fIsVideo ? B_TRANSLATE("Video output:") labelItem = channelMenuField->CreateLabelLayoutItem();
: B_TRANSLATE("Audio output:"), fMenu2, NULL); menuItem = channelMenuField->CreateMenuBarLayoutItem();
menuField2->SetDivider(divider); defaultsGrid->AddItem(labelItem, 2, 1, 1, 1);
defaultsGrid->AddItem(menuItem, 3, 1, 1, 1);
inputField->GroupLayout()->AddView(menuField1);
outputField->GroupLayout()->AddView(menuField2);
BMenuField* menuField3 = NULL;
if (!fIsVideo) {
fMenu3 = new BPopUpMenu(B_TRANSLATE("<none>"));
fMenu3->SetLabelFromMarked(true);
menuField3 = new BMenuField("menuField3",
B_TRANSLATE("Channel:"), fMenu3, NULL);
outputField->GroupLayout()->AddView(menuField3);
menuField3->SetDivider(StringWidth(B_TRANSLATE("Channel:"))+5);
} }
labelItem = outputMenuField->CreateLabelLayoutItem();
menuItem = outputMenuField->CreateMenuBarLayoutItem();
defaultsGrid->AddItem(labelItem, 0, 1, 1, 1);
defaultsGrid->AddItem(menuItem, 1, 1, outputMenuWidth, 1);
rgb_color red_color = {222, 32, 33}; rgb_color red_color = {222, 32, 33};
fRestartView = new BStringView("restartStringView", fRestartView = new BStringView("restartStringView",
B_TRANSLATE("Restart the media server to apply changes.")); B_TRANSLATE("Restart the media server to apply changes."));
@@ -136,7 +152,7 @@ SettingsView::SettingsView (bool isVideo)
realtimeBoxLayout->AddView(fRealtimeCheckBox); realtimeBoxLayout->AddView(fRealtimeCheckBox);
realtimeBoxLayout->AddView(textView); realtimeBoxLayout->AddView(textView);
// create the bottom line: volumen in deskbar checkbox and restart button // create the bottom line: volume in deskbar checkbox and restart button
BGroupView* bottomView = new BGroupView(B_HORIZONTAL); BGroupView* bottomView = new BGroupView(B_HORIZONTAL);
BButton* restartButton = new BButton("restartButton", BButton* restartButton = new BButton("restartButton",
B_TRANSLATE("Restart media services"), B_TRANSLATE("Restart media services"),
@@ -168,10 +184,10 @@ SettingsView::SettingsView (bool isVideo)
void void
SettingsView::AddNodes(NodeList& list, bool isInput) SettingsView::AddNodes(NodeList& list, bool isInput)
{ {
BMenu* menu = isInput ? fMenu1 : fMenu2; BMenu* menu = isInput ? fInputMenu : fOutputMenu;
void* item;
while ((item = menu->RemoveItem((int32)0)) != NULL) for (BMenuItem* item; (item = menu->RemoveItem((int32)0)) != NULL;)
delete static_cast<dormant_node_info*>(item); delete item;
BMessage message(ML_DEFAULT_CHANGE); BMessage message(ML_DEFAULT_CHANGE);
message.AddBool("isVideo", fIsVideo); message.AddBool("isVideo", fIsVideo);
@@ -187,7 +203,7 @@ SettingsView::AddNodes(NodeList& list, bool isInput)
void void
SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID) SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID)
{ {
BMenu* menu = isInput ? fMenu1 : fMenu2; BMenu* menu = isInput ? fInputMenu : fOutputMenu;
for (int32 i = 0; i < menu->CountItems(); i++) { for (int32 i = 0; i < menu->CountItems(); i++) {
SettingsItem* item = static_cast<SettingsItem*>(menu->ItemAt(i)); SettingsItem* item = static_cast<SettingsItem*>(menu->ItemAt(i));
@@ -200,7 +216,7 @@ SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID)
if (!fIsVideo && !isInput && outputID >= 0) { if (!fIsVideo && !isInput && outputID >= 0) {
BMenuItem* item; BMenuItem* item;
while ((item = fMenu3->RemoveItem((int32)0)) != NULL) while ((item = fChannelMenu->RemoveItem((int32)0)) != NULL)
delete item; delete item;
BMediaRoster* roster = BMediaRoster::Roster(); BMediaRoster* roster = BMediaRoster::Roster();
@@ -226,7 +242,7 @@ SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID)
memcpy(input, &inputs[i], sizeof(*input)); memcpy(input, &inputs[i], sizeof(*input));
item = new Settings2Item(&info, input, item = new Settings2Item(&info, input,
new BMessage(message)); new BMessage(message));
fMenu3->AddItem(item); fChannelMenu->AddItem(item);
if (inputs[i].destination.id == outputID) if (inputs[i].destination.id == outputID)
item->SetMarked(true); item->SetMarked(true);
} }
+4 -6
View File
@@ -69,12 +69,10 @@ public:
BCheckBox* fRealtimeCheckBox; BCheckBox* fRealtimeCheckBox;
BCheckBox* fVolumeCheckBox; BCheckBox* fVolumeCheckBox;
BMenu* fMenu1; BMenu* fInputMenu;
// input menu BMenu* fOutputMenu;
BMenu* fMenu2; BMenu* fChannelMenu;
// output menu // (audio only)
BMenu* fMenu3;
// channel menu (audio only)
BStringView* fRestartView; BStringView* fRestartView;
private: private:
+14 -10
View File
@@ -114,20 +114,24 @@ MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into)
{ {
dormant_node_info node_info[64]; dormant_node_info node_info[64];
int32 node_info_count = 64; int32 node_info_count = 64;
media_format format; media_format format;
media_format* format1 = NULL, *format2 = NULL; media_format* nodeInputFormat = NULL, *nodeOutputFormat = NULL;
BMediaRoster* roster = BMediaRoster::Roster();
format.type = type; format.type = type;
// output nodes must be BBufferConsumers => they have an input format
// input nodes must be BBufferProducers => they have an output format
if (kind & B_PHYSICAL_OUTPUT) if (kind & B_PHYSICAL_OUTPUT)
format1 = &format; nodeInputFormat = &format;
else if (kind & B_PHYSICAL_INPUT) else if (kind & B_PHYSICAL_INPUT)
format2 = &format; nodeOutputFormat = &format;
else else
return; return;
if (roster->GetDormantNodes(node_info, &node_info_count, format1, format2, BMediaRoster* roster = BMediaRoster::Roster();
NULL, kind)!=B_OK) {
if (roster->GetDormantNodes(node_info, &node_info_count, nodeInputFormat,
nodeOutputFormat, NULL, kind) != B_OK) {
// TODO: better error reporting! // TODO: better error reporting!
fprintf(stderr, "error\n"); fprintf(stderr, "error\n");
return; return;
@@ -430,7 +434,7 @@ MediaWindow::MessageReceived(BMessage* message)
if (message->FindInt32("index", &index)!=B_OK) if (message->FindInt32("index", &index)!=B_OK)
break; break;
Settings2Item* item = static_cast<Settings2Item*>( Settings2Item* item = static_cast<Settings2Item*>(
fAudioView->fMenu3->ItemAt(index)); fAudioView->fChannelMenu->ItemAt(index));
if (item) { if (item) {
BMediaRoster* roster = BMediaRoster::Roster(); BMediaRoster* roster = BMediaRoster::Roster();
@@ -454,8 +458,8 @@ MediaWindow::MessageReceived(BMessage* message)
if (message->FindInt32("index", &index)!=B_OK) if (message->FindInt32("index", &index)!=B_OK)
break; break;
SettingsView* settingsView = isVideo ? fVideoView : fAudioView; SettingsView* settingsView = isVideo ? fVideoView : fAudioView;
BMenu* menu = isInput ? settingsView->fMenu1 BMenu* menu = isInput ? settingsView->fInputMenu
: settingsView->fMenu2; : settingsView->fOutputMenu;
SettingsItem* item = static_cast<SettingsItem*>( SettingsItem* item = static_cast<SettingsItem*>(
menu->ItemAt(index)); menu->ItemAt(index));
@@ -542,7 +546,7 @@ MediaWindow::MessageReceived(BMessage* message)
case ML_ENABLE_REAL_TIME: case ML_ENABLE_REAL_TIME:
{ {
bool isVideo = true; bool isVideo = true;
if (message->FindBool("isVideo", &isVideo)!=B_OK) if (message->FindBool("isVideo", &isVideo) != B_OK)
break; break;
SettingsView* settingsView = isVideo ? fVideoView : fAudioView; SettingsView* settingsView = isVideo ? fVideoView : fAudioView;
uint32 flags; uint32 flags;