sgtlib 3.3.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. StructuralGT/__init__.py +31 -0
  2. StructuralGT/apps/__init__.py +0 -0
  3. StructuralGT/apps/cli_main.py +258 -0
  4. StructuralGT/apps/gui_main.py +69 -0
  5. StructuralGT/apps/gui_mcw/__init__.py +0 -0
  6. StructuralGT/apps/gui_mcw/checkbox_model.py +91 -0
  7. StructuralGT/apps/gui_mcw/controller.py +1073 -0
  8. StructuralGT/apps/gui_mcw/image_provider.py +74 -0
  9. StructuralGT/apps/gui_mcw/imagegrid_model.py +75 -0
  10. StructuralGT/apps/gui_mcw/qthread_worker.py +102 -0
  11. StructuralGT/apps/gui_mcw/table_model.py +79 -0
  12. StructuralGT/apps/gui_mcw/tree_model.py +154 -0
  13. StructuralGT/apps/sgt_qml/CenterMainContent.qml +19 -0
  14. StructuralGT/apps/sgt_qml/LeftContent.qml +48 -0
  15. StructuralGT/apps/sgt_qml/MainWindow.qml +762 -0
  16. StructuralGT/apps/sgt_qml/RightLoggingPanel.qml +125 -0
  17. StructuralGT/apps/sgt_qml/assets/icons/.DS_Store +0 -0
  18. StructuralGT/apps/sgt_qml/assets/icons/back_icon.png +0 -0
  19. StructuralGT/apps/sgt_qml/assets/icons/brightness_icon.png +0 -0
  20. StructuralGT/apps/sgt_qml/assets/icons/cancel_icon.png +0 -0
  21. StructuralGT/apps/sgt_qml/assets/icons/crop_icon.png +0 -0
  22. StructuralGT/apps/sgt_qml/assets/icons/edit_icon.png +0 -0
  23. StructuralGT/apps/sgt_qml/assets/icons/graph_icon.png +0 -0
  24. StructuralGT/apps/sgt_qml/assets/icons/hide_panel.png +0 -0
  25. StructuralGT/apps/sgt_qml/assets/icons/next_icon.png +0 -0
  26. StructuralGT/apps/sgt_qml/assets/icons/notify_icon.png +0 -0
  27. StructuralGT/apps/sgt_qml/assets/icons/rescale_icon.png +0 -0
  28. StructuralGT/apps/sgt_qml/assets/icons/show_panel.png +0 -0
  29. StructuralGT/apps/sgt_qml/assets/icons/square_icon.png +0 -0
  30. StructuralGT/apps/sgt_qml/assets/icons/undo_icon.png +0 -0
  31. StructuralGT/apps/sgt_qml/components/ImageFilters.qml +82 -0
  32. StructuralGT/apps/sgt_qml/components/ImageProperties.qml +112 -0
  33. StructuralGT/apps/sgt_qml/components/ProjectNav.qml +127 -0
  34. StructuralGT/apps/sgt_qml/widgets/BinaryFilterWidget.qml +151 -0
  35. StructuralGT/apps/sgt_qml/widgets/BrightnessControlWidget.qml +103 -0
  36. StructuralGT/apps/sgt_qml/widgets/CreateProjectWidget.qml +112 -0
  37. StructuralGT/apps/sgt_qml/widgets/GTWidget.qml +94 -0
  38. StructuralGT/apps/sgt_qml/widgets/GraphComputeWidget.qml +77 -0
  39. StructuralGT/apps/sgt_qml/widgets/GraphExtractWidget.qml +175 -0
  40. StructuralGT/apps/sgt_qml/widgets/GraphPropertyWidget.qml +77 -0
  41. StructuralGT/apps/sgt_qml/widgets/ImageFilterWidget.qml +137 -0
  42. StructuralGT/apps/sgt_qml/widgets/ImagePropertyWidget.qml +78 -0
  43. StructuralGT/apps/sgt_qml/widgets/ImageViewWidget.qml +585 -0
  44. StructuralGT/apps/sgt_qml/widgets/MenuBarWidget.qml +137 -0
  45. StructuralGT/apps/sgt_qml/widgets/MicroscopyPropertyWidget.qml +80 -0
  46. StructuralGT/apps/sgt_qml/widgets/ProjectWidget.qml +141 -0
  47. StructuralGT/apps/sgt_qml/widgets/RescaleControlWidget.qml +83 -0
  48. StructuralGT/apps/sgt_qml/widgets/RibbonWidget.qml +406 -0
  49. StructuralGT/apps/sgt_qml/widgets/StatusBarWidget.qml +173 -0
  50. StructuralGT/compute/__init__.py +0 -0
  51. StructuralGT/compute/c_lang/include/sgt_base.h +21 -0
  52. StructuralGT/compute/graph_analyzer.py +1499 -0
  53. StructuralGT/entrypoints.py +49 -0
  54. StructuralGT/imaging/__init__.py +0 -0
  55. StructuralGT/imaging/base_image.py +403 -0
  56. StructuralGT/imaging/image_processor.py +780 -0
  57. StructuralGT/modules.py +29 -0
  58. StructuralGT/networks/__init__.py +0 -0
  59. StructuralGT/networks/fiber_network.py +490 -0
  60. StructuralGT/networks/graph_skeleton.py +425 -0
  61. StructuralGT/networks/sknw_mod.py +199 -0
  62. StructuralGT/utils/__init__.py +0 -0
  63. StructuralGT/utils/config_loader.py +244 -0
  64. StructuralGT/utils/configs.ini +97 -0
  65. StructuralGT/utils/progress_update.py +67 -0
  66. StructuralGT/utils/sgt_utils.py +291 -0
  67. sgtlib-3.3.9.dist-info/METADATA +789 -0
  68. sgtlib-3.3.9.dist-info/RECORD +72 -0
  69. sgtlib-3.3.9.dist-info/WHEEL +5 -0
  70. sgtlib-3.3.9.dist-info/entry_points.txt +3 -0
  71. sgtlib-3.3.9.dist-info/licenses/LICENSE +674 -0
  72. sgtlib-3.3.9.dist-info/top_level.txt +1 -0
@@ -0,0 +1,585 @@
1
+ import QtQuick
2
+ import QtQuick.Controls
3
+ import QtQuick.Controls.Basic as Basic
4
+ import QtQuick.Layouts
5
+
6
+
7
+ ColumnLayout {
8
+ Layout.fillWidth: true
9
+ Layout.fillHeight: true
10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
11
+
12
+ property real zoomFactor: 1.0
13
+ property int selectedRole: (Qt.UserRole + 20)
14
+
15
+ Rectangle {
16
+ id: welcomeContainer
17
+ Layout.fillWidth: true
18
+ Layout.fillHeight: true
19
+ color: "transparent"
20
+ visible: !mainController.display_image()
21
+
22
+ ColumnLayout {
23
+ anchors.centerIn: parent
24
+
25
+ Label {
26
+ id: lblWelcome
27
+ //Layout.preferredWidth:
28
+ text: "Welcome to Structural GT"
29
+ color: "blue"
30
+ //font.bold: true
31
+ font.pixelSize: 24
32
+ }
33
+
34
+ RowLayout {
35
+ //anchors.fill: parent
36
+
37
+ ColumnLayout {
38
+
39
+ Basic.Button {
40
+ id: btnCreateProject
41
+ Layout.preferredWidth: 180
42
+ Layout.preferredHeight: 48
43
+ background: Rectangle {
44
+ color: "transparent"
45
+ }
46
+ text: ""
47
+ onClicked: createProjectDialog.open()
48
+
49
+ Rectangle {
50
+ anchors.fill: parent
51
+ radius: 5
52
+ color: "yellow"
53
+
54
+ Label {
55
+ text: "Create project..."
56
+ color: "#808080"
57
+ font.bold: true
58
+ font.pixelSize: 16
59
+ anchors.centerIn: parent
60
+ }
61
+ }
62
+ }
63
+
64
+ Basic.Button {
65
+ id: btnOpenProject
66
+ Layout.preferredWidth: 180
67
+ Layout.preferredHeight: 48
68
+ background: Rectangle {
69
+ color: "transparent"
70
+ }
71
+ text: ""
72
+ onClicked: projectFileDialog.open()
73
+
74
+ Rectangle {
75
+ anchors.fill: parent
76
+ radius: 5
77
+ color: "transparent"
78
+ border.width: 2
79
+ border.color: "#808080"
80
+
81
+ Label {
82
+ text: "Open project..."
83
+ color: "#808080"
84
+ font.bold: true
85
+ font.pixelSize: 16
86
+ anchors.centerIn: parent
87
+ }
88
+ }
89
+ }
90
+
91
+ }
92
+
93
+ Rectangle {
94
+ Layout.leftMargin: 24
95
+ Layout.rightMargin: 12
96
+ width: 1
97
+ height: 75
98
+ color: "#c0c0c0"
99
+ }
100
+
101
+ ColumnLayout {
102
+
103
+ Label {
104
+ id: lblQuick
105
+ Layout.leftMargin: 5
106
+ //Layout.preferredWidth:
107
+ text: "Quick Analysis"
108
+ color: "#808080"
109
+ font.bold: true
110
+ font.pixelSize: 16
111
+ }
112
+
113
+ Button {
114
+ id: btnAddImage
115
+ Layout.preferredWidth: 125
116
+ Layout.preferredHeight: 32
117
+ text: ""
118
+ onClicked: imageFileDialog.open()
119
+
120
+ Rectangle {
121
+ anchors.fill: parent
122
+ radius: 5
123
+ color: "#808080"
124
+
125
+ Label {
126
+ text: "Add image"
127
+ color: "white"
128
+ font.bold: true
129
+ font.pixelSize: 12
130
+ anchors.centerIn: parent
131
+ }
132
+ }
133
+ }
134
+
135
+ Button {
136
+ id: btnAddImageFolder
137
+ Layout.preferredWidth: 125
138
+ Layout.preferredHeight: 32
139
+ text: ""
140
+ onClicked: imageFolderDialog.open()
141
+
142
+ Rectangle {
143
+ anchors.fill: parent
144
+ radius: 5
145
+ color: "#808080"
146
+
147
+ Label {
148
+ text: "Add image folder"
149
+ color: "white"
150
+ font.bold: true
151
+ font.pixelSize: 12
152
+ anchors.centerIn: parent
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ }
159
+ }
160
+ }
161
+
162
+
163
+ Rectangle {
164
+ id: imgViewControls
165
+ height: 32
166
+ Layout.fillHeight: false
167
+ Layout.fillWidth: true
168
+ color: "transparent"
169
+ visible: mainController.display_image()
170
+
171
+ RowLayout {
172
+ anchors.verticalCenter: parent.verticalCenter
173
+ anchors.horizontalCenter: parent.horizontalCenter
174
+
175
+ ComboBox {
176
+ id: cbBatchSelector
177
+ visible: mainController.image_batches_exist()
178
+ //enabled: image_batches_exist.display_image()
179
+ Layout.minimumWidth: 125
180
+ model: imgBatchModel
181
+ implicitContentWidthPolicy: ComboBox.WidestTextWhenCompleted
182
+ textRole: "text"
183
+ valueRole: "value"
184
+ ToolTip.text: "Change image batch"
185
+ ToolTip.visible: cbBatchSelector.hovered
186
+ onCurrentIndexChanged: mainController.select_img_batch(valueAt(currentIndex))
187
+ }
188
+
189
+ Switch {
190
+ id: toggleShowGiantGraph
191
+ visible: mainController.display_graph()
192
+ text: "only giant graph"
193
+ checked: false // Initial state
194
+ onCheckedChanged: {
195
+ if (checked) {
196
+ // Actions when switched on
197
+ mainController.reload_graph_image(true);
198
+ } else {
199
+ // Actions when switched off
200
+ mainController.reload_graph_image(false);
201
+ }
202
+ }
203
+ }
204
+
205
+ Button {
206
+ id: btnLoad3DGraph
207
+ text: "view 3D graph"
208
+ visible: mainController.display_graph()
209
+ onClicked: mainController.load_graph_simulation()
210
+ }
211
+ }
212
+ }
213
+
214
+
215
+ Rectangle {
216
+ id: imgContainer
217
+ Layout.fillWidth: true
218
+ Layout.fillHeight: true
219
+ color: "transparent"
220
+ clip: true // Ensures only the selected area is visible
221
+ visible: mainController.display_image()
222
+
223
+ Flickable {
224
+ id: flickableArea
225
+ anchors.fill: parent
226
+ contentWidth: imgView.width * imgView.scale
227
+ contentHeight: imgView.height * imgView.scale
228
+ //clip: true
229
+ flickableDirection: Flickable.HorizontalAndVerticalFlick
230
+
231
+ ScrollBar.vertical: ScrollBar {
232
+ id: vScrollBar
233
+ policy: flickableArea.contentHeight > flickableArea.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
234
+ }
235
+ ScrollBar.horizontal: ScrollBar {
236
+ id: hScrollBar
237
+ policy: flickableArea.contentWidth > flickableArea.width ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
238
+ }
239
+
240
+ Image {
241
+ id: imgView
242
+ width: flickableArea.width
243
+ height: flickableArea.height
244
+ anchors.centerIn: parent
245
+ scale: zoomFactor
246
+ transformOrigin: Item.Center
247
+ fillMode: Image.PreserveAspectFit
248
+ source: ""
249
+ visible: !mainController.is_img_3d()
250
+ }
251
+
252
+
253
+ GridView {
254
+ id: imgGridView
255
+ width: flickableArea.width
256
+ height: flickableArea.height
257
+ anchors.centerIn: parent
258
+ cellWidth: flickableArea.width * zoomFactor / 3
259
+ cellHeight: flickableArea.height * zoomFactor / 3
260
+ model: img3dGridModel
261
+ visible: mainController.is_img_3d()
262
+
263
+ delegate: Item {
264
+ width: imgGridView.cellWidth
265
+ height: imgGridView.cellHeight
266
+
267
+ Rectangle {
268
+ width: parent.width - 2 // Adds horizontal spacing
269
+ height: parent.height - 2 // Adds vertical spacing
270
+ color: "#d0d0d0" // Background color for spacing effect
271
+
272
+ Image {
273
+ source: model.image === "" ? "" : "data:image/png;base64," + model.image // Base64 encoded image
274
+ width: parent.width
275
+ height: parent.height
276
+ anchors.centerIn: parent
277
+ //scale: zoomFactor
278
+ transformOrigin: Item.Center
279
+ fillMode: Image.PreserveAspectCrop
280
+ //cache: true
281
+ }
282
+
283
+ Label {
284
+ text: "Frame " + model.id
285
+ color: "#bc0022"
286
+ anchors.left: parent.left
287
+ anchors.top: parent.top
288
+ anchors.margins: 2
289
+ background: Rectangle {
290
+ color: "transparent"
291
+ }
292
+ }
293
+
294
+ CheckBox {
295
+ id: checkBox
296
+ anchors.right: parent.right
297
+ anchors.top: parent.top
298
+ anchors.margins: 2
299
+ property bool isSelected: model.selected === 1
300
+ checked: isSelected
301
+ onCheckedChanged: {
302
+ if (isSelected !== checked) { // Only update if there is a change
303
+ isSelected = checked
304
+ let val = checked ? 1 : 0;
305
+ var index = img3dGridModel.index(model.index, 0);
306
+ img3dGridModel.setData(index, val, selectedRole);
307
+ mainController.toggle_selected_batch_image(model.id, isSelected);
308
+ }
309
+ }
310
+ }
311
+
312
+ }
313
+ }
314
+ }
315
+
316
+ }
317
+
318
+ // Selection Rectangle for Cropping
319
+ Rectangle {
320
+ id: cropArea
321
+ color: "transparent"
322
+ border.color: "red"
323
+ border.width: 2
324
+ visible: false
325
+
326
+ // Draggable functionality
327
+ MouseArea {
328
+ id: dragArea
329
+ anchors.fill: parent
330
+ drag.target: cropArea
331
+ drag.minimumX: 0
332
+ drag.minimumY: 0
333
+ drag.maximumX: imgContainer.width - cropArea.width
334
+ drag.maximumY: imgContainer.height - cropArea.height
335
+ }
336
+ }
337
+
338
+ MouseArea {
339
+ id: selectionArea
340
+ anchors.fill: parent
341
+ enabled: false
342
+ onPressed: (mouse) => {
343
+ cropArea.x = mouse.x;
344
+ cropArea.y = mouse.y;
345
+ cropArea.width = 0;
346
+ cropArea.height = 0;
347
+ cropArea.visible = true;
348
+ }
349
+ onPositionChanged: (mouse) => {
350
+ if (cropArea.visible) {
351
+ cropArea.width = Math.abs(mouse.x - cropArea.x);
352
+ cropArea.height = Math.abs(mouse.y - cropArea.y);
353
+ }
354
+ }
355
+ onReleased: {
356
+ if (cropArea.width < 5 || cropArea.height < 5) {
357
+ cropArea.visible = false; // Hide small selections
358
+ mainController.show_cropping_tool(false);
359
+ } else {
360
+ mainController.show_cropping_tool(true);
361
+ }
362
+ }
363
+ }
364
+
365
+ Rectangle {
366
+ id: zoomControls
367
+ width: parent.width
368
+ anchors.top: parent.top
369
+ color: "transparent"
370
+ visible: true
371
+
372
+ RowLayout {
373
+ anchors.fill: parent
374
+
375
+ Basic.Button {
376
+ id: btnZoomIn
377
+ text: "+"
378
+ Layout.preferredHeight: 24
379
+ Layout.preferredWidth: 24
380
+ Layout.alignment: Qt.AlignLeft
381
+ Layout.margins: 5
382
+ font.bold: true
383
+ background: Rectangle {
384
+ color: "#80ffffff"
385
+ } // 80% opacity (50% transparency)
386
+ ToolTip.text: "Zoom in"
387
+ ToolTip.visible: btnZoomIn.hovered
388
+ onClicked: zoomFactor = Math.min(zoomFactor + 0.1, 3.0) // Max zoom = 3x
389
+ }
390
+
391
+ Basic.Button {
392
+ id: btnZoomOut
393
+ text: "-"
394
+ Layout.preferredHeight: 24
395
+ Layout.preferredWidth: 24
396
+ Layout.alignment: Qt.AlignRight
397
+ Layout.margins: 5
398
+ font.bold: true
399
+ background: Rectangle {
400
+ color: "#80ffffff"
401
+ }
402
+ ToolTip.text: "Zoom out"
403
+ ToolTip.visible: btnZoomOut.hovered
404
+ onClicked: zoomFactor = Math.max(zoomFactor - 0.1, 0.5) // Min zoom = 0.5x
405
+ }
406
+ }
407
+ }
408
+ }
409
+
410
+
411
+ Rectangle {
412
+ id: imgNavControls
413
+ height: 32
414
+ Layout.fillHeight: false
415
+ Layout.fillWidth: true
416
+ color: "transparent"
417
+ visible: mainController.display_image()
418
+
419
+ RowLayout {
420
+ anchors.fill: parent
421
+
422
+ Basic.Button {
423
+ id: btnPrevious
424
+ text: ""
425
+ icon.source: "../assets/icons/back_icon.png" // Path to your icon
426
+ icon.width: 24 // Adjust as needed
427
+ icon.height: 24
428
+ background: Rectangle {
429
+ color: "transparent"
430
+ }
431
+ Layout.alignment: Qt.AlignLeft
432
+ onClicked: mainController.load_prev_image()
433
+ }
434
+
435
+ Label {
436
+ id: lblNavInfo
437
+ text: ""
438
+ color: "#808080"
439
+ Layout.alignment: Qt.AlignCenter
440
+ }
441
+
442
+ Basic.Button {
443
+ id: btnNext
444
+ text: ""
445
+ icon.source: "../assets/icons/next_icon.png" // Path to your icon
446
+ icon.width: 24 // Adjust as needed
447
+ icon.height: 24
448
+ background: Rectangle {
449
+ color: "transparent"
450
+ }
451
+ Layout.alignment: Qt.AlignRight
452
+ onClicked: mainController.load_next_image()
453
+ }
454
+
455
+ }
456
+ }
457
+
458
+ function getActualImageSize() {
459
+ const containerWidth = flickableArea.width;
460
+ const containerHeight = flickableArea.height;
461
+
462
+ const imageSourceWidth = imgView.sourceSize.width;
463
+ const imageSourceHeight = imgView.sourceSize.height;
464
+
465
+ if (imageSourceWidth <= 0 || imageSourceHeight <= 0)
466
+ return {width: 0, height: 0};
467
+
468
+ const imgAspect = imageSourceWidth / imageSourceHeight;
469
+ const containerAspect = containerWidth / containerHeight;
470
+
471
+ let actualWidth, actualHeight;
472
+ if (imgAspect > containerAspect) {
473
+ // Image is wider than container, so width fits
474
+ actualWidth = containerWidth;
475
+ actualHeight = containerWidth / imgAspect;
476
+ } else {
477
+ // Image is taller than container, so height fits
478
+ actualHeight = containerHeight;
479
+ actualWidth = containerHeight * imgAspect;
480
+ }
481
+
482
+ return {width: actualWidth, height: actualHeight};
483
+ }
484
+
485
+ function getCropAreaInImageCoords() {
486
+ const scale = zoomFactor;
487
+ const offsetX = flickableArea.contentX;
488
+ const offsetY = flickableArea.contentY;
489
+ const actualSize = getActualImageSize();
490
+
491
+ const cropX = (cropArea.x + offsetX) / scale;
492
+ const cropY = (cropArea.y + offsetY) / scale;
493
+ const cropW = cropArea.width / scale;
494
+ const cropH = cropArea.height / scale;
495
+
496
+ return {
497
+ x: Math.round(cropX),
498
+ y: Math.round(cropY),
499
+ width: Math.round(cropW),
500
+ height: Math.round(cropH),
501
+ actualWidth: Math.round(actualSize.width),
502
+ actualHeight: Math.round(actualSize.height)
503
+ };
504
+ }
505
+
506
+ function cropImage() {
507
+
508
+ // Crop image through mainController
509
+ const cropRect = getCropAreaInImageCoords();
510
+ mainController.crop_image(cropRect.x, cropRect.y, cropRect.width, cropRect.height, cropRect.actualWidth, cropRect.actualHeight);
511
+
512
+ // Hide the selection box
513
+ cropArea.visible = false;
514
+ }
515
+
516
+ Connections {
517
+ target: mainController
518
+
519
+ function onImageChangedSignal() {
520
+ // Force refresh
521
+ imgView.visible = !mainController.is_img_3d();
522
+ imgGridView.visible = mainController.is_img_3d();
523
+ welcomeContainer.visible = mainController.display_image() ? false : !mainController.is_project_open();
524
+ imgContainer.visible = mainController.display_image();
525
+ imgNavControls.visible = mainController.display_image();
526
+ imgViewControls.visible = mainController.display_image();
527
+ cbBatchSelector.visible = mainController.image_batches_exist();
528
+ toggleShowGiantGraph.visible = mainController.display_graph();
529
+ btnLoad3DGraph.visible = mainController.display_graph();
530
+
531
+ if (!mainController.is_img_3d()) {
532
+ imgView.source = mainController.get_pixmap();
533
+ } else {
534
+ imgView.source = "";
535
+ }
536
+
537
+ zoomFactor = 1.0;
538
+
539
+ btnPrevious.enabled = mainController.enable_prev_nav_btn();
540
+ btnNext.enabled = mainController.enable_next_nav_btn();
541
+ lblNavInfo.text = mainController.get_img_nav_location();
542
+ //console.log(src);
543
+
544
+ const curr_batch = mainController.get_selected_img_batch();
545
+ cbBatchSelector.currentIndex = curr_batch;
546
+ }
547
+
548
+ function onProjectOpenedSignal(name) {
549
+ welcomeContainer.visible = mainController.display_image() ? false : !mainController.is_project_open();
550
+ }
551
+
552
+ function onEnableRectangularSelectionSignal(allow) {
553
+ if (allow) {
554
+ selectionArea.enabled = true;
555
+ cropArea.visible = true
556
+ } else {
557
+ selectionArea.enabled = false
558
+ cropArea.visible = false
559
+ }
560
+ }
561
+
562
+ function onPerformCroppingSignal(allow) {
563
+ if (allow) {
564
+ cropImage();
565
+ }
566
+ }
567
+
568
+ function onUpdateProgressSignal(val, msg) {
569
+ if (val === 101) {
570
+ lblNavInfo.text = msg;
571
+ }
572
+ btnNext.enabled = mainController.enable_next_nav_btn();
573
+ lblNavInfo.text = mainController.get_img_nav_location();
574
+ }
575
+
576
+ function onTaskTerminatedSignal(success_val, msg_data) {
577
+ lblNavInfo.text = mainController.get_img_nav_location();
578
+ btnNext.enabled = mainController.enable_next_nav_btn();
579
+ lblNavInfo.text = mainController.get_img_nav_location();
580
+ }
581
+
582
+ }
583
+ }
584
+
585
+