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