xref: /haiku/src/preferences/media/MediaViews.cpp (revision a10cf76ef5b9e8c726ebc47183abd6943023cf8f)
1*a10cf76eSAxel Dörfler // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2*a10cf76eSAxel Dörfler //
3*a10cf76eSAxel Dörfler //	Copyright (c) 2003, OpenBeOS
4*a10cf76eSAxel Dörfler //
5*a10cf76eSAxel Dörfler //  This software is part of the OpenBeOS distribution and is covered
6*a10cf76eSAxel Dörfler //  by the OpenBeOS license.
7*a10cf76eSAxel Dörfler //
8*a10cf76eSAxel Dörfler //
9*a10cf76eSAxel Dörfler //  File:        MediaViews.cpp
10*a10cf76eSAxel Dörfler //  Author:      Sikosis, Jérôme Duval
11*a10cf76eSAxel Dörfler //  Description: Media Preferences
12*a10cf76eSAxel Dörfler //  Created :    June 25, 2003
13*a10cf76eSAxel Dörfler //
14*a10cf76eSAxel Dörfler // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
15*a10cf76eSAxel Dörfler 
16*a10cf76eSAxel Dörfler 
17*a10cf76eSAxel Dörfler // Includes -------------------------------------------------------------------------------------------------- //
18*a10cf76eSAxel Dörfler #include <Box.h>
19*a10cf76eSAxel Dörfler #include <Button.h>
20*a10cf76eSAxel Dörfler #include <TextView.h>
21*a10cf76eSAxel Dörfler #include <MenuField.h>
22*a10cf76eSAxel Dörfler #include <PopUpMenu.h>
23*a10cf76eSAxel Dörfler #include <MediaRoster.h>
24*a10cf76eSAxel Dörfler #include <Deskbar.h>
25*a10cf76eSAxel Dörfler #include <Entry.h>
26*a10cf76eSAxel Dörfler #include <stdio.h>
27*a10cf76eSAxel Dörfler #include <MediaAddOn.h>
28*a10cf76eSAxel Dörfler #include <String.h>
29*a10cf76eSAxel Dörfler #include "MediaViews.h"
30*a10cf76eSAxel Dörfler 
31*a10cf76eSAxel Dörfler BarView::BarView(BRect frame)
32*a10cf76eSAxel Dörfler  : BView (frame, "barView", B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW ),
33*a10cf76eSAxel Dörfler  	mDisplay(true)
34*a10cf76eSAxel Dörfler {
35*a10cf76eSAxel Dörfler }
36*a10cf76eSAxel Dörfler 
37*a10cf76eSAxel Dörfler void
38*a10cf76eSAxel Dörfler BarView::Draw(BRect updateRect)
39*a10cf76eSAxel Dörfler {
40*a10cf76eSAxel Dörfler 	BRect r = Bounds();
41*a10cf76eSAxel Dörfler 
42*a10cf76eSAxel Dörfler 	if(mDisplay) {
43*a10cf76eSAxel Dörfler 		// Display the 3D Look Divider Bar
44*a10cf76eSAxel Dörfler 		SetHighColor(140,140,140,0);
45*a10cf76eSAxel Dörfler 		StrokeLine(BPoint(r.left,r.top),BPoint(r.right,r.top));
46*a10cf76eSAxel Dörfler 		SetHighColor(255,255,255,0);
47*a10cf76eSAxel Dörfler 		StrokeLine(BPoint(r.left,r.bottom),BPoint(r.right,r.bottom));
48*a10cf76eSAxel Dörfler 	} else {
49*a10cf76eSAxel Dörfler 		SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
50*a10cf76eSAxel Dörfler 		StrokeLine(BPoint(r.left,r.top),BPoint(r.right,r.top));
51*a10cf76eSAxel Dörfler 		StrokeLine(BPoint(r.left,r.bottom),BPoint(r.right,r.bottom));
52*a10cf76eSAxel Dörfler 	}
53*a10cf76eSAxel Dörfler }
54*a10cf76eSAxel Dörfler 
55*a10cf76eSAxel Dörfler 
56*a10cf76eSAxel Dörfler SettingsView::SettingsView (BRect frame, bool isVideo)
57*a10cf76eSAxel Dörfler  : BView (frame, "SettingsView", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW ),
58*a10cf76eSAxel Dörfler  	mIsVideo(isVideo)
59*a10cf76eSAxel Dörfler {
60*a10cf76eSAxel Dörfler 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
61*a10cf76eSAxel Dörfler 	BRect rect(frame);
62*a10cf76eSAxel Dörfler 	rect.left += 10;
63*a10cf76eSAxel Dörfler 	rect.top += 12;
64*a10cf76eSAxel Dörfler 	rect.right -=21;
65*a10cf76eSAxel Dörfler 	rect.bottom = rect.top + 104;
66*a10cf76eSAxel Dörfler 	BBox *defaultsBox = new BBox(rect, "defaults");
67*a10cf76eSAxel Dörfler 	defaultsBox->SetLabel(mIsVideo ? "Default Nodes" : "Defaults");
68*a10cf76eSAxel Dörfler 	AddChild(defaultsBox);
69*a10cf76eSAxel Dörfler 
70*a10cf76eSAxel Dörfler 	BRect defaultRect(20, 22, 250, 40);
71*a10cf76eSAxel Dörfler 	mMenu1 = new BPopUpMenu("<none>");
72*a10cf76eSAxel Dörfler 	mMenu1->SetLabelFromMarked(true);
73*a10cf76eSAxel Dörfler 	BMenuField *menuField1 = new BMenuField(defaultRect, "menuField1",
74*a10cf76eSAxel Dörfler 		mIsVideo ? "Video Input:" : "Audio Input:", mMenu1);
75*a10cf76eSAxel Dörfler 	defaultsBox->AddChild(menuField1);
76*a10cf76eSAxel Dörfler 	menuField1->SetDivider(75);
77*a10cf76eSAxel Dörfler 
78*a10cf76eSAxel Dörfler 	defaultRect.OffsetBy(0, 26);
79*a10cf76eSAxel Dörfler 	mMenu2 = new BPopUpMenu("<none>");
80*a10cf76eSAxel Dörfler 	mMenu2->SetLabelFromMarked(true);
81*a10cf76eSAxel Dörfler 	BMenuField *menuField2 = new BMenuField(defaultRect, "menuField2",
82*a10cf76eSAxel Dörfler 		mIsVideo ? "Video Output:" : "Audio Output:", mMenu2);
83*a10cf76eSAxel Dörfler 	defaultsBox->AddChild(menuField2);
84*a10cf76eSAxel Dörfler 	menuField2->SetDivider(75);
85*a10cf76eSAxel Dörfler 
86*a10cf76eSAxel Dörfler 	if(!mIsVideo) {
87*a10cf76eSAxel Dörfler 		defaultRect.OffsetBy(186, 0);
88*a10cf76eSAxel Dörfler 		mMenu3 = new BPopUpMenu("<none>");
89*a10cf76eSAxel Dörfler 		mMenu3->SetLabelFromMarked(true);
90*a10cf76eSAxel Dörfler 		BMenuField *mMenuField3 = new BMenuField(defaultRect, "menuField3",
91*a10cf76eSAxel Dörfler 			"Channel:", mMenu3);
92*a10cf76eSAxel Dörfler 		defaultsBox->AddChild(mMenuField3);
93*a10cf76eSAxel Dörfler 		mMenuField3->SetDivider(50);
94*a10cf76eSAxel Dörfler 		defaultRect.OffsetBy(-186, 0);
95*a10cf76eSAxel Dörfler 	}
96*a10cf76eSAxel Dörfler 
97*a10cf76eSAxel Dörfler 	defaultRect.OffsetBy(0, 32);
98*a10cf76eSAxel Dörfler 	BRect restartTextRect(defaultRect);
99*a10cf76eSAxel Dörfler 	restartTextRect.OffsetTo(B_ORIGIN);
100*a10cf76eSAxel Dörfler 	restartTextRect.InsetBy(1,1);
101*a10cf76eSAxel Dörfler 	rgb_color red_color = {222, 32, 33};
102*a10cf76eSAxel Dörfler 	mRestartTextView = new BTextView(defaultRect, "restartTextView", restartTextRect,
103*a10cf76eSAxel Dörfler 		be_plain_font, &red_color, B_FOLLOW_ALL, B_WILL_DRAW);
104*a10cf76eSAxel Dörfler 	mRestartTextView->Insert("Restart the Media Server to apply changes.");
105*a10cf76eSAxel Dörfler 	mRestartTextView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
106*a10cf76eSAxel Dörfler 	defaultsBox->AddChild(mRestartTextView);
107*a10cf76eSAxel Dörfler 	mRestartTextView->Hide();
108*a10cf76eSAxel Dörfler 
109*a10cf76eSAxel Dörfler 	rect.top = rect.bottom + 10;
110*a10cf76eSAxel Dörfler 	rect.bottom = rect.top + 162;
111*a10cf76eSAxel Dörfler 	BBox *realtimeBox = new BBox(rect, "realtime");
112*a10cf76eSAxel Dörfler 	realtimeBox->SetLabel("Real-Time");
113*a10cf76eSAxel Dörfler 	AddChild(realtimeBox);
114*a10cf76eSAxel Dörfler 
115*a10cf76eSAxel Dörfler 	BMessage *message = new BMessage(ML_ENABLE_REAL_TIME);
116*a10cf76eSAxel Dörfler 	message->AddBool("isVideo", mIsVideo);
117*a10cf76eSAxel Dörfler 	BRect rect2(22,20, 190, 40);
118*a10cf76eSAxel Dörfler 	mRealtimeCheckBox = new BCheckBox(rect2, "realtimeCheckBox",
119*a10cf76eSAxel Dörfler 		mIsVideo ? "Enable Real-Time Video" : "Enable Real-Time Audio", message);
120*a10cf76eSAxel Dörfler 	realtimeBox->AddChild(mRealtimeCheckBox);
121*a10cf76eSAxel Dörfler 
122*a10cf76eSAxel Dörfler 	uint32 flags;
123*a10cf76eSAxel Dörfler 	BMediaRoster::Roster()->GetRealtimeFlags(&flags);
124*a10cf76eSAxel Dörfler 	if(flags & (mIsVideo ? B_MEDIA_REALTIME_VIDEO : B_MEDIA_REALTIME_AUDIO))
125*a10cf76eSAxel Dörfler 		mRealtimeCheckBox->SetValue(B_CONTROL_ON);
126*a10cf76eSAxel Dörfler 
127*a10cf76eSAxel Dörfler 	rect2.top += 26;
128*a10cf76eSAxel Dörfler 	rect2.bottom = rect2.top + 80;
129*a10cf76eSAxel Dörfler 	rect2.right = rect.right - 15;
130*a10cf76eSAxel Dörfler 	BRect textRect(3, 3, rect2.Width() - 3, rect2.Height() - 3);
131*a10cf76eSAxel Dörfler 	BTextView *textView = new BTextView(rect2, "textView", textRect, B_FOLLOW_ALL, B_WILL_DRAW);
132*a10cf76eSAxel Dörfler 	textView->Insert(mIsVideo ? "Enabling Real-Time Video allows the BeOS to perform video operations as fast and smoothly as possible.  It achieves optimum performance by using more RAM."
133*a10cf76eSAxel Dörfler 		: "Enabling Real-time Audio allows BeOS to record and play audio as fast as possible.  It achieves this performance by using more CPU and RAM.");
134*a10cf76eSAxel Dörfler 	textView->Insert("\n\nOnly enable this feature if you need the lowest latency possible.");
135*a10cf76eSAxel Dörfler 	textView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
136*a10cf76eSAxel Dörfler 	realtimeBox->AddChild(textView);
137*a10cf76eSAxel Dörfler 
138*a10cf76eSAxel Dörfler 	rect.top = rect.bottom + 11;
139*a10cf76eSAxel Dörfler 	rect.bottom = rect.top + 20;
140*a10cf76eSAxel Dörfler 	rect.left = rect.right - 130;
141*a10cf76eSAxel Dörfler 	BButton *restartButton = new BButton(rect, "restartButton",
142*a10cf76eSAxel Dörfler 		"Restart Media Services", new BMessage(ML_RESTART_MEDIA_SERVER));
143*a10cf76eSAxel Dörfler 	AddChild(restartButton);
144*a10cf76eSAxel Dörfler 
145*a10cf76eSAxel Dörfler 	if(!mIsVideo) {
146*a10cf76eSAxel Dörfler 		rect.top += 4;
147*a10cf76eSAxel Dörfler 		rect.left = frame.left + 33;
148*a10cf76eSAxel Dörfler 		rect.right = rect.left + 180;
149*a10cf76eSAxel Dörfler 
150*a10cf76eSAxel Dörfler 		mVolumeCheckBox = new BCheckBox(rect, "volumeCheckBox",
151*a10cf76eSAxel Dörfler 			"Show Volume Control on Deskbar", new BMessage(ML_SHOW_VOLUME_CONTROL));
152*a10cf76eSAxel Dörfler 		AddChild(mVolumeCheckBox);
153*a10cf76eSAxel Dörfler 
154*a10cf76eSAxel Dörfler 		if(BDeskbar().HasItem("MediaReplicant"))
155*a10cf76eSAxel Dörfler 			mVolumeCheckBox->SetValue(B_CONTROL_ON);
156*a10cf76eSAxel Dörfler 	}
157*a10cf76eSAxel Dörfler }
158*a10cf76eSAxel Dörfler 
159*a10cf76eSAxel Dörfler void
160*a10cf76eSAxel Dörfler SettingsView::AddNodes(BList &list, bool isInput)
161*a10cf76eSAxel Dörfler {
162*a10cf76eSAxel Dörfler 	BMenu *menu = isInput ? mMenu1 : mMenu2;
163*a10cf76eSAxel Dörfler 	void *item;
164*a10cf76eSAxel Dörfler 	while ((item = menu->RemoveItem((int32)0)) != NULL)
165*a10cf76eSAxel Dörfler 		delete static_cast<dormant_node_info *>(item);
166*a10cf76eSAxel Dörfler 
167*a10cf76eSAxel Dörfler 	BMessage message(ML_DEFAULT_CHANGE);
168*a10cf76eSAxel Dörfler 	message.AddBool("isVideo", mIsVideo);
169*a10cf76eSAxel Dörfler 	message.AddBool("isInput", isInput);
170*a10cf76eSAxel Dörfler 
171*a10cf76eSAxel Dörfler 	for (int32 i = 0; i < list.CountItems(); i++) {
172*a10cf76eSAxel Dörfler 		dormant_node_info *info = static_cast<dormant_node_info *>(list.ItemAt(i));
173*a10cf76eSAxel Dörfler 		menu->AddItem(new SettingsItem(info, new BMessage(message)));
174*a10cf76eSAxel Dörfler 	}
175*a10cf76eSAxel Dörfler }
176*a10cf76eSAxel Dörfler 
177*a10cf76eSAxel Dörfler void
178*a10cf76eSAxel Dörfler SettingsView::SetDefault(dormant_node_info &info, bool isInput, int32 outputID)
179*a10cf76eSAxel Dörfler {
180*a10cf76eSAxel Dörfler 	BMenu *menu = isInput ? mMenu1 : mMenu2;
181*a10cf76eSAxel Dörfler 
182*a10cf76eSAxel Dörfler 	for (int32 i = 0; i < menu->CountItems(); i++) {
183*a10cf76eSAxel Dörfler 		SettingsItem *item = static_cast<SettingsItem *>(menu->ItemAt(i));
184*a10cf76eSAxel Dörfler 		if(item->mInfo && item->mInfo->addon == info.addon && item->mInfo->flavor_id == info.flavor_id) {
185*a10cf76eSAxel Dörfler 			item->SetMarked(true);
186*a10cf76eSAxel Dörfler 			break;
187*a10cf76eSAxel Dörfler 		}
188*a10cf76eSAxel Dörfler 	}
189*a10cf76eSAxel Dörfler 
190*a10cf76eSAxel Dörfler 	if (!mIsVideo&&!isInput&&outputID>-1) {
191*a10cf76eSAxel Dörfler 		BMenuItem *item;
192*a10cf76eSAxel Dörfler 		while ((item = mMenu3->RemoveItem((int32)0)) != NULL)
193*a10cf76eSAxel Dörfler 			delete item;
194*a10cf76eSAxel Dörfler 		BMediaRoster *roster = BMediaRoster::Roster();
195*a10cf76eSAxel Dörfler 		media_node node;
196*a10cf76eSAxel Dörfler 		media_node_id node_id;
197*a10cf76eSAxel Dörfler 		status_t err;
198*a10cf76eSAxel Dörfler 		if (roster->GetInstancesFor(info.addon, info.flavor_id, &node_id)!=B_OK)
199*a10cf76eSAxel Dörfler 			err = roster->InstantiateDormantNode(info, &node, B_FLAVOR_IS_GLOBAL);
200*a10cf76eSAxel Dörfler 		else
201*a10cf76eSAxel Dörfler 			err = roster->GetNodeFor(node_id, &node);
202*a10cf76eSAxel Dörfler 
203*a10cf76eSAxel Dörfler 		if (err == B_OK) {
204*a10cf76eSAxel Dörfler 			media_input inputs[16];
205*a10cf76eSAxel Dörfler 			int32 inputCount = 16;
206*a10cf76eSAxel Dörfler 			if (roster->GetAllInputsFor(node, inputs, 16, &inputCount)==B_OK) {
207*a10cf76eSAxel Dörfler 				BMessage message(ML_DEFAULTOUTPUT_CHANGE);
208*a10cf76eSAxel Dörfler 
209*a10cf76eSAxel Dörfler 				for (int32 i = 0; i < inputCount; i++) {
210*a10cf76eSAxel Dörfler 					media_input *input = new media_input();
211*a10cf76eSAxel Dörfler 					memcpy(input, &inputs[i], sizeof(*input));
212*a10cf76eSAxel Dörfler 					mMenu3->AddItem(item = new Settings2Item(&info, input, new BMessage(message)));
213*a10cf76eSAxel Dörfler 					if(inputs[i].destination.id == outputID)
214*a10cf76eSAxel Dörfler 						item->SetMarked(true);
215*a10cf76eSAxel Dörfler 				}
216*a10cf76eSAxel Dörfler 			}
217*a10cf76eSAxel Dörfler 		}
218*a10cf76eSAxel Dörfler 	}
219*a10cf76eSAxel Dörfler }
220*a10cf76eSAxel Dörfler 
221*a10cf76eSAxel Dörfler SettingsItem::SettingsItem(dormant_node_info *info, BMessage *message,
222*a10cf76eSAxel Dörfler 			char shortcut, uint32 modifiers)
223*a10cf76eSAxel Dörfler 	: BMenuItem(info->name, message, shortcut, modifiers),
224*a10cf76eSAxel Dörfler 	mInfo(info)
225*a10cf76eSAxel Dörfler {
226*a10cf76eSAxel Dörfler 
227*a10cf76eSAxel Dörfler }
228*a10cf76eSAxel Dörfler 
229*a10cf76eSAxel Dörfler Settings2Item::Settings2Item(dormant_node_info *info, media_input *input, BMessage *message,
230*a10cf76eSAxel Dörfler 			char shortcut, uint32 modifiers)
231*a10cf76eSAxel Dörfler 	: BMenuItem(input->name, message, shortcut, modifiers),
232*a10cf76eSAxel Dörfler 	mInfo(info),
233*a10cf76eSAxel Dörfler 	mInput(input)
234*a10cf76eSAxel Dörfler {
235*a10cf76eSAxel Dörfler 
236*a10cf76eSAxel Dörfler }
237*a10cf76eSAxel Dörfler 
238*a10cf76eSAxel Dörfler Settings2Item::~Settings2Item()
239*a10cf76eSAxel Dörfler {
240*a10cf76eSAxel Dörfler 	delete mInput;
241*a10cf76eSAxel Dörfler }
242*a10cf76eSAxel Dörfler 
243