This adds some resource-ownership tracking.
Time to start spreading this out, more.
This commit is contained in:
@ -390,11 +390,11 @@ FltkPlatform::FltkResourceFactory::createLabelButtonResource (const char
|
||||
}
|
||||
|
||||
core::ui::ComplexButtonResource *
|
||||
FltkPlatform::FltkResourceFactory::createComplexButtonResource (core::Widget
|
||||
*widget,
|
||||
FltkPlatform::FltkResourceFactory::createComplexButtonResource (std::unique_ptr< core::Widget
|
||||
> widget,
|
||||
bool relief)
|
||||
{
|
||||
return new ui::FltkComplexButtonResource (platform, widget, relief);
|
||||
return new ui::FltkComplexButtonResource (platform, std::move( widget ), relief);
|
||||
}
|
||||
|
||||
core::ui::ListResource *
|
||||
|
||||
@ -104,7 +104,7 @@ private:
|
||||
core::ui::LabelButtonResource *createLabelButtonResource (const char
|
||||
*label);
|
||||
core::ui::ComplexButtonResource *
|
||||
createComplexButtonResource (core::Widget *widget, bool relief);
|
||||
createComplexButtonResource (std::unique_ptr< core::Widget > widget, bool relief);
|
||||
core::ui::ListResource *
|
||||
createListResource (core::ui::ListResource::SelectionMode selectionMode,
|
||||
int rows);
|
||||
|
||||
@ -727,14 +727,14 @@ void FltkLabelButtonResource::setLabel (const char *label)
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
FltkComplexButtonResource::FltkComplexButtonResource (FltkPlatform *platform,
|
||||
dw::core::Widget
|
||||
*widget, bool relief):
|
||||
std::unique_ptr< dw::core::Widget
|
||||
> widget, bool relief):
|
||||
FltkSpecificResource <dw::core::ui::ComplexButtonResource> (platform)
|
||||
{
|
||||
flatView = topView = NULL;
|
||||
this->relief = relief;
|
||||
FltkResource::init (platform);
|
||||
ComplexButtonResource::init (widget);
|
||||
ComplexButtonResource::init (std::move( widget ));
|
||||
}
|
||||
|
||||
FltkComplexButtonResource::~FltkComplexButtonResource ()
|
||||
|
||||
@ -5,6 +5,8 @@
|
||||
# error Do not include this file directly, use "fltkcore.hh" instead.
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <FL/Fl_Button.H>
|
||||
#include <FL/Fl_Menu.H>
|
||||
#include <FL/Fl_Text_Buffer.H>
|
||||
@ -284,7 +286,7 @@ protected:
|
||||
Fl_Widget *createNewWidget (core::Allocation *allocation);
|
||||
|
||||
public:
|
||||
FltkComplexButtonResource (FltkPlatform *platform, dw::core::Widget *widget,
|
||||
FltkComplexButtonResource (FltkPlatform *platform, std::unique_ptr< dw::core::Widget > widget,
|
||||
bool relief);
|
||||
~FltkComplexButtonResource ();
|
||||
};
|
||||
|
||||
34
dw/layout.cc
34
dw/layout.cc
@ -327,10 +327,8 @@ Layout::~Layout ()
|
||||
if (bgImage)
|
||||
bgImage->unref ();
|
||||
if (topLevel) {
|
||||
detachWidget (topLevel);
|
||||
Widget *w = topLevel;
|
||||
topLevel = NULL;
|
||||
delete w;
|
||||
detachWidget (topLevel.get());
|
||||
topLevel.reset();
|
||||
}
|
||||
|
||||
delete queueResizeList;
|
||||
@ -364,7 +362,7 @@ void Layout::detachWidget (Widget *widget)
|
||||
it->unref ();
|
||||
}
|
||||
|
||||
void Layout::addWidget (Widget *widget)
|
||||
void Layout::addWidget (std::unique_ptr< Widget > widget)
|
||||
{
|
||||
if (topLevel) {
|
||||
MSG_WARN("widget already set\n");
|
||||
@ -374,20 +372,20 @@ void Layout::addWidget (Widget *widget)
|
||||
// The toplevel widget always establishes a stacking context. It could
|
||||
// already be set in Widget::setStyle().
|
||||
if (widget->stackingContextMgr == NULL && IMPL_POS) {
|
||||
widget->stackingContextMgr = new StackingContextMgr (widget);
|
||||
DBG_OBJ_ASSOC (widget, widget->stackingContextMgr);
|
||||
widget->stackingContextWidget = widget;
|
||||
widget->stackingContextMgr = new StackingContextMgr (widget.get());
|
||||
DBG_OBJ_ASSOC (widget.get(), widget->stackingContextMgr);
|
||||
widget->stackingContextWidget = widget.get();
|
||||
}
|
||||
|
||||
topLevel = widget;
|
||||
widget->layout = this;
|
||||
widget->container = NULL;
|
||||
DBG_OBJ_SET_PTR_O (widget, "container", widget->container);
|
||||
topLevel = std::move( widget );
|
||||
topLevel->layout = this;
|
||||
topLevel->container = NULL;
|
||||
DBG_OBJ_SET_PTR_O (topLevel.get(), "container", topLevel->container);
|
||||
|
||||
queueResizeList->clear ();
|
||||
widget->notifySetAsTopLevel ();
|
||||
topLevel->notifySetAsTopLevel ();
|
||||
|
||||
findtextState.setWidget (widget);
|
||||
findtextState.setWidget (topLevel.get());
|
||||
|
||||
canvasHeightGreater = false;
|
||||
DBG_OBJ_SET_SYM ("canvasHeightGreater",
|
||||
@ -426,18 +424,16 @@ void Layout::removeWidget ()
|
||||
updateCursor ();
|
||||
}
|
||||
|
||||
void Layout::setWidget (Widget *widget)
|
||||
void Layout::setWidget (std::unique_ptr< Widget >widget)
|
||||
{
|
||||
DBG_OBJ_ASSOC_CHILD (widget);
|
||||
|
||||
widgetAtPoint = NULL;
|
||||
if (topLevel) {
|
||||
Widget *w = topLevel;
|
||||
topLevel = NULL;
|
||||
delete w;
|
||||
topLevel.reset();
|
||||
}
|
||||
textZone->zoneFree ();
|
||||
addWidget (widget);
|
||||
addWidget (std::move(widget));
|
||||
|
||||
updateCursor ();
|
||||
|
||||
|
||||
@ -158,7 +158,8 @@ private:
|
||||
|
||||
Platform *platform;
|
||||
View *view;
|
||||
Widget *topLevel, *widgetAtPoint;
|
||||
std::unique_ptr< Widget > topLevel;
|
||||
Widget *widgetAtPoint;
|
||||
lout::container::typed::Vector<Widget> *queueResizeList;
|
||||
|
||||
/* The state, which must be projected into the view. */
|
||||
@ -281,8 +282,8 @@ public:
|
||||
|
||||
lout::misc::ZoneAllocator *textZone;
|
||||
|
||||
void addWidget (Widget *widget);
|
||||
void setWidget (Widget *widget);
|
||||
void addWidget (std::unique_ptr< Widget > widget);
|
||||
void setWidget (std::unique_ptr< Widget > widget);
|
||||
|
||||
void attachView (View *view);
|
||||
void detachView (View *view);
|
||||
|
||||
6
dw/ui.cc
6
dw/ui.cc
@ -340,15 +340,15 @@ ComplexButtonResource::ComplexButtonResource ()
|
||||
click_x = click_y = -1;
|
||||
}
|
||||
|
||||
void ComplexButtonResource::init (Widget *widget)
|
||||
void ComplexButtonResource::init (std::unique_ptr< Widget > widget)
|
||||
{
|
||||
childWidget = widget;
|
||||
childWidget = widget.get();
|
||||
|
||||
/* FIXME: Buttons should not need a full Layout */
|
||||
layout = new Layout (createPlatform (), false);
|
||||
setLayout (layout);
|
||||
DBG_OBJ_ASSOC_CHILD (layout);
|
||||
layout->setWidget (widget);
|
||||
layout->setWidget (std::move( widget ));
|
||||
layout->connect (&layoutReceiver);
|
||||
|
||||
if (getEmbed ())
|
||||
|
||||
6
dw/ui.hh
6
dw/ui.hh
@ -5,6 +5,8 @@
|
||||
# error Do not include this file directly, use "core.hh" instead.
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace dw {
|
||||
namespace core {
|
||||
|
||||
@ -433,7 +435,7 @@ protected:
|
||||
virtual int reliefXThickness () = 0;
|
||||
virtual int reliefYThickness () = 0;
|
||||
|
||||
void init (Widget *widget);
|
||||
void init (std::unique_ptr< Widget > widget);
|
||||
|
||||
public:
|
||||
ComplexButtonResource ();
|
||||
@ -582,7 +584,7 @@ class ResourceFactory: public lout::object::Object
|
||||
public:
|
||||
virtual LabelButtonResource *createLabelButtonResource (const char *label)
|
||||
= 0;
|
||||
virtual ComplexButtonResource *createComplexButtonResource (Widget *widget,
|
||||
virtual ComplexButtonResource *createComplexButtonResource (std::unique_ptr< Widget > widget,
|
||||
bool relief)
|
||||
= 0;
|
||||
virtual ListResource *createListResource (ListResource::SelectionMode
|
||||
|
||||
@ -214,7 +214,7 @@ void Widget::drawInterruption (View *view, Rectangle *area,
|
||||
DrawingContext *context)
|
||||
{
|
||||
Rectangle thisArea;
|
||||
if (intersects (layout->topLevel, context->getToplevelArea (), &thisArea))
|
||||
if (intersects (layout->topLevel.get(), context->getToplevelArea (), &thisArea))
|
||||
draw (view, &thisArea, context);
|
||||
|
||||
context->addWidgetProcessedAsInterruption (this);
|
||||
|
||||
Reference in New Issue
Block a user