xref: /haiku/src/add-ons/screen_savers/slideshowsaver/SlideShowConfigView.cpp (revision 97dfeb96704e5dbc5bec32ad7b21379d0125e031)
1 /*****************************************************************************/
2 // SlideShowConfigView
3 // Written by Michael Wilber
4 //
5 // SlideShowConfigView.cpp
6 //
7 // This BView based object displays the SlideShowSaver settings options
8 //
9 //
10 // Copyright (C) Haiku
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining a
13 // copy of this software and associated documentation files (the "Software"),
14 // to deal in the Software without restriction, including without limitation
15 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 // and/or sell copies of the Software, and to permit persons to whom the
17 // Software is furnished to do so, subject to the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be included
20 // in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 // DEALINGS IN THE SOFTWARE.
29 /*****************************************************************************/
30 
31 #include <stdio.h>
32 #include <string.h>
33 #include <FilePanel.h>
34 #include "SlideShowConfigView.h"
35 
36 BMessage *
37 delay_msg(int32 option)
38 {
39 	BMessage *pMsg = new BMessage(CHANGE_DELAY);
40 	pMsg->AddInt32("delay", option);
41 	return pMsg;
42 }
43 
44 // ---------------------------------------------------------------
45 // Constructor
46 //
47 // Sets up the view settings
48 //
49 // Preconditions:
50 //
51 // Parameters:
52 //
53 // Postconditions:
54 //
55 // Returns:
56 // ---------------------------------------------------------------
57 SlideShowConfigView::SlideShowConfigView(const BRect &frame, const char *name,
58 	uint32 resize, uint32 flags, LiveSettings *settings)
59 	:	BView(frame, name, resize, flags)
60 {
61 	fSettings = settings;
62 
63 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
64 
65 	BMessage *pMsg;
66 	int32 val;
67 
68 	// Show Caption checkbox
69 	pMsg = new BMessage(CHANGE_CAPTION);
70 	fShowCaption = new BCheckBox(BRect(10, 45, 180, 62),
71 		"Show caption", "Show caption", pMsg);
72 	val = (fSettings->SetGetBool(SAVER_SETTING_CAPTION)) ? 1 : 0;
73 	fShowCaption->SetValue(val);
74 	fShowCaption->SetViewColor(ViewColor());
75 	AddChild(fShowCaption);
76 
77 	// Change Border checkbox
78 	pMsg = new BMessage(CHANGE_BORDER);
79 	fShowBorder = new BCheckBox(BRect(10, 70, 180, 87),
80 		"Show border", "Show border", pMsg);
81 	val = (fSettings->SetGetBool(SAVER_SETTING_BORDER)) ? 1 : 0;
82 	fShowBorder->SetValue(val);
83 	fShowBorder->SetViewColor(ViewColor());
84 	AddChild(fShowBorder);
85 
86 	// Delay Menu
87 	// setup PNG interlace options menu
88 	int32 currentDelay = fSettings->SetGetInt32(SAVER_SETTING_DELAY) / 1000;
89 	fDelayMenu = new BPopUpMenu("Delay menu");
90 	struct DelayItem {
91 		const char *name;
92 		int32 delay;
93 	};
94 	DelayItem items[] = {
95 		{"No delay",	0},
96 		{"1 second",	1},
97 		{"2 seconds",	2},
98 		{"3 seconds",	3},
99 		{"4 seconds",	4},
100 		{"5 seconds",	5},
101 		{"6 seconds",	6},
102 		{"7 seconds",	7},
103 		{"8 seconds",	8},
104 		{"9 seconds",	9},
105 		{"10 seconds",	10},
106 		{"15 seconds",	15},
107 		{"20 seconds",	20},
108 		{"30 seconds",	30},
109 		{"1 minute",	1 * 60},
110 		{"2 minutes",	2 * 60},
111 		{"5 minutes",	5 * 60},
112 		{"10 minutes",	10 * 60},
113 		{"15 minutes",	15 * 60}
114 	};
115 	for (uint32 i = 0; i < sizeof(items) / sizeof(DelayItem); i++) {
116 		BMenuItem *menuItem =
117 			new BMenuItem(items[i].name, delay_msg(items[i].delay));
118 		fDelayMenu->AddItem(menuItem);
119 		if (items[i].delay == currentDelay)
120 			menuItem->SetMarked(true);
121 	}
122 	fDelayMenuField = new BMenuField(BRect(10, 100, 180, 120),
123 		"Delay Menu Field", "Delay:", fDelayMenu);
124 	fDelayMenuField->SetViewColor(ViewColor());
125 	fDelayMenuField->SetDivider(40);
126 	AddChild(fDelayMenuField);
127 
128 	// Choose Image Folder button
129 	pMsg = new BMessage(CHOOSE_DIRECTORY);
130 	fChooseFolder = new BButton(BRect(50, 160, 180, 180),
131 		"Choose Folder", "Choose image folder" B_UTF8_ELLIPSIS, pMsg);
132 	AddChild(fChooseFolder);
133 
134 	// Setup choose folder file panel
135 	pMsg = new BMessage(CHANGE_DIRECTORY);
136 	fFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, (const entry_ref *) NULL,
137 		B_DIRECTORY_NODE, false, pMsg, NULL, true, true);
138 	fFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, "Select");
139 	delete pMsg;
140 }
141 
142 // ---------------------------------------------------------------
143 // Destructor
144 //
145 // Releases the translator settings
146 //
147 // Preconditions:
148 //
149 // Parameters:
150 //
151 // Postconditions:
152 //
153 // Returns:
154 // ---------------------------------------------------------------
155 SlideShowConfigView::~SlideShowConfigView()
156 {
157 	fSettings->Release();
158 
159 	delete fFilePanel;
160 	fFilePanel = NULL;
161 }
162 
163 // ---------------------------------------------------------------
164 // AllAttached
165 //
166 //
167 //
168 // Preconditions:
169 //
170 // Parameters:
171 //
172 // Postconditions:
173 //
174 // Returns:
175 // ---------------------------------------------------------------
176 void
177 SlideShowConfigView::AllAttached()
178 {
179 	BMessenger msgr(this);
180 	fShowCaption->SetTarget(msgr);
181 	fShowBorder->SetTarget(msgr);
182 	fChooseFolder->SetTarget(msgr);
183 	fFilePanel->SetTarget(msgr);
184 
185 	// Set target for menu items
186 	for (int32 i = 0; i < fDelayMenu->CountItems(); i++) {
187 		BMenuItem *item = fDelayMenu->ItemAt(i);
188 		if (item)
189 			item->SetTarget(msgr);
190 	}
191 }
192 
193 // ---------------------------------------------------------------
194 // MessageReceived
195 //
196 // Handles state changes of the RLE setting checkbox
197 //
198 // Preconditions:
199 //
200 // Parameters: message	the actual BMessage that was received
201 //
202 // Postconditions:
203 //
204 // Returns:
205 // ---------------------------------------------------------------
206 void
207 SlideShowConfigView::MessageReceived(BMessage *message)
208 {
209 	bool bNewVal;
210 	switch (message->what) {
211 		case CHANGE_CAPTION:
212 			if (fShowCaption->Value())
213 				bNewVal = true;
214 			else
215 				bNewVal = false;
216 			fSettings->SetGetBool(SAVER_SETTING_CAPTION, &bNewVal);
217 			fSettings->SaveSettings();
218 			break;
219 
220 		case CHANGE_BORDER:
221 			if (fShowBorder->Value())
222 				bNewVal = true;
223 			else
224 				bNewVal = false;
225 			fSettings->SetGetBool(SAVER_SETTING_BORDER, &bNewVal);
226 			fSettings->SaveSettings();
227 			break;
228 
229 		case CHOOSE_DIRECTORY:
230 		{
231 			BString strDirectory;
232 			fSettings->GetString(SAVER_SETTING_DIRECTORY, strDirectory);
233 			BEntry entry(strDirectory.String());
234 			if (entry.InitCheck() != B_OK)
235 				return;
236 			entry_ref ref;
237 			if (entry.GetRef(&ref) != B_OK)
238 				return;
239 			fFilePanel->SetPanelDirectory(&ref);
240 
241 			fFilePanel->Show();
242 			break;
243 		}
244 
245 		case CHANGE_DIRECTORY:
246 		{
247 			entry_ref ref;
248 			if (message->FindRef("refs", &ref) != B_OK)
249 				return;
250 			BEntry entry(&ref, true);
251 			if (entry.InitCheck() != B_OK)
252 				return;
253 			BPath path(&entry);
254 			if (path.InitCheck() != B_OK)
255 				return;
256 			BString strDirectory = path.Path();
257 
258 			fSettings->SetString(SAVER_SETTING_DIRECTORY, strDirectory);
259 			fSettings->SaveSettings();
260 
261 			Invalidate();
262 			break;
263 		}
264 
265 		case CHANGE_DELAY:
266 		{
267 			int32 newVal;
268 			if (message->FindInt32("delay", &newVal) == B_OK) {
269 				newVal *= 1000;
270 				fSettings->SetGetInt32(SAVER_SETTING_DELAY, &newVal);
271 				fSettings->SaveSettings();
272 			}
273 			break;
274 		}
275 
276 		default:
277 			BView::MessageReceived(message);
278 			break;
279 	}
280 }
281 
282 // ---------------------------------------------------------------
283 // Draw
284 //
285 // Draws information about the SlideShowConfigTranslator to this view.
286 //
287 // Preconditions:
288 //
289 // Parameters: area,	not used
290 //
291 // Postconditions:
292 //
293 // Returns:
294 // ---------------------------------------------------------------
295 void
296 SlideShowConfigView::Draw(BRect area)
297 {
298 	SetFont(be_bold_font);
299 	font_height fh;
300 	GetFontHeight(&fh);
301 	float xbold, ybold;
302 	xbold = fh.descent + 1;
303 	ybold = fh.ascent + fh.descent * 2 + fh.leading;
304 
305 	char title[] = "SlideShow Screen Saver";
306 	DrawString(title, BPoint(xbold, ybold));
307 
308 	SetFont(be_plain_font);
309 	font_height plainh;
310 	GetFontHeight(&plainh);
311 	float yplain;
312 	yplain = plainh.ascent + plainh.descent * 2 + plainh.leading;
313 
314 	char writtenby[] = "Written by Michael Wilber";
315 	DrawString(writtenby, BPoint(xbold, yplain * 1 + ybold));
316 
317 	// Draw current folder
318 	BString strFolder;
319 	fSettings->GetString(SAVER_SETTING_DIRECTORY, strFolder);
320 	strFolder.Prepend("Image folder: ");
321 	DrawString(strFolder.String(), BPoint(10, yplain * 9 + ybold));
322 }
323