1 | // This file is a part of Framsticks SDK. http://www.framsticks.com/
|
---|
2 | // Copyright (C) 1999-2020 Maciej Komosinski and Szymon Ulatowski.
|
---|
3 | // See LICENSE.txt for details.
|
---|
4 |
|
---|
5 | #include "modelcheckpoints.h"
|
---|
6 |
|
---|
7 | ModelCheckpointSupport::ModelCheckpointSupport(ModelSelectionPropagator &msp, ModelViewInterface &_model_view)
|
---|
8 | :mod_sel_prop(msp), model_view(_model_view), mod(NULL), mod_checkpoints(NULL)
|
---|
9 | {
|
---|
10 | selection_enabled = false;
|
---|
11 | }
|
---|
12 |
|
---|
13 | ModelCheckpointSupport::~ModelCheckpointSupport()
|
---|
14 | {
|
---|
15 | freeModel();
|
---|
16 | }
|
---|
17 |
|
---|
18 | void ModelCheckpointSupport::enableSelection(bool e)
|
---|
19 | {
|
---|
20 | if (e == selection_enabled) return;
|
---|
21 | selection_enabled = e;
|
---|
22 | if (selection_enabled)
|
---|
23 | {
|
---|
24 | mod_sel_prop.addModelSelection(&model_view.getModelSelection());
|
---|
25 | mod_sel_prop.setModel(mod);
|
---|
26 | }
|
---|
27 | else
|
---|
28 | {
|
---|
29 | mod_sel_prop.removeModelSelection(&model_view.getModelSelection());
|
---|
30 | mod_sel_prop.setModel(NULL);
|
---|
31 | }
|
---|
32 |
|
---|
33 | }
|
---|
34 |
|
---|
35 | void ModelCheckpointSupport::freeModel()
|
---|
36 | {
|
---|
37 | enableSelection(false);
|
---|
38 | SAFEDELETE(mod);
|
---|
39 | SAFEDELETE(mod_checkpoints);
|
---|
40 | }
|
---|
41 |
|
---|
42 | int ModelCheckpointSupport::showGeno(const Geno* g, bool _use_checkpoints)
|
---|
43 | {
|
---|
44 | use_checkpoints = (g != NULL) && _use_checkpoints;
|
---|
45 | freeModel();
|
---|
46 | if (g != NULL)
|
---|
47 | mod = new Model(*g, Model::SHAPE_UNKNOWN, true, false);
|
---|
48 | toguiCheckpoints(use_checkpoints ? EnabledUnknown : Disabled, 1, 1);
|
---|
49 | int ret = model_view.showModel(mod);
|
---|
50 | enableSelection(true);
|
---|
51 | return ret;
|
---|
52 | }
|
---|
53 |
|
---|
54 | void ModelCheckpointSupport::fromguiPhase(float p)
|
---|
55 | {
|
---|
56 | if (mod == NULL) return;
|
---|
57 | if (use_checkpoints && (mod_checkpoints == NULL))
|
---|
58 | {
|
---|
59 | if (p == current_value) return;
|
---|
60 | mod_checkpoints = new Model(mod->getGeno(), Model::SHAPE_UNKNOWN, false, true);
|
---|
61 | if (mod_checkpoints->getCheckpointCount() > 1)
|
---|
62 | {
|
---|
63 | max_value = current_value = mod_checkpoints->getCheckpointCount() - 1;
|
---|
64 | current_index = mod_checkpoints->getCheckpointCount();
|
---|
65 | toguiCheckpoints(EnabledActive, current_value, current_value);
|
---|
66 | }
|
---|
67 | else
|
---|
68 | {
|
---|
69 | toguiCheckpoints(EnabledUnavailable, 1, 1);
|
---|
70 | }
|
---|
71 | }
|
---|
72 |
|
---|
73 | if (!(mod_checkpoints->getCheckpointCount() > 1))
|
---|
74 | return;
|
---|
75 |
|
---|
76 | current_value = p;
|
---|
77 | int i = int(current_value + 0.5);
|
---|
78 | if (current_value == max_value)
|
---|
79 | i = mod_checkpoints->getCheckpointCount();
|
---|
80 | if (i != current_index)
|
---|
81 | {
|
---|
82 | current_index = i;
|
---|
83 | if (current_index < mod_checkpoints->getCheckpointCount())
|
---|
84 | {
|
---|
85 | model_view.showModel(mod_checkpoints->getCheckpoint(i));
|
---|
86 | enableSelection(false);
|
---|
87 | }
|
---|
88 | else
|
---|
89 | {
|
---|
90 | model_view.showModel(mod);
|
---|
91 | enableSelection(true);
|
---|
92 | }
|
---|
93 | }
|
---|
94 | }
|
---|
95 |
|
---|
96 | int ModelCheckpointSupport::showModel(const Model *m)
|
---|
97 | {
|
---|
98 | freeModel();
|
---|
99 | return model_view.showModel(m);
|
---|
100 | }
|
---|
101 |
|
---|
102 | Model *ModelCheckpointSupport::getModel()
|
---|
103 | {
|
---|
104 | return mod ? mod : model_view.getModel();
|
---|
105 | }
|
---|
106 |
|
---|
107 | ModelSelection& ModelCheckpointSupport::getModelSelection()
|
---|
108 | {
|
---|
109 | return model_view.getModelSelection();
|
---|
110 | }
|
---|
111 |
|
---|
112 | ModelCheckpointSupport::CheckpointsMode ModelCheckpointSupport::getCheckpointsMode()
|
---|
113 | {
|
---|
114 | if (use_checkpoints)
|
---|
115 | {
|
---|
116 | if (mod_checkpoints == NULL)
|
---|
117 | return EnabledUnknown;
|
---|
118 | if (mod_checkpoints->getCheckpointCount() > 1)
|
---|
119 | return EnabledActive;
|
---|
120 | else
|
---|
121 | return EnabledUnavailable;
|
---|
122 | }
|
---|
123 | else
|
---|
124 | return Disabled;
|
---|
125 | }
|
---|
126 |
|
---|
127 | SString ModelCheckpointSupport::checkpointHint()
|
---|
128 | {
|
---|
129 | switch (getCheckpointsMode())
|
---|
130 | {
|
---|
131 | case EnabledUnknown: return SString("Drag horizontally to show developmental phases");
|
---|
132 | case EnabledUnavailable: return SString("Developmental phases not available for this genotype");
|
---|
133 | case EnabledActive:
|
---|
134 | if (current_index < mod_checkpoints->getCheckpointCount())
|
---|
135 | return SString::sprintf("Displaying developmental phase %d of %d", current_index, mod_checkpoints->getCheckpointCount());
|
---|
136 | else
|
---|
137 | return SString("Displaying the final phase of development");
|
---|
138 | }
|
---|
139 | return SString();
|
---|
140 | }
|
---|
141 |
|
---|