1 #include <OS.h> 2 #include <Application.h> 3 #include <Window.h> 4 #include <View.h> 5 #include <Region.h> 6 #include <Rect.h> 7 #include <String.h> 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 #include "MyView.h" 13 #include "Layer.h" 14 #include "WinBorder.h" 15 16 #define ApplicationSignature "application/x-vnd.generic-SkeletonApplication" 17 18 BWindow *wind = NULL; 19 20 class clsApp 21 : 22 public BApplication 23 { 24 public: 25 clsApp(); 26 ~clsApp(); 27 virtual void ReadyToRun(); 28 }; 29 30 class clsMainWindow 31 : 32 public BWindow 33 { 34 public: 35 clsMainWindow(const char *uWindowTitle); 36 ~clsMainWindow(); 37 38 virtual bool QuitRequested(); 39 void AddWindow(BRect frame, const char* name); 40 void test2(); 41 void test1(); 42 private: 43 MyView *fView; 44 }; 45 46 clsApp::clsApp() : BApplication(ApplicationSignature) 47 { 48 srand(real_time_clock_usecs()); 49 } 50 51 clsApp::~clsApp() 52 { 53 } 54 55 void clsApp::ReadyToRun() 56 { 57 } 58 59 60 clsMainWindow::clsMainWindow(const char *uWindowTitle) 61 : 62 BWindow( 63 BRect(50, 50, 800, 650), 64 uWindowTitle, 65 B_TITLED_WINDOW_LOOK, 66 B_NORMAL_WINDOW_FEEL, 67 0 ) 68 { 69 wind = this; 70 fView = new MyView(Bounds(), "emu", B_FOLLOW_ALL, B_WILL_DRAW); 71 AddChild(fView); 72 fView->MakeFocus(true); 73 } 74 75 clsMainWindow::~clsMainWindow() 76 { 77 } 78 79 bool clsMainWindow::QuitRequested() 80 { 81 be_app->PostMessage(B_QUIT_REQUESTED); 82 return BWindow::QuitRequested(); 83 } 84 85 86 // AddWindow 87 void 88 clsMainWindow::AddWindow(BRect frame, const char* name) 89 { 90 Layer* topLayer = fView->topLayer; 91 92 WinBorder* window = new WinBorder(frame, name, B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, 93 (rgb_color){ 255, 203, 0, 255 }); 94 topLayer->AddLayer(window); 95 96 // add a coupld children 97 frame.OffsetTo(B_ORIGIN); 98 frame.InsetBy(5.0, 5.0); 99 if (frame.IsValid()) { 100 Layer* layer1 = new Layer(frame, "View 1", B_FOLLOW_ALL, 101 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 180, 180, 180, 255 }); 102 103 frame.OffsetTo(B_ORIGIN); 104 frame.InsetBy(15.0, 15.0); 105 if (frame.IsValid()) { 106 107 BRect f = frame; 108 f.bottom = f.top + f.Height() / 3 - 3; 109 f.right = f.left + f.Width() / 3 - 3; 110 111 // top row of views 112 Layer* layer; 113 layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP, 114 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 115 layer1->AddLayer(layer); 116 117 f.OffsetBy(f.Width() + 6, 0); 118 119 layer = new Layer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, 120 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 121 layer1->AddLayer(layer); 122 123 f.OffsetBy(f.Width() + 6, 0); 124 125 layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP, 126 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 127 layer1->AddLayer(layer); 128 129 // middle row of views 130 f = frame; 131 f.bottom = f.top + f.Height() / 3 - 3; 132 f.right = f.left + f.Width() / 3 - 3; 133 f.OffsetBy(0, f.Height() + 6); 134 135 layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM, 136 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 137 layer1->AddLayer(layer); 138 139 f.OffsetBy(f.Width() + 6, 0); 140 141 layer = new Layer(f, "View", B_FOLLOW_ALL, 142 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 143 layer1->AddLayer(layer); 144 145 f.OffsetBy(f.Width() + 6, 0); 146 147 layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM, 148 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 149 layer1->AddLayer(layer); 150 151 // bottom row of views 152 f = frame; 153 f.bottom = f.top + f.Height() / 3 - 3; 154 f.right = f.left + f.Width() / 3 - 3; 155 f.OffsetBy(0, 2 * f.Height() + 12); 156 157 layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 158 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 159 layer1->AddLayer(layer); 160 161 f.OffsetBy(f.Width() + 6, 0); 162 163 layer = new Layer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, 164 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 165 layer1->AddLayer(layer); 166 167 f.OffsetBy(f.Width() + 6, 0); 168 169 layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, 170 B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); 171 layer1->AddLayer(layer); 172 } 173 174 window->AddLayer(layer1); 175 } 176 177 BRegion temp; 178 window->GetWantedRegion(temp); 179 topLayer->RebuildVisibleRegions(temp, window); 180 } 181 182 // test2 183 void 184 clsMainWindow::test2() 185 { 186 BRect frame(20, 20, 330, 230); 187 for (int32 i = 0; i < 20; i++) { 188 BString name("Window "); 189 frame.OffsetBy(20, 15); 190 name << i + 1; 191 AddWindow(frame, name.String()); 192 } 193 /* 194 frame.Set(10, 80, 320, 290); 195 for (int32 i = 20; i < 40; i++) { 196 BString name("Window "); 197 frame.OffsetBy(20, 15); 198 name << i + 1; 199 AddWindow(frame, name.String()); 200 } 201 202 frame.Set(20, 140, 330, 230); 203 for (int32 i = 40; i < 60; i++) { 204 BString name("Window "); 205 frame.OffsetBy(20, 15); 206 name << i + 1; 207 AddWindow(frame, name.String()); 208 } 209 210 frame.Set(20, 200, 330, 230); 211 for (int32 i = 60; i < 80; i++) { 212 BString name("Window "); 213 frame.OffsetBy(20, 15); 214 name << i + 1; 215 AddWindow(frame, name.String()); 216 } 217 218 frame.Set(20, 260, 330, 230); 219 // 99 windows are ok, the 100th looper does not run anymore, 220 // I guess I'm hitting a BeOS limit (max loopers per app?) 221 for (int32 i = 80; i < 99; i++) { 222 BString name("Window "); 223 frame.OffsetBy(20, 15); 224 name << i + 1; 225 AddWindow(frame, name.String()); 226 }*/ 227 228 fView->RequestRedraw(); 229 } 230 231 void clsMainWindow::test1() 232 { 233 Layer *topLayer = fView->topLayer; 234 235 rgb_color c; 236 237 c.red = rand()/256; 238 c.green = rand()/256; 239 c.blue = rand()/256; 240 // Layer *lay1 241 // = new Layer(BRect(20,20,300,220), "lay1", B_FOLLOW_NONE, 0, c); 242 // = new WinBorder(BRect(20,20,300,220), "lay1", B_FOLLOW_NONE, 0, c); 243 // topLayer->AddLayer(lay1); 244 // ------ 245 WinBorder *wb1 = new WinBorder(BRect(20,20,300,220), "wb1", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 246 topLayer->AddLayer(wb1); 247 // same size as wb1 248 Layer *lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 249 wb1->AddLayer(lay1); 250 // ------ 251 c.red = rand()/256; 252 c.green = rand()/256; 253 c.blue = rand()/256; 254 Layer *lay2 = new Layer(BRect(20,20,150,150), "lay2", 255 B_FOLLOW_NONE, 256 B_FULL_UPDATE_ON_RESIZE, c); 257 lay1->AddLayer(lay2); 258 259 c.red = rand()/256; 260 c.green = rand()/256; 261 c.blue = rand()/256; 262 Layer *lay3 = new Layer(BRect(20,20,100,100), "lay3", 263 B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 264 0, c); 265 lay2->AddLayer(lay3); 266 267 c.red = rand()/256; 268 c.green = rand()/256; 269 c.blue = rand()/256; 270 Layer *lay12 = new Layer(BRect(170,20,290,150), "lay12", 271 B_FOLLOW_LEFT | B_FOLLOW_TOP, 272 // B_FOLLOW_NONE, 273 0, c); 274 lay1->AddLayer(lay12); 275 276 c.red = rand()/256; 277 c.green = rand()/256; 278 c.blue = rand()/256; 279 Layer *lay13 = new Layer(BRect(20,20,100,100), "lay13", 280 // B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 281 B_FOLLOW_RIGHT | B_FOLLOW_TOP, 282 // B_FOLLOW_LEFT | B_FOLLOW_V_CENTER, 283 // B_FOLLOW_H_CENTER | B_FOLLOW_TOP, 284 0, c); 285 lay12->AddLayer(lay13); 286 287 c.red = rand()/256; 288 c.green = rand()/256; 289 c.blue = rand()/256; 290 Layer *lay102 = new Layer(BRect(200,20,420,250), "lay102", 291 // B_FOLLOW_NONE, 292 B_FOLLOW_TOP_BOTTOM, 293 // B_FULL_UPDATE_ON_RESIZE, c); 294 0, c); 295 lay1->AddLayer(lay102); 296 297 c.red = rand()/256; 298 c.green = rand()/256; 299 c.blue = rand()/256; 300 Layer *lay103 = new Layer(BRect(0,0,100,50), "lay103", 301 B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 302 // B_FOLLOW_LEFT | B_FOLLOW_TOP, 303 0, c); 304 lay102->AddLayer(lay103); 305 306 c.red = rand()/256; 307 c.green = rand()/256; 308 c.blue = rand()/256; 309 Layer *lay104 = new Layer(BRect(0,51,100,130), "lay104", 310 // B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 311 B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, 312 0, c); 313 lay102->AddLayer(lay104); 314 315 c.red = rand()/256; 316 c.green = rand()/256; 317 c.blue = rand()/256; 318 Layer *lay106 = new Layer(BRect(0,140,100, 200), "lay104", 319 // B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 320 B_FOLLOW_RIGHT | B_FOLLOW_TOP, 321 0, c); 322 lay102->AddLayer(lay106); 323 324 c.red = rand()/256; 325 c.green = rand()/256; 326 c.blue = rand()/256; 327 Layer *lay105 = new Layer(BRect(105,51,150,130), "lay104", 328 // B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, 329 B_FOLLOW_H_CENTER | B_FOLLOW_BOTTOM, 330 0, c); 331 lay102->AddLayer(lay105); 332 333 //--------- 334 c.red = rand()/256; 335 c.green = rand()/256; 336 c.blue = rand()/256; 337 WinBorder *wb2 = new WinBorder(BRect(280,120,600,420), "wb2", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 338 topLayer->AddLayer(wb2); 339 Layer *lay21 = new Layer(wb2->Bounds().OffsetToCopy(0,0), "lay21", B_FOLLOW_NONE, 0, c); 340 wb2->AddLayer(lay21); 341 342 c.red = rand()/256; 343 c.green = rand()/256; 344 c.blue = rand()/256; 345 Layer *lay22 = new Layer(BRect(20,20,150,150), "lay22", 346 B_FOLLOW_NONE, 347 0, c); 348 lay21->AddLayer(lay22); 349 350 351 WinBorder *wb3 = new WinBorder(BRect(20,20,300,220), "wb3", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 352 topLayer->AddLayer(wb3); 353 // same size as wb1 354 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 355 wb3->AddLayer(lay1); 356 357 WinBorder *wb4 = new WinBorder(BRect(20,20,300,220), "wb4", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 358 topLayer->AddLayer(wb4); 359 // same size as wb1 360 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 361 wb4->AddLayer(lay1); 362 363 WinBorder *wb5 = new WinBorder(BRect(20,20,300,220), "wb5", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 364 topLayer->AddLayer(wb5); 365 // same size as wb1 366 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 367 wb5->AddLayer(lay1); 368 369 WinBorder *wb6 = new WinBorder(BRect(20,20,300,220), "wb6", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 370 topLayer->AddLayer(wb6); 371 // same size as wb1 372 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 373 wb6->AddLayer(lay1); 374 375 WinBorder *wb7 = new WinBorder(BRect(20,20,300,220), "wb7", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 376 topLayer->AddLayer(wb7); 377 // same size as wb1 378 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 379 wb7->AddLayer(lay1); 380 381 WinBorder *wb8 = new WinBorder(BRect(20,20,300,220), "wb8", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 382 topLayer->AddLayer(wb8); 383 // same size as wb1 384 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 385 wb8->AddLayer(lay1); 386 387 WinBorder *wb9 = new WinBorder(BRect(20,20,300,220), "wb9", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 388 topLayer->AddLayer(wb9); 389 // same size as wb1 390 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 391 wb9->AddLayer(lay1); 392 393 WinBorder *wb10 = new WinBorder(BRect(20,20,300,220), "wb10", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); 394 topLayer->AddLayer(wb10); 395 // same size as wb1 396 lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); 397 wb10->AddLayer(lay1); 398 399 //--------- 400 401 BRegion temp; 402 wb1->GetWantedRegion(temp); 403 topLayer->RebuildVisibleRegions(temp, wb1); 404 405 wb2->GetWantedRegion(temp); 406 topLayer->RebuildVisibleRegions(temp, wb2); 407 408 wb3->GetWantedRegion(temp); 409 topLayer->RebuildVisibleRegions(temp, wb3); 410 411 wb4->GetWantedRegion(temp); 412 topLayer->RebuildVisibleRegions(temp, wb4); 413 414 wb5->GetWantedRegion(temp); 415 topLayer->RebuildVisibleRegions(temp, wb5); 416 417 wb6->GetWantedRegion(temp); 418 topLayer->RebuildVisibleRegions(temp, wb6); 419 420 wb7->GetWantedRegion(temp); 421 topLayer->RebuildVisibleRegions(temp, wb7); 422 423 wb8->GetWantedRegion(temp); 424 topLayer->RebuildVisibleRegions(temp, wb8); 425 426 wb9->GetWantedRegion(temp); 427 topLayer->RebuildVisibleRegions(temp, wb9); 428 429 wb10->GetWantedRegion(temp); 430 topLayer->RebuildVisibleRegions(temp, wb10); 431 432 433 fView->RequestRedraw(); 434 435 snooze(1000000); 436 437 wb1->Hide(); 438 439 snooze(1000000); 440 441 wb1->Show(); 442 443 /* 444 445 snooze(2000000); 446 447 lay2->MoveBy(25,35); 448 449 snooze(2000000); 450 451 lay2->ResizeBy(45,55); 452 453 snooze(2000000); 454 455 lay2->ResizeBy(-45, -55); 456 457 458 snooze(2000000); 459 460 lay1->ScrollBy(0,50); 461 462 snooze(2000000); 463 464 lay2->Hide(); 465 466 snooze(2000000); 467 468 lay2->Show(); 469 470 snooze(2000000); 471 472 lay1->Invalidate(BRect(0,0,500,500)); 473 */ 474 } 475 476 int main() 477 { 478 new clsApp(); 479 clsMainWindow *win = new clsMainWindow("clipping"); 480 win->Show(); 481 482 win->test2(); 483 484 be_app->Run(); 485 delete be_app; 486 return 0; 487 } 488