Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d8352b3

Browse filesBrowse files
committed
Merge branch 'develop-8.1' of https://github.com/livecode/livecode into bugfix-19281
2 parents d766925 + b685511 commit d8352b3
Copy full SHA for d8352b3

File tree

Expand file treeCollapse file tree

7 files changed

+388
-31
lines changed
Filter options
Expand file treeCollapse file tree

7 files changed

+388
-31
lines changed

‎docs/notes/bugfix-19457.md

Copy file name to clipboard
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Prevent crash when deleting selected objects with the backspace key

‎engine/src/globals.cpp

Copy file name to clipboardExpand all lines: engine/src/globals.cpp
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,8 @@ int X_close(void)
12631263

12641264
MCstacks->closeall();
12651265
MCselected->clear(False);
1266-
1266+
MCundos->freestate();
1267+
12671268
MCU_play_stop();
12681269
#ifdef FEATURE_PLATFORM_RECORDER
12691270
if (MCrecorder != nil)

‎engine/src/sellst.cpp

Copy file name to clipboardExpand all lines: engine/src/sellst.cpp
+50-29Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,6 @@ void MCSellist::clear(Boolean message)
156156
delete nodeptr;
157157
}
158158

159-
MCundos->freestate();
160-
161159
if (message && optr)
162160
optr->message(MCM_selected_object_changed);
163161
}
@@ -540,36 +538,59 @@ Boolean MCSellist::cut()
540538

541539
Boolean MCSellist::del()
542540
{
541+
if (!IsDeletable())
542+
return False;
543+
544+
if (nullptr == objects)
545+
return False;
546+
547+
MCundos->freestate();
548+
549+
MCStack *sptr = objects->m_ref->getstack();
550+
while (objects != NULL)
551+
{
552+
MCSelnode *tptr = objects->remove(objects);
553+
if (tptr->m_ref->gettype() >= CT_GROUP)
554+
{
555+
MCControl *cptr = tptr->m_ref.GetAs<MCControl>();
556+
uint2 num = 0;
557+
cptr->getcard()->count(CT_LAYER, CT_UNDEFINED, cptr, num, True);
558+
559+
Ustruct *us = new Ustruct;
560+
us->type = UT_DELETE;
561+
us->ud.layer = num;
562+
MCundos->savestate(cptr, us);
563+
564+
if (cptr->del(true))
565+
{
566+
tptr->m_ref = nil;
567+
}
568+
}
569+
delete tptr;
570+
}
571+
sptr->message(MCM_selected_object_changed);
572+
return True;
573+
}
574+
575+
bool MCSellist::IsDeletable()
576+
{
577+
if (nullptr == objects)
578+
return false;
579+
543580
// Clear all deleted objects first
544581
Clean();
582+
583+
MCSelnode *t_object = objects;
584+
do
585+
{
586+
if (!t_object->m_ref->isdeletable(true))
587+
return false;
588+
589+
t_object = t_object->next();
590+
}
591+
while (t_object != objects);
545592

546-
MCundos->freestate();
547-
if (objects != NULL)
548-
{
549-
MCStack *sptr = objects->m_ref->getstack();
550-
while (objects != NULL)
551-
{
552-
MCSelnode *tptr = objects->remove(objects);
553-
if (tptr->m_ref->gettype() >= CT_GROUP)
554-
{
555-
MCControl *cptr = tptr->m_ref.GetAs<MCControl>();
556-
uint2 num = 0;
557-
cptr->getcard()->count(CT_LAYER, CT_UNDEFINED, cptr, num, True);
558-
if (cptr->del(true))
559-
{
560-
Ustruct *us = new Ustruct;
561-
us->type = UT_DELETE;
562-
us->ud.layer = num;
563-
MCundos->savestate(cptr, us);
564-
tptr->m_ref = nil;
565-
}
566-
}
567-
delete tptr;
568-
}
569-
sptr->message(MCM_selected_object_changed);
570-
return True;
571-
}
572-
return False;
593+
return true;
573594
}
574595

575596
void MCSellist::startmove(int2 x, int2 y, Boolean canclone)

‎engine/src/sellst.h

Copy file name to clipboardExpand all lines: engine/src/sellst.h
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class MCSellist
3838
Boolean dropclone;
3939

4040
void Clean();
41+
bool IsDeletable();
4142

4243
public:
4344

‎tests/lcs/core/interface/delete.livecodescript

Copy file name to clipboardExpand all lines: tests/lcs/core/interface/delete.livecodescript
+56Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,59 @@ on TestDeleteStackWithSubstack
3838

3939
TestAssert "delete stack with substack no crash", true
4040
end TestDeleteStackWithSubstack
41+
42+
on TestDeleteSelectedObjects
43+
create stack
44+
set the defaultStack to the short name of it
45+
46+
create button
47+
create field
48+
select button 1 and field 1
49+
50+
delete
51+
52+
TestAssert "delete selected objects", the number of controls is 0
53+
end TestDeleteSelectedObjects
54+
55+
on TestDeleteSelectedCantDelete
56+
create stack
57+
set the defaultStack to the short name of it
58+
59+
create button
60+
61+
local tGroup
62+
create group
63+
put it into tGroup
64+
65+
create field in tGroup
66+
set the cantDelete of tGroup to true
67+
68+
select button 1
69+
delete
70+
71+
select tGroup
72+
delete
73+
74+
local tThereIsAGroup
75+
put there is a tGroup into tThereIsAGroup
76+
77+
undo
78+
79+
TestAssert "can't delete group with cantDelete true", tThereIsAGroup
80+
TestAssert "undo previous delete after failed delete", there is a button 1
81+
end TestDeleteSelectedCantDelete
82+
83+
on TestUndoAfterDeleteNothing
84+
create stack
85+
set the defaultStack to the short name of it
86+
87+
create button
88+
select button 1
89+
delete
90+
91+
select empty
92+
delete
93+
undo
94+
95+
TestAssert "undo previous delete after failed delete", there is a button 1
96+
end TestUndoAfterDeleteNothing

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.