Skip to content

Commit 8d79df0

Browse files
committed
deprecate drawing
1 parent b98d54f commit 8d79df0

File tree

10 files changed

+56
-86
lines changed

10 files changed

+56
-86
lines changed

include/nana/gui.hpp

-2
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
#include "gui/compact.hpp"
1919
#include "gui/screen.hpp"
2020
#include "gui/widgets/form.hpp"
21-
#ifndef NANA_DRAWING_REMOVED
2221
#include "gui/drawing.hpp"
23-
#endif
2422
#include "gui/msgbox.hpp"
2523
#include "gui/place.hpp"
2624

include/nana/gui/basis.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ namespace nana
2929
struct native_window_handle_impl;
3030
struct native_drawable_impl;
3131
struct event_handle_impl;
32+
struct drawing_handle_impl;
3233
}
3334

35+
using drawing_handle = detail::drawing_handle_impl*;
36+
3437
#ifdef NANA_X11
3538
namespace x11
3639
{

include/nana/gui/detail/drawer.hpp

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* A Drawer Implementation
33
* Nana C++ Library(https://nana.acemind.cn)
4-
* Copyright(C) 2003-2017 Jinhao([email protected])
4+
* Copyright(C) 2003-2024 Jinhao([email protected])
55
*
66
* Distributed under the Boost Software License, Version 1.0.
77
* (See accompanying file LICENSE_1_0.txt or copy at
@@ -152,14 +152,9 @@ namespace nana
152152
void attached(widget&, drawer_trigger&);
153153
drawer_trigger* detached();
154154
public:
155-
std::function<void(paint::graphics&)> drawing() const;
156-
void drawing(std::function<void(paint::graphics&)>&&);
157-
158-
#ifndef NANA_DRAWING_REMOVED
159155
void clear();
160-
void* draw(std::function<void(paint::graphics&)> &&, bool diehard);
161-
void erase(void* diehard);
162-
#endif
156+
drawing_handle drawing(std::function<void(paint::graphics&)>&&, bool diehard) noexcept;
157+
void erase(drawing_handle) noexcept;
163158
private:
164159
void _m_effect_bground_subsequent();
165160
method_state& _m_mth_state(int pos);

include/nana/gui/drawing.hpp

-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
* @file: nana/gui/drawing.hpp
1111
*/
1212

13-
#ifndef NANA_DRAWING_REMOVED
14-
1513
#ifndef NANA_GUI_DRAWING_HPP
1614
#define NANA_GUI_DRAWING_HPP
1715

@@ -55,5 +53,3 @@ namespace nana
5553

5654
#include <nana/pop_ignore_diagnostic>
5755
#endif
58-
59-
#endif //NANA_DRAWING_REMOVED

include/nana/gui/programming_interface.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,8 @@ namespace api
534534
/// the specified window is a text editor window, false otherwise.
535535
bool keyboard_numeric(window, bool padding);
536536

537-
std::function<void(paint::graphics&)> drawing(window);
538-
void drawing(window, std::function<void(paint::graphics&)>);
537+
drawing_handle drawing(window, std::function<void(paint::graphics&)>) noexcept;
538+
void remove_drawing(window, drawing_handle) noexcept;
539539
}//end namespace api
540540

541541
namespace API = api;

include/nana/gui/widgets/widget.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* The fundamental widget class implementation
33
* Nana C++ Library(https://nana.acemind.cn)
4-
* Copyright(C) 2003-2020 Jinhao([email protected])
4+
* Copyright(C) 2003-2024 Jinhao([email protected])
55
*
66
* Distributed under the Boost Software License, Version 1.0.
77
* (See accompanying file LICENSE_1_0.txt or copy at
@@ -128,8 +128,7 @@ namespace nana
128128
operator dummy_bool_type() const;
129129
operator window() const;
130130

131-
std::function<void(paint::graphics&)> drawing() const;
132-
void drawing(std::function<void(paint::graphics&)>);
131+
drawing_handle drawing(std::function<void(paint::graphics&)>);
133132

134133
protected:
135134
std::unique_ptr<::nana::detail::widget_notifier_interface> _m_wdg_notifier();

source/gui/detail/drawer.cpp

+26-43
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,7 @@ namespace nana
228228
drawer_trigger* realizer{ nullptr };
229229
method_state mth_state[event_size];
230230

231-
std::function<void(paint::graphics&)> draw;
232-
233-
#ifndef NANA_DRAWING_REMOVED
234231
std::vector<std::pair<std::function<void(paint::graphics&)>, bool>*> draws; //Drawing function and flag for clearable
235-
#endif
236232
};
237233

238234
drawer::drawer()
@@ -241,10 +237,8 @@ namespace nana
241237

242238
drawer::~drawer()
243239
{
244-
#ifndef NANA_DRAWING_REMOVED
245240
for(auto p : data_impl_->draws)
246241
delete p;
247-
#endif
248242

249243
delete data_impl_;
250244
}
@@ -422,67 +416,56 @@ namespace nana
422416
return nullptr;
423417
}
424418

425-
std::function<void(paint::graphics&)> drawer::drawing() const
426-
{
427-
return data_impl_->draw;
428-
}
429419

430-
void drawer::drawing(std::function<void(paint::graphics&)>&& fn)
420+
drawing_handle drawer::drawing(std::function<void(paint::graphics&)>&& fn, bool diehard) noexcept
431421
{
432-
data_impl_->draw = std::move(fn);
433-
}
434422

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 (...)
439430
{
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;
447433
}
448434
}
449435

450-
void* drawer::draw(std::function<void(paint::graphics&)> && f, bool diehard)
436+
void drawer::erase(drawing_handle dw) noexcept
451437
{
452-
if(f)
438+
for (auto i = data_impl_->draws.cbegin(); i != data_impl_->draws.cend(); ++i)
453439
{
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+
}
457446
}
458-
return nullptr;
459447
}
460448

461-
void drawer::erase(void * p)
449+
void drawer::clear()
462450
{
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();)
464452
{
465-
if (*i == p)
453+
if (!(*i)->second)
466454
{
467455
delete (*i);
468-
data_impl_->draws.erase(i);
469-
return;
456+
i = data_impl_->draws.erase(i);
470457
}
458+
else
459+
++i;
471460
}
472461
}
473-
#endif
462+
474463
void drawer::_m_effect_bground_subsequent()
475464
{
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
482465
for (auto * dw : data_impl_->draws)
483466
dw->first(graphics);
484-
#endif
485467

468+
auto& effect = data_impl_->window_handle->effect;
486469
if (effect.bground)
487470
{
488471
if (effect.bground_fade_rate >= 0.01)

source/gui/drawing.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
* @file: nana/gui/drawing.cpp
1111
*/
1212

13-
#ifndef NANA_DRAWING_REMOVED
1413
#include "detail/basic_window.hpp"
1514
#include <nana/gui/drawing.hpp>
1615
#include <nana/gui/programming_interface.hpp>
@@ -55,42 +54,46 @@ namespace nana
5554

5655
void drawing::draw(const draw_fn_t& f)
5756
{
57+
internal_scope_guard lock;
5858
if(api::empty_window(handle_)) return;
59-
restrict::get_drawer(handle_).draw(draw_fn_t(f), false);
59+
restrict::get_drawer(handle_).drawing(draw_fn_t(f), false);
6060
}
6161

6262
void drawing::draw(draw_fn_t&& f)
6363
{
64+
internal_scope_guard lock;
6465
if(api::empty_window(handle_)) return;
65-
restrict::get_drawer(handle_).draw(std::move(f), false);
66+
restrict::get_drawer(handle_).drawing(std::move(f), false);
6667
}
6768

6869
drawing::diehard_t drawing::draw_diehard(const draw_fn_t& f)
6970
{
71+
internal_scope_guard lock;
7072
if(api::empty_window(handle_)) return nullptr;
71-
return reinterpret_cast<diehard_t>(restrict::get_drawer(handle_).draw(draw_fn_t(f), true));
73+
return reinterpret_cast<diehard_t>(restrict::get_drawer(handle_).drawing(draw_fn_t(f), true));
7274
}
7375

7476
drawing::diehard_t drawing::draw_diehard(draw_fn_t&& f)
7577
{
78+
internal_scope_guard lock;
7679
if(api::empty_window(handle_)) return nullptr;
77-
return reinterpret_cast<diehard_t>(restrict::get_drawer(handle_).draw(std::move(f), true));
80+
return reinterpret_cast<diehard_t>(restrict::get_drawer(handle_).drawing(std::move(f), true));
7881
}
7982

8083
void drawing::erase(diehard_t d)
8184
{
85+
internal_scope_guard lock;
8286
//Fixed by Tumiz
8387
//https://github.com/cnjinhao/nana/issues/153
8488
if(!api::empty_window(handle_))
85-
restrict::get_drawer(handle_).erase(d);
89+
restrict::get_drawer(handle_).erase(reinterpret_cast<drawing_handle>(d));
8690
}
8791

8892
void drawing::clear()
8993
{
94+
internal_scope_guard lock;
9095
if(api::empty_window(handle_)) return;
9196
restrict::get_drawer(handle_).clear();
9297
}
9398
//end class drawing
94-
}//end namespace nana
95-
96-
#endif //NANA_DRAWING_REMOVED
99+
}//end namespace nana

source/gui/programming_interface.cpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -1755,22 +1755,20 @@ namespace api
17551755
#endif
17561756
}
17571757

1758-
std::function<void(paint::graphics&)> drawing(window wd)
1758+
drawing_handle drawing(window wd, std::function<void(paint::graphics&)> fn) noexcept
17591759
{
17601760
internal_scope_guard lock;
17611761
if (!is_window(wd))
1762-
return {};
1762+
return nullptr;
17631763

1764-
return wd->drawer.drawing();
1764+
return wd->drawer.drawing(std::move(fn), false);
17651765
}
17661766

1767-
void drawing(window wd, std::function<void(paint::graphics&)> fn)
1767+
void remove_drawing(window wd, drawing_handle dw) noexcept
17681768
{
17691769
internal_scope_guard lock;
1770-
if (!is_window(wd))
1771-
return;
1772-
1773-
wd->drawer.drawing(std::move(fn));
1770+
if (is_window(wd))
1771+
wd->drawer.erase(dw);
17741772
}
17751773
}//end namespace api
17761774
}//end namespace nana

source/gui/widgets/widget.cpp

+2-7
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,9 @@ namespace nana
293293
return handle();
294294
}
295295

296-
std::function<void(paint::graphics&)> widget::drawing() const
296+
drawing_handle widget::drawing(std::function<void(paint::graphics&)> draw_fn)
297297
{
298-
return api::drawing(handle());
299-
}
300-
301-
void widget::drawing(std::function<void(paint::graphics&)> draw_fn)
302-
{
303-
api::drawing(handle(), std::move(draw_fn));
298+
return api::drawing(handle(), std::move(draw_fn));
304299
}
305300

306301
std::unique_ptr<::nana::detail::widget_notifier_interface> widget::_m_wdg_notifier()

0 commit comments

Comments
 (0)