Skip to content

Commit 9f0524f

Browse files
author
Sanjana Mali
committed
Fixes #945 - Reselect strands after assigning properties
1 parent 245ac12 commit 9f0524f

File tree

3 files changed

+71
-14
lines changed

3 files changed

+71
-14
lines changed

lib/src/actions/actions.dart

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ mixin UndoableAction implements DesignChangingAction {
7979
/// Fast actions are not dispatched to normal store for optimization
8080
abstract class FastAction extends Action {}
8181

82+
abstract class ChangePropertiesAction extends Action {}
83+
8284
// Wrap an UndoableAction in a SkipUndo in order to apply it, but skip its effect on the undo/redo stacks.
8385
abstract class SkipUndo with BuiltJsonSerializable implements Action, Built<SkipUndo, SkipUndoBuilder> {
8486
UndoableAction get undoable_action;
@@ -383,7 +385,7 @@ abstract class SelectModesSet
383385
// used to set or remove (set name=null to remove)
384386
abstract class StrandNameSet
385387
with BuiltJsonSerializable, UndoableAction
386-
implements SingleStrandAction, Built<StrandNameSet, StrandNameSetBuilder> {
388+
implements SingleStrandAction, ChangePropertiesAction, Built<StrandNameSet, StrandNameSetBuilder> {
387389
String? get name;
388390

389391
Strand get strand;
@@ -405,7 +407,7 @@ abstract class StrandNameSet
405407
// used to set or remove (set name=null to remove)
406408
abstract class StrandLabelSet
407409
with BuiltJsonSerializable, UndoableAction
408-
implements SingleStrandAction, Built<StrandLabelSet, StrandLabelSetBuilder> {
410+
implements SingleStrandAction, ChangePropertiesAction, Built<StrandLabelSet, StrandLabelSetBuilder> {
409411
String? get label;
410412

411413
Strand get strand;
@@ -428,7 +430,7 @@ abstract class StrandLabelSet
428430
// used for Domains, Loopouts, and Extensions
429431
abstract class SubstrandNameSet
430432
with BuiltJsonSerializable, UndoableAction
431-
implements StrandPartAction, Built<SubstrandNameSet, SubstrandNameSetBuilder> {
433+
implements StrandPartAction, ChangePropertiesAction, Built<SubstrandNameSet, SubstrandNameSetBuilder> {
432434
String? get name;
433435

434436
Substrand get substrand;
@@ -454,7 +456,7 @@ abstract class SubstrandNameSet
454456
// used for Domains, Loopouts, and Extensions
455457
abstract class SubstrandLabelSet
456458
with BuiltJsonSerializable, UndoableAction
457-
implements StrandPartAction, Built<SubstrandLabelSet, SubstrandLabelSetBuilder> {
459+
implements StrandPartAction, ChangePropertiesAction, Built<SubstrandLabelSet, SubstrandLabelSetBuilder> {
458460
String? get label;
459461

460462
Substrand get substrand;
@@ -2320,7 +2322,7 @@ abstract class ExtensionDisplayLengthAngleSet
23202322

23212323
abstract class ExtensionAdd
23222324
with BuiltJsonSerializable, UndoableAction
2323-
implements SingleStrandAction, Built<ExtensionAdd, ExtensionAddBuilder> {
2325+
implements SingleStrandAction, ChangePropertiesAction, Built<ExtensionAdd, ExtensionAddBuilder> {
23242326
Strand get strand;
23252327

23262328
bool get is_5p;
@@ -2639,7 +2641,7 @@ abstract class JoinStrandsByMultipleCrossovers
26392641

26402642
abstract class StrandsReflect
26412643
with BuiltJsonSerializable
2642-
implements Action, Built<StrandsReflect, StrandsReflectBuilder> {
2644+
implements Action, ChangePropertiesAction, Built<StrandsReflect, StrandsReflectBuilder> {
26432645
BuiltList<Strand> get strands;
26442646

26452647
bool get horizontal;
@@ -3279,7 +3281,7 @@ abstract class HelixGroupMoveCommit
32793281

32803282
abstract class AssignDNA
32813283
with BuiltJsonSerializable, UndoableAction
3282-
implements Built<AssignDNA, AssignDNABuilder> {
3284+
implements ChangePropertiesAction, Built<AssignDNA, AssignDNABuilder> {
32833285
Strand get strand;
32843286

32853287
DNAAssignOptions get dna_assign_options;
@@ -3311,7 +3313,9 @@ abstract class AssignDNA
33113313
/// assign/replace its DNA with the complement of those
33123314
abstract class AssignDNAComplementFromBoundStrands
33133315
with BuiltJsonSerializable, UndoableAction
3314-
implements Built<AssignDNAComplementFromBoundStrands, AssignDNAComplementFromBoundStrandsBuilder> {
3316+
implements
3317+
ChangePropertiesAction,
3318+
Built<AssignDNAComplementFromBoundStrands, AssignDNAComplementFromBoundStrandsBuilder> {
33153319
BuiltList<Strand> get strands;
33163320

33173321
/************************ begin BuiltValue boilerplate ************************/
@@ -3365,6 +3369,7 @@ abstract class AssignDomainNameComplementFromBoundStrands
33653369
abstract class AssignDomainNameComplementFromBoundDomains
33663370
with BuiltJsonSerializable, UndoableAction
33673371
implements
3372+
ChangePropertiesAction,
33683373
Built<AssignDomainNameComplementFromBoundDomains, AssignDomainNameComplementFromBoundDomainsBuilder> {
33693374
BuiltList<Domain> get domains;
33703375

@@ -3391,7 +3396,7 @@ abstract class AssignDomainNameComplementFromBoundDomains
33913396

33923397
abstract class RemoveDNA
33933398
with BuiltJsonSerializable, UndoableAction
3394-
implements SingleStrandAction, Built<RemoveDNA, RemoveDNABuilder> {
3399+
implements SingleStrandAction, ChangePropertiesAction, Built<RemoveDNA, RemoveDNABuilder> {
33953400
Strand get strand;
33963401

33973402
bool get remove_complements;
@@ -3641,6 +3646,7 @@ abstract class ScalePurificationVendorFieldsAssign
36413646
with BuiltJsonSerializable, UndoableAction
36423647
implements
36433648
SingleStrandAction,
3649+
ChangePropertiesAction,
36443650
Built<ScalePurificationVendorFieldsAssign, ScalePurificationVendorFieldsAssignBuilder> {
36453651
Strand get strand;
36463652

@@ -3663,7 +3669,10 @@ abstract class ScalePurificationVendorFieldsAssign
36633669
// assign plate/well IDT fields of strands
36643670
abstract class PlateWellVendorFieldsAssign
36653671
with BuiltJsonSerializable, UndoableAction
3666-
implements SingleStrandAction, Built<PlateWellVendorFieldsAssign, PlateWellVendorFieldsAssignBuilder> {
3672+
implements
3673+
SingleStrandAction,
3674+
ChangePropertiesAction,
3675+
Built<PlateWellVendorFieldsAssign, PlateWellVendorFieldsAssignBuilder> {
36673676
Strand get strand;
36683677

36693678
VendorFields get vendor_fields;
@@ -3684,7 +3693,10 @@ abstract class PlateWellVendorFieldsAssign
36843693
// remove plate/well vendor fields of strands
36853694
abstract class PlateWellVendorFieldsRemove
36863695
with BuiltJsonSerializable, UndoableAction
3687-
implements SingleStrandAction, Built<PlateWellVendorFieldsRemove, PlateWellVendorFieldsRemoveBuilder> {
3696+
implements
3697+
SingleStrandAction,
3698+
ChangePropertiesAction,
3699+
Built<PlateWellVendorFieldsRemove, PlateWellVendorFieldsRemoveBuilder> {
36883700
Strand get strand;
36893701

36903702
/************************ begin BuiltValue boilerplate ************************/
@@ -3702,7 +3714,10 @@ abstract class PlateWellVendorFieldsRemove
37023714
// remove vendor fields of strands
37033715
abstract class VendorFieldsRemove
37043716
with BuiltJsonSerializable, UndoableAction
3705-
implements SingleStrandAction, Built<VendorFieldsRemove, VendorFieldsRemoveBuilder> {
3717+
implements
3718+
SingleStrandAction,
3719+
ChangePropertiesAction,
3720+
Built<VendorFieldsRemove, VendorFieldsRemoveBuilder> {
37063721
Strand get strand;
37073722

37083723
/************************ begin BuiltValue boilerplate ************************/
@@ -4130,7 +4145,7 @@ abstract class SingleStrandAction implements Action {
41304145

41314146
abstract class ScaffoldSet
41324147
with BuiltJsonSerializable, UndoableAction
4133-
implements SingleStrandAction, Built<ScaffoldSet, ScaffoldSetBuilder> {
4148+
implements SingleStrandAction, ChangePropertiesAction, Built<ScaffoldSet, ScaffoldSetBuilder> {
41344149
Strand get strand;
41354150

41364151
bool get is_scaffold;
@@ -4151,7 +4166,10 @@ abstract class ScaffoldSet
41514166

41524167
abstract class StrandOrSubstrandColorSet
41534168
with BuiltJsonSerializable, UndoableAction
4154-
implements SingleStrandAction, Built<StrandOrSubstrandColorSet, StrandOrSubstrandColorSetBuilder> {
4169+
implements
4170+
SingleStrandAction,
4171+
ChangePropertiesAction,
4172+
Built<StrandOrSubstrandColorSet, StrandOrSubstrandColorSetBuilder> {
41554173
Strand get strand;
41564174

41574175
Substrand? get substrand;

lib/src/middleware/all_middleware.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:redux/redux.dart';
2+
import 'package:scadnano/src/middleware/reselected_strands_after_props_updated.dart';
23
import 'package:scadnano/src/middleware/system_clipboard.dart';
34

45
import '../state/app_state.dart';
@@ -68,6 +69,7 @@ final all_middleware = List<Middleware<AppState>>.unmodifiable([
6869
reselect_moved_dna_extension_ends_middleware,
6970
reselect_moved_copied_strands_middleware,
7071
reselect_moved_domains_middleware,
72+
reselected_strands_after_props_updated,
7173
selections_intersect_box_compute_middleware,
7274
insertion_deletion_batching_middleware,
7375
adjust_grid_position_middleware,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'package:built_collection/built_collection.dart';
2+
import 'package:redux/redux.dart';
3+
import 'package:scadnano/src/actions/actions.dart' as actions;
4+
import 'package:scadnano/src/state/app_state.dart';
5+
import 'package:scadnano/src/state/design.dart';
6+
import 'package:scadnano/src/state/strand.dart';
7+
8+
bool are_batch_actions(dynamic action) {
9+
for (var action in action.actions) {
10+
if (!((action is actions.SingleStrandAction || action is actions.StrandPartAction))) {
11+
return false;
12+
}
13+
}
14+
return true;
15+
}
16+
17+
reselected_strands_after_props_updated(Store<AppState> store, action, NextDispatcher next) {
18+
List<String> prevIds = store.state.ui_state.selectables_store.selected_strands.map((s) => s.id).toList();
19+
if ((action is actions.ChangePropertiesAction ||
20+
(action is actions.ChangePropertiesAction &&
21+
action is actions.BatchAction &&
22+
are_batch_actions(action))) &&
23+
prevIds.length > 1) {
24+
next(action);
25+
26+
List<Strand> new_strands = [];
27+
Design newDesign = store.state.design;
28+
for (var strand in newDesign.strands) {
29+
if (prevIds.contains(strand.id)) {
30+
new_strands.add(strand);
31+
}
32+
}
33+
store.dispatch(actions.SelectAll(selectables: new_strands.toBuiltList(), only: true));
34+
} else {
35+
next(action);
36+
}
37+
}

0 commit comments

Comments
 (0)