From 6e62e7442344b160f07c3612c9e510a20dccc370 Mon Sep 17 00:00:00 2001 From: Alex Wilson Date: Sat, 30 Oct 2010 04:20:58 +0000 Subject: [PATCH] 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 --- src/preferences/media/MediaViews.cpp | 102 +++++++++++++++----------- src/preferences/media/MediaViews.h | 10 +-- src/preferences/media/MediaWindow.cpp | 24 +++--- 3 files changed, 77 insertions(+), 59 deletions(-) diff --git a/src/preferences/media/MediaViews.cpp b/src/preferences/media/MediaViews.cpp index 27dbc140b0..7ea5d48474 100644 --- a/src/preferences/media/MediaViews.cpp +++ b/src/preferences/media/MediaViews.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -45,50 +46,65 @@ SettingsView::SettingsView (bool isVideo) { SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + // create the default box + + // input menu + fInputMenu = new BPopUpMenu(B_TRANSLATE("")); + 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("")); + 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("")); + fChannelMenu->SetLabelFromMarked(true); + channelMenuField = new BMenuField("channelMenuField", + B_TRANSLATE("Channel:"), fChannelMenu, NULL); + channelMenuField->SetDivider(StringWidth(B_TRANSLATE("Channel:"))+5); + } + BBox* defaultsBox = new BBox("defaults"); defaultsBox->SetLabel(fIsVideo ? B_TRANSLATE("Default nodes") : B_TRANSLATE("Defaults")); - // create the default box - BGroupLayout* defaultBoxLayout = new BGroupLayout(B_VERTICAL, 5); - defaultBoxLayout->SetInsets(10,10,10,10); - defaultsBox->SetLayout(defaultBoxLayout); - defaultBoxLayout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(5)); + // put our menus in a BGridView in our BBox, this way, the BBox makes sure + // we have are not blocking the label. + BGridView* defaultsGridView = new BGridView(); + defaultsBox->AddChild(defaultsGridView); - BGroupView* inputField = new BGroupView(B_HORIZONTAL); - BGroupView* outputField = new BGroupView(B_HORIZONTAL); - defaultsBox->GetLayout()->AddView(inputField); - defaultsBox->GetLayout()->AddView(outputField); + BGridLayout* defaultsGrid = defaultsGridView->GridLayout(); + defaultsGrid->SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING, + B_USE_DEFAULT_SPACING); - float divider = StringWidth(fIsVideo ? B_TRANSLATE("Video output:") - : B_TRANSLATE("Audio output:")) + 5; - fMenu1 = new BPopUpMenu(B_TRANSLATE("")); - fMenu1->SetLabelFromMarked(true); - BMenuField* menuField1 = new BMenuField("menuField1", - fIsVideo ? B_TRANSLATE("Video input:") - : B_TRANSLATE("Audio input:"), fMenu1, NULL); - menuField1->SetDivider(divider); + BLayoutItem* labelItem = inputMenuField->CreateLabelLayoutItem(); + BLayoutItem* menuItem = inputMenuField->CreateMenuBarLayoutItem(); + defaultsGrid->AddItem(labelItem, 0, 0, 1, 1); + defaultsGrid->AddItem(menuItem, 1, 0, 3, 1); - fMenu2 = new BPopUpMenu(B_TRANSLATE("")); - fMenu2->SetLabelFromMarked(true); - BMenuField* menuField2 = new BMenuField("menuField2", - fIsVideo ? B_TRANSLATE("Video output:") - : B_TRANSLATE("Audio output:"), fMenu2, NULL); - menuField2->SetDivider(divider); - - inputField->GroupLayout()->AddView(menuField1); - outputField->GroupLayout()->AddView(menuField2); - - BMenuField* menuField3 = NULL; - if (!fIsVideo) { - fMenu3 = new BPopUpMenu(B_TRANSLATE("")); - fMenu3->SetLabelFromMarked(true); - menuField3 = new BMenuField("menuField3", - B_TRANSLATE("Channel:"), fMenu3, NULL); - outputField->GroupLayout()->AddView(menuField3); - menuField3->SetDivider(StringWidth(B_TRANSLATE("Channel:"))+5); + int32 outputMenuWidth = 3; + if (channelMenuField) { + outputMenuWidth = 1; + labelItem = channelMenuField->CreateLabelLayoutItem(); + menuItem = channelMenuField->CreateMenuBarLayoutItem(); + defaultsGrid->AddItem(labelItem, 2, 1, 1, 1); + defaultsGrid->AddItem(menuItem, 3, 1, 1, 1); } + 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}; fRestartView = new BStringView("restartStringView", B_TRANSLATE("Restart the media server to apply changes.")); @@ -136,7 +152,7 @@ SettingsView::SettingsView (bool isVideo) realtimeBoxLayout->AddView(fRealtimeCheckBox); 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); BButton* restartButton = new BButton("restartButton", B_TRANSLATE("Restart media services"), @@ -168,10 +184,10 @@ SettingsView::SettingsView (bool isVideo) void SettingsView::AddNodes(NodeList& list, bool isInput) { - BMenu* menu = isInput ? fMenu1 : fMenu2; - void* item; - while ((item = menu->RemoveItem((int32)0)) != NULL) - delete static_cast(item); + BMenu* menu = isInput ? fInputMenu : fOutputMenu; + + for (BMenuItem* item; (item = menu->RemoveItem((int32)0)) != NULL;) + delete item; BMessage message(ML_DEFAULT_CHANGE); message.AddBool("isVideo", fIsVideo); @@ -187,7 +203,7 @@ SettingsView::AddNodes(NodeList& list, bool isInput) void 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++) { SettingsItem* item = static_cast(menu->ItemAt(i)); @@ -200,7 +216,7 @@ SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID) if (!fIsVideo && !isInput && outputID >= 0) { BMenuItem* item; - while ((item = fMenu3->RemoveItem((int32)0)) != NULL) + while ((item = fChannelMenu->RemoveItem((int32)0)) != NULL) delete item; BMediaRoster* roster = BMediaRoster::Roster(); @@ -226,7 +242,7 @@ SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID) memcpy(input, &inputs[i], sizeof(*input)); item = new Settings2Item(&info, input, new BMessage(message)); - fMenu3->AddItem(item); + fChannelMenu->AddItem(item); if (inputs[i].destination.id == outputID) item->SetMarked(true); } diff --git a/src/preferences/media/MediaViews.h b/src/preferences/media/MediaViews.h index 4deaf43b9c..d47b0bcc59 100644 --- a/src/preferences/media/MediaViews.h +++ b/src/preferences/media/MediaViews.h @@ -69,12 +69,10 @@ public: BCheckBox* fRealtimeCheckBox; BCheckBox* fVolumeCheckBox; - BMenu* fMenu1; - // input menu - BMenu* fMenu2; - // output menu - BMenu* fMenu3; - // channel menu (audio only) + BMenu* fInputMenu; + BMenu* fOutputMenu; + BMenu* fChannelMenu; + // (audio only) BStringView* fRestartView; private: diff --git a/src/preferences/media/MediaWindow.cpp b/src/preferences/media/MediaWindow.cpp index 8a65c462ad..07f37b7cfa 100644 --- a/src/preferences/media/MediaWindow.cpp +++ b/src/preferences/media/MediaWindow.cpp @@ -114,20 +114,24 @@ MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into) { dormant_node_info node_info[64]; int32 node_info_count = 64; + media_format format; - media_format* format1 = NULL, *format2 = NULL; - BMediaRoster* roster = BMediaRoster::Roster(); + media_format* nodeInputFormat = NULL, *nodeOutputFormat = NULL; 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) - format1 = &format; + nodeInputFormat = &format; else if (kind & B_PHYSICAL_INPUT) - format2 = &format; + nodeOutputFormat = &format; else return; - if (roster->GetDormantNodes(node_info, &node_info_count, format1, format2, - NULL, kind)!=B_OK) { + BMediaRoster* roster = BMediaRoster::Roster(); + + if (roster->GetDormantNodes(node_info, &node_info_count, nodeInputFormat, + nodeOutputFormat, NULL, kind) != B_OK) { // TODO: better error reporting! fprintf(stderr, "error\n"); return; @@ -430,7 +434,7 @@ MediaWindow::MessageReceived(BMessage* message) if (message->FindInt32("index", &index)!=B_OK) break; Settings2Item* item = static_cast( - fAudioView->fMenu3->ItemAt(index)); + fAudioView->fChannelMenu->ItemAt(index)); if (item) { BMediaRoster* roster = BMediaRoster::Roster(); @@ -454,8 +458,8 @@ MediaWindow::MessageReceived(BMessage* message) if (message->FindInt32("index", &index)!=B_OK) break; SettingsView* settingsView = isVideo ? fVideoView : fAudioView; - BMenu* menu = isInput ? settingsView->fMenu1 - : settingsView->fMenu2; + BMenu* menu = isInput ? settingsView->fInputMenu + : settingsView->fOutputMenu; SettingsItem* item = static_cast( menu->ItemAt(index)); @@ -542,7 +546,7 @@ MediaWindow::MessageReceived(BMessage* message) case ML_ENABLE_REAL_TIME: { bool isVideo = true; - if (message->FindBool("isVideo", &isVideo)!=B_OK) + if (message->FindBool("isVideo", &isVideo) != B_OK) break; SettingsView* settingsView = isVideo ? fVideoView : fAudioView; uint32 flags;