From 78aa9c8040c13ed6a32632ba024259ee993c6c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 2 Jul 2003 04:21:09 +0000 Subject: [PATCH] The creation of the parameter views now happens before the sub-groups are added to the group. That way, a title view can be identified and always placed at the top of the view. Fixed minor related bugs. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3804 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/media/DefaultMediaTheme.cpp | 81 ++++++++++++++++++---------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/kits/media/DefaultMediaTheme.cpp b/src/kits/media/DefaultMediaTheme.cpp index fa086c8f7b..22c10037b1 100644 --- a/src/kits/media/DefaultMediaTheme.cpp +++ b/src/kits/media/DefaultMediaTheme.cpp @@ -251,14 +251,44 @@ DefaultMediaTheme::MakeViewFor(BParameterGroup &group, const BRect &hintRect) return NULL; BRect rect(hintRect); - BView *view = new BView(rect, group.Name(), B_FOLLOW_ALL, B_WILL_DRAW); + BView *view = new BView(rect, group.Name(), B_FOLLOW_NONE, B_WILL_DRAW); view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - // Add the sub-group views + // Create the parameter views - but don't add them yet rect.OffsetTo(B_ORIGIN); rect.InsetBySelf(5, 5); + + BList views; + for (int32 i = 0; i < group.CountParameters(); i++) { + BParameter *parameter = group.ParameterAt(i); + if (parameter == NULL) + continue; + + BView *parameterView = MakeSelfHostingViewFor(*parameter, rect); + if (parameterView == NULL) + continue; + + parameterView->SetViewColor(view->ViewColor()); + // ToDo: dunno why this is needed, but the controls + // sometimes (!) have a white background without it + + views.AddItem(parameterView); + } + + // Identify a title view, and add it at the top if present + + TitleView *titleView = dynamic_cast((BView *)views.ItemAt(0)); + if (titleView != NULL) { + view->AddChild(titleView); + rect.OffsetBy(0, titleView->Bounds().Height()); + } + + // Add the sub-group views + rect.right = rect.left + 50; + rect.bottom = rect.top + 10; + float lastHeight; for (int32 i = 0; i < group.CountGroups(); i++) { BParameterGroup *subGroup = group.GroupAt(i); @@ -271,9 +301,11 @@ DefaultMediaTheme::MakeViewFor(BParameterGroup &group, const BRect &hintRect) if (i > 0) { // add separator view - BRect separatorRect(rect); + BRect separatorRect(groupView->Frame()); separatorRect.left -= 3; separatorRect.right = separatorRect.left + 1; + if (lastHeight > separatorRect.Height()) + separatorRect.bottom = separatorRect.top + lastHeight; view->AddChild(new SeparatorView(separatorRect)); } @@ -282,31 +314,33 @@ DefaultMediaTheme::MakeViewFor(BParameterGroup &group, const BRect &hintRect) rect.OffsetBy(groupView->Bounds().Width() + 5, 0); - if (groupView->Bounds().Height() > rect.Height()) - rect.bottom = groupView->Bounds().Height() - 1; + lastHeight = groupView->Bounds().Height(); + if (lastHeight > rect.Height()) + rect.bottom = rect.top + lastHeight - 1; } - view->ResizeTo(rect.left + 10, rect.bottom + 10); - rect.left = 5; - - // add the parameter views part of the group + view->ResizeTo(rect.left + 10, rect.bottom + 5); if (group.CountParameters() == 0) return view; - if (view->CountChildren() > 0) - rect.OffsetBy(0, rect.Height() + 10); + // add the parameter views part of the group + + if (group.CountGroups() > 0) { + rect.top = rect.bottom + 10; + rect.bottom = rect.top + 20; + } - BList views; bool center = false; - for (int32 i = 0; i < group.CountParameters(); i++) { - BParameter *parameter = group.ParameterAt(i); - if (parameter == NULL) - continue; + for (int32 i = 0; i < views.CountItems(); i++) { + BView *parameterView = static_cast(views.ItemAt(i)); - BView *parameterView = MakeSelfHostingViewFor(*parameter, rect); - if (parameterView == NULL) + if (parameterView->Bounds().Width() + 5 > rect.Width()) + rect.right = parameterView->Bounds().Width() + rect.left + 5; + + // we don't need to add the title view again + if (parameterView == titleView) continue; // if there is a BChannelSlider (ToDo: or any vertical slider?) @@ -314,20 +348,13 @@ DefaultMediaTheme::MakeViewFor(BParameterGroup &group, const BRect &hintRect) if (dynamic_cast(parameterView) != NULL) center = true; - parameterView->SetViewColor(view->ViewColor()); - // ToDo: dunno why this is needed, but the controls - // sometimes (!) have a white background without it - + parameterView->MoveTo(parameterView->Frame().left, rect.top); view->AddChild(parameterView); - views.AddItem(parameterView); rect.OffsetBy(0, parameterView->Bounds().Height() + 5); - - if (parameterView->Bounds().Width() + 5 > rect.Width()) - rect.right = parameterView->Bounds().Width() + rect.left + 5; } - if (group.CountParameters() > 0) + if (views.CountItems() > (titleView != NULL ? 1 : 0)) view->ResizeTo(rect.right + 5, rect.top + 5); // center the parameter views if needed, and tweak some views