@@ -228,11 +228,7 @@ namespace nana
228
228
drawer_trigger* realizer{ nullptr };
229
229
method_state mth_state[event_size];
230
230
231
- std::function<void (paint::graphics&)> draw;
232
-
233
- #ifndef NANA_DRAWING_REMOVED
234
231
std::vector<std::pair<std::function<void (paint::graphics&)>, bool >*> draws; // Drawing function and flag for clearable
235
- #endif
236
232
};
237
233
238
234
drawer::drawer ()
@@ -241,10 +237,8 @@ namespace nana
241
237
242
238
drawer::~drawer ()
243
239
{
244
- #ifndef NANA_DRAWING_REMOVED
245
240
for (auto p : data_impl_->draws )
246
241
delete p;
247
- #endif
248
242
249
243
delete data_impl_;
250
244
}
@@ -422,67 +416,56 @@ namespace nana
422
416
return nullptr ;
423
417
}
424
418
425
- std::function<void (paint::graphics&)> drawer::drawing () const
426
- {
427
- return data_impl_->draw ;
428
- }
429
419
430
- void drawer::drawing (std::function<void (paint::graphics&)>&& fn)
420
+ drawing_handle drawer::drawing (std::function<void (paint::graphics&)>&& fn, bool diehard) noexcept
431
421
{
432
- data_impl_->draw = std::move (fn);
433
- }
434
422
435
- #ifndef NANA_DRAWING_REMOVED
436
- void drawer::clear ()
437
- {
438
- for (auto i = data_impl_->draws .cbegin (); i != data_impl_->draws .cend ();)
423
+ std::pair<std::function<void (paint::graphics&)>, bool >* pdw = nullptr ;
424
+ try {
425
+ pdw = new std::pair<std::function<void (paint::graphics&)>, bool >(std::move (fn), diehard);
426
+ data_impl_->draws .emplace_back (pdw);
427
+ return reinterpret_cast <drawing_handle>(pdw);
428
+ }
429
+ catch (...)
439
430
{
440
- if ((*i)->second )
441
- {
442
- delete (*i);
443
- i = data_impl_->draws .erase (i);
444
- }
445
- else
446
- ++i;
431
+ delete pdw;
432
+ return nullptr ;
447
433
}
448
434
}
449
435
450
- void * drawer::draw (std::function< void (paint::graphics&)> && f, bool diehard)
436
+ void drawer::erase (drawing_handle dw) noexcept
451
437
{
452
- if (f )
438
+ for ( auto i = data_impl_-> draws . cbegin (); i != data_impl_-> draws . cend (); ++i )
453
439
{
454
- auto p = new std::pair<std::function<void (paint::graphics&)>, bool >(std::move (f), !diehard);
455
- data_impl_->draws .emplace_back (p);
456
- return p;
440
+ if (reinterpret_cast <drawing_handle>(*i) == dw)
441
+ {
442
+ delete (*i);
443
+ data_impl_->draws .erase (i);
444
+ return ;
445
+ }
457
446
}
458
- return nullptr ;
459
447
}
460
448
461
- void drawer::erase ( void * p )
449
+ void drawer::clear ( )
462
450
{
463
- for (auto i = data_impl_->draws .begin (); i != data_impl_->draws .end (); ++i )
451
+ for (auto i = data_impl_->draws .cbegin (); i != data_impl_->draws .cend ();)
464
452
{
465
- if (*i == p )
453
+ if (!(*i)-> second )
466
454
{
467
455
delete (*i);
468
- data_impl_->draws .erase (i);
469
- return ;
456
+ i = data_impl_->draws .erase (i);
470
457
}
458
+ else
459
+ ++i;
471
460
}
472
461
}
473
- # endif
462
+
474
463
void drawer::_m_effect_bground_subsequent ()
475
464
{
476
- if (data_impl_->draw )
477
- data_impl_->draw (graphics);
478
-
479
- auto & effect = data_impl_->window_handle ->effect ;
480
-
481
- #ifndef NANA_DRAWING_REMOVED
482
465
for (auto * dw : data_impl_->draws )
483
466
dw->first (graphics);
484
- #endif
485
467
468
+ auto & effect = data_impl_->window_handle ->effect ;
486
469
if (effect.bground )
487
470
{
488
471
if (effect.bground_fade_rate >= 0.01 )
0 commit comments