Skip to content

Commit 09bbc57

Browse files
committed
[[ Bug 15565 ]] Fixed "create card ... in ..."
1 parent 8a65ac7 commit 09bbc57

6 files changed

Lines changed: 66 additions & 23 deletions

File tree

engine/src/card.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,13 +1406,16 @@ void MCCard::kfocusset(MCControl *target)
14061406
}
14071407
}
14081408

1409-
MCCard *MCCard::clone(Boolean attach, Boolean controls)
1409+
MCCard *MCCard::clone(Boolean attach, Boolean controls, MCStack *p_parent)
14101410
{
14111411
clean();
14121412
MCCard *newcptr = new (nothrow) MCCard(*this);
1413-
newcptr->parent = MCdefaultstackptr;
1413+
if (p_parent == nullptr)
1414+
{
1415+
p_parent = MCdefaultstackptr;
1416+
}
1417+
newcptr->parent = p_parent;
14141418
Boolean diffstack = getstack() != MCdefaultstackptr;
1415-
14161419
if (controls)
14171420
{
14181421
if (objptrs != NULL)

engine/src/card.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class MCCard : public MCObject, public MCMixinObjectHandle<MCCard>
136136
IO_stat loadobjects(IO_handle stream, uint32_t version);
137137

138138
void kfocusset(MCControl *target);
139-
MCCard *clone(Boolean attach, Boolean controls);
139+
MCCard *clone(Boolean attach, Boolean controls, MCStack *p_parent=nullptr);
140140
void clonedata(MCCard *source);
141141
void replacedata(MCStack *source);
142142
Exec_stat relayer(MCControl *optr, uint2 newlayer);

engine/src/cmdsc.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,20 @@ void MCCreate::exec_ctxt(MCExecContext& ctxt)
614614
}
615615
break;
616616
case CT_CARD:
617-
MCInterfaceExecCreateCard(ctxt, *t_new_name, visible == False);
617+
{
618+
MCObject *parent = nil;
619+
if (container != nil)
620+
{
621+
uint32_t parid;
622+
623+
if (!container->getobj(ctxt, parent, parid, True) || parent->gettype() != CT_STACK)
624+
{
625+
ctxt . LegacyThrow(EE_CREATE_BADBGORCARD);
626+
return;
627+
}
628+
}
629+
MCInterfaceExecCreateCard(ctxt, *t_new_name, static_cast<MCStack *>(parent), visible==False);
630+
}
618631
break;
619632
case CT_WIDGET:
620633
{

engine/src/exec-interface.cpp

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ MC_EXEC_DEFINE_EXEC_METHOD(Interface, PopupStack, 3)
226226
MC_EXEC_DEFINE_EXEC_METHOD(Interface, PopupStackByName, 3)
227227
MC_EXEC_DEFINE_EXEC_METHOD(Interface, CreateStack, 3)
228228
MC_EXEC_DEFINE_EXEC_METHOD(Interface, CreateStackWithGroup, 3)
229-
MC_EXEC_DEFINE_EXEC_METHOD(Interface, CreateCard, 2)
229+
MC_EXEC_DEFINE_EXEC_METHOD(Interface, CreateCard, 3)
230230
MC_EXEC_DEFINE_EXEC_METHOD(Interface, CreateControl, 4)
231231
MC_EXEC_DEFINE_EXEC_METHOD(Interface, Clone, 3)
232232
MC_EXEC_DEFINE_EXEC_METHOD(Interface, Find, 3)
@@ -3272,23 +3272,31 @@ void MCInterfaceExecCreateStackWithGroup(MCExecContext& ctxt, MCGroup *p_group_t
32723272
MCInterfaceExecCreateStack(ctxt, p_group_to_copy, p_new_name, p_force_invisible, true);
32733273
}
32743274

3275-
void MCInterfaceExecCreateCard(MCExecContext& ctxt, MCStringRef p_new_name, bool p_force_invisible)
3276-
{
3277-
if (MCdefaultstackptr->islocked())
3278-
{
3279-
ctxt . LegacyThrow(EE_CREATE_LOCKED);
3280-
return;
3281-
}
3282-
3283-
MCdefaultstackptr->stopedit();
3284-
MCObject *t_object = MCtemplatecard->clone(True, False);
32853275

3286-
if (p_new_name != nil)
3287-
t_object->setstringprop(ctxt, 0, P_NAME, False, p_new_name);
3288-
3289-
MCAutoValueRef t_id;
3290-
t_object->names(P_LONG_ID, &t_id);
3291-
ctxt . SetItToValue(*t_id);
3276+
void MCInterfaceExecCreateCard(MCExecContext& ctxt, MCStringRef p_new_name, MCStack *p_parent, bool p_force_invisible)
3277+
{
3278+
if (p_parent == nullptr)
3279+
{
3280+
p_parent = MCdefaultstackptr;
3281+
}
3282+
3283+
if (p_parent->islocked())
3284+
{
3285+
ctxt . LegacyThrow(EE_CREATE_LOCKED);
3286+
return;
3287+
}
3288+
3289+
p_parent->stopedit();
3290+
MCObject *t_object = MCtemplatecard->clone(True, False,p_parent);
3291+
3292+
if (p_new_name != nil)
3293+
{
3294+
t_object->setstringprop(ctxt, 0, P_NAME, False, p_new_name);
3295+
}
3296+
3297+
MCAutoValueRef t_id;
3298+
t_object->names(P_LONG_ID, &t_id);
3299+
ctxt . SetItToValue(*t_id);
32923300
}
32933301

32943302
MCControl* MCInterfaceExecCreateControlGetObject(MCExecContext& ctxt, int p_type, MCGroup *&r_parent)

engine/src/exec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3119,7 +3119,7 @@ void MCInterfaceExecPopupStackByName(MCExecContext& ctxt, MCNameRef p_target, MC
31193119
void MCInterfaceExecCreateStack(MCExecContext& ctxt, MCStack *p_owner, MCStringRef p_new_name, bool p_force_invisible);
31203120
void MCInterfaceExecCreateScriptOnlyStack(MCExecContext& ctxt, MCStringRef p_new_name);
31213121
void MCInterfaceExecCreateStackWithGroup(MCExecContext& ctxt, MCGroup *p_group_to_copy, MCStringRef p_new_name, bool p_force_invisible);
3122-
void MCInterfaceExecCreateCard(MCExecContext& ctxt, MCStringRef p_new_name, bool p_force_invisible);
3122+
void MCInterfaceExecCreateCard(MCExecContext& ctxt, MCStringRef p_new_name, MCStack *p_parent, bool p_force_invisible);
31233123
void MCInterfaceExecCreateControl(MCExecContext& ctxt, MCStringRef p_new_name, int p_type, MCGroup *p_container, bool p_force_invisible);
31243124
void MCInterfaceExecCreateWidget(MCExecContext& ctxt, MCStringRef p_new_name, MCNameRef p_kind, MCGroup *p_container, bool p_force_invisible);
31253125

tests/lcs/core/interface/stack.livecodescript

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,22 @@ on TestStackNameProp
2828
TestAssert "Variable used to set stack name is unmodified", tVar is "Test 1,2,3"
2929
end TestStackNameProp
3030

31+
on TestCreateControlInCard
32+
create stack "Temp"
33+
34+
create card "Other"
35+
36+
create button "Test" in card "Other"
37+
38+
TestAssert "test if the button was created in the correct card" , there is a button "Test" of card "Other"
39+
end TestCreateControlInCard
40+
41+
on TestCreateControlInStack
42+
create stack "Temp"
43+
44+
create card "Other" in stack "Temp"
45+
46+
put there is a card "Other"
47+
48+
TestAssert "test if the card was created in the correct stack" , there is a card "Other" of stack "Temp"
49+
end TestCreateControlInStack

0 commit comments

Comments
 (0)