From d0148bf4607ea209e11da937d853a5adb44c3771 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Wed, 19 Aug 2020 16:22:10 +0300 Subject: [PATCH] tree changes --- CMakeLists.txt | 15 +- SDKMacros.cmake | 93 +- android.toolchain.cmake.add | 6 - cd_utils/CMakeLists.txt | 55 +- pip | 2 +- piqt/CMakeLists.txt | 91 +- piqt/libs/CMakeLists.txt | 1 + piqt/libs/core/CMakeLists.txt | 1 + piqt/{ => libs/core}/piqt.cpp | 0 piqt/{ => libs/core}/piqt.h | 0 piqt/libs/qcd/CMakeLists.txt | 1 + {qcd_utils => piqt/libs/qcd}/qcd_core.cpp | 594 ++++---- {qcd_utils => piqt/libs/qcd}/qcd_core.h | 192 +-- {qcd_utils => piqt/libs/qcd}/qcd_graphic.cpp | 80 +- {qcd_utils => piqt/libs/qcd}/qcd_graphic.h | 132 +- {qcd_utils => piqt/libs/qcd}/qcd_graphic.ui | 338 ++--- .../libs/qcd}/qcd_modedialog.cpp | 92 +- {qcd_utils => piqt/libs/qcd}/qcd_modedialog.h | 100 +- .../libs/qcd}/qcd_modedialog.ui | 196 +-- {qcd_utils => piqt/libs/qcd}/qcd_model.cpp | 920 ++++++------- {qcd_utils => piqt/libs/qcd}/qcd_model.h | 264 ++-- {qcd_utils => piqt/libs/qcd}/qcd_view.cpp | 742 +++++----- {qcd_utils => piqt/libs/qcd}/qcd_view.h | 224 +-- piqt/libs/widgets/CMakeLists.txt | 9 + .../libs/widgets}/piqt_connection_edit.cpp | 0 .../libs/widgets}/piqt_connection_edit.h | 0 .../libs/widgets}/piqt_connection_edit.ui | 0 .../libs/widgets}/piqt_connection_view.cpp | 0 .../libs/widgets}/piqt_connection_view.h | 0 .../libs/widgets}/piqt_highlighter.cpp | 0 .../libs/widgets}/piqt_highlighter.h | 0 .../libs/widgets}/piqt_iodevice_edit.cpp | 0 .../libs/widgets}/piqt_iodevice_edit.h | 0 .../widgets}/piqt_iodevice_edit_dialog.cpp | 0 .../libs/widgets}/piqt_iodevice_edit_dialog.h | 0 .../widgets}/piqt_iodevice_edit_dialog.ui | 0 .../libs/widgets}/qpiconnection.cpp | 0 .../libs/widgets}/qpiconnection.h | 0 piqt/utils/CMakeLists.txt | 1 + piqt/utils/cd_pult/CMakeLists.txt | 14 + .../pult => piqt/utils/cd_pult}/cddirectk.cpp | 624 ++++----- .../pult => piqt/utils/cd_pult}/cddirectk.h | 154 +-- .../pult => piqt/utils/cd_pult}/cddirectk.ui | 170 +-- .../utils/cd_pult}/cddirectk_type_dialog.cpp | 152 +- .../utils/cd_pult}/cddirectk_type_dialog.h | 88 +- .../utils/cd_pult}/cddirectk_type_dialog.ui | 464 +++---- .../utils/cd_pult}/cdgraphics.cpp | 708 +++++----- .../pult => piqt/utils/cd_pult}/cdgraphics.h | 184 +-- .../pult => piqt/utils/cd_pult}/cdgraphics.ui | 336 ++--- piqt/utils/cd_pult/cdpult.qrc | 16 + .../utils/cd_pult}/cdpultwindow.cpp | 584 ++++---- .../utils/cd_pult}/cdpultwindow.h | 106 +- .../utils/cd_pult}/cdpultwindow.ui | 1224 ++++++++--------- .../utils/cd_pult}/cdviewwidget.cpp | 156 +-- .../utils/cd_pult}/cdviewwidget.h | 82 +- .../utils/cd_pult}/cdviewwidget.ui | 352 ++--- .../Apps-accessories-calculator-icon.png | Bin .../icons/accessories-text-editor.png | Bin .../utils/cd_pult}/icons/db-export.png | Bin .../utils/cd_pult}/icons/db-import.png | Bin .../utils/cd_pult}/icons/flame.png | Bin .../utils/cd_pult}/icons/timer.png | Bin .../pult => piqt/utils/cd_pult}/main.cpp | 746 +++++----- piqt/utils/piconnedit/CMakeLists.txt | 10 + piqt/utils/piconnedit/piconnedit.qrc | 4 + .../utils}/piconnedit/piconnedit_main.cpp | 0 piqt/utils/pidumper/CMakeLists.txt | 10 + .../utils}/pidumper/pidumper.cpp | 0 .../utils}/pidumper/pidumper.h | 0 .../utils}/pidumper/pidumper.ui | 0 .../utils}/pidumper/pidumper_main.cpp | 0 piqt/utils/piintrospector/CMakeLists.txt | 13 + .../utils}/piintrospector/containers_view.cpp | 0 .../utils}/piintrospector/containers_view.h | 0 .../utils}/piintrospector/containers_view.ui | 0 .../utils}/piintrospector/objects_view.cpp | 0 .../utils}/piintrospector/objects_view.h | 0 .../utils}/piintrospector/objects_view.ui | 0 .../utils}/piintrospector/piintrospector.cpp | 0 .../utils}/piintrospector/piintrospector.h | 0 .../utils}/piintrospector/piintrospector.ui | 0 .../piintrospector/piintrospector_main.cpp | 0 .../utils}/piintrospector/threads_view.cpp | 0 .../utils}/piintrospector/threads_view.h | 0 .../utils}/piintrospector/threads_view.ui | 0 piqt_utils/CMakeLists.txt | 73 - piqt_utils/LICENSE.txt | 165 --- piqt_utils/piconnedit/CMakeLists.txt | 23 - piqt_utils/piconnedit/icons/DALI-designer.png | Bin 7837 -> 0 bytes piqt_utils/piconnedit/icons/alpha.png | Bin 158 -> 0 bytes .../piconnedit/icons/application-exit.png | Bin 1134 -> 0 bytes .../icons/applications-engineering.png | Bin 1035 -> 0 bytes .../piconnedit/icons/archive-extract.png | Bin 626 -> 0 bytes .../icons/archive-insert-directory.png | Bin 588 -> 0 bytes .../piconnedit/icons/archive-insert.png | Bin 433 -> 0 bytes piqt_utils/piconnedit/icons/arrow-down.png | Bin 525 -> 0 bytes piqt_utils/piconnedit/icons/arrow-up.png | Bin 484 -> 0 bytes piqt_utils/piconnedit/icons/axis_x.png | Bin 235 -> 0 bytes piqt_utils/piconnedit/icons/axis_y.png | Bin 259 -> 0 bytes .../piconnedit/icons/case-sensitive.png | Bin 326 -> 0 bytes .../piconnedit/icons/checkbox-unchecked.png | Bin 419 -> 0 bytes piqt_utils/piconnedit/icons/checkbox.png | Bin 654 -> 0 bytes piqt_utils/piconnedit/icons/clients.png | Bin 1257 -> 0 bytes piqt_utils/piconnedit/icons/close.png | Bin 1251 -> 0 bytes piqt_utils/piconnedit/icons/code-error.png | Bin 722 -> 0 bytes piqt_utils/piconnedit/icons/code-function.png | Bin 449 -> 0 bytes piqt_utils/piconnedit/icons/code-keyword.png | Bin 342 -> 0 bytes piqt_utils/piconnedit/icons/code-parents.png | Bin 641 -> 0 bytes piqt_utils/piconnedit/icons/code-property.png | Bin 540 -> 0 bytes piqt_utils/piconnedit/icons/code-signal.png | Bin 726 -> 0 bytes piqt_utils/piconnedit/icons/code-struct.png | Bin 676 -> 0 bytes piqt_utils/piconnedit/icons/code-union.png | Bin 731 -> 0 bytes piqt_utils/piconnedit/icons/code-variable.png | Bin 328 -> 0 bytes piqt_utils/piconnedit/icons/code-word.png | Bin 543 -> 0 bytes piqt_utils/piconnedit/icons/configure-.png | Bin 1379 -> 0 bytes piqt_utils/piconnedit/icons/configure.png | Bin 717 -> 0 bytes piqt_utils/piconnedit/icons/database.png | Bin 1918 -> 0 bytes piqt_utils/piconnedit/icons/debug-run.png | Bin 1100 -> 0 bytes piqt_utils/piconnedit/icons/designer-qt4.png | Bin 1367 -> 0 bytes piqt_utils/piconnedit/icons/dialog-close.png | Bin 813 -> 0 bytes .../piconnedit/icons/dialog-ok-apply.png | Bin 1977 -> 0 bytes .../piconnedit/icons/dialog-warning.png | Bin 2312 -> 0 bytes piqt_utils/piconnedit/icons/disabled.png | Bin 5685 -> 0 bytes .../icons/distribute-horizontal-margin.png | Bin 539 -> 0 bytes piqt_utils/piconnedit/icons/document-edit.png | Bin 726 -> 0 bytes piqt_utils/piconnedit/icons/document-new.png | Bin 1387 -> 0 bytes piqt_utils/piconnedit/icons/document-open.png | Bin 1798 -> 0 bytes .../piconnedit/icons/document-print.png | Bin 880 -> 0 bytes .../piconnedit/icons/document-save-.png | Bin 1263 -> 0 bytes .../piconnedit/icons/document-save-all.png | Bin 921 -> 0 bytes .../piconnedit/icons/document-save-as.png | Bin 2152 -> 0 bytes piqt_utils/piconnedit/icons/document-save.png | Bin 563 -> 0 bytes piqt_utils/piconnedit/icons/edit-clear-.png | Bin 3911 -> 0 bytes .../icons/edit-clear-locationbar-rtl.png | Bin 644 -> 0 bytes piqt_utils/piconnedit/icons/edit-clear.png | Bin 2066 -> 0 bytes piqt_utils/piconnedit/icons/edit-copy.png | Bin 828 -> 0 bytes piqt_utils/piconnedit/icons/edit-cut.png | Bin 892 -> 0 bytes piqt_utils/piconnedit/icons/edit-delete.png | Bin 1259 -> 0 bytes piqt_utils/piconnedit/icons/edit-find-.png | Bin 1631 -> 0 bytes piqt_utils/piconnedit/icons/edit-find.png | Bin 634 -> 0 bytes piqt_utils/piconnedit/icons/edit-guides.png | Bin 544 -> 0 bytes piqt_utils/piconnedit/icons/edit-paste.png | Bin 1406 -> 0 bytes piqt_utils/piconnedit/icons/edit-redo.png | Bin 3383 -> 0 bytes .../icons/edit-table-insert-row-below.png | Bin 852 -> 0 bytes piqt_utils/piconnedit/icons/edit-undo.png | Bin 3440 -> 0 bytes piqt_utils/piconnedit/icons/employees.png | Bin 1304 -> 0 bytes piqt_utils/piconnedit/icons/expand_s_x.png | Bin 571 -> 0 bytes piqt_utils/piconnedit/icons/expand_s_y.png | Bin 577 -> 0 bytes piqt_utils/piconnedit/icons/expand_x.png | Bin 579 -> 0 bytes piqt_utils/piconnedit/icons/expand_y.png | Bin 577 -> 0 bytes .../icons/format-text-subscript.png | Bin 824 -> 0 bytes piqt_utils/piconnedit/icons/games-solve.png | Bin 1449 -> 0 bytes piqt_utils/piconnedit/icons/go-jump.png | Bin 1126 -> 0 bytes piqt_utils/piconnedit/icons/go-next.png | Bin 940 -> 0 bytes piqt_utils/piconnedit/icons/go-previous.png | Bin 907 -> 0 bytes piqt_utils/piconnedit/icons/graphics.png | Bin 391 -> 0 bytes piqt_utils/piconnedit/icons/groups-edit.png | Bin 12368 -> 0 bytes piqt_utils/piconnedit/icons/item-add.png | Bin 639 -> 0 bytes piqt_utils/piconnedit/icons/item.png | Bin 448 -> 0 bytes piqt_utils/piconnedit/icons/lastmoves.png | Bin 592 -> 0 bytes piqt_utils/piconnedit/icons/led_3.png | Bin 8532 -> 0 bytes piqt_utils/piconnedit/icons/led_off.png | Bin 540 -> 0 bytes piqt_utils/piconnedit/icons/led_on.png | Bin 533 -> 0 bytes piqt_utils/piconnedit/icons/light-+.png | Bin 16851 -> 0 bytes piqt_utils/piconnedit/icons/light--.png | Bin 16559 -> 0 bytes piqt_utils/piconnedit/icons/light-254.png | Bin 12006 -> 0 bytes .../piconnedit/icons/light-disable-all.png | Bin 20566 -> 0 bytes piqt_utils/piconnedit/icons/light-disable.png | Bin 16755 -> 0 bytes piqt_utils/piconnedit/icons/light-down.png | Bin 16334 -> 0 bytes piqt_utils/piconnedit/icons/light-edit.png | Bin 13080 -> 0 bytes piqt_utils/piconnedit/icons/light-max.png | Bin 14426 -> 0 bytes piqt_utils/piconnedit/icons/light-min.png | Bin 17432 -> 0 bytes piqt_utils/piconnedit/icons/light-off.png | Bin 16487 -> 0 bytes piqt_utils/piconnedit/icons/light-on.png | Bin 13042 -> 0 bytes .../piconnedit/icons/light-step-down.png | Bin 16814 -> 0 bytes piqt_utils/piconnedit/icons/light-step-up.png | Bin 16158 -> 0 bytes piqt_utils/piconnedit/icons/light-up.png | Bin 15602 -> 0 bytes piqt_utils/piconnedit/icons/lights.png | Bin 34124 -> 0 bytes piqt_utils/piconnedit/icons/list-add.png | Bin 1487 -> 0 bytes piqt_utils/piconnedit/icons/list-remove.png | Bin 1065 -> 0 bytes piqt_utils/piconnedit/icons/log_parser.png | Bin 18635 -> 0 bytes piqt_utils/piconnedit/icons/mail.png | Bin 918 -> 0 bytes piqt_utils/piconnedit/icons/media-flash.png | Bin 1256 -> 0 bytes .../piconnedit/icons/media-playback-pause.png | Bin 721 -> 0 bytes .../piconnedit/icons/media-playback-stop.png | Bin 736 -> 0 bytes piqt_utils/piconnedit/icons/media-record.png | Bin 1155 -> 0 bytes piqt_utils/piconnedit/icons/node-add.png | Bin 694 -> 0 bytes piqt_utils/piconnedit/icons/node.png | Bin 658 -> 0 bytes piqt_utils/piconnedit/icons/object-locked.png | Bin 604 -> 0 bytes piqt_utils/piconnedit/icons/piconnection.png | Bin 19319 -> 0 bytes piqt_utils/piconnedit/icons/piconnection.xcf | Bin 66746 -> 0 bytes piqt_utils/piconnedit/icons/quickopen.png | Bin 1969 -> 0 bytes .../icons/run-build-install-root.png | Bin 1915 -> 0 bytes piqt_utils/piconnedit/icons/run-build.png | Bin 1928 -> 0 bytes piqt_utils/piconnedit/icons/scenes-edit.png | Bin 314 -> 0 bytes piqt_utils/piconnedit/icons/select-add.png | Bin 941 -> 0 bytes .../piconnedit/icons/select-intersect.png | Bin 946 -> 0 bytes piqt_utils/piconnedit/icons/select-invert.png | Bin 830 -> 0 bytes piqt_utils/piconnedit/icons/select-none.png | Bin 1113 -> 0 bytes .../piconnedit/icons/select-replace.png | Bin 738 -> 0 bytes .../piconnedit/icons/select-subtract.png | Bin 981 -> 0 bytes piqt_utils/piconnedit/icons/splash.png | Bin 37270 -> 0 bytes piqt_utils/piconnedit/icons/status-off.png | Bin 47007 -> 0 bytes piqt_utils/piconnedit/icons/status-on.png | Bin 50169 -> 0 bytes piqt_utils/piconnedit/icons/status-warn.png | Bin 12669 -> 0 bytes piqt_utils/piconnedit/icons/system-help.png | Bin 1222 -> 0 bytes .../piconnedit/icons/tool-light-add.png | Bin 1381 -> 0 bytes .../piconnedit/icons/tool-selection.png | Bin 971 -> 0 bytes piqt_utils/piconnedit/icons/tools-wizard.png | Bin 797 -> 0 bytes .../piconnedit/icons/transform-move.png | Bin 1103 -> 0 bytes piqt_utils/piconnedit/icons/variable-add.png | Bin 557 -> 0 bytes piqt_utils/piconnedit/icons/variable-copy.png | Bin 567 -> 0 bytes piqt_utils/piconnedit/icons/variable-edit.png | Bin 567 -> 0 bytes .../piconnedit/icons/variable-remove.png | Bin 588 -> 0 bytes piqt_utils/piconnedit/icons/view-grid.png | Bin 691 -> 0 bytes piqt_utils/piconnedit/icons/view-refresh.png | Bin 2182 -> 0 bytes piqt_utils/piconnedit/icons/warning-a.png | Bin 2529 -> 0 bytes piqt_utils/piconnedit/icons/warning-id.png | Bin 2458 -> 0 bytes piqt_utils/piconnedit/icons/window-close.png | Bin 2083 -> 0 bytes piqt_utils/piconnedit/icons/zoom-fit-best.png | Bin 539 -> 0 bytes piqt_utils/piconnedit/icons/zoom-in.png | Bin 1191 -> 0 bytes piqt_utils/piconnedit/icons/zoom-out.png | Bin 1173 -> 0 bytes piqt_utils/piconnedit/icons/zoom-range.png | Bin 1311 -> 0 bytes piqt_utils/piconnedit/icons/zoom-rect.png | Bin 1378 -> 0 bytes piqt_utils/piconnedit/piconnedit.qrc | 6 - piqt_utils/pidumper/CMakeLists.txt | 23 - piqt_utils/piintrospector/CMakeLists.txt | 25 - qad/CMakeLists.txt | 101 +- qad/cmake/QADMacros.cmake | 82 ++ .../pult => qad}/icons/dialog-information.png | Bin qad/icons/document-revert.png | Bin 0 -> 27698 bytes qad/libs/CMakeLists.txt | 27 +- qad/libs/application/CMakeLists.txt | 2 +- qad/libs/blockview/CMakeLists.txt | 2 +- qad/libs/doc/CMakeLists.txt | 2 +- qad/libs/graphic/CMakeLists.txt | 2 +- qad/libs/sql_table/CMakeLists.txt | 2 +- qad/libs/touch_widgets/CMakeLists.txt | 2 +- qad/libs/utils/CMakeLists.txt | 2 +- qad/libs/widgets/CMakeLists.txt | 2 +- qad/utils/CMakeLists.txt | 12 +- qad/utils/blockeditor/CMakeLists.txt | 42 +- qad/utils/qpicalculator/CMakeLists.txt | 31 +- .../Apps-accessories-calculator-icon.png | Bin 9661 -> 0 bytes .../qpicalculator/icons/application-exit.png | Bin 842 -> 0 bytes qad/utils/qpicalculator/icons/arrow-left.png | Bin 839 -> 0 bytes qad/utils/qpicalculator/icons/arrow-right.png | Bin 798 -> 0 bytes qad/utils/qpicalculator/icons/axes.png | Bin 468 -> 0 bytes qad/utils/qpicalculator/icons/axes_1.png | Bin 538 -> 0 bytes .../qpicalculator/icons/character-set.png | Bin 494 -> 0 bytes qad/utils/qpicalculator/icons/configure.png | Bin 717 -> 0 bytes .../qpicalculator/icons/dialog-close.png | Bin 813 -> 0 bytes .../qpicalculator/icons/document-close.png | Bin 678 -> 0 bytes .../qpicalculator/icons/document-edit.png | Bin 726 -> 0 bytes .../qpicalculator/icons/document-open.png | Bin 639 -> 0 bytes .../qpicalculator/icons/document-revert.png | Bin 794 -> 0 bytes .../qpicalculator/icons/document-save-as.png | Bin 839 -> 0 bytes .../qpicalculator/icons/document-save.png | Bin 563 -> 0 bytes .../icons/edit-clear-locationbar-rtl.png | Bin 644 -> 0 bytes qad/utils/qpicalculator/icons/edit-clear.png | Bin 802 -> 0 bytes qad/utils/qpicalculator/icons/edit-copy.png | Bin 485 -> 0 bytes qad/utils/qpicalculator/icons/edit-cut.png | Bin 368 -> 0 bytes qad/utils/qpicalculator/icons/edit-delete.png | Bin 640 -> 0 bytes qad/utils/qpicalculator/icons/edit-find.png | Bin 634 -> 0 bytes qad/utils/qpicalculator/icons/edit-guides.png | Bin 544 -> 0 bytes qad/utils/qpicalculator/icons/edit-paste.png | Bin 529 -> 0 bytes qad/utils/qpicalculator/icons/edit-redo.png | Bin 813 -> 0 bytes qad/utils/qpicalculator/icons/edit-undo.png | Bin 866 -> 0 bytes qad/utils/qpicalculator/icons/empty_brick.png | Bin 674 -> 0 bytes .../qpicalculator/icons/format-fill-color.png | Bin 985 -> 0 bytes .../qpicalculator/icons/format-text-bold.png | Bin 463 -> 0 bytes .../qpicalculator/icons/format-text-color.png | Bin 601 -> 0 bytes .../icons/format-text-italic.png | Bin 331 -> 0 bytes .../icons/format-text-overline.png | Bin 464 -> 0 bytes .../icons/format-text-strikethrough.png | Bin 441 -> 0 bytes .../icons/format-text-underline.png | Bin 392 -> 0 bytes qad/utils/qpicalculator/icons/go-home.png | Bin 935 -> 0 bytes qad/utils/qpicalculator/icons/go-next.png | Bin 940 -> 0 bytes qad/utils/qpicalculator/icons/go-previous.png | Bin 907 -> 0 bytes qad/utils/qpicalculator/icons/graphic_add.png | Bin 599 -> 0 bytes qad/utils/qpicalculator/icons/graphics.png | Bin 364 -> 0 bytes .../qpicalculator/icons/help-contents.png | Bin 684 -> 0 bytes .../qpicalculator/icons/history_brick_add.png | Bin 767 -> 0 bytes .../qpicalculator/icons/history_brick_del.png | Bin 747 -> 0 bytes .../icons/history_brick_move.png | Bin 427 -> 0 bytes .../qpicalculator/icons/history_conn_add.png | Bin 644 -> 0 bytes .../qpicalculator/icons/history_conn_del.png | Bin 623 -> 0 bytes .../qpicalculator/icons/history_conn_edit.png | Bin 539 -> 0 bytes .../icons/history_conn_retrace.png | Bin 597 -> 0 bytes .../qpicalculator/icons/history_convert.png | Bin 761 -> 0 bytes .../qpicalculator/icons/history_freq.png | Bin 631 -> 0 bytes .../qpicalculator/icons/history_point.xcf | Bin 5283 -> 0 bytes .../qpicalculator/icons/history_point_add.png | Bin 612 -> 0 bytes .../qpicalculator/icons/history_point_del.png | Bin 591 -> 0 bytes .../icons/history_point_move.png | Bin 532 -> 0 bytes .../qpicalculator/icons/history_seg_add.png | Bin 621 -> 0 bytes .../qpicalculator/icons/history_seg_del.png | Bin 602 -> 0 bytes .../qpicalculator/icons/history_seg_move.png | Bin 542 -> 0 bytes .../qpicalculator/icons/history_text_add.png | Bin 603 -> 0 bytes .../qpicalculator/icons/history_text_del.png | Bin 609 -> 0 bytes .../qpicalculator/icons/history_text_edit.png | Bin 620 -> 0 bytes .../qpicalculator/icons/history_text_move.png | Bin 542 -> 0 bytes qad/utils/qpicalculator/icons/initial.png | Bin 1248 -> 0 bytes .../qpicalculator/icons/insert-image.png | Bin 697 -> 0 bytes qad/utils/qpicalculator/icons/insert-text.png | Bin 1772 -> 0 bytes .../qpicalculator/icons/layer-visible-off.png | Bin 783 -> 0 bytes .../qpicalculator/icons/layer-visible-on.png | Bin 838 -> 0 bytes qad/utils/qpicalculator/icons/list-add.png | Bin 564 -> 0 bytes qad/utils/qpicalculator/icons/mbricks.svg | 351 ----- qad/utils/qpicalculator/icons/mbricks_128.png | Bin 9458 -> 0 bytes qad/utils/qpicalculator/icons/mbricks_22.png | Bin 1070 -> 0 bytes qad/utils/qpicalculator/icons/mbricks_256.png | Bin 24538 -> 0 bytes qad/utils/qpicalculator/icons/mbricks_64.png | Bin 3764 -> 0 bytes .../icons/media-playback-pause.png | Bin 484 -> 0 bytes .../icons/media-playback-start.png | Bin 501 -> 0 bytes .../icons/media-playback-stop.png | Bin 499 -> 0 bytes .../icons/media-skip-forward.png | Bin 506 -> 0 bytes .../icons/object-flip-horizontal.png | Bin 748 -> 0 bytes qad/utils/qpicalculator/icons/player-time.png | Bin 975 -> 0 bytes .../icons/preferences-desktop-display.png | Bin 1341 -> 0 bytes .../icons/preferences-desktop-keyboard.png | Bin 843 -> 0 bytes .../qpicalculator/icons/qpicalculator.ico | Bin 0 -> 161593 bytes .../qpicalculator/icons/qpicalculator.png | Bin 0 -> 23336 bytes qad/utils/qpicalculator/icons/run-build.png | Bin 880 -> 0 bytes qad/utils/qpicalculator/icons/tree.png | Bin 793 -> 0 bytes qad/utils/qpicalculator/icons/view-center.png | Bin 500 -> 0 bytes .../qpicalculator/icons/view-fullscreen.png | Bin 396 -> 0 bytes qad/utils/qpicalculator/icons/view-grid.png | Bin 691 -> 0 bytes .../qpicalculator/icons/view-mode-compact.png | Bin 734 -> 0 bytes .../icons/view-mode-expanded.png | Bin 789 -> 0 bytes .../qpicalculator/icons/view-mode-icon.png | Bin 659 -> 0 bytes .../qpicalculator/icons/view-refresh.png | Bin 931 -> 0 bytes .../qpicalculator/icons/view-restore.png | Bin 370 -> 0 bytes .../qpicalculator/icons/view-tooltips.png | Bin 659 -> 0 bytes qad/utils/qpicalculator/icons/window-new.png | Bin 377 -> 0 bytes .../qpicalculator/icons/zoom-fit-best.png | Bin 539 -> 0 bytes qad/utils/qpicalculator/icons/zoom-in.png | Bin 791 -> 0 bytes .../qpicalculator/icons/zoom-original.png | Bin 781 -> 0 bytes qad/utils/qpicalculator/icons/zoom-out.png | Bin 786 -> 0 bytes qad/utils/qpicalculator/icons/zoom-range.png | Bin 1311 -> 0 bytes qad/utils/qpicalculator/icons/zoom-rect.png | Bin 1378 -> 0 bytes qad/utils/qpicalculator/mainwindow.ui | 2 +- qad/utils/qpicalculator/qpicalculator.qrc | 6 +- qcd_utils/CMakeLists.txt | 78 -- qcd_utils/LICENSE.txt | 165 --- qcd_utils/pult/CMakeLists.txt | 36 - qcd_utils/pult/cdpult.qrc | 16 - .../Apps-accessories-calculator-icon.png | Bin 9661 -> 0 bytes qcd_utils/pult/icons/dialog-cancel.png | Bin 45200 -> 0 bytes qcd_utils/pult/icons/dialog-ok-apply.png | Bin 24550 -> 0 bytes qcd_utils/pult/icons/document-revert.png | Bin 2885 -> 0 bytes qcd_utils/pult/icons/format-stroke-color.png | Bin 24156 -> 0 bytes qcd_utils/pult/icons/view-refresh.png | Bin 40505 -> 0 bytes qglengine/CMakeLists.txt | 2 +- qglengine/widgets/CMakeLists.txt | 2 +- qglview/CMakeLists.txt | 2 +- 356 files changed, 5334 insertions(+), 6298 deletions(-) delete mode 100644 android.toolchain.cmake.add create mode 100644 piqt/libs/CMakeLists.txt create mode 100644 piqt/libs/core/CMakeLists.txt rename piqt/{ => libs/core}/piqt.cpp (100%) rename piqt/{ => libs/core}/piqt.h (100%) create mode 100644 piqt/libs/qcd/CMakeLists.txt rename {qcd_utils => piqt/libs/qcd}/qcd_core.cpp (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_core.h (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_graphic.cpp (94%) rename {qcd_utils => piqt/libs/qcd}/qcd_graphic.h (95%) rename {qcd_utils => piqt/libs/qcd}/qcd_graphic.ui (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_modedialog.cpp (95%) rename {qcd_utils => piqt/libs/qcd}/qcd_modedialog.h (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_modedialog.ui (95%) rename {qcd_utils => piqt/libs/qcd}/qcd_model.cpp (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_model.h (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_view.cpp (96%) rename {qcd_utils => piqt/libs/qcd}/qcd_view.h (96%) create mode 100644 piqt/libs/widgets/CMakeLists.txt rename {piqt_utils => piqt/libs/widgets}/piqt_connection_edit.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_connection_edit.h (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_connection_edit.ui (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_connection_view.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_connection_view.h (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_highlighter.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_highlighter.h (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_iodevice_edit.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_iodevice_edit.h (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_iodevice_edit_dialog.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_iodevice_edit_dialog.h (100%) rename {piqt_utils => piqt/libs/widgets}/piqt_iodevice_edit_dialog.ui (100%) rename {piqt_utils => piqt/libs/widgets}/qpiconnection.cpp (100%) rename {piqt_utils => piqt/libs/widgets}/qpiconnection.h (100%) create mode 100644 piqt/utils/CMakeLists.txt create mode 100644 piqt/utils/cd_pult/CMakeLists.txt rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk.cpp (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk.h (94%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk.ui (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk_type_dialog.cpp (95%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk_type_dialog.h (95%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cddirectk_type_dialog.ui (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdgraphics.cpp (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdgraphics.h (94%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdgraphics.ui (96%) create mode 100644 piqt/utils/cd_pult/cdpult.qrc rename {qcd_utils/pult => piqt/utils/cd_pult}/cdpultwindow.cpp (97%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdpultwindow.h (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdpultwindow.ui (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdviewwidget.cpp (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdviewwidget.h (96%) rename {qcd_utils/pult => piqt/utils/cd_pult}/cdviewwidget.ui (96%) rename {piqt_utils/piconnedit => piqt/utils/cd_pult}/icons/Apps-accessories-calculator-icon.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/icons/accessories-text-editor.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/icons/db-export.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/icons/db-import.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/icons/flame.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/icons/timer.png (100%) rename {qcd_utils/pult => piqt/utils/cd_pult}/main.cpp (97%) create mode 100644 piqt/utils/piconnedit/CMakeLists.txt create mode 100644 piqt/utils/piconnedit/piconnedit.qrc rename {piqt_utils => piqt/utils}/piconnedit/piconnedit_main.cpp (100%) create mode 100644 piqt/utils/pidumper/CMakeLists.txt rename {piqt_utils => piqt/utils}/pidumper/pidumper.cpp (100%) rename {piqt_utils => piqt/utils}/pidumper/pidumper.h (100%) rename {piqt_utils => piqt/utils}/pidumper/pidumper.ui (100%) rename {piqt_utils => piqt/utils}/pidumper/pidumper_main.cpp (100%) create mode 100644 piqt/utils/piintrospector/CMakeLists.txt rename {piqt_utils => piqt/utils}/piintrospector/containers_view.cpp (100%) rename {piqt_utils => piqt/utils}/piintrospector/containers_view.h (100%) rename {piqt_utils => piqt/utils}/piintrospector/containers_view.ui (100%) rename {piqt_utils => piqt/utils}/piintrospector/objects_view.cpp (100%) rename {piqt_utils => piqt/utils}/piintrospector/objects_view.h (100%) rename {piqt_utils => piqt/utils}/piintrospector/objects_view.ui (100%) rename {piqt_utils => piqt/utils}/piintrospector/piintrospector.cpp (100%) rename {piqt_utils => piqt/utils}/piintrospector/piintrospector.h (100%) rename {piqt_utils => piqt/utils}/piintrospector/piintrospector.ui (100%) rename {piqt_utils => piqt/utils}/piintrospector/piintrospector_main.cpp (100%) rename {piqt_utils => piqt/utils}/piintrospector/threads_view.cpp (100%) rename {piqt_utils => piqt/utils}/piintrospector/threads_view.h (100%) rename {piqt_utils => piqt/utils}/piintrospector/threads_view.ui (100%) delete mode 100644 piqt_utils/CMakeLists.txt delete mode 100644 piqt_utils/LICENSE.txt delete mode 100644 piqt_utils/piconnedit/CMakeLists.txt delete mode 100644 piqt_utils/piconnedit/icons/DALI-designer.png delete mode 100644 piqt_utils/piconnedit/icons/alpha.png delete mode 100644 piqt_utils/piconnedit/icons/application-exit.png delete mode 100644 piqt_utils/piconnedit/icons/applications-engineering.png delete mode 100644 piqt_utils/piconnedit/icons/archive-extract.png delete mode 100644 piqt_utils/piconnedit/icons/archive-insert-directory.png delete mode 100644 piqt_utils/piconnedit/icons/archive-insert.png delete mode 100644 piqt_utils/piconnedit/icons/arrow-down.png delete mode 100644 piqt_utils/piconnedit/icons/arrow-up.png delete mode 100644 piqt_utils/piconnedit/icons/axis_x.png delete mode 100644 piqt_utils/piconnedit/icons/axis_y.png delete mode 100644 piqt_utils/piconnedit/icons/case-sensitive.png delete mode 100644 piqt_utils/piconnedit/icons/checkbox-unchecked.png delete mode 100644 piqt_utils/piconnedit/icons/checkbox.png delete mode 100644 piqt_utils/piconnedit/icons/clients.png delete mode 100644 piqt_utils/piconnedit/icons/close.png delete mode 100644 piqt_utils/piconnedit/icons/code-error.png delete mode 100644 piqt_utils/piconnedit/icons/code-function.png delete mode 100644 piqt_utils/piconnedit/icons/code-keyword.png delete mode 100644 piqt_utils/piconnedit/icons/code-parents.png delete mode 100644 piqt_utils/piconnedit/icons/code-property.png delete mode 100644 piqt_utils/piconnedit/icons/code-signal.png delete mode 100644 piqt_utils/piconnedit/icons/code-struct.png delete mode 100644 piqt_utils/piconnedit/icons/code-union.png delete mode 100644 piqt_utils/piconnedit/icons/code-variable.png delete mode 100644 piqt_utils/piconnedit/icons/code-word.png delete mode 100644 piqt_utils/piconnedit/icons/configure-.png delete mode 100644 piqt_utils/piconnedit/icons/configure.png delete mode 100644 piqt_utils/piconnedit/icons/database.png delete mode 100644 piqt_utils/piconnedit/icons/debug-run.png delete mode 100644 piqt_utils/piconnedit/icons/designer-qt4.png delete mode 100644 piqt_utils/piconnedit/icons/dialog-close.png delete mode 100644 piqt_utils/piconnedit/icons/dialog-ok-apply.png delete mode 100644 piqt_utils/piconnedit/icons/dialog-warning.png delete mode 100644 piqt_utils/piconnedit/icons/disabled.png delete mode 100644 piqt_utils/piconnedit/icons/distribute-horizontal-margin.png delete mode 100644 piqt_utils/piconnedit/icons/document-edit.png delete mode 100644 piqt_utils/piconnedit/icons/document-new.png delete mode 100644 piqt_utils/piconnedit/icons/document-open.png delete mode 100644 piqt_utils/piconnedit/icons/document-print.png delete mode 100644 piqt_utils/piconnedit/icons/document-save-.png delete mode 100644 piqt_utils/piconnedit/icons/document-save-all.png delete mode 100644 piqt_utils/piconnedit/icons/document-save-as.png delete mode 100644 piqt_utils/piconnedit/icons/document-save.png delete mode 100644 piqt_utils/piconnedit/icons/edit-clear-.png delete mode 100644 piqt_utils/piconnedit/icons/edit-clear-locationbar-rtl.png delete mode 100644 piqt_utils/piconnedit/icons/edit-clear.png delete mode 100644 piqt_utils/piconnedit/icons/edit-copy.png delete mode 100644 piqt_utils/piconnedit/icons/edit-cut.png delete mode 100644 piqt_utils/piconnedit/icons/edit-delete.png delete mode 100644 piqt_utils/piconnedit/icons/edit-find-.png delete mode 100644 piqt_utils/piconnedit/icons/edit-find.png delete mode 100644 piqt_utils/piconnedit/icons/edit-guides.png delete mode 100644 piqt_utils/piconnedit/icons/edit-paste.png delete mode 100644 piqt_utils/piconnedit/icons/edit-redo.png delete mode 100644 piqt_utils/piconnedit/icons/edit-table-insert-row-below.png delete mode 100644 piqt_utils/piconnedit/icons/edit-undo.png delete mode 100644 piqt_utils/piconnedit/icons/employees.png delete mode 100644 piqt_utils/piconnedit/icons/expand_s_x.png delete mode 100644 piqt_utils/piconnedit/icons/expand_s_y.png delete mode 100644 piqt_utils/piconnedit/icons/expand_x.png delete mode 100644 piqt_utils/piconnedit/icons/expand_y.png delete mode 100644 piqt_utils/piconnedit/icons/format-text-subscript.png delete mode 100644 piqt_utils/piconnedit/icons/games-solve.png delete mode 100644 piqt_utils/piconnedit/icons/go-jump.png delete mode 100644 piqt_utils/piconnedit/icons/go-next.png delete mode 100644 piqt_utils/piconnedit/icons/go-previous.png delete mode 100644 piqt_utils/piconnedit/icons/graphics.png delete mode 100644 piqt_utils/piconnedit/icons/groups-edit.png delete mode 100644 piqt_utils/piconnedit/icons/item-add.png delete mode 100644 piqt_utils/piconnedit/icons/item.png delete mode 100644 piqt_utils/piconnedit/icons/lastmoves.png delete mode 100644 piqt_utils/piconnedit/icons/led_3.png delete mode 100644 piqt_utils/piconnedit/icons/led_off.png delete mode 100644 piqt_utils/piconnedit/icons/led_on.png delete mode 100644 piqt_utils/piconnedit/icons/light-+.png delete mode 100644 piqt_utils/piconnedit/icons/light--.png delete mode 100644 piqt_utils/piconnedit/icons/light-254.png delete mode 100644 piqt_utils/piconnedit/icons/light-disable-all.png delete mode 100644 piqt_utils/piconnedit/icons/light-disable.png delete mode 100644 piqt_utils/piconnedit/icons/light-down.png delete mode 100644 piqt_utils/piconnedit/icons/light-edit.png delete mode 100644 piqt_utils/piconnedit/icons/light-max.png delete mode 100644 piqt_utils/piconnedit/icons/light-min.png delete mode 100644 piqt_utils/piconnedit/icons/light-off.png delete mode 100644 piqt_utils/piconnedit/icons/light-on.png delete mode 100644 piqt_utils/piconnedit/icons/light-step-down.png delete mode 100644 piqt_utils/piconnedit/icons/light-step-up.png delete mode 100644 piqt_utils/piconnedit/icons/light-up.png delete mode 100644 piqt_utils/piconnedit/icons/lights.png delete mode 100644 piqt_utils/piconnedit/icons/list-add.png delete mode 100644 piqt_utils/piconnedit/icons/list-remove.png delete mode 100644 piqt_utils/piconnedit/icons/log_parser.png delete mode 100644 piqt_utils/piconnedit/icons/mail.png delete mode 100644 piqt_utils/piconnedit/icons/media-flash.png delete mode 100644 piqt_utils/piconnedit/icons/media-playback-pause.png delete mode 100644 piqt_utils/piconnedit/icons/media-playback-stop.png delete mode 100644 piqt_utils/piconnedit/icons/media-record.png delete mode 100644 piqt_utils/piconnedit/icons/node-add.png delete mode 100644 piqt_utils/piconnedit/icons/node.png delete mode 100644 piqt_utils/piconnedit/icons/object-locked.png delete mode 100644 piqt_utils/piconnedit/icons/piconnection.png delete mode 100644 piqt_utils/piconnedit/icons/piconnection.xcf delete mode 100644 piqt_utils/piconnedit/icons/quickopen.png delete mode 100644 piqt_utils/piconnedit/icons/run-build-install-root.png delete mode 100644 piqt_utils/piconnedit/icons/run-build.png delete mode 100644 piqt_utils/piconnedit/icons/scenes-edit.png delete mode 100644 piqt_utils/piconnedit/icons/select-add.png delete mode 100644 piqt_utils/piconnedit/icons/select-intersect.png delete mode 100644 piqt_utils/piconnedit/icons/select-invert.png delete mode 100644 piqt_utils/piconnedit/icons/select-none.png delete mode 100644 piqt_utils/piconnedit/icons/select-replace.png delete mode 100644 piqt_utils/piconnedit/icons/select-subtract.png delete mode 100644 piqt_utils/piconnedit/icons/splash.png delete mode 100644 piqt_utils/piconnedit/icons/status-off.png delete mode 100644 piqt_utils/piconnedit/icons/status-on.png delete mode 100644 piqt_utils/piconnedit/icons/status-warn.png delete mode 100644 piqt_utils/piconnedit/icons/system-help.png delete mode 100644 piqt_utils/piconnedit/icons/tool-light-add.png delete mode 100644 piqt_utils/piconnedit/icons/tool-selection.png delete mode 100644 piqt_utils/piconnedit/icons/tools-wizard.png delete mode 100644 piqt_utils/piconnedit/icons/transform-move.png delete mode 100644 piqt_utils/piconnedit/icons/variable-add.png delete mode 100644 piqt_utils/piconnedit/icons/variable-copy.png delete mode 100644 piqt_utils/piconnedit/icons/variable-edit.png delete mode 100644 piqt_utils/piconnedit/icons/variable-remove.png delete mode 100644 piqt_utils/piconnedit/icons/view-grid.png delete mode 100644 piqt_utils/piconnedit/icons/view-refresh.png delete mode 100644 piqt_utils/piconnedit/icons/warning-a.png delete mode 100644 piqt_utils/piconnedit/icons/warning-id.png delete mode 100644 piqt_utils/piconnedit/icons/window-close.png delete mode 100644 piqt_utils/piconnedit/icons/zoom-fit-best.png delete mode 100644 piqt_utils/piconnedit/icons/zoom-in.png delete mode 100644 piqt_utils/piconnedit/icons/zoom-out.png delete mode 100644 piqt_utils/piconnedit/icons/zoom-range.png delete mode 100644 piqt_utils/piconnedit/icons/zoom-rect.png delete mode 100644 piqt_utils/piconnedit/piconnedit.qrc delete mode 100644 piqt_utils/pidumper/CMakeLists.txt delete mode 100644 piqt_utils/piintrospector/CMakeLists.txt create mode 100644 qad/cmake/QADMacros.cmake rename {qcd_utils/pult => qad}/icons/dialog-information.png (100%) create mode 100644 qad/icons/document-revert.png delete mode 100644 qad/utils/qpicalculator/icons/Apps-accessories-calculator-icon.png delete mode 100644 qad/utils/qpicalculator/icons/application-exit.png delete mode 100644 qad/utils/qpicalculator/icons/arrow-left.png delete mode 100644 qad/utils/qpicalculator/icons/arrow-right.png delete mode 100644 qad/utils/qpicalculator/icons/axes.png delete mode 100644 qad/utils/qpicalculator/icons/axes_1.png delete mode 100644 qad/utils/qpicalculator/icons/character-set.png delete mode 100644 qad/utils/qpicalculator/icons/configure.png delete mode 100644 qad/utils/qpicalculator/icons/dialog-close.png delete mode 100644 qad/utils/qpicalculator/icons/document-close.png delete mode 100644 qad/utils/qpicalculator/icons/document-edit.png delete mode 100644 qad/utils/qpicalculator/icons/document-open.png delete mode 100644 qad/utils/qpicalculator/icons/document-revert.png delete mode 100644 qad/utils/qpicalculator/icons/document-save-as.png delete mode 100644 qad/utils/qpicalculator/icons/document-save.png delete mode 100644 qad/utils/qpicalculator/icons/edit-clear-locationbar-rtl.png delete mode 100644 qad/utils/qpicalculator/icons/edit-clear.png delete mode 100644 qad/utils/qpicalculator/icons/edit-copy.png delete mode 100644 qad/utils/qpicalculator/icons/edit-cut.png delete mode 100644 qad/utils/qpicalculator/icons/edit-delete.png delete mode 100644 qad/utils/qpicalculator/icons/edit-find.png delete mode 100644 qad/utils/qpicalculator/icons/edit-guides.png delete mode 100644 qad/utils/qpicalculator/icons/edit-paste.png delete mode 100644 qad/utils/qpicalculator/icons/edit-redo.png delete mode 100644 qad/utils/qpicalculator/icons/edit-undo.png delete mode 100644 qad/utils/qpicalculator/icons/empty_brick.png delete mode 100644 qad/utils/qpicalculator/icons/format-fill-color.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-bold.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-color.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-italic.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-overline.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-strikethrough.png delete mode 100644 qad/utils/qpicalculator/icons/format-text-underline.png delete mode 100644 qad/utils/qpicalculator/icons/go-home.png delete mode 100644 qad/utils/qpicalculator/icons/go-next.png delete mode 100644 qad/utils/qpicalculator/icons/go-previous.png delete mode 100644 qad/utils/qpicalculator/icons/graphic_add.png delete mode 100644 qad/utils/qpicalculator/icons/graphics.png delete mode 100644 qad/utils/qpicalculator/icons/help-contents.png delete mode 100644 qad/utils/qpicalculator/icons/history_brick_add.png delete mode 100644 qad/utils/qpicalculator/icons/history_brick_del.png delete mode 100644 qad/utils/qpicalculator/icons/history_brick_move.png delete mode 100644 qad/utils/qpicalculator/icons/history_conn_add.png delete mode 100644 qad/utils/qpicalculator/icons/history_conn_del.png delete mode 100644 qad/utils/qpicalculator/icons/history_conn_edit.png delete mode 100644 qad/utils/qpicalculator/icons/history_conn_retrace.png delete mode 100644 qad/utils/qpicalculator/icons/history_convert.png delete mode 100644 qad/utils/qpicalculator/icons/history_freq.png delete mode 100644 qad/utils/qpicalculator/icons/history_point.xcf delete mode 100644 qad/utils/qpicalculator/icons/history_point_add.png delete mode 100644 qad/utils/qpicalculator/icons/history_point_del.png delete mode 100644 qad/utils/qpicalculator/icons/history_point_move.png delete mode 100644 qad/utils/qpicalculator/icons/history_seg_add.png delete mode 100644 qad/utils/qpicalculator/icons/history_seg_del.png delete mode 100644 qad/utils/qpicalculator/icons/history_seg_move.png delete mode 100644 qad/utils/qpicalculator/icons/history_text_add.png delete mode 100644 qad/utils/qpicalculator/icons/history_text_del.png delete mode 100644 qad/utils/qpicalculator/icons/history_text_edit.png delete mode 100644 qad/utils/qpicalculator/icons/history_text_move.png delete mode 100644 qad/utils/qpicalculator/icons/initial.png delete mode 100644 qad/utils/qpicalculator/icons/insert-image.png delete mode 100644 qad/utils/qpicalculator/icons/insert-text.png delete mode 100644 qad/utils/qpicalculator/icons/layer-visible-off.png delete mode 100644 qad/utils/qpicalculator/icons/layer-visible-on.png delete mode 100644 qad/utils/qpicalculator/icons/list-add.png delete mode 100644 qad/utils/qpicalculator/icons/mbricks.svg delete mode 100644 qad/utils/qpicalculator/icons/mbricks_128.png delete mode 100644 qad/utils/qpicalculator/icons/mbricks_22.png delete mode 100644 qad/utils/qpicalculator/icons/mbricks_256.png delete mode 100644 qad/utils/qpicalculator/icons/mbricks_64.png delete mode 100644 qad/utils/qpicalculator/icons/media-playback-pause.png delete mode 100644 qad/utils/qpicalculator/icons/media-playback-start.png delete mode 100644 qad/utils/qpicalculator/icons/media-playback-stop.png delete mode 100644 qad/utils/qpicalculator/icons/media-skip-forward.png delete mode 100644 qad/utils/qpicalculator/icons/object-flip-horizontal.png delete mode 100644 qad/utils/qpicalculator/icons/player-time.png delete mode 100644 qad/utils/qpicalculator/icons/preferences-desktop-display.png delete mode 100644 qad/utils/qpicalculator/icons/preferences-desktop-keyboard.png create mode 100644 qad/utils/qpicalculator/icons/qpicalculator.ico create mode 100644 qad/utils/qpicalculator/icons/qpicalculator.png delete mode 100644 qad/utils/qpicalculator/icons/run-build.png delete mode 100644 qad/utils/qpicalculator/icons/tree.png delete mode 100644 qad/utils/qpicalculator/icons/view-center.png delete mode 100644 qad/utils/qpicalculator/icons/view-fullscreen.png delete mode 100644 qad/utils/qpicalculator/icons/view-grid.png delete mode 100644 qad/utils/qpicalculator/icons/view-mode-compact.png delete mode 100644 qad/utils/qpicalculator/icons/view-mode-expanded.png delete mode 100644 qad/utils/qpicalculator/icons/view-mode-icon.png delete mode 100644 qad/utils/qpicalculator/icons/view-refresh.png delete mode 100644 qad/utils/qpicalculator/icons/view-restore.png delete mode 100644 qad/utils/qpicalculator/icons/view-tooltips.png delete mode 100644 qad/utils/qpicalculator/icons/window-new.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-fit-best.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-in.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-original.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-out.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-range.png delete mode 100644 qad/utils/qpicalculator/icons/zoom-rect.png delete mode 100644 qcd_utils/CMakeLists.txt delete mode 100644 qcd_utils/LICENSE.txt delete mode 100644 qcd_utils/pult/CMakeLists.txt delete mode 100644 qcd_utils/pult/cdpult.qrc delete mode 100644 qcd_utils/pult/icons/Apps-accessories-calculator-icon.png delete mode 100644 qcd_utils/pult/icons/dialog-cancel.png delete mode 100644 qcd_utils/pult/icons/dialog-ok-apply.png delete mode 100644 qcd_utils/pult/icons/document-revert.png delete mode 100644 qcd_utils/pult/icons/format-stroke-color.png delete mode 100644 qcd_utils/pult/icons/view-refresh.png diff --git a/CMakeLists.txt b/CMakeLists.txt index d4431bc..528514c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,8 @@ endif() set(_COMPANY SHS) set(_DOMAIN org.SHS) include_directories(${CMAKE_CURRENT_BINARY_DIR}/pip) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/qad) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/piqt) if(MINGW) find_package(MinGW REQUIRED) else() @@ -115,6 +117,7 @@ if(WIN32) endif() set(QAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qad) +set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) if (CROSSTOOLS) @@ -154,9 +157,10 @@ else() message(STATUS "Building Qt-derived targets for ${QtVersions}") add_subdirectory(qad) include_directories(${qad_includes}) - set(_DIRS piqt piqt_utils qcd_utils) + add_subdirectory(piqt) + include_directories(${piqt_includes}) + set(_DIRS) if (Qt5) - list(APPEND _DIRS) if (QGLVIEW) list(APPEND _DIRS qglview) endif() @@ -166,16 +170,11 @@ else() endif() foreach(_D ${_DIRS}) list(APPEND QT_MULTILIB_LIST ${_D}) + add_subdirectory(${_D}) endforeach(_D) - include_directories(piqt) else() message(STATUS "None of Qt found, skip Qt-derived targets") endif() - include_directories(cd_utils) - list(INSERT _DIRS 0 cd_utils) - foreach(_D ${_DIRS}) - add_subdirectory(${_D}) - endforeach(_D) endif() diff --git a/SDKMacros.cmake b/SDKMacros.cmake index 77db2e1..2e933e0 100644 --- a/SDKMacros.cmake +++ b/SDKMacros.cmake @@ -1,35 +1,96 @@ -macro(sdk_install _DIR _TARGET _H_FILES _QM_FILES) +macro(sdk_install _DIR IS_APP _TARGET _H_FILES _QM_FILES) #message("QM=${_QM_FILES}") if(LIB) if(WIN32) - if(NOT "x${_H_FILES}" STREQUAL "x") - install(FILES ${_H_FILES} DESTINATION ${MINGW_INCLUDE}/${_DIR}) + if (${IS_APP}) + qt_install(TARGETS ${_TARGET} DESTINATION ${MINGW_BIN}) + qt_install(TARGETS ${_TARGET} DESTINATION QtBin) + else() + if(NOT "x${_H_FILES}" STREQUAL "x") + install(FILES ${_H_FILES} DESTINATION ${MINGW_INCLUDE}/${_DIR}) + endif() + qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION ${MINGW_LIB}) + qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION ${MINGW_BIN}) + qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION QtBin) endif() - qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION ${MINGW_LIB}) - qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION ${MINGW_BIN}) - qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION QtBin) else() - if (NOT "x${_H_FILES}" STREQUAL "x") - install(FILES ${_H_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${_DIR}) + if (${IS_APP}) + qt_install(TARGETS ${_TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + else() + if (NOT "x${_H_FILES}" STREQUAL "x") + install(FILES ${_H_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${_DIR}) + endif() + qt_install(TARGETS ${_TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) endif() - qt_install(TARGETS ${_TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) endif() if(NOT "x${_QM_FILES}" STREQUAL "x") qt_install(LANG ${_QM_FILES} DESTINATION QtLang) endif() else() - if(NOT "x${_H_FILES}" STREQUAL "x") - install(FILES ${_H_FILES} DESTINATION include/${_DIR}) - endif() - if(WIN32) - qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION bin) - qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION lib) + if(${IS_APP}) + qt_install(TARGETS ${_TARGET} DESTINATION bin) else() - qt_install(TARGETS ${_TARGET} DESTINATION lib) + if(NOT "x${_H_FILES}" STREQUAL "x") + install(FILES ${_H_FILES} DESTINATION include/${_DIR}) + endif() + if(WIN32) + qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION bin) + qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION lib) + else() + qt_install(TARGETS ${_TARGET} DESTINATION lib) + endif() endif() if(NOT "x${_QM_FILES}" STREQUAL "x") qt_install(LANG ${_QM_FILES} DESTINATION lang) endif() endif() endmacro() + + +macro(add_directories_with_include multilib_prefix) + set(DIRS) + file(GLOB _dl "[^.]*") + foreach(_d ${_dl}) + if(IS_DIRECTORY ${_d}) + list(APPEND DIRS ${_d}) + endif() + endforeach() + + set(inc_var ${multilib_prefix}includes) + set(${inc_var}) + foreach(_d ${DIRS}) + get_filename_component(_dname "${_d}" NAME) + list(APPEND QT_MULTILIB_LIST ${multilib_prefix}${_dname}) + list(APPEND ${inc_var} "${_d}") + endforeach() + + foreach(_d ${DIRS}) + include_directories(${_d}) + endforeach() + foreach(_d ${DIRS}) + add_subdirectory(${_d}) + endforeach() + + set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE) + set(${inc_var} ${${inc_var}} PARENT_SCOPE) + if (LIB) + set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) + endif() +endmacro() + + +macro(add_directories multilib_prefix) + include_directories(${${multilib_prefix}includes}) + file(GLOB _dl "[^.]*") + foreach(_d ${_dl}) + if(IS_DIRECTORY ${_d}) + add_subdirectory(${_d}) + endif() + endforeach() + + if (LIB) + set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) + endif() +endmacro() + diff --git a/android.toolchain.cmake.add b/android.toolchain.cmake.add deleted file mode 100644 index 58617f7..0000000 --- a/android.toolchain.cmake.add +++ /dev/null @@ -1,6 +0,0 @@ -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST) -set(CMAKE_PREFIX_PATH /soft/android/${ANDROID_ABI}) -list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH}/lib) -include_directories(${CMAKE_PREFIX_PATH}/include) diff --git a/cd_utils/CMakeLists.txt b/cd_utils/CMakeLists.txt index c58b05e..9ac1c9b 100644 --- a/cd_utils/CMakeLists.txt +++ b/cd_utils/CMakeLists.txt @@ -1,67 +1,16 @@ cmake_minimum_required(VERSION 3.0) project(cd_utils) -if (NOT LIBPROJECT) - find_package(PIP REQUIRED) - option(LIB "System install" 1) - option(DEBUG "Build with -g3" 0) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall") - if (DEBUG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") - endif() -endif() -if (MINGW) - find_package(MinGW REQUIRED) -endif() +find_package(MinGW REQUIRED) include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${PIP_INCLUDES}) -#file(GLOB HDRS_UTILS "*.h") -#file(GLOB CPPS_UTILS "*.cpp") file(GLOB CPPS_UTILS "cdutils_*.cpp") file(GLOB HDRS_UTILS "cdutils_*.h") -if (DEFINED ENV{QNX_HOST}) - add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS}) -else() - add_library(${PROJECT_NAME} SHARED ${CPPS_UTILS} ${HDRS_UTILS}) -endif() +add_library(${PROJECT_NAME} SHARED ${CPPS_UTILS} ${HDRS_UTILS}) target_link_libraries(${PROJECT_NAME} ${PIP_LIBRARY}) -# # Apple crosscompiling rpath patch -# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH) - # foreach(_RP ${CMAKE_INSTALL_RPATH}) - # add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - # COMMAND "${CMAKE_INSTALL_NAME_TOOL}" - # "-add_rpath" "${_RP}" - # "$/$" - # COMMENT "Add to ${PROJECT_NAME} rpath \"${_RP}\"") - # endforeach() -# endif() - add_executable(cdutilstest "cdutilstest.cpp" "cdtest.h") target_link_libraries(cdutilstest ${PIP_LIBRARY} ${PROJECT_NAME}) message(STATUS "Building ${PROJECT_NAME}") -if(NOT LIBPROJECT) - if(LIB) - if(WIN32) - if(MINGW) - set(CMAKE_INSTALL_PREFIX ${MINGW_DIR}) - endif() - else() - if (DEFINED ANDROID_PLATFORM) - set(CMAKE_INSTALL_PREFIX ${ANDROID_SYSTEM_LIBRARY_PATH}/usr) - else() - if(CMAKE_CROSSCOMPILING) - set(CMAKE_INSTALL_PREFIX ${CMAKE_STAGING_PREFIX}) - else() - set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX}/usr/local) - endif() - endif() - endif() - message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") - else() - message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"") - endif() -endif() - if(LIB) list(APPEND _ALL_TARGETS ${PROJECT_NAME}) set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) diff --git a/pip b/pip index ccd6a98..fec6829 160000 --- a/pip +++ b/pip @@ -1 +1 @@ -Subproject commit ccd6a9888f0b77834fd01dd278f2f1022fa6db58 +Subproject commit fec68299c17f9e66f6a7cf88e171c490b44b8031 diff --git a/piqt/CMakeLists.txt b/piqt/CMakeLists.txt index ca1c9a8..27028b2 100644 --- a/piqt/CMakeLists.txt +++ b/piqt/CMakeLists.txt @@ -1,49 +1,50 @@ cmake_minimum_required(VERSION 3.0) -project(piqt) -if(NOT LIBPROJECT) - find_package(PIP REQUIRED) - option(LIB "System install" 0) - option(DEBUG "Build with -g3" 0) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall") - if(DEBUG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") - endif() +cmake_policy(SET CMP0017 NEW) # need include() with .cmake +set(_PIQt_MAJOR 1) +set(_PIQt_MINOR 0) +set(_PIQt_REVISION 0) +set(_PIQt_SUFFIX ) +set(_PIQt_COMPANY SHS) +set(_PIQt_DOMAIN org.SHS) +if(NOT DEFINED BUILD_NUMBER) + set(BUILD_NUMBER 9999) endif() -find_package(QAD REQUIRED) -list(APPEND QT_MULTILIB_LIST ${PROJECT_NAME}) +set(PIQt_LIB_TYPE SHARED) + +set(QAD_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/piqt_version.h") +set_version(PIQt + MAJOR "${_PIQt_MAJOR}" + MINOR "${_PIQt_MINOR}" + REVISION "${_PIQt_REVISION}" + BUILD "${BUILD_NUMBER}" + SUFFIX "${_PIQt_SUFFIX}" + OUTPUT "${PIQt_VERSION_FILE}") +set_deploy_property(PIQt ${_PIQt_LIB_TYPE} + FULLNAME "${_PIQt_DOMAIN}.*" + COMPANY "${_PIQt_COMPANY}") + +include(QADMacros) + +macro(piqt_library NAME _MODULES _LIBS) + _qt_project(${NAME} FALSE "PIQt" "${_MODULES}" "pip;${_LIBS}" ${ARGN}) + _qt_install(${NAME} FALSE "pip" "out_HDR" "out_QM") +endmacro() + +macro(piqt_application NAME _MODULES _LIBS) + _qt_project(${NAME} TRUE "PIQt" "${_MODULES}" "pip;${_LIBS}" ${ARGN}) + _qt_install(${NAME} TRUE "pip" "" "out_QM") +endmacro() + + +include_directories(${PIP_INCLUDES}) +add_subdirectory(libs) +if (UTILS) + add_subdirectory(utils) +endif() + set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE) -include_directories(${PIP_INCLUDES} ${QAD_INCLUDES}) -file(GLOB SRC "*.h" "*.cpp" "*.ui" "*.qrc" "lang/*.ts") -find_qt(${QtVersions} Core Gui Positioning) -qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) -qt_add_library(${PROJECT_NAME} SHARED out_CPP) -qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets) -message(STATUS "Building ${PROJECT_NAME}") -if(LIBPROJECT) - sdk_install("pip" "${PROJECT_NAME}" "${out_HDR}" "${out_QM}") -else() - if(LIB) - if(WIN32) - install(FILES ${out_HDR} DESTINATION ${MINGW_INCLUDE}/pip) - if(NOT "x${out_QM}" STREQUAL "x") - qt_install(FILES ${out_QM} DESTINATION QtLang) - endif() - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${MINGW_LIB}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${MINGW_BIN}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION QtBin) - else() - install(FILES ${out_HDR} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/pip) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) - endif() - message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") - else() - if(WIN32) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib) - else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION lib) - endif() - install(FILES ${out_HDR} DESTINATION include/pip) - message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"") - endif() +set(piqt_includes ${piqt_includes} PARENT_SCOPE) +if (LIB) + set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) endif() + diff --git a/piqt/libs/CMakeLists.txt b/piqt/libs/CMakeLists.txt new file mode 100644 index 0000000..c20718c --- /dev/null +++ b/piqt/libs/CMakeLists.txt @@ -0,0 +1 @@ +add_directories_with_include("piqt_") diff --git a/piqt/libs/core/CMakeLists.txt b/piqt/libs/core/CMakeLists.txt new file mode 100644 index 0000000..fc48469 --- /dev/null +++ b/piqt/libs/core/CMakeLists.txt @@ -0,0 +1 @@ +piqt_library(piqt "Gui;Positioning" "qad_utils;qad_widgets") diff --git a/piqt/piqt.cpp b/piqt/libs/core/piqt.cpp similarity index 100% rename from piqt/piqt.cpp rename to piqt/libs/core/piqt.cpp diff --git a/piqt/piqt.h b/piqt/libs/core/piqt.h similarity index 100% rename from piqt/piqt.h rename to piqt/libs/core/piqt.h diff --git a/piqt/libs/qcd/CMakeLists.txt b/piqt/libs/qcd/CMakeLists.txt new file mode 100644 index 0000000..f3e84e8 --- /dev/null +++ b/piqt/libs/qcd/CMakeLists.txt @@ -0,0 +1 @@ +piqt_library(qcd_utils "Gui" "pip;qad_utils;qad_widgets;qad_graphic;cd_utils;piqt") diff --git a/qcd_utils/qcd_core.cpp b/piqt/libs/qcd/qcd_core.cpp similarity index 96% rename from qcd_utils/qcd_core.cpp rename to piqt/libs/qcd/qcd_core.cpp index c77e70e..95511a8 100644 --- a/qcd_utils/qcd_core.cpp +++ b/piqt/libs/qcd/qcd_core.cpp @@ -1,297 +1,297 @@ -#include "qcd_core.h" -#include "cdutils_k.h" -#include "cdutils_core.h" -#include "piqt.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace CDUtils; - - -int __QCore_Initializer__::count_(0); -QCDCore * __QCore_Initializer__::__instance__(0); - - -__QCore_Initializer__::__QCore_Initializer__() { - count_++; - if (count_ > 1) return; - __instance__ = new QCDCore(); -} - - -__QCore_Initializer__::~__QCore_Initializer__() { - count_--; - if (count_ > 0) return; - if (__instance__ != 0) { - delete __instance__; - __instance__ = 0; - } -} - - - - -QCDCore::QCDCore() { - setObjectName("QCDCore"); - setName("QCDCore"); - CONNECTU(&K, changedGlobal, this, K_ChangedGlobal); - updating = direct_on = false; -} - - -QCDCore::~QCDCore() { -} - - -void QCDCore::K_ChangedGlobal() { - QMetaObject::invokeMethod(this, "updateBindedWidgets", Qt::QueuedConnection); -} - - -void QCDCore::slotBool(bool v) { - QWidget * w = (QWidget*)sender(); - if (!w || updating) return; - QList > pathes = binded_widgets.values(w); - foreach (const PIDeque & path, pathes) - K[path].setValue(PIString::fromBool(v)); - K.calculate(); - emit updateViewRequest(); -} - - -void QCDCore::slotInt(int v) { - QWidget * w = (QWidget*)sender(); - if (!w || updating) return; - QList > pathes = binded_widgets.values(w); - foreach (const PIDeque & path, pathes) - K[path].setValue(PIString::fromNumber(v)); - finishEdit(pathes); -} - - -void QCDCore::slotDouble(double v) { - QWidget * w = (QWidget*)sender(); - if (!w || updating) return; - QList > pathes = binded_widgets.values(w); - foreach (const PIDeque & path, pathes) - K[path].setValue(PIString::fromNumber(v)); - finishEdit(pathes); -} - - -void QCDCore::slotText(QString v) { - QWidget * w = (QWidget*)sender(); - if (!w || updating) return; - QList > pathes = binded_widgets.values(w); - foreach (const PIDeque & path, pathes) - K[path].setValue(Q2PIString(v)); - finishEdit(pathes); -} - - -void QCDCore::slotVariant(QVariant v) { - QWidget * w = (QWidget*)sender(); - if (!w || updating) return; - QList > pathes = binded_widgets.values(w); - foreach (const PIDeque & path, pathes) - K[path].setVariantValue(Q2PIVariant(v)); - finishEdit(pathes); -} - - -void QCDCore::slotDestroyed(QObject * o) { - if (!o) return; - if (!binded_widgets.contains((QWidget*)o)) return; - binded_widgets.remove((QWidget*)o); -} - - -int QCDCore::bindWindow(QWidget * wnd) { - if (!wnd) return 0; - //K.root().makePath(); - return bindWidgets(wnd->findChildren()); -} - - -int QCDCore::bindWidgets(QList wl) { - int ret = 0; - foreach (QWidget * w, wl) - if (bindWidget(w)) ++ret; - return ret; -} - - -bool QCDCore::bindWidget(QWidget * w) { - if (!w) return false; - QString on = w->objectName(); - QString cn = w->metaObject()->className(); - if (cn == "CDView") { - bindView(w); - return false; - } - PIVector ak = K.root().children(); - piForeachC (CDType * k, ak) { - if (!on.endsWith(PI2QString(k->pathString().join("_")))) continue; - if (bindWidget(w, *k)) return true; - } - return false; -} - - -bool QCDCore::bindWidget(QWidget * w, const CDType & k) { - if (!w) return false; - //piCout << "bind..." << k.name() << k.path(); - QString cn = w->metaObject()->className(); - bool ok = false; - if (cn == "QCheckBox" || cn == "QGroupBox") { - connect(w, SIGNAL(toggled(bool)), this, SLOT(slotBool(bool)), Qt::UniqueConnection); - ok = true; - } - if (cn == "QSpinBox" || cn == "QSlider" || cn == "QScrollBar") { - connect(w, SIGNAL(valueChanged(int)), this, SLOT(slotInt(int)), Qt::UniqueConnection); - ok = true; - } - if (cn == "QDoubleSpinBox" || cn == "SpinSlider" || cn == "EvalSpinBox") { - connect(w, SIGNAL(valueChanged(double)), this, SLOT(slotDouble(double)), Qt::UniqueConnection); - ok = true; - } - if (cn == "QLineEdit" || cn == "CLineEdit") { - connect(w, SIGNAL(textChanged(QString)), this, SLOT(slotText(QString)), Qt::UniqueConnection); - ok = true; - } - if (cn == "QVariantEdit") { - connect(w, SIGNAL(valueChanged(QVariant)), this, SLOT(slotVariant(QVariant)), Qt::UniqueConnection); - ok = true; - } - if (cn == "CDView") { - bindView(w); - } - connect(w, SIGNAL(destroyed(QObject*)), this, SLOT(slotDestroyed(QObject*)), Qt::UniqueConnection); - setWidgetValue(w, k); - if (!ok) return false; - //piCout << k.name() << k.path() << "ok"; - binded_widgets.insert(w, k.path()); - return true; -} - - -void QCDCore::updateBindedWidgets() { - QMapIterator > it(binded_widgets); - QWidgetList to_remove; - updating = true; - while (it.hasNext()) { - QWidget * w = it.next().key(); - if (!K.exists(it.value())) - to_remove << w; - else - setWidgetValue(w, K[it.value()]); - } - foreach (QWidget * w, to_remove) - unbindWidget(w); - updating = false; -} - - -void QCDCore::bindView(QWidget * v) { - CDView * w = qobject_cast(v); - if (!w) return; - connect(this, SIGNAL(updateViewRequest()), w, SLOT(refreshValues()), Qt::UniqueConnection); -} - - -void QCDCore::setWidgetValue(QWidget * w, const CDType & k) { - if (!w) return; - QString cn = w->metaObject()->className(); - if (cn == "QCheckBox") qobject_cast(w)->setChecked(k.toBool()); - if (cn == "QGroupBox") qobject_cast(w)->setChecked(k.toBool()); - if (cn == "QSpinBox") qobject_cast(w)->setValue(k.toInt()); - if (cn == "QSlider") qobject_cast(w)->setValue(k.toInt()); - if (cn == "QScrollBar") qobject_cast(w)->setValue(k.toInt()); - if (cn == "QDoubleSpinBox") qobject_cast(w)->setValue(k.toDouble()); - if (cn == "SpinSlider") qobject_cast(w)->setValue(k.toDouble()); - if (cn == "QLineEdit") qobject_cast(w)->setText(PI2QString(k.value())); - if (cn == "CLineEdit") qobject_cast(w)->setText(PI2QString(k.value())); - if (cn == "EvalSpinBox") qobject_cast(w)->setValue(k.toDouble()); - if (cn == "QVariantEdit") qobject_cast(w)->setValue(PI2QVariant(k.variantValue())); -} - - -void QCDCore::finishEdit(const QList > & pathes) { - K.calculate(); - if (direct_on) { - foreach (const PIDeque & path, pathes) - K.directChange(K[path]); - } - emit updateViewRequest(); -} - - -int QCDCore::unbindWindow(QWidget * wnd) { - if (!wnd) return 0; - return unbindWidgets(wnd->findChildren()); -} - - -int QCDCore::unbindWidgets(QList wl) { - int ret = 0; - foreach (QWidget * w, wl) - if (unbindWidget(w)) ++ret; - return ret; -} - - -bool QCDCore::unbindWidget(QWidget * w) { - if (!w) return false; - //qDebug() << "unbind" << w; - if (!binded_widgets.contains(w)) return false; - QString cn = w->metaObject()->className(); - if (cn == "QCheckBox" || cn == "QGroupBox") - disconnect(w, SIGNAL(toggled(bool)), this, SLOT(slotBool(bool))); - if (cn == "QSpinBox" || cn == "QSlider" || cn == "QScrollBar") - disconnect(w, SIGNAL(valueChanged(int)), this, SLOT(slotInt(int))); - if (cn == "QDoubleSpinBox" || cn == "SpinSlider" || cn == "EvalSpinBox") - disconnect(w, SIGNAL(valueChanged(double)), this, SLOT(slotDouble(double))); - if (cn == "QLineEdit" || cn == "CLineEdit") - disconnect(w, SIGNAL(textChanged(QString)), this, SLOT(slotText(QString))); - if (cn == "QVariantEdit") - disconnect(w, SIGNAL(valueChanged(QVariant)), this, SLOT(slotVariant(QVariant))); - //qDebug() << "remove b" << binded_widgets.size(); - binded_widgets.remove(w); - //qDebug() << "remove a" << binded_widgets.size(); - return true; -} - - -void QCDCore::unbindAllWidgets() { - QMap > bwm = binded_widgets; - QMapIterator > it(bwm); - while (it.hasNext()) { - QWidget * w = it.next().key(); - unbindWidget(w); - } - binded_widgets.clear(); -} - - -void QCDCore::updateBindedWidget(const CDType & k_) { - QMapIterator > it(binded_widgets); - updating = true; - while (it.hasNext()) { - QWidget * w = it.next().key(); - const CDType & k(K[it.value()]); - if (k.path() != k_.path()) continue; - setWidgetValue(w, k); - } - updating = false; -} +#include "qcd_core.h" +#include "cdutils_k.h" +#include "cdutils_core.h" +#include "piqt.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace CDUtils; + + +int __QCore_Initializer__::count_(0); +QCDCore * __QCore_Initializer__::__instance__(0); + + +__QCore_Initializer__::__QCore_Initializer__() { + count_++; + if (count_ > 1) return; + __instance__ = new QCDCore(); +} + + +__QCore_Initializer__::~__QCore_Initializer__() { + count_--; + if (count_ > 0) return; + if (__instance__ != 0) { + delete __instance__; + __instance__ = 0; + } +} + + + + +QCDCore::QCDCore() { + setObjectName("QCDCore"); + setName("QCDCore"); + CONNECTU(&K, changedGlobal, this, K_ChangedGlobal); + updating = direct_on = false; +} + + +QCDCore::~QCDCore() { +} + + +void QCDCore::K_ChangedGlobal() { + QMetaObject::invokeMethod(this, "updateBindedWidgets", Qt::QueuedConnection); +} + + +void QCDCore::slotBool(bool v) { + QWidget * w = (QWidget*)sender(); + if (!w || updating) return; + QList > pathes = binded_widgets.values(w); + foreach (const PIDeque & path, pathes) + K[path].setValue(PIString::fromBool(v)); + K.calculate(); + emit updateViewRequest(); +} + + +void QCDCore::slotInt(int v) { + QWidget * w = (QWidget*)sender(); + if (!w || updating) return; + QList > pathes = binded_widgets.values(w); + foreach (const PIDeque & path, pathes) + K[path].setValue(PIString::fromNumber(v)); + finishEdit(pathes); +} + + +void QCDCore::slotDouble(double v) { + QWidget * w = (QWidget*)sender(); + if (!w || updating) return; + QList > pathes = binded_widgets.values(w); + foreach (const PIDeque & path, pathes) + K[path].setValue(PIString::fromNumber(v)); + finishEdit(pathes); +} + + +void QCDCore::slotText(QString v) { + QWidget * w = (QWidget*)sender(); + if (!w || updating) return; + QList > pathes = binded_widgets.values(w); + foreach (const PIDeque & path, pathes) + K[path].setValue(Q2PIString(v)); + finishEdit(pathes); +} + + +void QCDCore::slotVariant(QVariant v) { + QWidget * w = (QWidget*)sender(); + if (!w || updating) return; + QList > pathes = binded_widgets.values(w); + foreach (const PIDeque & path, pathes) + K[path].setVariantValue(Q2PIVariant(v)); + finishEdit(pathes); +} + + +void QCDCore::slotDestroyed(QObject * o) { + if (!o) return; + if (!binded_widgets.contains((QWidget*)o)) return; + binded_widgets.remove((QWidget*)o); +} + + +int QCDCore::bindWindow(QWidget * wnd) { + if (!wnd) return 0; + //K.root().makePath(); + return bindWidgets(wnd->findChildren()); +} + + +int QCDCore::bindWidgets(QList wl) { + int ret = 0; + foreach (QWidget * w, wl) + if (bindWidget(w)) ++ret; + return ret; +} + + +bool QCDCore::bindWidget(QWidget * w) { + if (!w) return false; + QString on = w->objectName(); + QString cn = w->metaObject()->className(); + if (cn == "CDView") { + bindView(w); + return false; + } + PIVector ak = K.root().children(); + piForeachC (CDType * k, ak) { + if (!on.endsWith(PI2QString(k->pathString().join("_")))) continue; + if (bindWidget(w, *k)) return true; + } + return false; +} + + +bool QCDCore::bindWidget(QWidget * w, const CDType & k) { + if (!w) return false; + //piCout << "bind..." << k.name() << k.path(); + QString cn = w->metaObject()->className(); + bool ok = false; + if (cn == "QCheckBox" || cn == "QGroupBox") { + connect(w, SIGNAL(toggled(bool)), this, SLOT(slotBool(bool)), Qt::UniqueConnection); + ok = true; + } + if (cn == "QSpinBox" || cn == "QSlider" || cn == "QScrollBar") { + connect(w, SIGNAL(valueChanged(int)), this, SLOT(slotInt(int)), Qt::UniqueConnection); + ok = true; + } + if (cn == "QDoubleSpinBox" || cn == "SpinSlider" || cn == "EvalSpinBox") { + connect(w, SIGNAL(valueChanged(double)), this, SLOT(slotDouble(double)), Qt::UniqueConnection); + ok = true; + } + if (cn == "QLineEdit" || cn == "CLineEdit") { + connect(w, SIGNAL(textChanged(QString)), this, SLOT(slotText(QString)), Qt::UniqueConnection); + ok = true; + } + if (cn == "QVariantEdit") { + connect(w, SIGNAL(valueChanged(QVariant)), this, SLOT(slotVariant(QVariant)), Qt::UniqueConnection); + ok = true; + } + if (cn == "CDView") { + bindView(w); + } + connect(w, SIGNAL(destroyed(QObject*)), this, SLOT(slotDestroyed(QObject*)), Qt::UniqueConnection); + setWidgetValue(w, k); + if (!ok) return false; + //piCout << k.name() << k.path() << "ok"; + binded_widgets.insert(w, k.path()); + return true; +} + + +void QCDCore::updateBindedWidgets() { + QMapIterator > it(binded_widgets); + QWidgetList to_remove; + updating = true; + while (it.hasNext()) { + QWidget * w = it.next().key(); + if (!K.exists(it.value())) + to_remove << w; + else + setWidgetValue(w, K[it.value()]); + } + foreach (QWidget * w, to_remove) + unbindWidget(w); + updating = false; +} + + +void QCDCore::bindView(QWidget * v) { + CDView * w = qobject_cast(v); + if (!w) return; + connect(this, SIGNAL(updateViewRequest()), w, SLOT(refreshValues()), Qt::UniqueConnection); +} + + +void QCDCore::setWidgetValue(QWidget * w, const CDType & k) { + if (!w) return; + QString cn = w->metaObject()->className(); + if (cn == "QCheckBox") qobject_cast(w)->setChecked(k.toBool()); + if (cn == "QGroupBox") qobject_cast(w)->setChecked(k.toBool()); + if (cn == "QSpinBox") qobject_cast(w)->setValue(k.toInt()); + if (cn == "QSlider") qobject_cast(w)->setValue(k.toInt()); + if (cn == "QScrollBar") qobject_cast(w)->setValue(k.toInt()); + if (cn == "QDoubleSpinBox") qobject_cast(w)->setValue(k.toDouble()); + if (cn == "SpinSlider") qobject_cast(w)->setValue(k.toDouble()); + if (cn == "QLineEdit") qobject_cast(w)->setText(PI2QString(k.value())); + if (cn == "CLineEdit") qobject_cast(w)->setText(PI2QString(k.value())); + if (cn == "EvalSpinBox") qobject_cast(w)->setValue(k.toDouble()); + if (cn == "QVariantEdit") qobject_cast(w)->setValue(PI2QVariant(k.variantValue())); +} + + +void QCDCore::finishEdit(const QList > & pathes) { + K.calculate(); + if (direct_on) { + foreach (const PIDeque & path, pathes) + K.directChange(K[path]); + } + emit updateViewRequest(); +} + + +int QCDCore::unbindWindow(QWidget * wnd) { + if (!wnd) return 0; + return unbindWidgets(wnd->findChildren()); +} + + +int QCDCore::unbindWidgets(QList wl) { + int ret = 0; + foreach (QWidget * w, wl) + if (unbindWidget(w)) ++ret; + return ret; +} + + +bool QCDCore::unbindWidget(QWidget * w) { + if (!w) return false; + //qDebug() << "unbind" << w; + if (!binded_widgets.contains(w)) return false; + QString cn = w->metaObject()->className(); + if (cn == "QCheckBox" || cn == "QGroupBox") + disconnect(w, SIGNAL(toggled(bool)), this, SLOT(slotBool(bool))); + if (cn == "QSpinBox" || cn == "QSlider" || cn == "QScrollBar") + disconnect(w, SIGNAL(valueChanged(int)), this, SLOT(slotInt(int))); + if (cn == "QDoubleSpinBox" || cn == "SpinSlider" || cn == "EvalSpinBox") + disconnect(w, SIGNAL(valueChanged(double)), this, SLOT(slotDouble(double))); + if (cn == "QLineEdit" || cn == "CLineEdit") + disconnect(w, SIGNAL(textChanged(QString)), this, SLOT(slotText(QString))); + if (cn == "QVariantEdit") + disconnect(w, SIGNAL(valueChanged(QVariant)), this, SLOT(slotVariant(QVariant))); + //qDebug() << "remove b" << binded_widgets.size(); + binded_widgets.remove(w); + //qDebug() << "remove a" << binded_widgets.size(); + return true; +} + + +void QCDCore::unbindAllWidgets() { + QMap > bwm = binded_widgets; + QMapIterator > it(bwm); + while (it.hasNext()) { + QWidget * w = it.next().key(); + unbindWidget(w); + } + binded_widgets.clear(); +} + + +void QCDCore::updateBindedWidget(const CDType & k_) { + QMapIterator > it(binded_widgets); + updating = true; + while (it.hasNext()) { + QWidget * w = it.next().key(); + const CDType & k(K[it.value()]); + if (k.path() != k_.path()) continue; + setWidgetValue(w, k); + } + updating = false; +} diff --git a/qcd_utils/qcd_core.h b/piqt/libs/qcd/qcd_core.h similarity index 96% rename from qcd_utils/qcd_core.h rename to piqt/libs/qcd/qcd_core.h index 01a8b0f..e29d1ee 100644 --- a/qcd_utils/qcd_core.h +++ b/piqt/libs/qcd/qcd_core.h @@ -1,96 +1,96 @@ -/* - QCD Utils - Qt bindings/utilites for CD Utils - - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#ifndef QCD_CORE_H -#define QCD_CORE_H - -#include -#include -#include -#include "piobject.h" -#include "cdutils_types.h" - - -class QCDCore; - - -class __QCore_Initializer__ { -public: - __QCore_Initializer__(); - ~__QCore_Initializer__(); - static int count_; - static QCDCore * __instance__; -}; - - -class QCDCore: public QObject, public PIObject -{ - Q_OBJECT - PIOBJECT(QCDCore) - friend class __QCore_Initializer__; -public: - static QCDCore * instance() {return __QCore_Initializer__::__instance__;} - - int bindWindow(QWidget * wnd); - int bindWidgets(QList wl); - bool bindWidget(QWidget * w); - bool bindWidget(QWidget * w, const CDUtils::CDType & k); - - int unbindWindow(QWidget * wnd); - int unbindWidgets(QList wl); - bool unbindWidget(QWidget * w); - void unbindAllWidgets(); - - void updateBindedWidget(const CDUtils::CDType & k_); - void setDirectKEnabled(bool yes) {direct_on = yes;} - bool isDirectKEnabled() const {return direct_on;} - -private: - QCDCore(); - ~QCDCore(); - - void bindView(QWidget * v); - void setWidgetValue(QWidget * w, const CDUtils::CDType & k); - void finishEdit(const QList > & pathes); - EVENT_HANDLER(void, K_ChangedGlobal); - - QMultiMap > binded_widgets; - bool updating, direct_on; - -private slots: - void slotBool(bool v); - void slotInt(int v); - void slotDouble(double v); - void slotText(QString v); - void slotVariant(QVariant v); - void slotDestroyed(QObject * ); - -public slots: - void updateBindedWidgets(); - -signals: - void updateViewRequest(); - -}; - - -static __QCore_Initializer__ __QCore_initializer__; - - -#endif // QCD_CORE_H +/* + QCD Utils - Qt bindings/utilites for CD Utils + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef QCD_CORE_H +#define QCD_CORE_H + +#include +#include +#include +#include "piobject.h" +#include "cdutils_types.h" + + +class QCDCore; + + +class __QCore_Initializer__ { +public: + __QCore_Initializer__(); + ~__QCore_Initializer__(); + static int count_; + static QCDCore * __instance__; +}; + + +class QCDCore: public QObject, public PIObject +{ + Q_OBJECT + PIOBJECT(QCDCore) + friend class __QCore_Initializer__; +public: + static QCDCore * instance() {return __QCore_Initializer__::__instance__;} + + int bindWindow(QWidget * wnd); + int bindWidgets(QList wl); + bool bindWidget(QWidget * w); + bool bindWidget(QWidget * w, const CDUtils::CDType & k); + + int unbindWindow(QWidget * wnd); + int unbindWidgets(QList wl); + bool unbindWidget(QWidget * w); + void unbindAllWidgets(); + + void updateBindedWidget(const CDUtils::CDType & k_); + void setDirectKEnabled(bool yes) {direct_on = yes;} + bool isDirectKEnabled() const {return direct_on;} + +private: + QCDCore(); + ~QCDCore(); + + void bindView(QWidget * v); + void setWidgetValue(QWidget * w, const CDUtils::CDType & k); + void finishEdit(const QList > & pathes); + EVENT_HANDLER(void, K_ChangedGlobal); + + QMultiMap > binded_widgets; + bool updating, direct_on; + +private slots: + void slotBool(bool v); + void slotInt(int v); + void slotDouble(double v); + void slotText(QString v); + void slotVariant(QVariant v); + void slotDestroyed(QObject * ); + +public slots: + void updateBindedWidgets(); + +signals: + void updateViewRequest(); + +}; + + +static __QCore_Initializer__ __QCore_initializer__; + + +#endif // QCD_CORE_H diff --git a/qcd_utils/qcd_graphic.cpp b/piqt/libs/qcd/qcd_graphic.cpp similarity index 94% rename from qcd_utils/qcd_graphic.cpp rename to piqt/libs/qcd/qcd_graphic.cpp index 5eac6f6..c53a9ae 100644 --- a/qcd_utils/qcd_graphic.cpp +++ b/piqt/libs/qcd/qcd_graphic.cpp @@ -1,40 +1,40 @@ -#include "qcd_graphic.h" -#include "ui_qcd_graphic.h" -#include "cdutils_core.h" -#include "cdutils_x.h" -#include "graphic.h" -#include "piqt.h" - -using namespace CDUtils; - - -CDGraphicWidget::CDGraphicWidget(QWidget * p): QWidget(p) { - ui = new Ui::CDGraphicWidget(); - ui->setupUi(this); - ui->graphic->setGraphicsCount(0); -} - - -Graphic * CDGraphicWidget::graphic() const { - return ui->graphic; -} - - -void CDGraphicWidget::setConfigVisible(bool on) { - ui->widgetConfig->setVisible(on); -} - - -bool CDGraphicWidget::isConfigVisible() const { - return ui->widgetConfig->isVisible(); -} - - -EvalSpinBox * CDGraphicWidget::evalSpinBoxHistory() { - return ui->evalHistory; -} - - -EvalSpinBox * CDGraphicWidget::evalSpinBoxVisible() { - return ui->evalVisible; -} +#include "qcd_graphic.h" +#include "ui_qcd_graphic.h" +#include "cdutils_core.h" +#include "cdutils_x.h" +#include "graphic.h" +#include "piqt.h" + +using namespace CDUtils; + + +CDGraphicWidget::CDGraphicWidget(QWidget * p): QWidget(p) { + ui = new Ui::CDGraphicWidget(); + ui->setupUi(this); + ui->graphic->setGraphicsCount(0); +} + + +Graphic * CDGraphicWidget::graphic() const { + return ui->graphic; +} + + +void CDGraphicWidget::setConfigVisible(bool on) { + ui->widgetConfig->setVisible(on); +} + + +bool CDGraphicWidget::isConfigVisible() const { + return ui->widgetConfig->isVisible(); +} + + +EvalSpinBox * CDGraphicWidget::evalSpinBoxHistory() { + return ui->evalHistory; +} + + +EvalSpinBox * CDGraphicWidget::evalSpinBoxVisible() { + return ui->evalVisible; +} diff --git a/qcd_utils/qcd_graphic.h b/piqt/libs/qcd/qcd_graphic.h similarity index 95% rename from qcd_utils/qcd_graphic.h rename to piqt/libs/qcd/qcd_graphic.h index 45529b4..cc876e4 100644 --- a/qcd_utils/qcd_graphic.h +++ b/piqt/libs/qcd/qcd_graphic.h @@ -1,66 +1,66 @@ -/* - QCD Utils - Qt bindings/utilites for CD Utils - - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#ifndef QCD_GRAPHIC_H -#define QCD_GRAPHIC_H - -#include -#include -#include - -namespace CDUtils { - class CDType; - class CDSection; -} - -namespace Ui { - class CDGraphicWidget; -} - -class Graphic; -class Graphic; - - -class CDGraphicWidget: public QWidget { - Q_OBJECT - friend class CDGraphics; - friend class GDockWidget; -public: - CDGraphicWidget(QWidget * p = 0); - - Graphic * graphic() const; - bool isConfigVisible() const; - - EvalSpinBox * evalSpinBoxHistory(); - EvalSpinBox * evalSpinBoxVisible(); - -public slots: - void setConfigVisible(bool on); - -private: - Ui::CDGraphicWidget * ui; - -private slots: - -signals: - -}; - - -#endif // QCD_GRAPHIC_H +/* + QCD Utils - Qt bindings/utilites for CD Utils + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef QCD_GRAPHIC_H +#define QCD_GRAPHIC_H + +#include +#include +#include + +namespace CDUtils { + class CDType; + class CDSection; +} + +namespace Ui { + class CDGraphicWidget; +} + +class Graphic; +class Graphic; + + +class CDGraphicWidget: public QWidget { + Q_OBJECT + friend class CDGraphics; + friend class GDockWidget; +public: + CDGraphicWidget(QWidget * p = 0); + + Graphic * graphic() const; + bool isConfigVisible() const; + + EvalSpinBox * evalSpinBoxHistory(); + EvalSpinBox * evalSpinBoxVisible(); + +public slots: + void setConfigVisible(bool on); + +private: + Ui::CDGraphicWidget * ui; + +private slots: + +signals: + +}; + + +#endif // QCD_GRAPHIC_H diff --git a/qcd_utils/qcd_graphic.ui b/piqt/libs/qcd/qcd_graphic.ui similarity index 96% rename from qcd_utils/qcd_graphic.ui rename to piqt/libs/qcd/qcd_graphic.ui index 511ed61..f08198f 100644 --- a/qcd_utils/qcd_graphic.ui +++ b/piqt/libs/qcd/qcd_graphic.ui @@ -1,169 +1,169 @@ - - - CDGraphicWidget - - - - 0 - 0 - 470 - 380 - - - - CD Pult - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Graphic::Autofit|Graphic::BorderInputs|Graphic::Clear|Graphic::Configure|Graphic::CursorAxis|Graphic::Fullscreen|Graphic::Legend|Graphic::OnlyExpandY|Graphic::Pause|Graphic::Save - - - false - - - false - - - 100.000000000000000 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - History: - - - - - - - 100.000000000000000 - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - Visible: - - - - - - - -1.000000000000000 - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - - - - - Graphic - QFrame -
graphic.h
-
- - EvalSpinBox - QWidget -
evalspinbox.h
-
-
- - - - evalHistory - valueChanged(double) - graphic - setHistorySize(double) - - - 148 - 363 - - - 156 - 297 - - - - - evalVisible - valueChanged(double) - graphic - setMaxVisibleTime(double) - - - 345 - 361 - - - 342 - 337 - - - - -
+ + + CDGraphicWidget + + + + 0 + 0 + 470 + 380 + + + + CD Pult + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Graphic::Autofit|Graphic::BorderInputs|Graphic::Clear|Graphic::Configure|Graphic::CursorAxis|Graphic::Fullscreen|Graphic::Legend|Graphic::OnlyExpandY|Graphic::Pause|Graphic::Save + + + false + + + false + + + 100.000000000000000 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + History: + + + + + + + 100.000000000000000 + + + + + + + Qt::Horizontal + + + + 1 + 20 + + + + + + + + Visible: + + + + + + + -1.000000000000000 + + + + + + + Qt::Horizontal + + + + 1 + 20 + + + + + + + + + + + + Graphic + QFrame +
graphic.h
+
+ + EvalSpinBox + QWidget +
evalspinbox.h
+
+
+ + + + evalHistory + valueChanged(double) + graphic + setHistorySize(double) + + + 148 + 363 + + + 156 + 297 + + + + + evalVisible + valueChanged(double) + graphic + setMaxVisibleTime(double) + + + 345 + 361 + + + 342 + 337 + + + + +
diff --git a/qcd_utils/qcd_modedialog.cpp b/piqt/libs/qcd/qcd_modedialog.cpp similarity index 95% rename from qcd_utils/qcd_modedialog.cpp rename to piqt/libs/qcd/qcd_modedialog.cpp index 9612588..c6e2bb6 100644 --- a/qcd_utils/qcd_modedialog.cpp +++ b/piqt/libs/qcd/qcd_modedialog.cpp @@ -1,46 +1,46 @@ -#include "qcd_modedialog.h" -#include "ui_qcd_modedialog.h" - - -QCDModeDialog::QCDModeDialog(QWidget * parent): QDialog(parent) { - ui = new Ui::QCDModeDialog(); - ui->setupUi(this); -} - - -QCDModeDialog::~QCDModeDialog() { - delete ui; -} - - -CDUtils::UpdateModeFlags QCDModeDialog::mode() const { - CDUtils::UpdateModeFlags ret = 0; - if (ui->checkSaveIndex->isChecked()) ret |= CDUtils::SaveByIndex; - if (ui->checkSaveName->isChecked()) ret |= CDUtils::SaveByName; - if (ui->checkMerge->isChecked()) ret |= CDUtils::Merge; - return ret; -} - - -void QCDModeDialog::changeEvent(QEvent *e) { - QDialog::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} - - -void QCDModeDialog::on_checkSaveIndex_clicked(bool checked) { - if (!checked) return; - ui->checkSaveName->setChecked(false); -} - - -void QCDModeDialog::on_checkSaveName_clicked(bool checked) { - if (!checked) return; - ui->checkSaveIndex->setChecked(false); -} +#include "qcd_modedialog.h" +#include "ui_qcd_modedialog.h" + + +QCDModeDialog::QCDModeDialog(QWidget * parent): QDialog(parent) { + ui = new Ui::QCDModeDialog(); + ui->setupUi(this); +} + + +QCDModeDialog::~QCDModeDialog() { + delete ui; +} + + +CDUtils::UpdateModeFlags QCDModeDialog::mode() const { + CDUtils::UpdateModeFlags ret = 0; + if (ui->checkSaveIndex->isChecked()) ret |= CDUtils::SaveByIndex; + if (ui->checkSaveName->isChecked()) ret |= CDUtils::SaveByName; + if (ui->checkMerge->isChecked()) ret |= CDUtils::Merge; + return ret; +} + + +void QCDModeDialog::changeEvent(QEvent *e) { + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + + +void QCDModeDialog::on_checkSaveIndex_clicked(bool checked) { + if (!checked) return; + ui->checkSaveName->setChecked(false); +} + + +void QCDModeDialog::on_checkSaveName_clicked(bool checked) { + if (!checked) return; + ui->checkSaveIndex->setChecked(false); +} diff --git a/qcd_utils/qcd_modedialog.h b/piqt/libs/qcd/qcd_modedialog.h similarity index 96% rename from qcd_utils/qcd_modedialog.h rename to piqt/libs/qcd/qcd_modedialog.h index 5554d4d..c9e478b 100644 --- a/qcd_utils/qcd_modedialog.h +++ b/piqt/libs/qcd/qcd_modedialog.h @@ -1,50 +1,50 @@ -/* - QCD Utils - Qt bindings/utilites for CD Utils - - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#ifndef QCD_MODEDIALOG_H -#define QCD_MODEDIALOG_H - -#include -#include - -namespace Ui { - class QCDModeDialog; -} - -class QCDModeDialog: public QDialog -{ - Q_OBJECT -public: - explicit QCDModeDialog(QWidget * parent = 0); - ~QCDModeDialog(); - - CDUtils::UpdateModeFlags mode() const; - -protected: - void changeEvent(QEvent *e); - - Ui::QCDModeDialog * ui; - -private slots: - void on_checkSaveIndex_clicked(bool checked); - void on_checkSaveName_clicked(bool checked); - -}; - -#endif // QCD_MODEDIALOG_H +/* + QCD Utils - Qt bindings/utilites for CD Utils + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef QCD_MODEDIALOG_H +#define QCD_MODEDIALOG_H + +#include +#include + +namespace Ui { + class QCDModeDialog; +} + +class QCDModeDialog: public QDialog +{ + Q_OBJECT +public: + explicit QCDModeDialog(QWidget * parent = 0); + ~QCDModeDialog(); + + CDUtils::UpdateModeFlags mode() const; + +protected: + void changeEvent(QEvent *e); + + Ui::QCDModeDialog * ui; + +private slots: + void on_checkSaveIndex_clicked(bool checked); + void on_checkSaveName_clicked(bool checked); + +}; + +#endif // QCD_MODEDIALOG_H diff --git a/qcd_utils/qcd_modedialog.ui b/piqt/libs/qcd/qcd_modedialog.ui similarity index 95% rename from qcd_utils/qcd_modedialog.ui rename to piqt/libs/qcd/qcd_modedialog.ui index 0c3d1dd..38c2dff 100644 --- a/qcd_utils/qcd_modedialog.ui +++ b/piqt/libs/qcd/qcd_modedialog.ui @@ -1,98 +1,98 @@ - - - QCDModeDialog - - - - 0 - 0 - 251 - 152 - - - - Update description mode - - - - - - Save by index - - - - - - - Save by name - - - - - - - Merge - - - - - - - Qt::Vertical - - - - 20 - 1 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - QCDModeDialog - accept() - - - 106 - 131 - - - 101 - 146 - - - - - buttonBox - rejected() - QCDModeDialog - reject() - - - 182 - 127 - - - 169 - 146 - - - - - + + + QCDModeDialog + + + + 0 + 0 + 251 + 152 + + + + Update description mode + + + + + + Save by index + + + + + + + Save by name + + + + + + + Merge + + + + + + + Qt::Vertical + + + + 20 + 1 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + QCDModeDialog + accept() + + + 106 + 131 + + + 101 + 146 + + + + + buttonBox + rejected() + QCDModeDialog + reject() + + + 182 + 127 + + + 169 + 146 + + + + + diff --git a/qcd_utils/qcd_model.cpp b/piqt/libs/qcd/qcd_model.cpp similarity index 96% rename from qcd_utils/qcd_model.cpp rename to piqt/libs/qcd/qcd_model.cpp index 1f7fa32..d6ee620 100644 --- a/qcd_utils/qcd_model.cpp +++ b/piqt/libs/qcd/qcd_model.cpp @@ -1,460 +1,460 @@ -#include "qcd_model.h" -#include "cdutils_interface.h" -#include "cdutils_core.h" -#include "cdutils_x.h" -#include "piqt.h" -#include -#include -#include -#include -#include "qvariantedit.h" -#include "qad_types.h" - - -using namespace CDUtils; - -// CDKItem - -CDItem::CDItem(CDUtils::Interface * i, int _index, CDItem::CDItemType type, CDItem *parent) { - interface = i; - index_ = _index; - parent_ = parent; - type_ = type; - item_count = 0; - expanded = true; -} - - -CDItem::~CDItem() { - qDeleteAll(childs); -} - - -QVariant CDItem::data(int column, int role) const { - if (role == Qt::BackgroundRole) { - switch (type_) { - case ItemCDType: { - CDType & t(interface->section(buildPath())[index_]); - if (t.errorString().isEmpty()) return QBrush(QColor(255, 250, 230)); - else return QBrush(QColor(255, 128, 128)); - } - case ItemCDSection: return QBrush(QColor(230, 250, 230)); - } - } - if (role == Qt::CheckStateRole && type_ == ItemCDType) { - CDType & t(interface->section(buildPath())[index_]); - if (column == cValue && t.cd_type() == CDType::cdK) { - if (t.type() == "b") return t.toBool() ? Qt::Checked : Qt::Unchecked; - else QVariant(); - } - if (column == cName_Cmd && t.cd_type() == CDType::cdX) { - return t.isSelectedX() ? Qt::Checked : Qt::Unchecked; - } - } - if (role == Qt::ToolTipRole && type_ == ItemCDType) { - CDType & t(interface->section(buildPath())[index_]); - return PI2QString(t.errorString()); - } - if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant(); - PIDeque path = buildPath(); - CDSection & rs = interface->section(path); - CDSection s; - switch (type_) { - case ItemCDType: - switch (column) { - case cID: return QString::number(index_); - case cName_Cmd: return PI2QString(rs[index_].name()); - case cType: return stringType(rs[index_].type()); - case cXMode: return QVariant::fromValue(xModeEnum(rs[index_].xmode())); - case cXAvg: return rs[index_].avg(); - case cExpression: return PI2QString(rs[index_].formula()); - case cValue: return value(rs[index_], role); - case cComment: return PI2QString(rs[index_].comment()); - default: break; - } - break; - case ItemCDSection: - s = rs.section(index_); -// piCout << rs.name << rs.alias << s.name << s.alias; - switch (column) { - case cID: return QString("[") + QString::number(index_) + QString("]"); - case cName_Cmd: return PI2QString(s.alias); - case cType: return PI2QString(s.name); - default: break; - } - break; - } - return QVariant(); -} - - -QVariant CDItem::value(CDType & t, int role) const { - if (t.type() == "f") return t.toDouble(); - if (t.type() == "n") return t.toInt(); - if (t.type() == "b") return t.toBool(); - if (t.type() == "e") { - QAD::Enum et = PI2QADEnum(t.enumValues()); - et.selectValue(t.toInt()); - if (role == Qt::EditRole) return QVariant::fromValue(et); - else return et.selectedName(); - } - return PI2QString(t.value()); -} - - -bool CDItem::setData(int column, const QVariant & value) { - if (type_ == ItemCDType) { - CDType & t(interface->section(buildPath())[index_]); - if ((column == cExpression || column == cValue) && (t.cd_type() == CDType::cdK)) { - interface->section(buildPath())[index_].setValue(Q2PIString(value.toString())); - interface->calculate(); - return true; - } - if (t.cd_type() == CDType::cdX) { - switch (column) { - case cName_Cmd: - X.setEnabled(t, value.toBool()); - return true; - case cXMode: - t.setXMode((CDType::XMode)value.toInt()); - return true; - case cXAvg: - t.setAvg(piMax(value.toInt(), 1)); - return true; - default: break; - } - } - } - return false; -} - - -PIDeque CDItem::buildPath() const { - PIDeque path; - CDItem * p = parent_; - while (p) { - path.push_front(p->index_); - p = p->parent_; - } - path.take_front(); - return path; -} - - -QString CDItem::stringType(const PIString & t) const { - QString n = PI2QString(t); - if (n.isEmpty()) return QString(""); - switch (n[0].toLatin1()) { - case 'l': return QString("list"); break; - case 'b': return QString("bool"); break; - case 'n': return QString("int"); break; - case 'f': return QString("double"); break; - case 'c': return QString("color"); break; - case 'r': return QString("rect"); break; - case 'a': return QString("rect"); break; - case 'p': return QString("point"); break; - case 'v': return QString("vector"); break; - case 'i': return QString("IP"); break; - case 'e': return QString("enum"); break; - case 'F': return QString("file"); break; - case 'D': return QString("dir"); break; - } - return QString("string"); -} - - -QAD::Enum CDItem::xModeEnum(int v) const { - QAD::Enum ret; - ret << QAD::Enumerator(CDType::X_Current, "Current") - << QAD::Enumerator(CDType::X_All_Avg, "All, Averaging"); - ret.selectValue(v); - return ret; -} - - -// CDKDelegate - -CDDelegate::CDDelegate(QObject *parent) : QStyledItemDelegate(parent) { -} - - -void CDDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { - CDItem * item = ((CDItemModel*)index.model())->getItem(index); - if (item) { - if (item->itemType() == CDItem::ItemCDType && item->interface->cdType() == CDType::cdC) { - QStyleOptionButton bo; - bo.direction = option.direction; - bo.fontMetrics = option.fontMetrics; - bo.palette = option.palette; - bo.rect = option.rect; - bo.state = option.state;// & ~(QStyle::State_HasFocus | QStyle::State_MouseOver); - bo.text = item->data(1, Qt::DisplayRole).toString(); - QWidget * v = (QWidget*)(painter->device()); - if (v) { - QPoint cp = v->mapFromGlobal(QCursor::pos()); - if (bo.rect.contains(cp, true)) { - //bo.state |= QStyle::State_MouseOver; - if (qApp->mouseButtons().testFlag(Qt::LeftButton)) - bo.state |= QStyle::State_On; - } - } - qApp->style()->drawControl(QStyle::CE_PushButton, &bo, painter); - return; - } - } - QStyledItemDelegate::paint(painter, option, index); - -} - - -QWidget * CDDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { - return new QVariantEdit(parent); -} - - -void CDDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - QVariantEdit *edit = static_cast(editor); - edit->setValue(index.model()->data(index, Qt::EditRole)); -} - - -void CDDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - QVariantEdit *edit = static_cast(editor); - QVariant v = edit->value(); - if (v.canConvert()) { - QAD::Enum et = v.value(); - model->setData(index, et.selectedValue(), Qt::EditRole); - } else model->setData(index, v, Qt::EditRole); -} - - -void CDDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { - editor->setGeometry(option.rect); -} - - -QSize CDDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { - QSize s = QStyledItemDelegate::sizeHint(option, index); - s.setWidth(s.width() + 20); - return s; -} - - -// CDItemModel - -CDItemModel::CDItemModel(int type_, QObject *parent) : QAbstractItemModel(parent) { - interface = new Interface((CDType::cdT)type_); - root = 0; - internalRebuild(); -} - - -CDItemModel::~CDItemModel() { - delete root; - delete interface; -} - - -QVariant CDItemModel::data(const QModelIndex &index, int role) const { - if (!index.isValid()) return QVariant(); - CDItem * item = getItem(index); - return item->data(index.column(), role); -} - - -QVariant CDItemModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { - switch (section) { - case cID: return tr("Index"); - case cName_Cmd: return interface->cdType() == CDType::cdC ? tr("Command") : tr("Name"); - case cType: return tr("Type"); - case cXMode: return tr("Mode"); - case cXAvg: return tr("Averaging"); - case cExpression: return tr("Expression"); - case cValue: return tr("Value"); - case cComment: return tr("Comment"); - } - } - return QVariant(); -} - - -QModelIndex CDItemModel::index(int row, int column, const QModelIndex &parent) const { - if (parent.isValid() && parent.column() != cID) return QModelIndex(); - CDItem * p = getItem(parent); - CDItem * c = p->childs.value(row, 0); - if (c) return createIndex(row, column, c); - else return QModelIndex(); -} - - -QModelIndex CDItemModel::parent(const QModelIndex &index) const { - if (!index.isValid()) return QModelIndex(); - CDItem * c = getItem(index); - CDItem * p = c->parent_; - if (p == root) return QModelIndex(); - return createIndex(p->parent_->childs.indexOf(p), cID, p); -} - - -int CDItemModel::rowCount(const QModelIndex &parent) const { - CDItem * p = getItem(parent); - return p->childs.count(); -} - - -int CDItemModel::columnCount(const QModelIndex &parent) const { - return cLastColumn; -} - - -Qt::ItemFlags CDItemModel::flags(const QModelIndex & index) const { - if (!index.isValid()) return 0; - Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - CDItem * item = getItem(index); - if (!item) return 0; - if (item->type_ == CDItem::ItemCDType) { - CDType & t(interface->section(item->buildPath())[item->index_]); - if (t.cd_type() == CDType::cdK) { - if (index.column() == cExpression || index.column() == cValue) - f |= Qt::ItemIsEditable; - if (index.column() == cValue && t.type() == "b") - f |= Qt::ItemIsUserCheckable; - if (index.column() == cName_Cmd) - f |= Qt::ItemIsDragEnabled; - } - if (t.cd_type() == CDType::cdX) { - if (index.column() == cXMode || index.column() == cXAvg) - f |= Qt::ItemIsEditable; - if (index.column() == cName_Cmd) - f |= Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; - } - } - return f; -} - - -bool CDItemModel::setData(const QModelIndex & index, const QVariant & value, int role) { - if (role == Qt::CheckStateRole && (index.column() == cName_Cmd || index.column() == cValue)) { - CDItem * item = getItem(index); - if (item->type_ == CDItem::ItemCDType) { - CDType & t(interface->section(item->buildPath())[item->index_]); - if (index.column() == cValue && (t.cd_type() == CDType::cdK)) { - if (t.type() == "b") { - bool result = item->setData(index.column(), PI2QString(PIString::fromBool(value.toBool()))); - QModelIndex rin(CDItemModel::index(index.row(), cExpression, index.parent())); - emit dataChanged(rin, rin); - return result; - } - } - if (index.column() == cName_Cmd && (t.cd_type() == CDType::cdX)) { - bool result = item->setData(index.column(), value); - //QModelIndex rin(CDItemModel::index(index.row(), 1, index.parent())); - //emit dataChanged(rin, rin); - return result; - } - } - } - if (role != Qt::EditRole) return false; - CDItem * item = getItem(index); - bool result = item->setData(index.column(), value); - if (result) { - QModelIndex rin(CDItemModel::index(index.row(), cExpression, index.parent())); - emit dataChanged(rin, rin); - emit dataChanged(index, index); - } - return result; -} - - -QMimeData * CDItemModel::mimeData(const QModelIndexList & indexes) const { - if (indexes.size() == 1) { - QModelIndex index = indexes[0]; - if (index.isValid()/* && interface->cdType() == CDType::cdX*/) { - CDItem * item = getItem(index); - if (item) { - CDType & t(interface->section(item->buildPath())[item->index_]); - QMimeData * mime = new QMimeData(); - mime->setText(PI2QString(CDCore::instance()->typeLetter(interface->cdType()) + - CDCore::pathToString(t.path()))); - return mime; - } - } - } - return QAbstractItemModel::mimeData(indexes); -} - - -void CDItemModel::rebuildModel() { - beginResetModel(); - internalRebuild(); - endResetModel(); -} - - -void CDItemModel::buildItem(CDItem * it, CDSection & r) { - //piCout << "build item" << r.name << r.alias; - auto i = r.cd.makeIterator(); - while (i.next()) { - it->childs << new CDItem(interface, i.key(), CDItem::ItemCDType, it); - } - it->item_count = it->childs.size(); - auto j = r.s.makeIterator(); - while (j.next()) { - it->childs << new CDItem(interface, j.key(), CDItem::ItemCDSection, it); - buildItem(it->childs.back(), j.valueRef()); - } -} - - -void CDItemModel::updateModel() { - beginResetModel(); - endResetModel(); -} - - -void CDItemModel::internalRebuild() { - //qDebug() << "[CDKItemModel]" << "internalRebuild()"; - if (root) delete root; - root = new CDItem(interface, 0, CDItem::ItemCDSection, 0); - CDSection & r = interface->root(); - buildItem(root, r); -} - - -CDItem * CDItemModel::getItem(const QModelIndex &index) const { - if (index.isValid()) { - CDItem * item = static_cast(index.internalPointer()); - if (item) return item; - } - return root; -} - - -QModelIndex CDItemModel::indexByPath(const PIDeque & path, int column) const { - if (path.isEmpty()) return QModelIndex(); - CDItem * item = root; - //piCout << path << "..."; - bool ok = false; - for (int i = 0; i < path.size_s() - 1; ++i) { - ok = false; - foreach (CDItem * j, item->childs) - if (j->type_ == CDItem::ItemCDSection && j->index_ == path[i]) { - item = j; - ok = true; - break; - } - if (!ok) return QModelIndex(); - } - ok = false; - foreach (CDItem * j, item->childs) - if (j->type_ == CDItem::ItemCDType && j->index_ == path.back()) { - item = j; - ok = true; - break; - } - if (!ok || !item->parent_) return QModelIndex(); - QModelIndex ret = createIndex(item->parent_->childs.indexOf(item), column, item); - //piCout << path << Q2PIString(item->data(cName_Cmd, Qt::DisplayRole).toString()) << getItem(ret)->buildPath(); - return ret; -} +#include "qcd_model.h" +#include "cdutils_interface.h" +#include "cdutils_core.h" +#include "cdutils_x.h" +#include "piqt.h" +#include +#include +#include +#include +#include "qvariantedit.h" +#include "qad_types.h" + + +using namespace CDUtils; + +// CDKItem + +CDItem::CDItem(CDUtils::Interface * i, int _index, CDItem::CDItemType type, CDItem *parent) { + interface = i; + index_ = _index; + parent_ = parent; + type_ = type; + item_count = 0; + expanded = true; +} + + +CDItem::~CDItem() { + qDeleteAll(childs); +} + + +QVariant CDItem::data(int column, int role) const { + if (role == Qt::BackgroundRole) { + switch (type_) { + case ItemCDType: { + CDType & t(interface->section(buildPath())[index_]); + if (t.errorString().isEmpty()) return QBrush(QColor(255, 250, 230)); + else return QBrush(QColor(255, 128, 128)); + } + case ItemCDSection: return QBrush(QColor(230, 250, 230)); + } + } + if (role == Qt::CheckStateRole && type_ == ItemCDType) { + CDType & t(interface->section(buildPath())[index_]); + if (column == cValue && t.cd_type() == CDType::cdK) { + if (t.type() == "b") return t.toBool() ? Qt::Checked : Qt::Unchecked; + else QVariant(); + } + if (column == cName_Cmd && t.cd_type() == CDType::cdX) { + return t.isSelectedX() ? Qt::Checked : Qt::Unchecked; + } + } + if (role == Qt::ToolTipRole && type_ == ItemCDType) { + CDType & t(interface->section(buildPath())[index_]); + return PI2QString(t.errorString()); + } + if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant(); + PIDeque path = buildPath(); + CDSection & rs = interface->section(path); + CDSection s; + switch (type_) { + case ItemCDType: + switch (column) { + case cID: return QString::number(index_); + case cName_Cmd: return PI2QString(rs[index_].name()); + case cType: return stringType(rs[index_].type()); + case cXMode: return QVariant::fromValue(xModeEnum(rs[index_].xmode())); + case cXAvg: return rs[index_].avg(); + case cExpression: return PI2QString(rs[index_].formula()); + case cValue: return value(rs[index_], role); + case cComment: return PI2QString(rs[index_].comment()); + default: break; + } + break; + case ItemCDSection: + s = rs.section(index_); +// piCout << rs.name << rs.alias << s.name << s.alias; + switch (column) { + case cID: return QString("[") + QString::number(index_) + QString("]"); + case cName_Cmd: return PI2QString(s.alias); + case cType: return PI2QString(s.name); + default: break; + } + break; + } + return QVariant(); +} + + +QVariant CDItem::value(CDType & t, int role) const { + if (t.type() == "f") return t.toDouble(); + if (t.type() == "n") return t.toInt(); + if (t.type() == "b") return t.toBool(); + if (t.type() == "e") { + QAD::Enum et = PI2QADEnum(t.enumValues()); + et.selectValue(t.toInt()); + if (role == Qt::EditRole) return QVariant::fromValue(et); + else return et.selectedName(); + } + return PI2QString(t.value()); +} + + +bool CDItem::setData(int column, const QVariant & value) { + if (type_ == ItemCDType) { + CDType & t(interface->section(buildPath())[index_]); + if ((column == cExpression || column == cValue) && (t.cd_type() == CDType::cdK)) { + interface->section(buildPath())[index_].setValue(Q2PIString(value.toString())); + interface->calculate(); + return true; + } + if (t.cd_type() == CDType::cdX) { + switch (column) { + case cName_Cmd: + X.setEnabled(t, value.toBool()); + return true; + case cXMode: + t.setXMode((CDType::XMode)value.toInt()); + return true; + case cXAvg: + t.setAvg(piMax(value.toInt(), 1)); + return true; + default: break; + } + } + } + return false; +} + + +PIDeque CDItem::buildPath() const { + PIDeque path; + CDItem * p = parent_; + while (p) { + path.push_front(p->index_); + p = p->parent_; + } + path.take_front(); + return path; +} + + +QString CDItem::stringType(const PIString & t) const { + QString n = PI2QString(t); + if (n.isEmpty()) return QString(""); + switch (n[0].toLatin1()) { + case 'l': return QString("list"); break; + case 'b': return QString("bool"); break; + case 'n': return QString("int"); break; + case 'f': return QString("double"); break; + case 'c': return QString("color"); break; + case 'r': return QString("rect"); break; + case 'a': return QString("rect"); break; + case 'p': return QString("point"); break; + case 'v': return QString("vector"); break; + case 'i': return QString("IP"); break; + case 'e': return QString("enum"); break; + case 'F': return QString("file"); break; + case 'D': return QString("dir"); break; + } + return QString("string"); +} + + +QAD::Enum CDItem::xModeEnum(int v) const { + QAD::Enum ret; + ret << QAD::Enumerator(CDType::X_Current, "Current") + << QAD::Enumerator(CDType::X_All_Avg, "All, Averaging"); + ret.selectValue(v); + return ret; +} + + +// CDKDelegate + +CDDelegate::CDDelegate(QObject *parent) : QStyledItemDelegate(parent) { +} + + +void CDDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { + CDItem * item = ((CDItemModel*)index.model())->getItem(index); + if (item) { + if (item->itemType() == CDItem::ItemCDType && item->interface->cdType() == CDType::cdC) { + QStyleOptionButton bo; + bo.direction = option.direction; + bo.fontMetrics = option.fontMetrics; + bo.palette = option.palette; + bo.rect = option.rect; + bo.state = option.state;// & ~(QStyle::State_HasFocus | QStyle::State_MouseOver); + bo.text = item->data(1, Qt::DisplayRole).toString(); + QWidget * v = (QWidget*)(painter->device()); + if (v) { + QPoint cp = v->mapFromGlobal(QCursor::pos()); + if (bo.rect.contains(cp, true)) { + //bo.state |= QStyle::State_MouseOver; + if (qApp->mouseButtons().testFlag(Qt::LeftButton)) + bo.state |= QStyle::State_On; + } + } + qApp->style()->drawControl(QStyle::CE_PushButton, &bo, painter); + return; + } + } + QStyledItemDelegate::paint(painter, option, index); + +} + + +QWidget * CDDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { + return new QVariantEdit(parent); +} + + +void CDDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { + QVariantEdit *edit = static_cast(editor); + edit->setValue(index.model()->data(index, Qt::EditRole)); +} + + +void CDDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + QVariantEdit *edit = static_cast(editor); + QVariant v = edit->value(); + if (v.canConvert()) { + QAD::Enum et = v.value(); + model->setData(index, et.selectedValue(), Qt::EditRole); + } else model->setData(index, v, Qt::EditRole); +} + + +void CDDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { + editor->setGeometry(option.rect); +} + + +QSize CDDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { + QSize s = QStyledItemDelegate::sizeHint(option, index); + s.setWidth(s.width() + 20); + return s; +} + + +// CDItemModel + +CDItemModel::CDItemModel(int type_, QObject *parent) : QAbstractItemModel(parent) { + interface = new Interface((CDType::cdT)type_); + root = 0; + internalRebuild(); +} + + +CDItemModel::~CDItemModel() { + delete root; + delete interface; +} + + +QVariant CDItemModel::data(const QModelIndex &index, int role) const { + if (!index.isValid()) return QVariant(); + CDItem * item = getItem(index); + return item->data(index.column(), role); +} + + +QVariant CDItemModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + switch (section) { + case cID: return tr("Index"); + case cName_Cmd: return interface->cdType() == CDType::cdC ? tr("Command") : tr("Name"); + case cType: return tr("Type"); + case cXMode: return tr("Mode"); + case cXAvg: return tr("Averaging"); + case cExpression: return tr("Expression"); + case cValue: return tr("Value"); + case cComment: return tr("Comment"); + } + } + return QVariant(); +} + + +QModelIndex CDItemModel::index(int row, int column, const QModelIndex &parent) const { + if (parent.isValid() && parent.column() != cID) return QModelIndex(); + CDItem * p = getItem(parent); + CDItem * c = p->childs.value(row, 0); + if (c) return createIndex(row, column, c); + else return QModelIndex(); +} + + +QModelIndex CDItemModel::parent(const QModelIndex &index) const { + if (!index.isValid()) return QModelIndex(); + CDItem * c = getItem(index); + CDItem * p = c->parent_; + if (p == root) return QModelIndex(); + return createIndex(p->parent_->childs.indexOf(p), cID, p); +} + + +int CDItemModel::rowCount(const QModelIndex &parent) const { + CDItem * p = getItem(parent); + return p->childs.count(); +} + + +int CDItemModel::columnCount(const QModelIndex &parent) const { + return cLastColumn; +} + + +Qt::ItemFlags CDItemModel::flags(const QModelIndex & index) const { + if (!index.isValid()) return 0; + Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + CDItem * item = getItem(index); + if (!item) return 0; + if (item->type_ == CDItem::ItemCDType) { + CDType & t(interface->section(item->buildPath())[item->index_]); + if (t.cd_type() == CDType::cdK) { + if (index.column() == cExpression || index.column() == cValue) + f |= Qt::ItemIsEditable; + if (index.column() == cValue && t.type() == "b") + f |= Qt::ItemIsUserCheckable; + if (index.column() == cName_Cmd) + f |= Qt::ItemIsDragEnabled; + } + if (t.cd_type() == CDType::cdX) { + if (index.column() == cXMode || index.column() == cXAvg) + f |= Qt::ItemIsEditable; + if (index.column() == cName_Cmd) + f |= Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; + } + } + return f; +} + + +bool CDItemModel::setData(const QModelIndex & index, const QVariant & value, int role) { + if (role == Qt::CheckStateRole && (index.column() == cName_Cmd || index.column() == cValue)) { + CDItem * item = getItem(index); + if (item->type_ == CDItem::ItemCDType) { + CDType & t(interface->section(item->buildPath())[item->index_]); + if (index.column() == cValue && (t.cd_type() == CDType::cdK)) { + if (t.type() == "b") { + bool result = item->setData(index.column(), PI2QString(PIString::fromBool(value.toBool()))); + QModelIndex rin(CDItemModel::index(index.row(), cExpression, index.parent())); + emit dataChanged(rin, rin); + return result; + } + } + if (index.column() == cName_Cmd && (t.cd_type() == CDType::cdX)) { + bool result = item->setData(index.column(), value); + //QModelIndex rin(CDItemModel::index(index.row(), 1, index.parent())); + //emit dataChanged(rin, rin); + return result; + } + } + } + if (role != Qt::EditRole) return false; + CDItem * item = getItem(index); + bool result = item->setData(index.column(), value); + if (result) { + QModelIndex rin(CDItemModel::index(index.row(), cExpression, index.parent())); + emit dataChanged(rin, rin); + emit dataChanged(index, index); + } + return result; +} + + +QMimeData * CDItemModel::mimeData(const QModelIndexList & indexes) const { + if (indexes.size() == 1) { + QModelIndex index = indexes[0]; + if (index.isValid()/* && interface->cdType() == CDType::cdX*/) { + CDItem * item = getItem(index); + if (item) { + CDType & t(interface->section(item->buildPath())[item->index_]); + QMimeData * mime = new QMimeData(); + mime->setText(PI2QString(CDCore::instance()->typeLetter(interface->cdType()) + + CDCore::pathToString(t.path()))); + return mime; + } + } + } + return QAbstractItemModel::mimeData(indexes); +} + + +void CDItemModel::rebuildModel() { + beginResetModel(); + internalRebuild(); + endResetModel(); +} + + +void CDItemModel::buildItem(CDItem * it, CDSection & r) { + //piCout << "build item" << r.name << r.alias; + auto i = r.cd.makeIterator(); + while (i.next()) { + it->childs << new CDItem(interface, i.key(), CDItem::ItemCDType, it); + } + it->item_count = it->childs.size(); + auto j = r.s.makeIterator(); + while (j.next()) { + it->childs << new CDItem(interface, j.key(), CDItem::ItemCDSection, it); + buildItem(it->childs.back(), j.valueRef()); + } +} + + +void CDItemModel::updateModel() { + beginResetModel(); + endResetModel(); +} + + +void CDItemModel::internalRebuild() { + //qDebug() << "[CDKItemModel]" << "internalRebuild()"; + if (root) delete root; + root = new CDItem(interface, 0, CDItem::ItemCDSection, 0); + CDSection & r = interface->root(); + buildItem(root, r); +} + + +CDItem * CDItemModel::getItem(const QModelIndex &index) const { + if (index.isValid()) { + CDItem * item = static_cast(index.internalPointer()); + if (item) return item; + } + return root; +} + + +QModelIndex CDItemModel::indexByPath(const PIDeque & path, int column) const { + if (path.isEmpty()) return QModelIndex(); + CDItem * item = root; + //piCout << path << "..."; + bool ok = false; + for (int i = 0; i < path.size_s() - 1; ++i) { + ok = false; + foreach (CDItem * j, item->childs) + if (j->type_ == CDItem::ItemCDSection && j->index_ == path[i]) { + item = j; + ok = true; + break; + } + if (!ok) return QModelIndex(); + } + ok = false; + foreach (CDItem * j, item->childs) + if (j->type_ == CDItem::ItemCDType && j->index_ == path.back()) { + item = j; + ok = true; + break; + } + if (!ok || !item->parent_) return QModelIndex(); + QModelIndex ret = createIndex(item->parent_->childs.indexOf(item), column, item); + //piCout << path << Q2PIString(item->data(cName_Cmd, Qt::DisplayRole).toString()) << getItem(ret)->buildPath(); + return ret; +} diff --git a/qcd_utils/qcd_model.h b/piqt/libs/qcd/qcd_model.h similarity index 96% rename from qcd_utils/qcd_model.h rename to piqt/libs/qcd/qcd_model.h index bfc92da..30cc734 100644 --- a/qcd_utils/qcd_model.h +++ b/piqt/libs/qcd/qcd_model.h @@ -1,132 +1,132 @@ -/* - QCD Utils - Qt bindings/utilites for CD Utils - - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#ifndef QCD_MODEL_H -#define QCD_MODEL_H - -#include -#include -#include -#include "pistring.h" - -namespace CDUtils { - class CDType; - class CDSection; - class Interface; - - enum Column { - cID , - cName_Cmd , - cType , - cXMode , - cXAvg , - cExpression, - cValue , - cComment , - cLastColumn, - }; -} - -namespace QAD { - struct Enum; -} - -class CDItemModel; - - -class CDItem { - friend class CDItemModel; - friend class CDView; -public: - enum CDItemType{ItemCDType, ItemCDSection}; - CDItem(CDUtils::Interface * interface, int _index, CDItemType type, CDItem * parent); - ~CDItem(); - QVariant data(int column, int role) const; - QVariant value(CDUtils::CDType & t, int role) const; - bool setData(int column, const QVariant & value); - CDItemType itemType() const {return type_;} - PIDeque buildPath() const; - int index() const {return index_;} - - CDUtils::Interface * interface; - bool expanded; - -private: - QString stringType(const PIString & t) const; - QAD::Enum xModeEnum(int v) const; - - CDItem * parent_; - int index_, item_count; - CDItemType type_; - QList childs; -}; - - -class CDDelegate : public QStyledItemDelegate -{ - Q_OBJECT -public: - CDDelegate(QObject *parent = 0); - - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; - QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; - void setEditorData(QWidget *editor, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; - -}; - - -class CDItemModel : public QAbstractItemModel { - Q_OBJECT - friend class CDView; -public: - explicit CDItemModel(int type_, QObject *parent = 0); - ~CDItemModel(); - - QVariant data(const QModelIndex & index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex &index) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - Qt::ItemFlags flags(const QModelIndex &index) const; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); - QMimeData * mimeData(const QModelIndexList & indexes) const; - CDItem * getItem(const QModelIndex & index) const; - QModelIndex indexByPath(const PIDeque & path, int column = CDUtils::cID) const; - - void buildItem(CDItem * it, CDUtils::CDSection &r); - -public slots: - void rebuildModel(); - void updateModel(); - -private: - void internalRebuild(); - - CDUtils::Interface * interface; - CDItem * root; - -signals: - -}; - -#endif // QCD_MODEL_H +/* + QCD Utils - Qt bindings/utilites for CD Utils + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef QCD_MODEL_H +#define QCD_MODEL_H + +#include +#include +#include +#include "pistring.h" + +namespace CDUtils { + class CDType; + class CDSection; + class Interface; + + enum Column { + cID , + cName_Cmd , + cType , + cXMode , + cXAvg , + cExpression, + cValue , + cComment , + cLastColumn, + }; +} + +namespace QAD { + struct Enum; +} + +class CDItemModel; + + +class CDItem { + friend class CDItemModel; + friend class CDView; +public: + enum CDItemType{ItemCDType, ItemCDSection}; + CDItem(CDUtils::Interface * interface, int _index, CDItemType type, CDItem * parent); + ~CDItem(); + QVariant data(int column, int role) const; + QVariant value(CDUtils::CDType & t, int role) const; + bool setData(int column, const QVariant & value); + CDItemType itemType() const {return type_;} + PIDeque buildPath() const; + int index() const {return index_;} + + CDUtils::Interface * interface; + bool expanded; + +private: + QString stringType(const PIString & t) const; + QAD::Enum xModeEnum(int v) const; + + CDItem * parent_; + int index_, item_count; + CDItemType type_; + QList childs; +}; + + +class CDDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + CDDelegate(QObject *parent = 0); + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; + QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + +}; + + +class CDItemModel : public QAbstractItemModel { + Q_OBJECT + friend class CDView; +public: + explicit CDItemModel(int type_, QObject *parent = 0); + ~CDItemModel(); + + QVariant data(const QModelIndex & index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + QMimeData * mimeData(const QModelIndexList & indexes) const; + CDItem * getItem(const QModelIndex & index) const; + QModelIndex indexByPath(const PIDeque & path, int column = CDUtils::cID) const; + + void buildItem(CDItem * it, CDUtils::CDSection &r); + +public slots: + void rebuildModel(); + void updateModel(); + +private: + void internalRebuild(); + + CDUtils::Interface * interface; + CDItem * root; + +signals: + +}; + +#endif // QCD_MODEL_H diff --git a/qcd_utils/qcd_view.cpp b/piqt/libs/qcd/qcd_view.cpp similarity index 96% rename from qcd_utils/qcd_view.cpp rename to piqt/libs/qcd/qcd_view.cpp index 5ecea4c..619c46e 100644 --- a/qcd_utils/qcd_view.cpp +++ b/piqt/libs/qcd/qcd_view.cpp @@ -1,371 +1,371 @@ -#include -#include -#include -#include "cdutils_k.h" -#include "cdutils_x.h" -#include "cdutils_c.h" -#include "cdutils_m.h" -#include "cdutils_core.h" -#include "qcd_view.h" -#include "qcd_model.h" -#include "piqt.h" -#include "pifile.h" - -using namespace CDUtils; - - -CDView::CDView(QWidget * parent) : QTreeView(parent) { - type_ = -1; - model_ = 0; - proxy_ = 0; - connect(this, SIGNAL(clicked(QModelIndex)), this, SLOT(indexClicked(QModelIndex))); - connect(this, SIGNAL(_qcd_sendFailed()), this, SLOT(cd_sendFailed()), Qt::QueuedConnection); - connect(this, SIGNAL(_qcd_sendSucceed()), this, SLOT(cd_sendSucceed()), Qt::QueuedConnection); - connect(this, SIGNAL(_qcd_receiveFailed()), this, SLOT(cd_receiveFailed()), Qt::QueuedConnection); - connect(this, SIGNAL(_qcd_receiveSucceed()), this, SLOT(cd_receiveSucceed()), Qt::QueuedConnection); - connect(this, SIGNAL(_qcd_receivedX()), this, SLOT(cd_receivedX()), Qt::QueuedConnection); - connect(this, SIGNAL(_qcd_changedGlobal()), this, SLOT(cd_changedGlobal()), Qt::QueuedConnection); -} - - -CDView::~CDView() { - if (model_) { - delete model_; - delete proxy_; - } - model_ = 0; - proxy_ = 0; -} - - -void CDView::setType(int cdt) { - if (cdt < 0) return; - if (type_ >= 0) return; - type_ = cdt; - switch ((CDType::cdT)type_) { - case CDType::cdK: - CONNECTU(&K, sended, this, pi_cd_sendSucceed); - CONNECTU(&K, sendFailed, this, pi_cd_sendFailed); - CONNECTU(&K, received, this, pi_cd_receiveSucceed); - CONNECTU(&K, receiveFailed, this, pi_cd_receiveFailed); - CONNECTU(&K, changedGlobal, this, pi_cd_changedGlobal); - break; - case CDType::cdX: - CONNECTU(&X, sended, this, pi_cd_sendSucceed); - CONNECTU(&X, sendFailed, this, pi_cd_sendFailed); - CONNECTU(&X, received, this, pi_cd_receiveSucceed); - CONNECTU(&X, receiveFailed, this, pi_cd_receiveFailed); - CONNECTU(&X, receivedX, this, pi_cd_receivedX); - CONNECTU(&X, changedGlobal, this, pi_cd_changedGlobal); - break; - case CDType::cdC: - CONNECTU(&C, sended, this, pi_cd_sendSucceed); - CONNECTU(&C, sendFailed, this, pi_cd_sendFailed); - CONNECTU(&C, received, this, pi_cd_receiveSucceed); - CONNECTU(&C, receiveFailed, this, pi_cd_receiveFailed); - CONNECTU(&C, changedGlobal, this, pi_cd_changedGlobal); - break; - case CDType::cdM: - CONNECTU(&M, sended, this, pi_cd_sendSucceed); - CONNECTU(&M, sendFailed, this, pi_cd_sendFailed); - CONNECTU(&M, received, this, pi_cd_receiveSucceed); - CONNECTU(&M, receiveFailed, this, pi_cd_receiveFailed); - CONNECTU(&M, changedGlobal, this, pi_cd_changedGlobal); - CONNECTU(&M, messageReceived, this, pi_cd_messageReceived); - break; - default: break; - } - -} - - -void CDView::mousePressEvent(QMouseEvent * e) { - if (type_ == CDType::cdC) { - QModelIndex i = indexAt(e->pos()); - if (i.isValid() && i.column() == cName_Cmd) - update(i); - } - QTreeView::mousePressEvent(e); -} - - -void CDView::mouseReleaseEvent(QMouseEvent * e) { - if (type_ == CDType::cdC) { - QModelIndex i = indexAt(e->pos()); - if (i.isValid() && i.column() == cName_Cmd) - update(i); - } - QTreeView::mouseReleaseEvent(e); -} - - -void CDView::currentChanged(const QModelIndex & cur, const QModelIndex & prev) { - if (type_ == CDType::cdC) { - if (prev.isValid() && prev.column() == cName_Cmd) - update(prev); - } - QTreeView::currentChanged(cur, prev); -} - - -void CDView::refresh() { - if (type_ < 0) return; - if (!model_) { - model_ = new CDItemModel(type_); - proxy_ = new QSortFilterProxyModel(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - proxy_->setRecursiveFilteringEnabled(true); -#endif - proxy_->setFilterKeyColumn(-1); - proxy_->setFilterCaseSensitivity(Qt::CaseInsensitive); - proxy_->setSourceModel(model_); - setModel(proxy_); - setItemDelegateForColumn(type_ == CDType::cdC ? cName_Cmd : cValue, new CDDelegate()); - if (type_ == CDType::cdX) - setItemDelegateForColumn(cXMode, new CDDelegate()); - } - model_->rebuildModel(); - switch ((CDType::cdT)type_) { - case CDType::cdK: - setColumnHidden(cXMode, true); - setColumnHidden(cXAvg, true); - break; - case CDType::cdX: - setColumnHidden(cExpression, true); - break; - case CDType::cdC: - case CDType::cdM: - setColumnHidden(cType, true); - setColumnHidden(cXMode, true); - setColumnHidden(cXAvg, true); - setColumnHidden(cExpression, true); - setColumnHidden(cValue, true); - break; - default: break; - } - expandAll(); - for (int i = 0; i < model_->columnCount(); i++) resizeColumnToContents(i); -} - - -void CDView::refreshValues() { - if (!model_) return; - model_->dataChanged(model_->index(0, 0), model_->index(model_->columnCount() - 1, model_->rowCount() - 1)); -} - - -void CDView::setFile(const QString & filename) { - switch ((CDType::cdT)type_) { - case CDType::cdK: K.setFileName(Q2PIString(filename)); break; - case CDType::cdX: X.setFileName(Q2PIString(filename)); break; - case CDType::cdC: C.setFileName(Q2PIString(filename)); break; - case CDType::cdM: M.setFileName(Q2PIString(filename)); break; - default: break; - } -} - - -bool CDView::inProgress() const { - switch ((CDType::cdT)type_) { - case CDType::cdK: return K.inProgress(); break; - case CDType::cdX: return X.inProgress(); break; - case CDType::cdC: return C.inProgress(); break; - case CDType::cdM: return M.inProgress(); break; - default: break; - } - return false; -} - - -void CDView::startX(double freq) { - switch ((CDType::cdT)type_) { - case CDType::cdX: X.start(freq); break; - default: break; - } -} - - -CDSection * CDView::root() { - return CDCore::instance()->root((CDType::cdT)type_); -} - - -QString CDView::typeLetter() const { - return PI2QString(CDCore::instance()->typeLetter((CDType::cdT)type_)); -} - - -void CDView::send() { - busyStatusChanged(true); - switch ((CDType::cdT)type_) { - case CDType::cdK: K.send(); break; - case CDType::cdX: X.send(); break; - case CDType::cdC: C.send(); break; - case CDType::cdM: M.send(); break; - default: break; - } -} - - -void CDView::receive() { - busyStatusChanged(true); - switch ((CDType::cdT)type_) { - case CDType::cdK: K.request(); break; - case CDType::cdX: X.request(); break; - case CDType::cdC: C.request(); break; - case CDType::cdM: M.request(); break; - default: break; - } -} - - -void CDView::save() { - switch ((CDType::cdT)type_) { - case CDType::cdK: K.writeFile(); break; - case CDType::cdX: X.writeFile(); break; - case CDType::cdC: C.writeFile(); break; - case CDType::cdM: M.writeFile(); break; - default: break; - } -} - - -void CDView::load() { - switch ((CDType::cdT)type_) { - case CDType::cdK: - K.readFile(); - K.calculate(); - break; - case CDType::cdX: - X.readFile(); - X.calculate(); - break; - case CDType::cdC: - C.readFile(); - C.calculate(); - break; - case CDType::cdM: - M.readFile(); - M.calculate(); - break; - default: break; - } - refresh(); -} - - -void CDView::clear() { - //piCout << "clearK"; - switch ((CDType::cdT)type_) { - case CDType::cdK: K.root() = CDSection(); break; - case CDType::cdX: X.root() = CDSection(); break; - case CDType::cdC: C.root() = CDSection(); break; - case CDType::cdM: M.root() = CDSection(); break; - default: break; - } - refresh(); -} - - -void CDView::buildFromHeader(const QString & description, int mode) { - if (description.isEmpty()) return; - PIString desc_file = Q2PIString(QDir::current().relativeFilePath(description)); - PIFile f(desc_file, PIIODevice::ReadOnly); - switch ((CDType::cdT)type_) { - case CDType::cdK: K.update(&f, mode); break; - case CDType::cdX: X.update(&f, mode); break; - case CDType::cdC: C.update(&f, mode); break; - case CDType::cdM: M.update(&f, mode); break; - default: break; - } - refresh(); -} - - -void CDView::calculate() { - switch ((CDType::cdT)type_) { - case CDType::cdK: K.calculate(); break; - case CDType::cdX: X.calculate(); break; - case CDType::cdC: C.calculate(); break; - case CDType::cdM: M.calculate(); break; - default: break; - } -} - - -void CDView::filter(const QString & f) { - proxy_->setFilterRegExp(QRegExp(f, Qt::CaseInsensitive)); -} - - -void CDView::indexClicked(const QModelIndex & i) { - if (!model_ || !i.isValid() || type_ != CDType::cdC || i.column() != cName_Cmd) return; - CDItem * item = model_->getItem(i); - if (!item) return; - if (item->itemType() != CDItem::ItemCDType) return; - CDType & t(model_->interface->section(item->buildPath())[item->index()]); - C.sendCommand(t); - emit commandSended(PI2QString(t.pathString().join("."))); - //piCout << t; - qDebug() << PI2QString(t.pathString().join(".")); -} - - -void CDView::cd_sendFailed() { - busyStatusChanged(false); - emit messageStatus("send failed"); - emit sendFailed(); -} - - -void CDView::cd_sendSucceed() { - busyStatusChanged(false); - emit messageStatus("send success"); - emit sendSucceed(); -} - - -void CDView::cd_receiveFailed() { - busyStatusChanged(false); - emit messageStatus("receive failed"); - emit receiveFailed(); -} - - -void CDView::cd_receiveSucceed() { - refresh(); - busyStatusChanged(false); - emit messageStatus("receive success"); - emit receiveSucceed(); -} - - -void CDView::cd_receivedX() { - X.lock(); - PIVector > xl = X.enabledList(); - //piCout << "X" << xl.size(); - piForeachC (PIDeque & x, xl) { - CDType & t(X[x]); - //piCout << t; - //piCout << t.path(); - if (t.cd_type() != CDType::cdX) continue; - update(model_->indexByPath(t.path(), cValue)); - //piCout << CDCore::pathToString(t.path()) << t.toDouble() << "model"; - //qDebug() << "val" << model_->data(model_->indexByPath(t.path(), cValue), Qt::DisplayRole).toDouble(); - } - X.unlock(); - emit receivedX(); -} - - -void CDView::cd_changedGlobal() { - emit changedGlobal(); -} - - -void CDView::pi_cd_messageReceived(PIDeque path, int type, PIString msg) { - QMetaObject::invokeMethod(this, "messageReceived", Qt::QueuedConnection, - Q_ARG(QString, PI2QString(CDCore::pathToString(path))), - Q_ARG(int, type), - Q_ARG(QString, PI2QString(msg))); -} +#include +#include +#include +#include "cdutils_k.h" +#include "cdutils_x.h" +#include "cdutils_c.h" +#include "cdutils_m.h" +#include "cdutils_core.h" +#include "qcd_view.h" +#include "qcd_model.h" +#include "piqt.h" +#include "pifile.h" + +using namespace CDUtils; + + +CDView::CDView(QWidget * parent) : QTreeView(parent) { + type_ = -1; + model_ = 0; + proxy_ = 0; + connect(this, SIGNAL(clicked(QModelIndex)), this, SLOT(indexClicked(QModelIndex))); + connect(this, SIGNAL(_qcd_sendFailed()), this, SLOT(cd_sendFailed()), Qt::QueuedConnection); + connect(this, SIGNAL(_qcd_sendSucceed()), this, SLOT(cd_sendSucceed()), Qt::QueuedConnection); + connect(this, SIGNAL(_qcd_receiveFailed()), this, SLOT(cd_receiveFailed()), Qt::QueuedConnection); + connect(this, SIGNAL(_qcd_receiveSucceed()), this, SLOT(cd_receiveSucceed()), Qt::QueuedConnection); + connect(this, SIGNAL(_qcd_receivedX()), this, SLOT(cd_receivedX()), Qt::QueuedConnection); + connect(this, SIGNAL(_qcd_changedGlobal()), this, SLOT(cd_changedGlobal()), Qt::QueuedConnection); +} + + +CDView::~CDView() { + if (model_) { + delete model_; + delete proxy_; + } + model_ = 0; + proxy_ = 0; +} + + +void CDView::setType(int cdt) { + if (cdt < 0) return; + if (type_ >= 0) return; + type_ = cdt; + switch ((CDType::cdT)type_) { + case CDType::cdK: + CONNECTU(&K, sended, this, pi_cd_sendSucceed); + CONNECTU(&K, sendFailed, this, pi_cd_sendFailed); + CONNECTU(&K, received, this, pi_cd_receiveSucceed); + CONNECTU(&K, receiveFailed, this, pi_cd_receiveFailed); + CONNECTU(&K, changedGlobal, this, pi_cd_changedGlobal); + break; + case CDType::cdX: + CONNECTU(&X, sended, this, pi_cd_sendSucceed); + CONNECTU(&X, sendFailed, this, pi_cd_sendFailed); + CONNECTU(&X, received, this, pi_cd_receiveSucceed); + CONNECTU(&X, receiveFailed, this, pi_cd_receiveFailed); + CONNECTU(&X, receivedX, this, pi_cd_receivedX); + CONNECTU(&X, changedGlobal, this, pi_cd_changedGlobal); + break; + case CDType::cdC: + CONNECTU(&C, sended, this, pi_cd_sendSucceed); + CONNECTU(&C, sendFailed, this, pi_cd_sendFailed); + CONNECTU(&C, received, this, pi_cd_receiveSucceed); + CONNECTU(&C, receiveFailed, this, pi_cd_receiveFailed); + CONNECTU(&C, changedGlobal, this, pi_cd_changedGlobal); + break; + case CDType::cdM: + CONNECTU(&M, sended, this, pi_cd_sendSucceed); + CONNECTU(&M, sendFailed, this, pi_cd_sendFailed); + CONNECTU(&M, received, this, pi_cd_receiveSucceed); + CONNECTU(&M, receiveFailed, this, pi_cd_receiveFailed); + CONNECTU(&M, changedGlobal, this, pi_cd_changedGlobal); + CONNECTU(&M, messageReceived, this, pi_cd_messageReceived); + break; + default: break; + } + +} + + +void CDView::mousePressEvent(QMouseEvent * e) { + if (type_ == CDType::cdC) { + QModelIndex i = indexAt(e->pos()); + if (i.isValid() && i.column() == cName_Cmd) + update(i); + } + QTreeView::mousePressEvent(e); +} + + +void CDView::mouseReleaseEvent(QMouseEvent * e) { + if (type_ == CDType::cdC) { + QModelIndex i = indexAt(e->pos()); + if (i.isValid() && i.column() == cName_Cmd) + update(i); + } + QTreeView::mouseReleaseEvent(e); +} + + +void CDView::currentChanged(const QModelIndex & cur, const QModelIndex & prev) { + if (type_ == CDType::cdC) { + if (prev.isValid() && prev.column() == cName_Cmd) + update(prev); + } + QTreeView::currentChanged(cur, prev); +} + + +void CDView::refresh() { + if (type_ < 0) return; + if (!model_) { + model_ = new CDItemModel(type_); + proxy_ = new QSortFilterProxyModel(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + proxy_->setRecursiveFilteringEnabled(true); +#endif + proxy_->setFilterKeyColumn(-1); + proxy_->setFilterCaseSensitivity(Qt::CaseInsensitive); + proxy_->setSourceModel(model_); + setModel(proxy_); + setItemDelegateForColumn(type_ == CDType::cdC ? cName_Cmd : cValue, new CDDelegate()); + if (type_ == CDType::cdX) + setItemDelegateForColumn(cXMode, new CDDelegate()); + } + model_->rebuildModel(); + switch ((CDType::cdT)type_) { + case CDType::cdK: + setColumnHidden(cXMode, true); + setColumnHidden(cXAvg, true); + break; + case CDType::cdX: + setColumnHidden(cExpression, true); + break; + case CDType::cdC: + case CDType::cdM: + setColumnHidden(cType, true); + setColumnHidden(cXMode, true); + setColumnHidden(cXAvg, true); + setColumnHidden(cExpression, true); + setColumnHidden(cValue, true); + break; + default: break; + } + expandAll(); + for (int i = 0; i < model_->columnCount(); i++) resizeColumnToContents(i); +} + + +void CDView::refreshValues() { + if (!model_) return; + model_->dataChanged(model_->index(0, 0), model_->index(model_->columnCount() - 1, model_->rowCount() - 1)); +} + + +void CDView::setFile(const QString & filename) { + switch ((CDType::cdT)type_) { + case CDType::cdK: K.setFileName(Q2PIString(filename)); break; + case CDType::cdX: X.setFileName(Q2PIString(filename)); break; + case CDType::cdC: C.setFileName(Q2PIString(filename)); break; + case CDType::cdM: M.setFileName(Q2PIString(filename)); break; + default: break; + } +} + + +bool CDView::inProgress() const { + switch ((CDType::cdT)type_) { + case CDType::cdK: return K.inProgress(); break; + case CDType::cdX: return X.inProgress(); break; + case CDType::cdC: return C.inProgress(); break; + case CDType::cdM: return M.inProgress(); break; + default: break; + } + return false; +} + + +void CDView::startX(double freq) { + switch ((CDType::cdT)type_) { + case CDType::cdX: X.start(freq); break; + default: break; + } +} + + +CDSection * CDView::root() { + return CDCore::instance()->root((CDType::cdT)type_); +} + + +QString CDView::typeLetter() const { + return PI2QString(CDCore::instance()->typeLetter((CDType::cdT)type_)); +} + + +void CDView::send() { + busyStatusChanged(true); + switch ((CDType::cdT)type_) { + case CDType::cdK: K.send(); break; + case CDType::cdX: X.send(); break; + case CDType::cdC: C.send(); break; + case CDType::cdM: M.send(); break; + default: break; + } +} + + +void CDView::receive() { + busyStatusChanged(true); + switch ((CDType::cdT)type_) { + case CDType::cdK: K.request(); break; + case CDType::cdX: X.request(); break; + case CDType::cdC: C.request(); break; + case CDType::cdM: M.request(); break; + default: break; + } +} + + +void CDView::save() { + switch ((CDType::cdT)type_) { + case CDType::cdK: K.writeFile(); break; + case CDType::cdX: X.writeFile(); break; + case CDType::cdC: C.writeFile(); break; + case CDType::cdM: M.writeFile(); break; + default: break; + } +} + + +void CDView::load() { + switch ((CDType::cdT)type_) { + case CDType::cdK: + K.readFile(); + K.calculate(); + break; + case CDType::cdX: + X.readFile(); + X.calculate(); + break; + case CDType::cdC: + C.readFile(); + C.calculate(); + break; + case CDType::cdM: + M.readFile(); + M.calculate(); + break; + default: break; + } + refresh(); +} + + +void CDView::clear() { + //piCout << "clearK"; + switch ((CDType::cdT)type_) { + case CDType::cdK: K.root() = CDSection(); break; + case CDType::cdX: X.root() = CDSection(); break; + case CDType::cdC: C.root() = CDSection(); break; + case CDType::cdM: M.root() = CDSection(); break; + default: break; + } + refresh(); +} + + +void CDView::buildFromHeader(const QString & description, int mode) { + if (description.isEmpty()) return; + PIString desc_file = Q2PIString(QDir::current().relativeFilePath(description)); + PIFile f(desc_file, PIIODevice::ReadOnly); + switch ((CDType::cdT)type_) { + case CDType::cdK: K.update(&f, mode); break; + case CDType::cdX: X.update(&f, mode); break; + case CDType::cdC: C.update(&f, mode); break; + case CDType::cdM: M.update(&f, mode); break; + default: break; + } + refresh(); +} + + +void CDView::calculate() { + switch ((CDType::cdT)type_) { + case CDType::cdK: K.calculate(); break; + case CDType::cdX: X.calculate(); break; + case CDType::cdC: C.calculate(); break; + case CDType::cdM: M.calculate(); break; + default: break; + } +} + + +void CDView::filter(const QString & f) { + proxy_->setFilterRegExp(QRegExp(f, Qt::CaseInsensitive)); +} + + +void CDView::indexClicked(const QModelIndex & i) { + if (!model_ || !i.isValid() || type_ != CDType::cdC || i.column() != cName_Cmd) return; + CDItem * item = model_->getItem(i); + if (!item) return; + if (item->itemType() != CDItem::ItemCDType) return; + CDType & t(model_->interface->section(item->buildPath())[item->index()]); + C.sendCommand(t); + emit commandSended(PI2QString(t.pathString().join("."))); + //piCout << t; + qDebug() << PI2QString(t.pathString().join(".")); +} + + +void CDView::cd_sendFailed() { + busyStatusChanged(false); + emit messageStatus("send failed"); + emit sendFailed(); +} + + +void CDView::cd_sendSucceed() { + busyStatusChanged(false); + emit messageStatus("send success"); + emit sendSucceed(); +} + + +void CDView::cd_receiveFailed() { + busyStatusChanged(false); + emit messageStatus("receive failed"); + emit receiveFailed(); +} + + +void CDView::cd_receiveSucceed() { + refresh(); + busyStatusChanged(false); + emit messageStatus("receive success"); + emit receiveSucceed(); +} + + +void CDView::cd_receivedX() { + X.lock(); + PIVector > xl = X.enabledList(); + //piCout << "X" << xl.size(); + piForeachC (PIDeque & x, xl) { + CDType & t(X[x]); + //piCout << t; + //piCout << t.path(); + if (t.cd_type() != CDType::cdX) continue; + update(model_->indexByPath(t.path(), cValue)); + //piCout << CDCore::pathToString(t.path()) << t.toDouble() << "model"; + //qDebug() << "val" << model_->data(model_->indexByPath(t.path(), cValue), Qt::DisplayRole).toDouble(); + } + X.unlock(); + emit receivedX(); +} + + +void CDView::cd_changedGlobal() { + emit changedGlobal(); +} + + +void CDView::pi_cd_messageReceived(PIDeque path, int type, PIString msg) { + QMetaObject::invokeMethod(this, "messageReceived", Qt::QueuedConnection, + Q_ARG(QString, PI2QString(CDCore::pathToString(path))), + Q_ARG(int, type), + Q_ARG(QString, PI2QString(msg))); +} diff --git a/qcd_utils/qcd_view.h b/piqt/libs/qcd/qcd_view.h similarity index 96% rename from qcd_utils/qcd_view.h rename to piqt/libs/qcd/qcd_view.h index 76d2130..50faaa5 100644 --- a/qcd_utils/qcd_view.h +++ b/piqt/libs/qcd/qcd_view.h @@ -1,112 +1,112 @@ -/* - QCD Utils - Qt bindings/utilites for CD Utils - - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . -*/ - -#ifndef QCD_VIEW_H -#define QCD_VIEW_H - -#include "piobject.h" -#include - -namespace CDUtils { - class CDType; - class CDSection; -} - -class CDItemModel; -class QSortFilterProxyModel; - -class CDView: public QTreeView, public PIObject -{ - Q_OBJECT - PIOBJECT(CDView) -public: - explicit CDView(QWidget *parent = 0); - ~CDView(); - - void setType(int cdt); - void setFile(const QString & filename); - bool inProgress() const; - void startX(double freq = 20.); - CDUtils::CDSection * root(); - QString typeLetter() const; - - CDItemModel * CDModel() {return model_;} - -protected: - void mousePressEvent(QMouseEvent * ); - void mouseReleaseEvent(QMouseEvent * ); - void currentChanged(const QModelIndex & cur, const QModelIndex & prev); - -public slots: - void refresh(); - void refreshValues(); - void send(); - void receive(); - void save(); - void load(); - void clear(); - void buildFromHeader(const QString & description, int mode = 2); - void calculate(); - void filter(const QString & f); - -private slots: - void indexClicked(const QModelIndex & i); - void cd_sendFailed(); - void cd_sendSucceed(); - void cd_receiveFailed(); - void cd_receiveSucceed(); - void cd_receivedX(); - void cd_changedGlobal(); - -private: - bool filterTree(const QModelIndex & ti, const QString & filter); - EVENT_HANDLER(void, pi_cd_sendFailed) {emit _qcd_sendFailed();} - EVENT_HANDLER(void, pi_cd_sendSucceed) {emit _qcd_sendSucceed();} - EVENT_HANDLER(void, pi_cd_receiveFailed) {emit _qcd_receiveFailed();} - EVENT_HANDLER(void, pi_cd_receiveSucceed) {emit _qcd_receiveSucceed();} - EVENT_HANDLER(void, pi_cd_receivedX) {emit _qcd_receivedX();} - EVENT_HANDLER(void, pi_cd_changedGlobal) {emit _qcd_changedGlobal();} - EVENT_HANDLER3(void, pi_cd_messageReceived, PIDeque, path, int, type, PIString, msg); - - CDItemModel * model_; - QSortFilterProxyModel * proxy_; - int type_; - -signals: - void sendFailed(); - void sendSucceed(); - void receiveFailed(); - void receiveSucceed(); - void receivedX(); - void changedGlobal(); - void messageStatus(QString msg); - void commandSended(QString msg); - void messageReceived(QString path, int type, QString msg); - void busyStatusChanged(bool busy); - - void _qcd_sendFailed(); // PRIVATE - void _qcd_sendSucceed(); // PRIVATE - void _qcd_receiveFailed(); // PRIVATE - void _qcd_receiveSucceed(); // PRIVATE - void _qcd_receivedX(); // PRIVATE - void _qcd_changedGlobal(); // PRIVATE - -}; - -#endif // QCD_VIEW_H +/* + QCD Utils - Qt bindings/utilites for CD Utils + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef QCD_VIEW_H +#define QCD_VIEW_H + +#include "piobject.h" +#include + +namespace CDUtils { + class CDType; + class CDSection; +} + +class CDItemModel; +class QSortFilterProxyModel; + +class CDView: public QTreeView, public PIObject +{ + Q_OBJECT + PIOBJECT(CDView) +public: + explicit CDView(QWidget *parent = 0); + ~CDView(); + + void setType(int cdt); + void setFile(const QString & filename); + bool inProgress() const; + void startX(double freq = 20.); + CDUtils::CDSection * root(); + QString typeLetter() const; + + CDItemModel * CDModel() {return model_;} + +protected: + void mousePressEvent(QMouseEvent * ); + void mouseReleaseEvent(QMouseEvent * ); + void currentChanged(const QModelIndex & cur, const QModelIndex & prev); + +public slots: + void refresh(); + void refreshValues(); + void send(); + void receive(); + void save(); + void load(); + void clear(); + void buildFromHeader(const QString & description, int mode = 2); + void calculate(); + void filter(const QString & f); + +private slots: + void indexClicked(const QModelIndex & i); + void cd_sendFailed(); + void cd_sendSucceed(); + void cd_receiveFailed(); + void cd_receiveSucceed(); + void cd_receivedX(); + void cd_changedGlobal(); + +private: + bool filterTree(const QModelIndex & ti, const QString & filter); + EVENT_HANDLER(void, pi_cd_sendFailed) {emit _qcd_sendFailed();} + EVENT_HANDLER(void, pi_cd_sendSucceed) {emit _qcd_sendSucceed();} + EVENT_HANDLER(void, pi_cd_receiveFailed) {emit _qcd_receiveFailed();} + EVENT_HANDLER(void, pi_cd_receiveSucceed) {emit _qcd_receiveSucceed();} + EVENT_HANDLER(void, pi_cd_receivedX) {emit _qcd_receivedX();} + EVENT_HANDLER(void, pi_cd_changedGlobal) {emit _qcd_changedGlobal();} + EVENT_HANDLER3(void, pi_cd_messageReceived, PIDeque, path, int, type, PIString, msg); + + CDItemModel * model_; + QSortFilterProxyModel * proxy_; + int type_; + +signals: + void sendFailed(); + void sendSucceed(); + void receiveFailed(); + void receiveSucceed(); + void receivedX(); + void changedGlobal(); + void messageStatus(QString msg); + void commandSended(QString msg); + void messageReceived(QString path, int type, QString msg); + void busyStatusChanged(bool busy); + + void _qcd_sendFailed(); // PRIVATE + void _qcd_sendSucceed(); // PRIVATE + void _qcd_receiveFailed(); // PRIVATE + void _qcd_receiveSucceed(); // PRIVATE + void _qcd_receivedX(); // PRIVATE + void _qcd_changedGlobal(); // PRIVATE + +}; + +#endif // QCD_VIEW_H diff --git a/piqt/libs/widgets/CMakeLists.txt b/piqt/libs/widgets/CMakeLists.txt new file mode 100644 index 0000000..d7e4002 --- /dev/null +++ b/piqt/libs/widgets/CMakeLists.txt @@ -0,0 +1,9 @@ +include(PIPMacros) +pip_code_model(CCM "${ROOT_DIR}/pip/libs/main/io_devices/piiodevice.h" "${ROOT_DIR}/pip/libs/main/io_utils/pipacketextractor.h" OPTIONS "-DPIP_EXPORT" "-Es") +piqt_library(piqt_utils "Gui" "qad_utils;qad_widgets;qad_blockview;piqt" ${CCM}) + +foreach(_v ${_QT_VERSIONS_}) + if (LOCAL_FOUND${_v}) + add_dependencies(piqt_utils${_v} pip_cmg) + endif() +endforeach() diff --git a/piqt_utils/piqt_connection_edit.cpp b/piqt/libs/widgets/piqt_connection_edit.cpp similarity index 100% rename from piqt_utils/piqt_connection_edit.cpp rename to piqt/libs/widgets/piqt_connection_edit.cpp diff --git a/piqt_utils/piqt_connection_edit.h b/piqt/libs/widgets/piqt_connection_edit.h similarity index 100% rename from piqt_utils/piqt_connection_edit.h rename to piqt/libs/widgets/piqt_connection_edit.h diff --git a/piqt_utils/piqt_connection_edit.ui b/piqt/libs/widgets/piqt_connection_edit.ui similarity index 100% rename from piqt_utils/piqt_connection_edit.ui rename to piqt/libs/widgets/piqt_connection_edit.ui diff --git a/piqt_utils/piqt_connection_view.cpp b/piqt/libs/widgets/piqt_connection_view.cpp similarity index 100% rename from piqt_utils/piqt_connection_view.cpp rename to piqt/libs/widgets/piqt_connection_view.cpp diff --git a/piqt_utils/piqt_connection_view.h b/piqt/libs/widgets/piqt_connection_view.h similarity index 100% rename from piqt_utils/piqt_connection_view.h rename to piqt/libs/widgets/piqt_connection_view.h diff --git a/piqt_utils/piqt_highlighter.cpp b/piqt/libs/widgets/piqt_highlighter.cpp similarity index 100% rename from piqt_utils/piqt_highlighter.cpp rename to piqt/libs/widgets/piqt_highlighter.cpp diff --git a/piqt_utils/piqt_highlighter.h b/piqt/libs/widgets/piqt_highlighter.h similarity index 100% rename from piqt_utils/piqt_highlighter.h rename to piqt/libs/widgets/piqt_highlighter.h diff --git a/piqt_utils/piqt_iodevice_edit.cpp b/piqt/libs/widgets/piqt_iodevice_edit.cpp similarity index 100% rename from piqt_utils/piqt_iodevice_edit.cpp rename to piqt/libs/widgets/piqt_iodevice_edit.cpp diff --git a/piqt_utils/piqt_iodevice_edit.h b/piqt/libs/widgets/piqt_iodevice_edit.h similarity index 100% rename from piqt_utils/piqt_iodevice_edit.h rename to piqt/libs/widgets/piqt_iodevice_edit.h diff --git a/piqt_utils/piqt_iodevice_edit_dialog.cpp b/piqt/libs/widgets/piqt_iodevice_edit_dialog.cpp similarity index 100% rename from piqt_utils/piqt_iodevice_edit_dialog.cpp rename to piqt/libs/widgets/piqt_iodevice_edit_dialog.cpp diff --git a/piqt_utils/piqt_iodevice_edit_dialog.h b/piqt/libs/widgets/piqt_iodevice_edit_dialog.h similarity index 100% rename from piqt_utils/piqt_iodevice_edit_dialog.h rename to piqt/libs/widgets/piqt_iodevice_edit_dialog.h diff --git a/piqt_utils/piqt_iodevice_edit_dialog.ui b/piqt/libs/widgets/piqt_iodevice_edit_dialog.ui similarity index 100% rename from piqt_utils/piqt_iodevice_edit_dialog.ui rename to piqt/libs/widgets/piqt_iodevice_edit_dialog.ui diff --git a/piqt_utils/qpiconnection.cpp b/piqt/libs/widgets/qpiconnection.cpp similarity index 100% rename from piqt_utils/qpiconnection.cpp rename to piqt/libs/widgets/qpiconnection.cpp diff --git a/piqt_utils/qpiconnection.h b/piqt/libs/widgets/qpiconnection.h similarity index 100% rename from piqt_utils/qpiconnection.h rename to piqt/libs/widgets/qpiconnection.h diff --git a/piqt/utils/CMakeLists.txt b/piqt/utils/CMakeLists.txt new file mode 100644 index 0000000..4dbf12d --- /dev/null +++ b/piqt/utils/CMakeLists.txt @@ -0,0 +1 @@ +add_directories("piqt_") diff --git a/piqt/utils/cd_pult/CMakeLists.txt b/piqt/utils/cd_pult/CMakeLists.txt new file mode 100644 index 0000000..1ffaae3 --- /dev/null +++ b/piqt/utils/cd_pult/CMakeLists.txt @@ -0,0 +1,14 @@ +project(cd_pult) +if(APPLE) + set(APP_ICON "") +elseif(WIN32) + set(APP_ICON "") +else() + set(APP_ICON "") +endif() +set(APP_INFO "CD Pult") +piqt_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_graphic;qad_application;qcd_utils;piqt_utils") +if (Qt5_FOUND) + import_version(${PROJ_NAME}5 ${PROJECT_NAME}) + deploy_target(${PROJECT_NAME}5 DEPLOY_DIR ${CMAKE_CURRENT_BINARY_DIR} DESTINATION ${ROOT_DIR}/release) +endif() diff --git a/qcd_utils/pult/cddirectk.cpp b/piqt/utils/cd_pult/cddirectk.cpp similarity index 96% rename from qcd_utils/pult/cddirectk.cpp rename to piqt/utils/cd_pult/cddirectk.cpp index f2dc425..ce7e756 100644 --- a/qcd_utils/pult/cddirectk.cpp +++ b/piqt/utils/cd_pult/cddirectk.cpp @@ -1,312 +1,312 @@ -#include "cddirectk.h" -#include "ui_cddirectk_type_dialog.h" -#include "cdutils_core.h" -#include "cdutils_k.h" -#include "qcd_core.h" -#include "qcd_model.h" -#include "graphic.h" -#include "piqt.h" -#include "qvariantedit.h" -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace CDUtils; - - -KDockWidget::KDockWidget(QString title, QMainWindow * p): QDockWidget(title, p) { - da = p; - menu = new QMenu(this); - QAction * a = new QAction(QIcon(":/icons/document-edit.png"), "Rename ...", this); - connect(a, SIGNAL(triggered(bool)), this, SLOT(rename())); - dactions << a; - a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove", this); - connect(a, SIGNAL(triggered(bool)), this, SIGNAL(removeRequest())); - dactions << a; - menu_k = new QMenu(this); - menu_k->setTitle(tr("Remove K")); - lay = new QFormLayout(); - lay->setContentsMargins(0, qApp->style()->pixelMetric(QStyle::PM_LayoutTopMargin), 0, 0); - lay->setLabelAlignment(Qt::AlignRight | Qt::AlignVCenter); - QWidget * w = new QWidget(); - w->setAcceptDrops(true); - w->installEventFilter(this); - w->setLayout(lay); - setWidget(w); - type_dialog = new CDDirectKTypeDialog(); -} - - -void KDockWidget::addK(const CDType & t, CDDirectKTypeDialog::TypeInfo ti) { - if (t.cd_type() != CDType::cdK) return; - PIDeque xp = t.path(); - if (k_list.contains(xp)) return; - k_list << xp; - info_list << ti; - //piCout << "add" << xp; - QWidget * ve = ti.create(); - //qDebug() << "add" << ve; - lay->addRow(PI2QString(t.pathString().join(".")) + ":", ve); - QCDCore::instance()->bindWidget(ve, t); - //ve->setValue(); -} - - -QByteArray KDockWidget::save() const { - ChunkStream cs; - cs.add(1, windowTitle()) - .add(2, getList(k_list)) - .add(3, info_list); - return cs.data(); -} - - -void KDockWidget::load(QByteArray ba) { - clear(); - if (ba.isEmpty()) return; - ChunkStream cs(ba); - PIVector > list; - QVector ilist; - while (!cs.atEnd()) { - switch (cs.read()) { - case 1: setWindowTitle(cs.getData()); break; - case 2: list = setList(cs.getData()); break; - case 3: ilist = cs.getData >(); break; - default: break; - } - } - ilist.resize(list.size()); - for (int i = 0; i < list.size_s(); ++i) { - addK(K[list[i]], ilist[i]); - } -} - - -void KDockWidget::clear() { - while (lay->rowCount() > 0) - removeRow(0); - k_list.clear(); - info_list.clear(); -} - - -void KDockWidget::changedGlobal() { - //piCout << "changedGlobal ..." << k_list.size_s() << info_list.size() << lay->count() << lay->rowCount(); - for (int i = 0; i < k_list.size_s(); ++i) { - //piCout << "update" << i << "0"; - if (!K.exists(k_list[i])) { - k_list.remove(i); - info_list.remove(i); - removeRow(i); - --i; - continue; - } - //piCout << "update" << i << "1"; - QLabel * lbl = qobject_cast(lay->itemAt(i, QFormLayout::LabelRole)->widget()); - //piCout << "update" << i << "2"; - if (lbl) lbl->setText(PI2QString(K[k_list[i]].pathString().join(".")) + ":"); - //piCout << "update" << i << "3"; - } - //piCout << "changedGlobal ok"; -} - - -bool KDockWidget::eventFilter(QObject * o, QEvent * e) { - //if (o == graphic->viewport()) { - switch (e->type()) { - case QEvent::DragMove: { - QDragMoveEvent * de = (QDragMoveEvent*)e; - const QMimeData * mime = de->mimeData(); - if (!mime) break; - if (!mime->text().startsWith("k")) break; - de->setDropAction(Qt::CopyAction); - de->accept(); - return true; - } break; - case QEvent::DragEnter: { - QDragEnterEvent * de = (QDragEnterEvent*)e; - const QMimeData * mime = de->mimeData(); - if (!mime) break; - if (!mime->text().startsWith("k")) break; - de->setDropAction(Qt::CopyAction); - de->accept(); - return true; - } break; - case QEvent::Drop: { - QDropEvent * de = (QDropEvent*)e; - const QMimeData * mime = de->mimeData(); - if (!mime) break; - //qDebug() << "drop" << mime->text(); - if (!mime->text().startsWith("k")) break; - CDDirectKTypeDialog::TypeInfo ti; - CDType & k(K[CDCore::stringToPath(Q2PIString(mime->text().mid(1)))]); - if (k.type().left(1) == "n" || k.type().left(1) == "f") { - if (type_dialog->exec() == QDialog::Accepted) - ti = type_dialog->getType(); - else - return true; - } - addK(k, ti); - de->accept(); - return true; - } break; - default: break; - } - //} - return QWidget::eventFilter(o, e); -} - - -void KDockWidget::contextMenuEvent(QContextMenuEvent * e) { - qDeleteAll(menu_k->actions()); - menu_k->clear(); - for (int i = 0; i < k_list.size_s(); ++i) { - QAction * a = new QAction(PI2QString(K[k_list[i]].pathString().join(".")), this); - a->setData(i); - connect(a, SIGNAL(triggered(bool)), this, SLOT(removeK())); - menu_k->addAction(a); - } - QMenu * mwm = da->createPopupMenu(); - menu->clear(); - menu->addActions(dactions); - menu->addMenu(menu_k); - menu->addSeparator(); - menu->addActions(mwm->actions()); - menu->popup(e->globalPos()); - mwm->deleteLater(); -} - - -void KDockWidget::removeRow(int r) { - if (r < 0 || r >= lay->rowCount()) return; -#if QT_VERSION >= 0x050800 - QFormLayout::TakeRowResult rr = lay->takeRow(r); - if (rr.fieldItem) {delete rr.fieldItem->widget(); delete rr.fieldItem;} - if (rr.labelItem) {delete rr.labelItem->widget(); delete rr.labelItem;} -#else - piForTimes (2) { - QLayoutItem * i = lay->itemAt(r+r); - lay->removeItem(i); - if (i) {delete i->widget(); delete i;} - } -#endif -} - - -void KDockWidget::rename() { - QString nn = QInputDialog::getText(this, tr("Rename area"), tr("New area name:"), - QLineEdit::Normal, windowTitle()); - if (nn.isEmpty()) return; - setWindowTitle(nn); -} - - -void KDockWidget::removeK() { - QAction * a = qobject_cast(sender()); - if (!a) return; - int ind = a->data().toInt(); - if (ind < 0 || ind >= k_list.size_s()) return; - k_list.remove(ind); - if (ind >= 0 && ind < info_list.size()) - info_list.remove(ind); - removeRow(ind); -} - - - - -CDDirectK::CDDirectK(QWidget * parent) : QWidget(parent), Ui::CDDirectK() { - setupUi(this); - da = new QMainWindow(); - da->setWindowFlags(frame->windowFlags()); - da->setDockNestingEnabled(true); - layoutMain->addWidget(da); -} - - -CDDirectK::~CDDirectK() { -} - - -void CDDirectK::reset() { - qDeleteAll(docks); - docks.clear(); -} - - -QByteArray CDDirectK::save() const { - ChunkStream cs; - QVector dstates; - foreach (KDockWidget * d, docks) { - dstates << d->save(); - } - cs.add(1, docks.size()) - .add(2, dstates) - .add(3, da->saveState()); - return cs.data(); -} - - -void CDDirectK::load(QByteArray ba) { - reset(); - if (ba.isEmpty()) return; - ChunkStream cs(ba); - while (!cs.atEnd()) { - switch (cs.read()) { - case 1: { - int s = cs.getData(); - piForTimes (s) - addArea(); - } break; - case 2: { - QVector dstates = cs.getData >(); - for (int i = 0; i < piMini(dstates.size(), docks.size()); ++i) - docks[i]->load(dstates[i]); - } break; - case 3: da->restoreState(cs.getData()); break; - default: break; - } - } -} - - -void CDDirectK::addArea() { - KDockWidget * dw = new KDockWidget(QString("area %1").arg(docks.size()), da); - connect(dw, SIGNAL(removeRequest()), this, SLOT(removeArea())); - da->addDockWidget(Qt::RightDockWidgetArea, dw); - docks << dw; - for (int i = 0; i < docks.size(); ++i) - docks[i]->setObjectName(QString("dock_%1").arg(i)); -} - - -void CDDirectK::changedGlobal() { - foreach (KDockWidget * d, docks) - d->changedGlobal(); -} - - -void CDDirectK::removeArea() { - KDockWidget * d = qobject_cast(sender()); - if (!d) return; - docks.removeAll(d); - d->deleteLater(); - for (int i = 0; i < docks.size(); ++i) - docks[i]->setObjectName(QString("dock_%1").arg(i)); -} - - -void CDDirectK::on_buttonAdd_clicked() { - addArea(); -} - - -void CDDirectK::on_buttonRemoveAll_clicked() { - qDeleteAll(docks); - docks.clear(); -} +#include "cddirectk.h" +#include "ui_cddirectk_type_dialog.h" +#include "cdutils_core.h" +#include "cdutils_k.h" +#include "qcd_core.h" +#include "qcd_model.h" +#include "graphic.h" +#include "piqt.h" +#include "qvariantedit.h" +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace CDUtils; + + +KDockWidget::KDockWidget(QString title, QMainWindow * p): QDockWidget(title, p) { + da = p; + menu = new QMenu(this); + QAction * a = new QAction(QIcon(":/icons/document-edit.png"), "Rename ...", this); + connect(a, SIGNAL(triggered(bool)), this, SLOT(rename())); + dactions << a; + a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove", this); + connect(a, SIGNAL(triggered(bool)), this, SIGNAL(removeRequest())); + dactions << a; + menu_k = new QMenu(this); + menu_k->setTitle(tr("Remove K")); + lay = new QFormLayout(); + lay->setContentsMargins(0, qApp->style()->pixelMetric(QStyle::PM_LayoutTopMargin), 0, 0); + lay->setLabelAlignment(Qt::AlignRight | Qt::AlignVCenter); + QWidget * w = new QWidget(); + w->setAcceptDrops(true); + w->installEventFilter(this); + w->setLayout(lay); + setWidget(w); + type_dialog = new CDDirectKTypeDialog(); +} + + +void KDockWidget::addK(const CDType & t, CDDirectKTypeDialog::TypeInfo ti) { + if (t.cd_type() != CDType::cdK) return; + PIDeque xp = t.path(); + if (k_list.contains(xp)) return; + k_list << xp; + info_list << ti; + //piCout << "add" << xp; + QWidget * ve = ti.create(); + //qDebug() << "add" << ve; + lay->addRow(PI2QString(t.pathString().join(".")) + ":", ve); + QCDCore::instance()->bindWidget(ve, t); + //ve->setValue(); +} + + +QByteArray KDockWidget::save() const { + ChunkStream cs; + cs.add(1, windowTitle()) + .add(2, getList(k_list)) + .add(3, info_list); + return cs.data(); +} + + +void KDockWidget::load(QByteArray ba) { + clear(); + if (ba.isEmpty()) return; + ChunkStream cs(ba); + PIVector > list; + QVector ilist; + while (!cs.atEnd()) { + switch (cs.read()) { + case 1: setWindowTitle(cs.getData()); break; + case 2: list = setList(cs.getData()); break; + case 3: ilist = cs.getData >(); break; + default: break; + } + } + ilist.resize(list.size()); + for (int i = 0; i < list.size_s(); ++i) { + addK(K[list[i]], ilist[i]); + } +} + + +void KDockWidget::clear() { + while (lay->rowCount() > 0) + removeRow(0); + k_list.clear(); + info_list.clear(); +} + + +void KDockWidget::changedGlobal() { + //piCout << "changedGlobal ..." << k_list.size_s() << info_list.size() << lay->count() << lay->rowCount(); + for (int i = 0; i < k_list.size_s(); ++i) { + //piCout << "update" << i << "0"; + if (!K.exists(k_list[i])) { + k_list.remove(i); + info_list.remove(i); + removeRow(i); + --i; + continue; + } + //piCout << "update" << i << "1"; + QLabel * lbl = qobject_cast(lay->itemAt(i, QFormLayout::LabelRole)->widget()); + //piCout << "update" << i << "2"; + if (lbl) lbl->setText(PI2QString(K[k_list[i]].pathString().join(".")) + ":"); + //piCout << "update" << i << "3"; + } + //piCout << "changedGlobal ok"; +} + + +bool KDockWidget::eventFilter(QObject * o, QEvent * e) { + //if (o == graphic->viewport()) { + switch (e->type()) { + case QEvent::DragMove: { + QDragMoveEvent * de = (QDragMoveEvent*)e; + const QMimeData * mime = de->mimeData(); + if (!mime) break; + if (!mime->text().startsWith("k")) break; + de->setDropAction(Qt::CopyAction); + de->accept(); + return true; + } break; + case QEvent::DragEnter: { + QDragEnterEvent * de = (QDragEnterEvent*)e; + const QMimeData * mime = de->mimeData(); + if (!mime) break; + if (!mime->text().startsWith("k")) break; + de->setDropAction(Qt::CopyAction); + de->accept(); + return true; + } break; + case QEvent::Drop: { + QDropEvent * de = (QDropEvent*)e; + const QMimeData * mime = de->mimeData(); + if (!mime) break; + //qDebug() << "drop" << mime->text(); + if (!mime->text().startsWith("k")) break; + CDDirectKTypeDialog::TypeInfo ti; + CDType & k(K[CDCore::stringToPath(Q2PIString(mime->text().mid(1)))]); + if (k.type().left(1) == "n" || k.type().left(1) == "f") { + if (type_dialog->exec() == QDialog::Accepted) + ti = type_dialog->getType(); + else + return true; + } + addK(k, ti); + de->accept(); + return true; + } break; + default: break; + } + //} + return QWidget::eventFilter(o, e); +} + + +void KDockWidget::contextMenuEvent(QContextMenuEvent * e) { + qDeleteAll(menu_k->actions()); + menu_k->clear(); + for (int i = 0; i < k_list.size_s(); ++i) { + QAction * a = new QAction(PI2QString(K[k_list[i]].pathString().join(".")), this); + a->setData(i); + connect(a, SIGNAL(triggered(bool)), this, SLOT(removeK())); + menu_k->addAction(a); + } + QMenu * mwm = da->createPopupMenu(); + menu->clear(); + menu->addActions(dactions); + menu->addMenu(menu_k); + menu->addSeparator(); + menu->addActions(mwm->actions()); + menu->popup(e->globalPos()); + mwm->deleteLater(); +} + + +void KDockWidget::removeRow(int r) { + if (r < 0 || r >= lay->rowCount()) return; +#if QT_VERSION >= 0x050800 + QFormLayout::TakeRowResult rr = lay->takeRow(r); + if (rr.fieldItem) {delete rr.fieldItem->widget(); delete rr.fieldItem;} + if (rr.labelItem) {delete rr.labelItem->widget(); delete rr.labelItem;} +#else + piForTimes (2) { + QLayoutItem * i = lay->itemAt(r+r); + lay->removeItem(i); + if (i) {delete i->widget(); delete i;} + } +#endif +} + + +void KDockWidget::rename() { + QString nn = QInputDialog::getText(this, tr("Rename area"), tr("New area name:"), + QLineEdit::Normal, windowTitle()); + if (nn.isEmpty()) return; + setWindowTitle(nn); +} + + +void KDockWidget::removeK() { + QAction * a = qobject_cast(sender()); + if (!a) return; + int ind = a->data().toInt(); + if (ind < 0 || ind >= k_list.size_s()) return; + k_list.remove(ind); + if (ind >= 0 && ind < info_list.size()) + info_list.remove(ind); + removeRow(ind); +} + + + + +CDDirectK::CDDirectK(QWidget * parent) : QWidget(parent), Ui::CDDirectK() { + setupUi(this); + da = new QMainWindow(); + da->setWindowFlags(frame->windowFlags()); + da->setDockNestingEnabled(true); + layoutMain->addWidget(da); +} + + +CDDirectK::~CDDirectK() { +} + + +void CDDirectK::reset() { + qDeleteAll(docks); + docks.clear(); +} + + +QByteArray CDDirectK::save() const { + ChunkStream cs; + QVector dstates; + foreach (KDockWidget * d, docks) { + dstates << d->save(); + } + cs.add(1, docks.size()) + .add(2, dstates) + .add(3, da->saveState()); + return cs.data(); +} + + +void CDDirectK::load(QByteArray ba) { + reset(); + if (ba.isEmpty()) return; + ChunkStream cs(ba); + while (!cs.atEnd()) { + switch (cs.read()) { + case 1: { + int s = cs.getData(); + piForTimes (s) + addArea(); + } break; + case 2: { + QVector dstates = cs.getData >(); + for (int i = 0; i < piMini(dstates.size(), docks.size()); ++i) + docks[i]->load(dstates[i]); + } break; + case 3: da->restoreState(cs.getData()); break; + default: break; + } + } +} + + +void CDDirectK::addArea() { + KDockWidget * dw = new KDockWidget(QString("area %1").arg(docks.size()), da); + connect(dw, SIGNAL(removeRequest()), this, SLOT(removeArea())); + da->addDockWidget(Qt::RightDockWidgetArea, dw); + docks << dw; + for (int i = 0; i < docks.size(); ++i) + docks[i]->setObjectName(QString("dock_%1").arg(i)); +} + + +void CDDirectK::changedGlobal() { + foreach (KDockWidget * d, docks) + d->changedGlobal(); +} + + +void CDDirectK::removeArea() { + KDockWidget * d = qobject_cast(sender()); + if (!d) return; + docks.removeAll(d); + d->deleteLater(); + for (int i = 0; i < docks.size(); ++i) + docks[i]->setObjectName(QString("dock_%1").arg(i)); +} + + +void CDDirectK::on_buttonAdd_clicked() { + addArea(); +} + + +void CDDirectK::on_buttonRemoveAll_clicked() { + qDeleteAll(docks); + docks.clear(); +} diff --git a/qcd_utils/pult/cddirectk.h b/piqt/utils/cd_pult/cddirectk.h similarity index 94% rename from qcd_utils/pult/cddirectk.h rename to piqt/utils/cd_pult/cddirectk.h index b5d71f4..47ade06 100644 --- a/qcd_utils/pult/cddirectk.h +++ b/piqt/utils/cd_pult/cddirectk.h @@ -1,77 +1,77 @@ -#ifndef CDDIRECTK_H -#define CDDIRECTK_H - -#include "cdgraphics.h" -#include "ui_cddirectk.h" -#include "cddirectk_type_dialog.h" - -class QFormLayout; - - -class KDockWidget: public QDockWidget { - Q_OBJECT -public: - KDockWidget(QString title = QString(), QMainWindow * p = 0); - - void addK(const CDUtils::CDType & t, CDDirectKTypeDialog::TypeInfo ti); - QByteArray save() const; - void load(QByteArray ba); - void clear(); - void changedGlobal(); - - QFormLayout * lay; - -private: - bool eventFilter(QObject * o, QEvent * e); - void contextMenuEvent(QContextMenuEvent * e); - void removeRow(int r); - - QMenu * menu, * menu_k; - QList dactions; - QMainWindow * da; - CDDirectKTypeDialog * type_dialog; - PIVector > k_list; - QVector info_list; - -private slots: - void rename(); - void removeK(); - -signals: - void removeRequest(); - -}; - - - - -class CDDirectK: public QWidget, public Ui::CDDirectK -{ - Q_OBJECT -public: - explicit CDDirectK(QWidget *parent = 0); - ~CDDirectK(); - - void reset(); - QByteArray save() const; - void load(QByteArray ba); - -private: - void addArea(); - - QList docks; - QMainWindow * da; - -public slots: - void changedGlobal(); - -private slots: - void removeArea(); - void on_buttonAdd_clicked(); - void on_buttonRemoveAll_clicked(); - -signals: - -}; - -#endif // CDDIRECTK_H +#ifndef CDDIRECTK_H +#define CDDIRECTK_H + +#include "cdgraphics.h" +#include "ui_cddirectk.h" +#include "cddirectk_type_dialog.h" + +class QFormLayout; + + +class KDockWidget: public QDockWidget { + Q_OBJECT +public: + KDockWidget(QString title = QString(), QMainWindow * p = 0); + + void addK(const CDUtils::CDType & t, CDDirectKTypeDialog::TypeInfo ti); + QByteArray save() const; + void load(QByteArray ba); + void clear(); + void changedGlobal(); + + QFormLayout * lay; + +private: + bool eventFilter(QObject * o, QEvent * e); + void contextMenuEvent(QContextMenuEvent * e); + void removeRow(int r); + + QMenu * menu, * menu_k; + QList dactions; + QMainWindow * da; + CDDirectKTypeDialog * type_dialog; + PIVector > k_list; + QVector info_list; + +private slots: + void rename(); + void removeK(); + +signals: + void removeRequest(); + +}; + + + + +class CDDirectK: public QWidget, public Ui::CDDirectK +{ + Q_OBJECT +public: + explicit CDDirectK(QWidget *parent = 0); + ~CDDirectK(); + + void reset(); + QByteArray save() const; + void load(QByteArray ba); + +private: + void addArea(); + + QList docks; + QMainWindow * da; + +public slots: + void changedGlobal(); + +private slots: + void removeArea(); + void on_buttonAdd_clicked(); + void on_buttonRemoveAll_clicked(); + +signals: + +}; + +#endif // CDDIRECTK_H diff --git a/qcd_utils/pult/cddirectk.ui b/piqt/utils/cd_pult/cddirectk.ui similarity index 96% rename from qcd_utils/pult/cddirectk.ui rename to piqt/utils/cd_pult/cddirectk.ui index a14e715..731498b 100644 --- a/qcd_utils/pult/cddirectk.ui +++ b/piqt/utils/cd_pult/cddirectk.ui @@ -1,85 +1,85 @@ - - - CDDirectK - - - - 0 - 0 - 624 - 411 - - - - CD Pult - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::StyledPanel - - - - 0 - - - 0 - - - - - Add new - - - - :/icons/list-add.png:/icons/list-add.png - - - - - - - Remove all - - - - :/icons/edit-delete.png:/icons/edit-delete.png - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - - - - - - - + + + CDDirectK + + + + 0 + 0 + 624 + 411 + + + + CD Pult + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + + 0 + + + 0 + + + + + Add new + + + + :/icons/list-add.png:/icons/list-add.png + + + + + + + Remove all + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + + + + + Qt::Horizontal + + + + 1 + 20 + + + + + + + + + + + + + + diff --git a/qcd_utils/pult/cddirectk_type_dialog.cpp b/piqt/utils/cd_pult/cddirectk_type_dialog.cpp similarity index 95% rename from qcd_utils/pult/cddirectk_type_dialog.cpp rename to piqt/utils/cd_pult/cddirectk_type_dialog.cpp index ba95141..c6be2fa 100644 --- a/qcd_utils/pult/cddirectk_type_dialog.cpp +++ b/piqt/utils/cd_pult/cddirectk_type_dialog.cpp @@ -1,76 +1,76 @@ -#include "cddirectk_type_dialog.h" -#include "cdutils_core.h" -#include "qcd_core.h" -#include "qcd_model.h" -#include "piqt.h" -#include "spinslider.h" -#include "qvariantedit.h" - - -CDDirectKTypeDialog::CDDirectKTypeDialog(QWidget * parent) : QDialog(parent), Ui::CDDirectKTypeDialog() { - setupUi(this); -} - - -CDDirectKTypeDialog::~CDDirectKTypeDialog() { -} - - -CDDirectKTypeDialog::TypeInfo CDDirectKTypeDialog::getType() const { - if (!groupBox->isChecked()) return TypeInfo(); - TypeInfo ret; - ret.type = comboType->currentIndex(); - ret.params_d[0] = evalMin->value(); - ret.params_d[1] = evalMax->value(); - ret.params_d[2] = spinDecimals->value(); - ret.params_d[3] = evalStep->value(); - ret.params_s[0] = linePrefix->text(); - ret.params_s[1] = lineSuffix->text(); - return ret; -} - - - - -CDDirectKTypeDialog::TypeInfo::TypeInfo(int type_) { - type = type_; - params_d.resize(4); - params_s.resize(2); -} - - -QWidget * CDDirectKTypeDialog::TypeInfo::create() { - params_d.resize(4); - params_s.resize(2); - switch (type) { - case 0: { - QDoubleSpinBox * ret = new QDoubleSpinBox(); - ret->setMinimum(params_d[0]); - ret->setMaximum(params_d[1]); - ret->setDecimals(params_d[2]); - ret->setSingleStep(params_d[3]); - ret->setPrefix(params_s[0]); - ret->setSuffix(params_s[1]); - return ret; - } break; - case 1: { - QSlider * ret = new QSlider(Qt::Horizontal); - ret->setMinimum(params_d[0]); - ret->setMaximum(params_d[1]); - ret->setSingleStep(params_d[3]); - return ret; - } break; - case 2: { - SpinSlider * ret = new SpinSlider(); - ret->setMinimum(params_d[0]); - ret->setMaximum(params_d[1]); - ret->setDecimals(params_d[2]); - ret->setSingleStep(params_d[3]); - ret->setPrefix(params_s[0]); - ret->setSuffix(params_s[1]); - return ret; - } break; - default: break; - } - return new QVariantEdit(); -} +#include "cddirectk_type_dialog.h" +#include "cdutils_core.h" +#include "qcd_core.h" +#include "qcd_model.h" +#include "piqt.h" +#include "spinslider.h" +#include "qvariantedit.h" + + +CDDirectKTypeDialog::CDDirectKTypeDialog(QWidget * parent) : QDialog(parent), Ui::CDDirectKTypeDialog() { + setupUi(this); +} + + +CDDirectKTypeDialog::~CDDirectKTypeDialog() { +} + + +CDDirectKTypeDialog::TypeInfo CDDirectKTypeDialog::getType() const { + if (!groupBox->isChecked()) return TypeInfo(); + TypeInfo ret; + ret.type = comboType->currentIndex(); + ret.params_d[0] = evalMin->value(); + ret.params_d[1] = evalMax->value(); + ret.params_d[2] = spinDecimals->value(); + ret.params_d[3] = evalStep->value(); + ret.params_s[0] = linePrefix->text(); + ret.params_s[1] = lineSuffix->text(); + return ret; +} + + + + +CDDirectKTypeDialog::TypeInfo::TypeInfo(int type_) { + type = type_; + params_d.resize(4); + params_s.resize(2); +} + + +QWidget * CDDirectKTypeDialog::TypeInfo::create() { + params_d.resize(4); + params_s.resize(2); + switch (type) { + case 0: { + QDoubleSpinBox * ret = new QDoubleSpinBox(); + ret->setMinimum(params_d[0]); + ret->setMaximum(params_d[1]); + ret->setDecimals(params_d[2]); + ret->setSingleStep(params_d[3]); + ret->setPrefix(params_s[0]); + ret->setSuffix(params_s[1]); + return ret; + } break; + case 1: { + QSlider * ret = new QSlider(Qt::Horizontal); + ret->setMinimum(params_d[0]); + ret->setMaximum(params_d[1]); + ret->setSingleStep(params_d[3]); + return ret; + } break; + case 2: { + SpinSlider * ret = new SpinSlider(); + ret->setMinimum(params_d[0]); + ret->setMaximum(params_d[1]); + ret->setDecimals(params_d[2]); + ret->setSingleStep(params_d[3]); + ret->setPrefix(params_s[0]); + ret->setSuffix(params_s[1]); + return ret; + } break; + default: break; + } + return new QVariantEdit(); +} diff --git a/qcd_utils/pult/cddirectk_type_dialog.h b/piqt/utils/cd_pult/cddirectk_type_dialog.h similarity index 95% rename from qcd_utils/pult/cddirectk_type_dialog.h rename to piqt/utils/cd_pult/cddirectk_type_dialog.h index c3ee06a..9881864 100644 --- a/qcd_utils/pult/cddirectk_type_dialog.h +++ b/piqt/utils/cd_pult/cddirectk_type_dialog.h @@ -1,44 +1,44 @@ -#ifndef CDDIRECTK_TYPE_DIALOG_H -#define CDDIRECTK_TYPE_DIALOG_H - -#include -#include "ui_cddirectk_type_dialog.h" - - -class CDDirectKTypeDialog: public QDialog, public Ui::CDDirectKTypeDialog -{ - Q_OBJECT -public: - explicit CDDirectKTypeDialog(QWidget * parent = 0); - ~CDDirectKTypeDialog(); - - struct TypeInfo { - TypeInfo(int type_ = -1); - QWidget * create(); - int type; - QVector params_d; - QVector params_s; - }; - - TypeInfo getType() const; - -private: - -public slots: - -private slots: - -signals: - -}; - -inline QDataStream & operator <<(QDataStream & s, const CDDirectKTypeDialog::TypeInfo & v) { - s << v.type << v.params_d << v.params_s; - return s; -} -inline QDataStream & operator >>(QDataStream & s, CDDirectKTypeDialog::TypeInfo & v) { - s >> v.type >> v.params_d >> v.params_s; - return s; -} - -#endif // CDDIRECTK_TYPE_DIALOG_H +#ifndef CDDIRECTK_TYPE_DIALOG_H +#define CDDIRECTK_TYPE_DIALOG_H + +#include +#include "ui_cddirectk_type_dialog.h" + + +class CDDirectKTypeDialog: public QDialog, public Ui::CDDirectKTypeDialog +{ + Q_OBJECT +public: + explicit CDDirectKTypeDialog(QWidget * parent = 0); + ~CDDirectKTypeDialog(); + + struct TypeInfo { + TypeInfo(int type_ = -1); + QWidget * create(); + int type; + QVector params_d; + QVector params_s; + }; + + TypeInfo getType() const; + +private: + +public slots: + +private slots: + +signals: + +}; + +inline QDataStream & operator <<(QDataStream & s, const CDDirectKTypeDialog::TypeInfo & v) { + s << v.type << v.params_d << v.params_s; + return s; +} +inline QDataStream & operator >>(QDataStream & s, CDDirectKTypeDialog::TypeInfo & v) { + s >> v.type >> v.params_d >> v.params_s; + return s; +} + +#endif // CDDIRECTK_TYPE_DIALOG_H diff --git a/qcd_utils/pult/cddirectk_type_dialog.ui b/piqt/utils/cd_pult/cddirectk_type_dialog.ui similarity index 96% rename from qcd_utils/pult/cddirectk_type_dialog.ui rename to piqt/utils/cd_pult/cddirectk_type_dialog.ui index 3c4ac3a..0b5ec15 100644 --- a/qcd_utils/pult/cddirectk_type_dialog.ui +++ b/piqt/utils/cd_pult/cddirectk_type_dialog.ui @@ -1,232 +1,232 @@ - - - CDDirectKTypeDialog - - - - 0 - 0 - 275 - 310 - - - - CD Pult - - - - - - Custom - - - true - - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Type: - - - - - - - - Spin - - - - - Slider - - - - - SpinSlider - - - - - - - - Min: - - - - - - - - - - Max: - - - - - - - 100.000000000000000 - - - - - - - Decimals: - - - - - - - - - - Single step: - - - - - - - 1.000000000000000 - - - - - - - Prefix: - - - - - - - - - - Suffix: - - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 1 - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - CLineEdit - QLineEdit -
clineedit.h
-
- - EvalSpinBox - QWidget -
evalspinbox.h
-
-
- - - - groupBox - toggled(bool) - widget - setEnabled(bool) - - - 86 - 49 - - - 94 - 91 - - - - - buttonBox - accepted() - CDDirectKTypeDialog - accept() - - - 297 - 285 - - - 315 - 280 - - - - - buttonBox - rejected() - CDDirectKTypeDialog - reject() - - - 281 - 290 - - - 283 - 307 - - - - -
+ + + CDDirectKTypeDialog + + + + 0 + 0 + 275 + 310 + + + + CD Pult + + + + + + Custom + + + true + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Type: + + + + + + + + Spin + + + + + Slider + + + + + SpinSlider + + + + + + + + Min: + + + + + + + + + + Max: + + + + + + + 100.000000000000000 + + + + + + + Decimals: + + + + + + + + + + Single step: + + + + + + + 1.000000000000000 + + + + + + + Prefix: + + + + + + + + + + Suffix: + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 1 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + CLineEdit + QLineEdit +
clineedit.h
+
+ + EvalSpinBox + QWidget +
evalspinbox.h
+
+
+ + + + groupBox + toggled(bool) + widget + setEnabled(bool) + + + 86 + 49 + + + 94 + 91 + + + + + buttonBox + accepted() + CDDirectKTypeDialog + accept() + + + 297 + 285 + + + 315 + 280 + + + + + buttonBox + rejected() + CDDirectKTypeDialog + reject() + + + 281 + 290 + + + 283 + 307 + + + + +
diff --git a/qcd_utils/pult/cdgraphics.cpp b/piqt/utils/cd_pult/cdgraphics.cpp similarity index 96% rename from qcd_utils/pult/cdgraphics.cpp rename to piqt/utils/cd_pult/cdgraphics.cpp index 0cb72ba..b067683 100644 --- a/qcd_utils/pult/cdgraphics.cpp +++ b/piqt/utils/cd_pult/cdgraphics.cpp @@ -1,354 +1,354 @@ -#include "cdgraphics.h" -//#include "ui_qcd_graphic.h" -#include "cdutils_core.h" -#include "cdutils_x.h" -#include "qcd_core.h" -#include "qcd_model.h" -#include "qcd_graphic.h" -#include "graphic.h" -#include "piqt.h" -#include -#include -#include -#include -#include -#include -#include - -using namespace CDUtils; - - -QStringList CDUtils::getList(const PIVector > & x_list) { - QStringList ret; - piForeachC (PIDeque & p, x_list) - ret << PI2QString(CDCore::pathToString(p)); - return ret; -} - - -PIVector > CDUtils::setList(const QStringList & l) { - PIVector > ret; - foreach (QString s, l) - ret << CDCore::stringToPath(Q2PIString(s)); - return ret; -} - - - - -GDockWidget::GDockWidget(QString title, QMainWindow * p): QDockWidget(title, p) { - da = p; - menu = new QMenu(this); - QAction * a = new QAction(QIcon(":/icons/document-edit.png"), "Rename ...", this); - connect(a, SIGNAL(triggered(bool)), this, SLOT(rename())); - dactions << a; - a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove", this); - connect(a, SIGNAL(triggered(bool)), this, SIGNAL(removeRequest())); - dactions << a; - menu_x = new QMenu(this); - menu_x->setTitle(tr("Remove X")); - graphic = new CDGraphicWidget(); - graphic->graphic()->viewport()->setAcceptDrops(true); - graphic->graphic()->viewport()->installEventFilter(this); - setWidget(graphic); -} - - -void GDockWidget::addX(const CDType & t) { - if (t.cd_type() != CDType::cdX) return; - PIDeque xp = t.path(); - if (x_list.contains(xp)) return; - x_list << xp; - int gind = graphic->graphic()->graphicsCount(); - graphic->graphic()->setGraphicsCount(gind + 1); - graphic->graphic()->setGraphicName(PI2QString(t.pathString().join(".")), gind); -} - - -void GDockWidget::drawX(const PIMap > & data) { - for (int i = 0; i < x_list.size_s(); ++i) { - PIString sp = CDCore::pathToString(x_list[i]); - const PIVector & ch(data[sp]); - for (int j = 0; j < ch.size_s(); ++j) - graphic->graphic()->addPoint(ch[j], i, false); - } - graphic->graphic()->updateGraphics(); -} - - -QByteArray GDockWidget::save() const { - ChunkStream cs; - cs.add(1, windowTitle()) - .add(2, getList(x_list)) - .add(3, graphic->graphic()->save()) - .add(4, graphic->evalSpinBoxHistory()->expression()) - .add(5, graphic->evalSpinBoxVisible()->expression()); - return cs.data(); -} - - -void GDockWidget::load(QByteArray ba) { - if (ba.isEmpty()) return; - ChunkStream cs(ba); - while (!cs.atEnd()) { - switch (cs.read()) { - case 1: setWindowTitle(cs.getData()); break; - case 2: x_list = setList(cs.getData()); break; - case 3: graphic->graphic()->load(cs.getData()); break; - case 4: graphic->evalSpinBoxHistory()->setExpression(cs.getData()); break; - case 5: graphic->evalSpinBoxVisible()->setExpression(cs.getData()); break; - default: break; - } - } -} - - -void GDockWidget::changedGlobal() { - for (int i = 0; i < x_list.size_s(); ++i) { - if (!X.exists(x_list[i])) { - x_list.remove(i); - graphic->graphic()->removeGraphic(i); - --i; - continue; - } - graphic->graphic()->setGraphicName(PI2QString(X[x_list[i]].pathString().join(".")), i); - } -} - - -bool GDockWidget::eventFilter(QObject * o, QEvent * e) { - //if (o == graphic->viewport()) { - switch (e->type()) { - case QEvent::DragMove: { - QDragMoveEvent * de = (QDragMoveEvent*)e; - const QMimeData * mime = de->mimeData(); - //qDebug() << "enter" << mime; - if (!mime) break; - if (!mime->text().startsWith("x")) break; - de->setDropAction(Qt::CopyAction); - de->accept(); - return true; - } break; - case QEvent::DragEnter: { - QDragEnterEvent * de = (QDragEnterEvent*)e; - const QMimeData * mime = de->mimeData(); - //qDebug() << "enter" << mime; - if (!mime) break; - if (!mime->text().startsWith("x")) break; - de->setDropAction(Qt::CopyAction); - de->accept(); - return true; - } break; - case QEvent::Drop: { - QDropEvent * de = (QDropEvent*)e; - const QMimeData * mime = de->mimeData(); - if (!mime) break; - //qDebug() << "drop" << mime->text(); - if (!mime->text().startsWith("x")) break; - addX(X[CDCore::stringToPath(Q2PIString(mime->text().mid(1)))]); - de->accept(); - return true; - } break; - default: break; - } - //} - return QWidget::eventFilter(o, e); -} - - -void GDockWidget::contextMenuEvent(QContextMenuEvent * e) { - if (graphic->graphic()->underMouse()) return; - qDeleteAll(menu_x->actions()); - menu_x->clear(); - for (int i = 0; i < graphic->graphic()->graphicsCount(); ++i) { - QPixmap icon(da->iconSize()); - icon.fill(graphic->graphic()->graphic(i).pen.color()); - QAction * a = new QAction(QIcon(icon), graphic->graphic()->graphic(i).name, this); - a->setData(i); - connect(a, SIGNAL(triggered(bool)), this, SLOT(removeX())); - menu_x->addAction(a); - } - QMenu * mwm = da->createPopupMenu(); - menu->clear(); - menu->addActions(dactions); - menu->addMenu(menu_x); - menu->addSeparator(); - menu->addActions(mwm->actions()); - menu->popup(e->globalPos()); - mwm->deleteLater(); -} - - -CDGraphicWidget * GDockWidget::viewportGraphic(QObject * o) const { - if (!o) return 0; - while (!qobject_cast(o) && o) - o = o->parent(); - return qobject_cast(o); -} - - -void GDockWidget::rename() { - QString nn = QInputDialog::getText(this, tr("Rename area"), tr("New area name:"), - QLineEdit::Normal, windowTitle()); - if (nn.isEmpty()) return; - setWindowTitle(nn); -} - - -void GDockWidget::removeX() { - QAction * a = qobject_cast(sender()); - if (!a) return; - int ind = a->data().toInt(); - if (ind < 0 || ind >= x_list.size_s()) return; - x_list.remove(ind); - graphic->graphic()->removeGraphic(ind); -} - - - - -CDGraphics::CDGraphics(QWidget * parent) : QWidget(parent), Ui::CDGraphics() { - setupUi(this); - da = new QMainWindow(); - da->setWindowFlags(frame->windowFlags()); - da->setDockNestingEnabled(true); - layoutMain->addWidget(da); -} - - -CDGraphics::~CDGraphics() { -} - - -void CDGraphics::reset() { - qDeleteAll(docks); - docks.clear(); -} - - -QByteArray CDGraphics::save() const { - ChunkStream cs; - QVector dstates; - foreach (GDockWidget * d, docks) { - dstates << d->save(); - } - cs.add(1, docks.size()) - .add(2, dstates) - .add(3, da->saveState()); - X.lock(); - cs.add(4, getList(X.enabledList())); - X.unlock(); - cs.add(5, buttonConfigVisible->isChecked()); - return cs.data(); -} - - -void CDGraphics::load(QByteArray ba) { - reset(); - if (ba.isEmpty()) return; - ChunkStream cs(ba); - while (!cs.atEnd()) { - switch (cs.read()) { - case 1: { - int s = cs.getData(); - piForTimes (s) - addGraphic(); - } break; - case 2: { - QVector dstates = cs.getData >(); - for (int i = 0; i < piMini(dstates.size(), docks.size()); ++i) - docks[i]->load(dstates[i]); - } break; - case 3: da->restoreState(cs.getData()); break; - case 4: - X.lock(); - X.setEnabledList(setList(cs.getData())); - X.unlock(); - break; - case 5: - buttonConfigVisible->setChecked(cs.getData()); - break; - default: break; - } - } -} - - -GDockWidget * CDGraphics::graphicDock(Graphic * o) const { - if (!o) return 0; - foreach (GDockWidget * d, docks) - if (d->widget() == o) - return d; - return 0; -} - - -void CDGraphics::addGraphic() { - GDockWidget * dw = new GDockWidget(QString("area %1").arg(docks.size()), da); - connect(dw, SIGNAL(removeRequest()), this, SLOT(removeGraphic())); - connect(buttonConfigVisible, SIGNAL(toggled(bool)), dw->graphic, SLOT(setConfigVisible(bool))); - connect(buttonLegendVisible, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setLegendVisible(bool))); - connect(buttonBorderInputsVisible, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setBorderInputsVisible(bool))); - connect(buttonPause, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setPaused(bool))); - dw->graphic->setConfigVisible(buttonConfigVisible->isChecked()); - dw->graphic->graphic()->setLegendVisible(buttonLegendVisible->isChecked()); - dw->graphic->graphic()->setBorderInputsVisible(buttonBorderInputsVisible->isChecked()); - da->addDockWidget(Qt::RightDockWidgetArea, dw); - docks << dw; - for (int i = 0; i < docks.size(); ++i) - docks[i]->setObjectName(QString("dock_%1").arg(i)); -} - - -void CDGraphics::receivedX() { - PIMap > data; - X.lock(); - PIVector > x_list = X.enabledList(); - PIVector ch; - piForeachC (PIDeque & p, x_list) { - CDType & t(X[p]); - if (t.xmode_rec() == CDType::X_Current) - ch.resize(1).fill(t.toDouble()); - else - ch = t.history; - t.history.clear(); - data[CDCore::pathToString(t.path())] = ch; - } - //piCout << data; - X.unlock(); - foreach (GDockWidget * d, docks) - d->drawX(data); -} - - -void CDGraphics::changedGlobal() { - foreach (GDockWidget * d, docks) - d->changedGlobal(); -} - - -void CDGraphics::removeGraphic() { - GDockWidget * d = qobject_cast(sender()); - if (!d) return; - docks.removeAll(d); - d->deleteLater(); - for (int i = 0; i < docks.size(); ++i) - docks[i]->setObjectName(QString("dock_%1").arg(i)); -} - - -void CDGraphics::on_buttonAdd_clicked() { - addGraphic(); -} - - -void CDGraphics::on_buttonClear_clicked() { - foreach (GDockWidget * d, docks) - d->graphic->graphic()->clear(); -} - - -void CDGraphics::on_buttonRemoveAll_clicked() { - qDeleteAll(docks); - docks.clear(); -} +#include "cdgraphics.h" +//#include "ui_qcd_graphic.h" +#include "cdutils_core.h" +#include "cdutils_x.h" +#include "qcd_core.h" +#include "qcd_model.h" +#include "qcd_graphic.h" +#include "graphic.h" +#include "piqt.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace CDUtils; + + +QStringList CDUtils::getList(const PIVector > & x_list) { + QStringList ret; + piForeachC (PIDeque & p, x_list) + ret << PI2QString(CDCore::pathToString(p)); + return ret; +} + + +PIVector > CDUtils::setList(const QStringList & l) { + PIVector > ret; + foreach (QString s, l) + ret << CDCore::stringToPath(Q2PIString(s)); + return ret; +} + + + + +GDockWidget::GDockWidget(QString title, QMainWindow * p): QDockWidget(title, p) { + da = p; + menu = new QMenu(this); + QAction * a = new QAction(QIcon(":/icons/document-edit.png"), "Rename ...", this); + connect(a, SIGNAL(triggered(bool)), this, SLOT(rename())); + dactions << a; + a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove", this); + connect(a, SIGNAL(triggered(bool)), this, SIGNAL(removeRequest())); + dactions << a; + menu_x = new QMenu(this); + menu_x->setTitle(tr("Remove X")); + graphic = new CDGraphicWidget(); + graphic->graphic()->viewport()->setAcceptDrops(true); + graphic->graphic()->viewport()->installEventFilter(this); + setWidget(graphic); +} + + +void GDockWidget::addX(const CDType & t) { + if (t.cd_type() != CDType::cdX) return; + PIDeque xp = t.path(); + if (x_list.contains(xp)) return; + x_list << xp; + int gind = graphic->graphic()->graphicsCount(); + graphic->graphic()->setGraphicsCount(gind + 1); + graphic->graphic()->setGraphicName(PI2QString(t.pathString().join(".")), gind); +} + + +void GDockWidget::drawX(const PIMap > & data) { + for (int i = 0; i < x_list.size_s(); ++i) { + PIString sp = CDCore::pathToString(x_list[i]); + const PIVector & ch(data[sp]); + for (int j = 0; j < ch.size_s(); ++j) + graphic->graphic()->addPoint(ch[j], i, false); + } + graphic->graphic()->updateGraphics(); +} + + +QByteArray GDockWidget::save() const { + ChunkStream cs; + cs.add(1, windowTitle()) + .add(2, getList(x_list)) + .add(3, graphic->graphic()->save()) + .add(4, graphic->evalSpinBoxHistory()->expression()) + .add(5, graphic->evalSpinBoxVisible()->expression()); + return cs.data(); +} + + +void GDockWidget::load(QByteArray ba) { + if (ba.isEmpty()) return; + ChunkStream cs(ba); + while (!cs.atEnd()) { + switch (cs.read()) { + case 1: setWindowTitle(cs.getData()); break; + case 2: x_list = setList(cs.getData()); break; + case 3: graphic->graphic()->load(cs.getData()); break; + case 4: graphic->evalSpinBoxHistory()->setExpression(cs.getData()); break; + case 5: graphic->evalSpinBoxVisible()->setExpression(cs.getData()); break; + default: break; + } + } +} + + +void GDockWidget::changedGlobal() { + for (int i = 0; i < x_list.size_s(); ++i) { + if (!X.exists(x_list[i])) { + x_list.remove(i); + graphic->graphic()->removeGraphic(i); + --i; + continue; + } + graphic->graphic()->setGraphicName(PI2QString(X[x_list[i]].pathString().join(".")), i); + } +} + + +bool GDockWidget::eventFilter(QObject * o, QEvent * e) { + //if (o == graphic->viewport()) { + switch (e->type()) { + case QEvent::DragMove: { + QDragMoveEvent * de = (QDragMoveEvent*)e; + const QMimeData * mime = de->mimeData(); + //qDebug() << "enter" << mime; + if (!mime) break; + if (!mime->text().startsWith("x")) break; + de->setDropAction(Qt::CopyAction); + de->accept(); + return true; + } break; + case QEvent::DragEnter: { + QDragEnterEvent * de = (QDragEnterEvent*)e; + const QMimeData * mime = de->mimeData(); + //qDebug() << "enter" << mime; + if (!mime) break; + if (!mime->text().startsWith("x")) break; + de->setDropAction(Qt::CopyAction); + de->accept(); + return true; + } break; + case QEvent::Drop: { + QDropEvent * de = (QDropEvent*)e; + const QMimeData * mime = de->mimeData(); + if (!mime) break; + //qDebug() << "drop" << mime->text(); + if (!mime->text().startsWith("x")) break; + addX(X[CDCore::stringToPath(Q2PIString(mime->text().mid(1)))]); + de->accept(); + return true; + } break; + default: break; + } + //} + return QWidget::eventFilter(o, e); +} + + +void GDockWidget::contextMenuEvent(QContextMenuEvent * e) { + if (graphic->graphic()->underMouse()) return; + qDeleteAll(menu_x->actions()); + menu_x->clear(); + for (int i = 0; i < graphic->graphic()->graphicsCount(); ++i) { + QPixmap icon(da->iconSize()); + icon.fill(graphic->graphic()->graphic(i).pen.color()); + QAction * a = new QAction(QIcon(icon), graphic->graphic()->graphic(i).name, this); + a->setData(i); + connect(a, SIGNAL(triggered(bool)), this, SLOT(removeX())); + menu_x->addAction(a); + } + QMenu * mwm = da->createPopupMenu(); + menu->clear(); + menu->addActions(dactions); + menu->addMenu(menu_x); + menu->addSeparator(); + menu->addActions(mwm->actions()); + menu->popup(e->globalPos()); + mwm->deleteLater(); +} + + +CDGraphicWidget * GDockWidget::viewportGraphic(QObject * o) const { + if (!o) return 0; + while (!qobject_cast(o) && o) + o = o->parent(); + return qobject_cast(o); +} + + +void GDockWidget::rename() { + QString nn = QInputDialog::getText(this, tr("Rename area"), tr("New area name:"), + QLineEdit::Normal, windowTitle()); + if (nn.isEmpty()) return; + setWindowTitle(nn); +} + + +void GDockWidget::removeX() { + QAction * a = qobject_cast(sender()); + if (!a) return; + int ind = a->data().toInt(); + if (ind < 0 || ind >= x_list.size_s()) return; + x_list.remove(ind); + graphic->graphic()->removeGraphic(ind); +} + + + + +CDGraphics::CDGraphics(QWidget * parent) : QWidget(parent), Ui::CDGraphics() { + setupUi(this); + da = new QMainWindow(); + da->setWindowFlags(frame->windowFlags()); + da->setDockNestingEnabled(true); + layoutMain->addWidget(da); +} + + +CDGraphics::~CDGraphics() { +} + + +void CDGraphics::reset() { + qDeleteAll(docks); + docks.clear(); +} + + +QByteArray CDGraphics::save() const { + ChunkStream cs; + QVector dstates; + foreach (GDockWidget * d, docks) { + dstates << d->save(); + } + cs.add(1, docks.size()) + .add(2, dstates) + .add(3, da->saveState()); + X.lock(); + cs.add(4, getList(X.enabledList())); + X.unlock(); + cs.add(5, buttonConfigVisible->isChecked()); + return cs.data(); +} + + +void CDGraphics::load(QByteArray ba) { + reset(); + if (ba.isEmpty()) return; + ChunkStream cs(ba); + while (!cs.atEnd()) { + switch (cs.read()) { + case 1: { + int s = cs.getData(); + piForTimes (s) + addGraphic(); + } break; + case 2: { + QVector dstates = cs.getData >(); + for (int i = 0; i < piMini(dstates.size(), docks.size()); ++i) + docks[i]->load(dstates[i]); + } break; + case 3: da->restoreState(cs.getData()); break; + case 4: + X.lock(); + X.setEnabledList(setList(cs.getData())); + X.unlock(); + break; + case 5: + buttonConfigVisible->setChecked(cs.getData()); + break; + default: break; + } + } +} + + +GDockWidget * CDGraphics::graphicDock(Graphic * o) const { + if (!o) return 0; + foreach (GDockWidget * d, docks) + if (d->widget() == o) + return d; + return 0; +} + + +void CDGraphics::addGraphic() { + GDockWidget * dw = new GDockWidget(QString("area %1").arg(docks.size()), da); + connect(dw, SIGNAL(removeRequest()), this, SLOT(removeGraphic())); + connect(buttonConfigVisible, SIGNAL(toggled(bool)), dw->graphic, SLOT(setConfigVisible(bool))); + connect(buttonLegendVisible, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setLegendVisible(bool))); + connect(buttonBorderInputsVisible, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setBorderInputsVisible(bool))); + connect(buttonPause, SIGNAL(clicked(bool)), dw->graphic->graphic(), SLOT(setPaused(bool))); + dw->graphic->setConfigVisible(buttonConfigVisible->isChecked()); + dw->graphic->graphic()->setLegendVisible(buttonLegendVisible->isChecked()); + dw->graphic->graphic()->setBorderInputsVisible(buttonBorderInputsVisible->isChecked()); + da->addDockWidget(Qt::RightDockWidgetArea, dw); + docks << dw; + for (int i = 0; i < docks.size(); ++i) + docks[i]->setObjectName(QString("dock_%1").arg(i)); +} + + +void CDGraphics::receivedX() { + PIMap > data; + X.lock(); + PIVector > x_list = X.enabledList(); + PIVector ch; + piForeachC (PIDeque & p, x_list) { + CDType & t(X[p]); + if (t.xmode_rec() == CDType::X_Current) + ch.resize(1).fill(t.toDouble()); + else + ch = t.history; + t.history.clear(); + data[CDCore::pathToString(t.path())] = ch; + } + //piCout << data; + X.unlock(); + foreach (GDockWidget * d, docks) + d->drawX(data); +} + + +void CDGraphics::changedGlobal() { + foreach (GDockWidget * d, docks) + d->changedGlobal(); +} + + +void CDGraphics::removeGraphic() { + GDockWidget * d = qobject_cast(sender()); + if (!d) return; + docks.removeAll(d); + d->deleteLater(); + for (int i = 0; i < docks.size(); ++i) + docks[i]->setObjectName(QString("dock_%1").arg(i)); +} + + +void CDGraphics::on_buttonAdd_clicked() { + addGraphic(); +} + + +void CDGraphics::on_buttonClear_clicked() { + foreach (GDockWidget * d, docks) + d->graphic->graphic()->clear(); +} + + +void CDGraphics::on_buttonRemoveAll_clicked() { + qDeleteAll(docks); + docks.clear(); +} diff --git a/qcd_utils/pult/cdgraphics.h b/piqt/utils/cd_pult/cdgraphics.h similarity index 94% rename from qcd_utils/pult/cdgraphics.h rename to piqt/utils/cd_pult/cdgraphics.h index 33ca214..51e3483 100644 --- a/qcd_utils/pult/cdgraphics.h +++ b/piqt/utils/cd_pult/cdgraphics.h @@ -1,92 +1,92 @@ -#ifndef CDGRAPHICS_H -#define CDGRAPHICS_H - -#include -#include -#include -#include "ui_cdgraphics.h" -#include "qcd_graphic.h" -#include - -namespace CDUtils { - class CDType; - class CDSection; - QStringList getList(const PIVector > & x_list); - PIVector > setList(const QStringList & l); -} - -class QMainWindow; -class Graphic; - - - - -class GDockWidget: public QDockWidget { - Q_OBJECT -public: - GDockWidget(QString title = QString(), QMainWindow * p = 0); - - void addX(const CDUtils::CDType & t); - void drawX(const PIMap > & data); - QByteArray save() const; - void load(QByteArray ba); - void changedGlobal(); - - CDGraphicWidget * graphic; - -private: - bool eventFilter(QObject * o, QEvent * e); - void contextMenuEvent(QContextMenuEvent * e); - CDGraphicWidget * viewportGraphic(QObject * o) const; - - QMenu * menu, * menu_x; - QList dactions; - QMainWindow * da; - PIVector > x_list; - -private slots: - void rename(); - void removeX(); - -signals: - void removeRequest(); - -}; - - - - -class CDGraphics : public QWidget, public Ui::CDGraphics -{ - Q_OBJECT -public: - explicit CDGraphics(QWidget *parent = 0); - ~CDGraphics(); - - void reset(); - QByteArray save() const; - void load(QByteArray ba); - -private: - GDockWidget * graphicDock(Graphic * o) const; - void addXToGraphic(const QString & xp, Graphic * g); - void addGraphic(); - - QList docks; - QMainWindow * da; - -public slots: - void receivedX(); - void changedGlobal(); - -private slots: - void removeGraphic(); - void on_buttonAdd_clicked(); - void on_buttonClear_clicked(); - void on_buttonRemoveAll_clicked(); - -signals: - -}; - -#endif // CDGRAPHICS_H +#ifndef CDGRAPHICS_H +#define CDGRAPHICS_H + +#include +#include +#include +#include "ui_cdgraphics.h" +#include "qcd_graphic.h" +#include + +namespace CDUtils { + class CDType; + class CDSection; + QStringList getList(const PIVector > & x_list); + PIVector > setList(const QStringList & l); +} + +class QMainWindow; +class Graphic; + + + + +class GDockWidget: public QDockWidget { + Q_OBJECT +public: + GDockWidget(QString title = QString(), QMainWindow * p = 0); + + void addX(const CDUtils::CDType & t); + void drawX(const PIMap > & data); + QByteArray save() const; + void load(QByteArray ba); + void changedGlobal(); + + CDGraphicWidget * graphic; + +private: + bool eventFilter(QObject * o, QEvent * e); + void contextMenuEvent(QContextMenuEvent * e); + CDGraphicWidget * viewportGraphic(QObject * o) const; + + QMenu * menu, * menu_x; + QList dactions; + QMainWindow * da; + PIVector > x_list; + +private slots: + void rename(); + void removeX(); + +signals: + void removeRequest(); + +}; + + + + +class CDGraphics : public QWidget, public Ui::CDGraphics +{ + Q_OBJECT +public: + explicit CDGraphics(QWidget *parent = 0); + ~CDGraphics(); + + void reset(); + QByteArray save() const; + void load(QByteArray ba); + +private: + GDockWidget * graphicDock(Graphic * o) const; + void addXToGraphic(const QString & xp, Graphic * g); + void addGraphic(); + + QList docks; + QMainWindow * da; + +public slots: + void receivedX(); + void changedGlobal(); + +private slots: + void removeGraphic(); + void on_buttonAdd_clicked(); + void on_buttonClear_clicked(); + void on_buttonRemoveAll_clicked(); + +signals: + +}; + +#endif // CDGRAPHICS_H diff --git a/qcd_utils/pult/cdgraphics.ui b/piqt/utils/cd_pult/cdgraphics.ui similarity index 96% rename from qcd_utils/pult/cdgraphics.ui rename to piqt/utils/cd_pult/cdgraphics.ui index 9974f72..6a40b06 100644 --- a/qcd_utils/pult/cdgraphics.ui +++ b/piqt/utils/cd_pult/cdgraphics.ui @@ -1,168 +1,168 @@ - - - CDGraphics - - - - 0 - 0 - 624 - 411 - - - - CD Pult - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::StyledPanel - - - - 0 - - - 0 - - - - - Add new - - - - :/icons/list-add.png:/icons/list-add.png - - - - - - - Clear all - - - - :/icons/edit-clear.png:/icons/edit-clear.png - - - - - - - Remove all - - - - :/icons/edit-delete.png:/icons/edit-delete.png - - - - - - - Remove all - - - - :/icons/layer-visible-off.png - :/icons/layer-visible-on.png:/icons/layer-visible-off.png - - - true - - - true - - - - - - - Remove all - - - - :/icons/legend.png:/icons/legend.png - - - true - - - true - - - - - - - Remove all - - - - :/icons/media-playback-pause.png:/icons/media-playback-pause.png - - - true - - - false - - - - - - - Remove all - - - - :/icons/border-line.png:/icons/border-line.png - - - true - - - false - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - - - - - - - - - - + + + CDGraphics + + + + 0 + 0 + 624 + 411 + + + + CD Pult + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::StyledPanel + + + + 0 + + + 0 + + + + + Add new + + + + :/icons/list-add.png:/icons/list-add.png + + + + + + + Clear all + + + + :/icons/edit-clear.png:/icons/edit-clear.png + + + + + + + Remove all + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + + + + + Remove all + + + + :/icons/layer-visible-off.png + :/icons/layer-visible-on.png:/icons/layer-visible-off.png + + + true + + + true + + + + + + + Remove all + + + + :/icons/legend.png:/icons/legend.png + + + true + + + true + + + + + + + Remove all + + + + :/icons/media-playback-pause.png:/icons/media-playback-pause.png + + + true + + + false + + + + + + + Remove all + + + + :/icons/border-line.png:/icons/border-line.png + + + true + + + false + + + + + + + Qt::Horizontal + + + + 1 + 20 + + + + + + + + + + + + + + + + + diff --git a/piqt/utils/cd_pult/cdpult.qrc b/piqt/utils/cd_pult/cdpult.qrc new file mode 100644 index 0000000..08a59ac --- /dev/null +++ b/piqt/utils/cd_pult/cdpult.qrc @@ -0,0 +1,16 @@ + + + ../../../qad/icons/dialog-information.png + ../../../qad/icons/dialog-cancel.png + ../../../qad/icons/dialog-ok-apply.png + ../../../qad/icons/document-revert.png + ../../../qad/icons/view-refresh.png + ../../../qad/icons/format-stroke-color.png + icons/db-export.png + icons/db-import.png + icons/timer.png + icons/flame.png + icons/Apps-accessories-calculator-icon.png + icons/accessories-text-editor.png + + diff --git a/qcd_utils/pult/cdpultwindow.cpp b/piqt/utils/cd_pult/cdpultwindow.cpp similarity index 97% rename from qcd_utils/pult/cdpultwindow.cpp rename to piqt/utils/cd_pult/cdpultwindow.cpp index ce58fb3..c388c5a 100644 --- a/qcd_utils/pult/cdpultwindow.cpp +++ b/piqt/utils/cd_pult/cdpultwindow.cpp @@ -1,292 +1,292 @@ -#include "edockwidget.h" -#include "cdpultwindow.h" -#include "cdutils_core.h" -#include "cdutils_k.h" -#include "cdutils_x.h" -#include "cdutils_m.h" -#include "qcd_core.h" -#include "qcd_view.h" -#include "qcd_model.h" -#include "qcd_modedialog.h" -#include "chunkstream.h" -#include "qvariantedit.h" -#include "piqt.h" -#include "piqt_highlighter.h" -#include "qcodeedit.h" -#include -#include -#include -#include - -using namespace CDUtils; - - -CDPultWindow::CDPultWindow(QWidget *parent) : EMainWindow(parent), Ui::CDPultWindow() { - setupUi(this); - centralWidget()->hide(); - setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North); - CDCore::instance()->initPult(); - def_config = codeConfig->text(); - checkDefaultConfig->setChecked(true); - new ConfigHighlighter(codeConfig->document()); - widgetK->setType(CDUtils::CDType::cdK); - widgetX->setType(CDUtils::CDType::cdX); - widgetC->setType(CDUtils::CDType::cdC); - widgetM->setType(CDUtils::CDType::cdM); - editFileK->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); - editFileX->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); - editFileC->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); - editFileM->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); - log_icons[CDViewWidget::OKIcon] = QIcon(":/icons/dialog-ok-apply.png"); - log_icons[CDViewWidget::FailIcon] = QIcon(":/icons/dialog-cancel.png"); - log_icons[CDViewWidget::WaitIcon] = QIcon(":/icons/timer.png"); - setRecentMenu(menuOpen_recent); - ribbon = new Ribbon(this); - session.setFile("session_cdpult.conf"); - session.addEntry(this); - session.addEntry(ribbon->tabWidget()); - session.load(); - reset(); - connect(widgetK, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); - connect(widgetX, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); - connect(widgetC, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); - connect(widgetM, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); - connect(widgetK->view, SIGNAL(changedGlobal()), widgetDirectK, SLOT(changedGlobal())); - connect(widgetX->view, SIGNAL(changedGlobal()), widgetGraphics, SLOT(changedGlobal())); - connect(widgetX->view, SIGNAL(receivedX()), widgetGraphics, SLOT(receivedX())); - connect(widgetM->view, SIGNAL(messageReceived(QString,int,QString)), this, SLOT(messageReceived(QString,int,QString))); - QCDCore::instance()->bindWidget(widgetK->view); - QCDCore::instance()->setDirectKEnabled(true); - X.start(); - if (windowState() == Qt::WindowMinimized) - setWindowState(Qt::WindowNoState); -} - - -CDPultWindow::~CDPultWindow() { -} - - -void CDPultWindow::loadFile(const QString & fp) { - load(fp); -} - - -void CDPultWindow::apply(bool sessions) { - CDCore::instance()->stop(); - widgetK->setFile(editFileK->value().value().file); - widgetX->setFile(editFileX->value().value().file); - widgetC->setFile(editFileC->value().value().file); - widgetM->setFile(editFileM->value().value().file); - if (checkDefaultConfig->isChecked()) - CDCore::instance()->initPult(); - else - CDCore::instance()->init(Q2PIString(codeConfig->text()), true); - widgetX->view->startX(); - if (sessions) { - widgetGraphics->load(session_gr); - widgetDirectK->load(session_dk); - if (!session_mw.isEmpty()) - restoreState(session_mw); - X.lock(); - PIVector > x_list = X.enabledList(); - X.unlock(); - piForeachC (PIDeque & p, x_list) - X.enable(X[p]); - ((CDItemModel*)widgetX->view->model())->updateModel(); - widgetX->view->expandAll(); - } - dockCDKView->setVisible(checkHasK->isChecked()); - dockCDXView->setVisible(checkHasX->isChecked()); - dockCDCView->setVisible(checkHasC->isChecked()); - dockCDMView->setVisible(checkHasM->isChecked()); - QMetaObject::invokeMethod(this, "changedDock", Qt::QueuedConnection); -} - - -void CDPultWindow::closeEvent(QCloseEvent *e) { - EMainWindow::closeEvent(e); - if (!e->isAccepted()) - return; - QApplication::closeAllWindows(); - session.save(); - session.setFile(QString()); -} - - -void CDPultWindow::reset(bool full) { - setWindowTitle(QString("CD Pult")); - widgetK->reset(); - setChanged(false); -} - - -bool CDPultWindow::load(const QString & path) { - qApp->setOverrideCursor(Qt::WaitCursor); - QPIConfig conf(path, QIODevice::ReadOnly); - QAD::File f = editFileK->value().value(); - checkSyncFiles->setChecked(false); - editFileK->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_k").toString(), f.filter))); - editFileX->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_x").toString(), f.filter))); - editFileC->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_c").toString(), f.filter))); - editFileM->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_m").toString(), f.filter))); - checkSyncFiles->setChecked(conf.getValue("sync_files").toBool()); - lineSessionName->setText(conf.getValue("session_name").toString()); - last_icon = conf.getValue("icon_path").toString(); - setAppIcon(conf.getValue("icon").toByteArray()); - checkHasK->setChecked(conf.getValue("has_k").toBool()); - checkHasX->setChecked(conf.getValue("has_x").toBool()); - checkHasC->setChecked(conf.getValue("has_c").toBool()); - checkHasM->setChecked(conf.getValue("has_m").toBool()); - checkDefaultConfig->setChecked(conf.getValue("default_config").toBool()); - codeConfig->setText(QByteArray2QString(conf.getValue("config").toByteArray())); - if (codeConfig->text().isEmpty()) - codeConfig->setText(def_config); - session_gr = conf.getValue("session_gr").toByteArray(); - session_dk = conf.getValue("session_dk").toByteArray(); - session_mw = conf.getValue("session_mw").toByteArray(); - setChanged(false); - file_name = path; - apply(true); - qApp->restoreOverrideCursor(); - return true; -} - - -bool CDPultWindow::save(const QString & path) { - session_gr = widgetGraphics->save(); - session_dk = widgetDirectK->save(); - session_mw = saveState(); - QPIConfig conf(path, QIODevice::ReadWrite); - conf.clear(); - conf.setValue("file_k", editFileK->value().value().file); - conf.setValue("file_x", editFileX->value().value().file); - conf.setValue("file_c", editFileC->value().value().file); - conf.setValue("file_m", editFileM->value().value().file); - conf.setValue("sync_files", checkSyncFiles->isChecked()); - conf.setValue("session_name", lineSessionName->text()); - conf.setValue("icon_path", last_icon); - conf.setValue("icon", appIcon()); - conf.setValue("has_k", checkHasK->isChecked()); - conf.setValue("has_x", checkHasX->isChecked()); - conf.setValue("has_c", checkHasC->isChecked()); - conf.setValue("has_m", checkHasM->isChecked()); - conf.setValue("default_config", checkDefaultConfig->isChecked()); - conf.setValue("config", QString2QByteArray(codeConfig->text())); - conf.setValue("session_gr", session_gr); - conf.setValue("session_dk", session_dk); - conf.setValue("session_mw", session_mw); - file_name = path; - return true; - - //widgetK->setFile(path); - //widgetK->save(); -} - - -void CDPultWindow::loadingSession(QPIConfig & conf) { - setRecentFiles(conf.getValue("recent files").toStringList()); -} - - -void CDPultWindow::savingSession(QPIConfig & conf) { - conf.setValue("recent files", recentFiles()); -} - - -QByteArray CDPultWindow::appIcon() const { - QByteArray ret; - if (icon.isNull()) return ret; - QBuffer buff(&ret); - buff.open(QIODevice::WriteOnly); - icon.save(&buff, "png"); - //qDebug() << "s" << ret.size(); - return ret; -} - - -void CDPultWindow::setAppIcon(QByteArray ba) { - if (ba.isEmpty()) { - icon = QImage(); - setWindowIcon(QIcon()); - return; - } - //qDebug() << "l" << ba.size(); - icon = QImage::fromData(ba); - setWindowIcon(QIcon(QPixmap::fromImage(icon))); - //qDebug() << QApplication::windowIcon().availableSizes(); -} - - -void CDPultWindow::addToLog(CDViewWidget::LogIcon icon, const QString & msg) { - QListWidgetItem * ni = new QListWidgetItem(log_icons[icon], "(" + QTime::currentTime().toString() + ") " + msg); - bool s = listLog->verticalScrollBar()->value() == listLog->verticalScrollBar()->maximum(); - listLog->addItem(ni); - if (s) listLog->scrollToBottom(); -} - - -void CDPultWindow::messageReceived(QString path, int type, QString msg) { - MessageType mt = (MessageType)type; - const CDType & t(M.root()[CDCore::stringToPath(Q2PIString(path))]); - if (t.cd_type() != CDType::cdM) return; - if (mt == MessageBox) - QMessageBox::information(this, windowTitle(), QString("[%1]\n%2").arg(PI2QString(t.name()), msg)); -} - - -void CDPultWindow::on_editFileK_valueChanged(const QVariant & p) { - if (!checkSyncFiles->isChecked()) return; - QFileInfo fi(p.value().file); - if (fi.path().isEmpty()) return; - QString n = fi.baseName(); - QString xn(n), cn(n), mn(n); - if (n.contains("k")) { - xn.replace(n.indexOf("k"), 1, "x"); - cn.replace(n.indexOf("k"), 1, "c"); - mn.replace(n.indexOf("k"), 1, "m"); - } else { - xn += "_x"; - cn += "_c"; - mn += "_m"; - } - QString ext = fi.suffix(), dot, dir; - QString kfn(fi.filePath()); - if (!ext.isEmpty()) { - kfn.chop(ext.size()); - if (kfn.endsWith(".")) { - kfn.chop(1); - dot = "."; - } - } - if (!fi.path().isEmpty() && fi.path() != ".") { - dir = fi.path(); - if (!dir.endsWith("/")) - dir += "/"; - } - QAD::File f = editFileK->value().value(); - f.file = dir + xn + dot + ext; editFileX->setValue(QVariant::fromValue(f)); - f.file = dir + cn + dot + ext; editFileC->setValue(QVariant::fromValue(f)); - f.file = dir + mn + dot + ext; editFileM->setValue(QVariant::fromValue(f)); -} - - -void CDPultWindow::on_buttonSessionApply_clicked() { - apply(false); -} - - -void CDPultWindow::on_lineSessionName_textChanged(const QString & t) { - setWindowTitle(QString("CD Pult - %1").arg(t)); -} - - -void CDPultWindow::on_buttonIcon_clicked() { - QList ifl = QImageReader::supportedImageFormats(); - QStringList sfl; foreach (QByteArray s, ifl) sfl << ("*." + QString(s).toLower()); - QString f = QFileDialog::getOpenFileName(this, tr("Select icon"), last_icon, tr("Images") + " (" + sfl.join(" ") + ")"); - if (f.isEmpty()) return; - last_icon = f; - icon = QImage(last_icon); - setWindowIcon(QIcon(QPixmap::fromImage(icon))); -} +#include "edockwidget.h" +#include "cdpultwindow.h" +#include "cdutils_core.h" +#include "cdutils_k.h" +#include "cdutils_x.h" +#include "cdutils_m.h" +#include "qcd_core.h" +#include "qcd_view.h" +#include "qcd_model.h" +#include "qcd_modedialog.h" +#include "chunkstream.h" +#include "qvariantedit.h" +#include "piqt.h" +#include "piqt_highlighter.h" +#include "qcodeedit.h" +#include +#include +#include +#include + +using namespace CDUtils; + + +CDPultWindow::CDPultWindow(QWidget *parent) : EMainWindow(parent), Ui::CDPultWindow() { + setupUi(this); + centralWidget()->hide(); + setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North); + CDCore::instance()->initPult(); + def_config = codeConfig->text(); + checkDefaultConfig->setChecked(true); + new ConfigHighlighter(codeConfig->document()); + widgetK->setType(CDUtils::CDType::cdK); + widgetX->setType(CDUtils::CDType::cdX); + widgetC->setType(CDUtils::CDType::cdC); + widgetM->setType(CDUtils::CDType::cdM); + editFileK->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); + editFileX->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); + editFileC->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); + editFileM->setValue(QVariant::fromValue(QAD::File("", "*.dat"))); + log_icons[CDViewWidget::OKIcon] = QIcon(":/icons/dialog-ok-apply.png"); + log_icons[CDViewWidget::FailIcon] = QIcon(":/icons/dialog-cancel.png"); + log_icons[CDViewWidget::WaitIcon] = QIcon(":/icons/timer.png"); + setRecentMenu(menuOpen_recent); + ribbon = new Ribbon(this); + session.setFile("session_cdpult.conf"); + session.addEntry(this); + session.addEntry(ribbon->tabWidget()); + session.load(); + reset(); + connect(widgetK, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); + connect(widgetX, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); + connect(widgetC, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); + connect(widgetM, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString))); + connect(widgetK->view, SIGNAL(changedGlobal()), widgetDirectK, SLOT(changedGlobal())); + connect(widgetX->view, SIGNAL(changedGlobal()), widgetGraphics, SLOT(changedGlobal())); + connect(widgetX->view, SIGNAL(receivedX()), widgetGraphics, SLOT(receivedX())); + connect(widgetM->view, SIGNAL(messageReceived(QString,int,QString)), this, SLOT(messageReceived(QString,int,QString))); + QCDCore::instance()->bindWidget(widgetK->view); + QCDCore::instance()->setDirectKEnabled(true); + X.start(); + if (windowState() == Qt::WindowMinimized) + setWindowState(Qt::WindowNoState); +} + + +CDPultWindow::~CDPultWindow() { +} + + +void CDPultWindow::loadFile(const QString & fp) { + load(fp); +} + + +void CDPultWindow::apply(bool sessions) { + CDCore::instance()->stop(); + widgetK->setFile(editFileK->value().value().file); + widgetX->setFile(editFileX->value().value().file); + widgetC->setFile(editFileC->value().value().file); + widgetM->setFile(editFileM->value().value().file); + if (checkDefaultConfig->isChecked()) + CDCore::instance()->initPult(); + else + CDCore::instance()->init(Q2PIString(codeConfig->text()), true); + widgetX->view->startX(); + if (sessions) { + widgetGraphics->load(session_gr); + widgetDirectK->load(session_dk); + if (!session_mw.isEmpty()) + restoreState(session_mw); + X.lock(); + PIVector > x_list = X.enabledList(); + X.unlock(); + piForeachC (PIDeque & p, x_list) + X.enable(X[p]); + ((CDItemModel*)widgetX->view->model())->updateModel(); + widgetX->view->expandAll(); + } + dockCDKView->setVisible(checkHasK->isChecked()); + dockCDXView->setVisible(checkHasX->isChecked()); + dockCDCView->setVisible(checkHasC->isChecked()); + dockCDMView->setVisible(checkHasM->isChecked()); + QMetaObject::invokeMethod(this, "changedDock", Qt::QueuedConnection); +} + + +void CDPultWindow::closeEvent(QCloseEvent *e) { + EMainWindow::closeEvent(e); + if (!e->isAccepted()) + return; + QApplication::closeAllWindows(); + session.save(); + session.setFile(QString()); +} + + +void CDPultWindow::reset(bool full) { + setWindowTitle(QString("CD Pult")); + widgetK->reset(); + setChanged(false); +} + + +bool CDPultWindow::load(const QString & path) { + qApp->setOverrideCursor(Qt::WaitCursor); + QPIConfig conf(path, QIODevice::ReadOnly); + QAD::File f = editFileK->value().value(); + checkSyncFiles->setChecked(false); + editFileK->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_k").toString(), f.filter))); + editFileX->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_x").toString(), f.filter))); + editFileC->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_c").toString(), f.filter))); + editFileM->setValue(QVariant::fromValue(QAD::File(conf.getValue("file_m").toString(), f.filter))); + checkSyncFiles->setChecked(conf.getValue("sync_files").toBool()); + lineSessionName->setText(conf.getValue("session_name").toString()); + last_icon = conf.getValue("icon_path").toString(); + setAppIcon(conf.getValue("icon").toByteArray()); + checkHasK->setChecked(conf.getValue("has_k").toBool()); + checkHasX->setChecked(conf.getValue("has_x").toBool()); + checkHasC->setChecked(conf.getValue("has_c").toBool()); + checkHasM->setChecked(conf.getValue("has_m").toBool()); + checkDefaultConfig->setChecked(conf.getValue("default_config").toBool()); + codeConfig->setText(QByteArray2QString(conf.getValue("config").toByteArray())); + if (codeConfig->text().isEmpty()) + codeConfig->setText(def_config); + session_gr = conf.getValue("session_gr").toByteArray(); + session_dk = conf.getValue("session_dk").toByteArray(); + session_mw = conf.getValue("session_mw").toByteArray(); + setChanged(false); + file_name = path; + apply(true); + qApp->restoreOverrideCursor(); + return true; +} + + +bool CDPultWindow::save(const QString & path) { + session_gr = widgetGraphics->save(); + session_dk = widgetDirectK->save(); + session_mw = saveState(); + QPIConfig conf(path, QIODevice::ReadWrite); + conf.clear(); + conf.setValue("file_k", editFileK->value().value().file); + conf.setValue("file_x", editFileX->value().value().file); + conf.setValue("file_c", editFileC->value().value().file); + conf.setValue("file_m", editFileM->value().value().file); + conf.setValue("sync_files", checkSyncFiles->isChecked()); + conf.setValue("session_name", lineSessionName->text()); + conf.setValue("icon_path", last_icon); + conf.setValue("icon", appIcon()); + conf.setValue("has_k", checkHasK->isChecked()); + conf.setValue("has_x", checkHasX->isChecked()); + conf.setValue("has_c", checkHasC->isChecked()); + conf.setValue("has_m", checkHasM->isChecked()); + conf.setValue("default_config", checkDefaultConfig->isChecked()); + conf.setValue("config", QString2QByteArray(codeConfig->text())); + conf.setValue("session_gr", session_gr); + conf.setValue("session_dk", session_dk); + conf.setValue("session_mw", session_mw); + file_name = path; + return true; + + //widgetK->setFile(path); + //widgetK->save(); +} + + +void CDPultWindow::loadingSession(QPIConfig & conf) { + setRecentFiles(conf.getValue("recent files").toStringList()); +} + + +void CDPultWindow::savingSession(QPIConfig & conf) { + conf.setValue("recent files", recentFiles()); +} + + +QByteArray CDPultWindow::appIcon() const { + QByteArray ret; + if (icon.isNull()) return ret; + QBuffer buff(&ret); + buff.open(QIODevice::WriteOnly); + icon.save(&buff, "png"); + //qDebug() << "s" << ret.size(); + return ret; +} + + +void CDPultWindow::setAppIcon(QByteArray ba) { + if (ba.isEmpty()) { + icon = QImage(); + setWindowIcon(QIcon()); + return; + } + //qDebug() << "l" << ba.size(); + icon = QImage::fromData(ba); + setWindowIcon(QIcon(QPixmap::fromImage(icon))); + //qDebug() << QApplication::windowIcon().availableSizes(); +} + + +void CDPultWindow::addToLog(CDViewWidget::LogIcon icon, const QString & msg) { + QListWidgetItem * ni = new QListWidgetItem(log_icons[icon], "(" + QTime::currentTime().toString() + ") " + msg); + bool s = listLog->verticalScrollBar()->value() == listLog->verticalScrollBar()->maximum(); + listLog->addItem(ni); + if (s) listLog->scrollToBottom(); +} + + +void CDPultWindow::messageReceived(QString path, int type, QString msg) { + MessageType mt = (MessageType)type; + const CDType & t(M.root()[CDCore::stringToPath(Q2PIString(path))]); + if (t.cd_type() != CDType::cdM) return; + if (mt == MessageBox) + QMessageBox::information(this, windowTitle(), QString("[%1]\n%2").arg(PI2QString(t.name()), msg)); +} + + +void CDPultWindow::on_editFileK_valueChanged(const QVariant & p) { + if (!checkSyncFiles->isChecked()) return; + QFileInfo fi(p.value().file); + if (fi.path().isEmpty()) return; + QString n = fi.baseName(); + QString xn(n), cn(n), mn(n); + if (n.contains("k")) { + xn.replace(n.indexOf("k"), 1, "x"); + cn.replace(n.indexOf("k"), 1, "c"); + mn.replace(n.indexOf("k"), 1, "m"); + } else { + xn += "_x"; + cn += "_c"; + mn += "_m"; + } + QString ext = fi.suffix(), dot, dir; + QString kfn(fi.filePath()); + if (!ext.isEmpty()) { + kfn.chop(ext.size()); + if (kfn.endsWith(".")) { + kfn.chop(1); + dot = "."; + } + } + if (!fi.path().isEmpty() && fi.path() != ".") { + dir = fi.path(); + if (!dir.endsWith("/")) + dir += "/"; + } + QAD::File f = editFileK->value().value(); + f.file = dir + xn + dot + ext; editFileX->setValue(QVariant::fromValue(f)); + f.file = dir + cn + dot + ext; editFileC->setValue(QVariant::fromValue(f)); + f.file = dir + mn + dot + ext; editFileM->setValue(QVariant::fromValue(f)); +} + + +void CDPultWindow::on_buttonSessionApply_clicked() { + apply(false); +} + + +void CDPultWindow::on_lineSessionName_textChanged(const QString & t) { + setWindowTitle(QString("CD Pult - %1").arg(t)); +} + + +void CDPultWindow::on_buttonIcon_clicked() { + QList ifl = QImageReader::supportedImageFormats(); + QStringList sfl; foreach (QByteArray s, ifl) sfl << ("*." + QString(s).toLower()); + QString f = QFileDialog::getOpenFileName(this, tr("Select icon"), last_icon, tr("Images") + " (" + sfl.join(" ") + ")"); + if (f.isEmpty()) return; + last_icon = f; + icon = QImage(last_icon); + setWindowIcon(QIcon(QPixmap::fromImage(icon))); +} diff --git a/qcd_utils/pult/cdpultwindow.h b/piqt/utils/cd_pult/cdpultwindow.h similarity index 96% rename from qcd_utils/pult/cdpultwindow.h rename to piqt/utils/cd_pult/cdpultwindow.h index 6e8c499..dad2c2b 100644 --- a/qcd_utils/pult/cdpultwindow.h +++ b/piqt/utils/cd_pult/cdpultwindow.h @@ -1,53 +1,53 @@ -#ifndef CDPULTWINDOW_H -#define CDPULTWINDOW_H - -#include "emainwindow.h" -#include "ui_cdpultwindow.h" -#include "cdviewwidget.h" -#include "ribbon.h" -#include "piobject.h" - - -class CDPultWindow : public EMainWindow, public Ui::CDPultWindow -{ - Q_OBJECT - Q_ENUMS(LogIcon) -public: - - explicit CDPultWindow(QWidget *parent = 0); - ~CDPultWindow(); - void loadFile(const QString & fp); - void apply(bool sessions); - -private: - - void closeEvent(QCloseEvent *); - void reset(bool full = false); - bool load(const QString & path); - bool save(const QString & path); - QString loadFilter() {return "Pult session(*.conf)";} - QString saveFilter() {return loadFilter();} - void loadingSession(QPIConfig & conf); - void savingSession(QPIConfig & conf); - - QByteArray appIcon() const; - void setAppIcon(QByteArray ba); - - Ribbon * ribbon; - QMap log_icons; - QByteArray session_gr, session_dk, session_mw; - QString def_config, last_icon; - QImage icon; - -private slots: - void addToLog(CDViewWidget::LogIcon icon, const QString & msg); - void messageReceived(QString path, int type, QString msg); - - void on_editFileK_valueChanged(const QVariant & p); - void on_buttonSessionApply_clicked(); - - void on_lineSessionName_textChanged(const QString & t); - void on_buttonIcon_clicked(); -}; - -#endif // CDPULTWINDOW_H +#ifndef CDPULTWINDOW_H +#define CDPULTWINDOW_H + +#include "emainwindow.h" +#include "ui_cdpultwindow.h" +#include "cdviewwidget.h" +#include "ribbon.h" +#include "piobject.h" + + +class CDPultWindow : public EMainWindow, public Ui::CDPultWindow +{ + Q_OBJECT + Q_ENUMS(LogIcon) +public: + + explicit CDPultWindow(QWidget *parent = 0); + ~CDPultWindow(); + void loadFile(const QString & fp); + void apply(bool sessions); + +private: + + void closeEvent(QCloseEvent *); + void reset(bool full = false); + bool load(const QString & path); + bool save(const QString & path); + QString loadFilter() {return "Pult session(*.conf)";} + QString saveFilter() {return loadFilter();} + void loadingSession(QPIConfig & conf); + void savingSession(QPIConfig & conf); + + QByteArray appIcon() const; + void setAppIcon(QByteArray ba); + + Ribbon * ribbon; + QMap log_icons; + QByteArray session_gr, session_dk, session_mw; + QString def_config, last_icon; + QImage icon; + +private slots: + void addToLog(CDViewWidget::LogIcon icon, const QString & msg); + void messageReceived(QString path, int type, QString msg); + + void on_editFileK_valueChanged(const QVariant & p); + void on_buttonSessionApply_clicked(); + + void on_lineSessionName_textChanged(const QString & t); + void on_buttonIcon_clicked(); +}; + +#endif // CDPULTWINDOW_H diff --git a/qcd_utils/pult/cdpultwindow.ui b/piqt/utils/cd_pult/cdpultwindow.ui similarity index 96% rename from qcd_utils/pult/cdpultwindow.ui rename to piqt/utils/cd_pult/cdpultwindow.ui index e7a1904..ee0273c 100644 --- a/qcd_utils/pult/cdpultwindow.ui +++ b/piqt/utils/cd_pult/cdpultwindow.ui @@ -1,612 +1,612 @@ - - - CDPultWindow - - - - 0 - 0 - 798 - 593 - - - - CD Pult - - - true - - - QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks - - - - - - 0 - 0 - 798 - 24 - - - - - Main - - - - Open recent - - - - :/icons/document-open-recent.png:/icons/document-open-recent.png - - - - - - - - - - - - - :/icons/document-edit.png:/icons/document-edit.png - - - K - - - 1 - - - - - 0 - - - - - - - - - - - :/icons/dialog-information.png:/icons/dialog-information.png - - - Log - - - 8 - - - - - - - QAbstractItemView::NoEditTriggers - - - false - - - true - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - QAbstractItemView::ScrollPerPixel - - - QAbstractItemView::ScrollPerPixel - - - - - - - - - - :/icons/qvariantedit.png:/icons/qvariantedit.png - - - X - - - 1 - - - - - - - - - - - - - :/icons/configure.png:/icons/configure.png - - - Session - - - 2 - - - - - - - Apply - - - - :/icons/dialog-ok-apply.png:/icons/dialog-ok-apply.png - - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - Name: - - - - - - - - - - - - Select icon... - - - - :/icons/view-preview.png:/icons/view-preview.png - - - - - - - - - K file: - - - - - - - - - - X file: - - - - - - - - - - C file: - - - - - - - - - - Sync files - - - - - - - - - K - - - - - - - X - - - - - - - C - - - - - - - M - - - - - - - - - Default config - - - - - - - M file: - - - - - - - - - - - - - 0 - 0 - - - - include = ip.conf -[connection] -device.cd = eth://udp:${ip.pult}:27002:${ip.app}:27001 #s -[] - - - - - DejaVu Sans Mono - 9 - - - - - - - - - - - :/icons/legend.png:/icons/legend.png - - - C - - - 1 - - - - - - - - - - - - - :/icons/format-stroke-color.png:/icons/format-stroke-color.png - - - Graphics - - - 8 - - - - - - - - - - - - - :/icons/tools-wizard.png:/icons/tools-wizard.png - - - Direct K - - - 8 - - - - - - - - - - - - - :/icons/accessories-text-editor.png:/icons/accessories-text-editor.png - - - M - - - 1 - - - - - - - - - - - - - :/icons/document-open.png:/icons/document-open.png - - - Open... - - - Ctrl+O - - - - - - :/icons/document-save.png:/icons/document-save.png - - - Save - - - Ctrl+S - - - - - - :/icons/document-save-as.png:/icons/document-save-as.png - - - Save As... - - - Ctrl+Shift+S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EMainWindow - QMainWindow -
emainwindow.h
- 1 -
- - CLineEdit - QLineEdit -
clineedit.h
-
- - QCodeEdit - QWidget -
qcodeedit.h
-
- - QVariantEdit - QWidget -
qvariantedit.h
-
- - EDockWidget - QDockWidget -
edockwidget.h
- 1 -
- - CDViewWidget - QWidget -
cdviewwidget.h
- 1 -
- - CDGraphics - QWidget -
cdgraphics.h
- 1 -
- - CDDirectK - QWidget -
cddirectk.h
- 1 -
-
- - - - - - - - - actionSave - triggered() - CDPultWindow - saveFile() - - - -1 - -1 - - - 399 - 299 - - - - - actionSaveAs - triggered() - CDPultWindow - saveAsFile() - - - -1 - -1 - - - 399 - 299 - - - - - actionOpen - triggered() - CDPultWindow - openFile() - - - -1 - -1 - - - 399 - 299 - - - - - checkSyncFiles - toggled(bool) - editFileX - setDisabled(bool) - - - 786 - 220 - - - 786 - 151 - - - - - checkSyncFiles - toggled(bool) - editFileC - setDisabled(bool) - - - 786 - 220 - - - 786 - 172 - - - - - checkDefaultConfig - toggled(bool) - codeConfig - setDisabled(bool) - - - 786 - 276 - - - 581 - 304 - - - - - checkSyncFiles - toggled(bool) - editFileM - setDisabled(bool) - - - 767 - 205 - - - 767 - 187 - - - - -
+ + + CDPultWindow + + + + 0 + 0 + 798 + 593 + + + + CD Pult + + + true + + + QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks + + + + + + 0 + 0 + 798 + 24 + + + + + Main + + + + Open recent + + + + :/icons/document-open-recent.png:/icons/document-open-recent.png + + + + + + + + + + + + + :/icons/document-edit.png:/icons/document-edit.png + + + K + + + 1 + + + + + 0 + + + + + + + + + + + :/icons/dialog-information.png:/icons/dialog-information.png + + + Log + + + 8 + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + + + + :/icons/qvariantedit.png:/icons/qvariantedit.png + + + X + + + 1 + + + + + + + + + + + + + :/icons/configure.png:/icons/configure.png + + + Session + + + 2 + + + + + + + Apply + + + + :/icons/dialog-ok-apply.png:/icons/dialog-ok-apply.png + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Name: + + + + + + + + + + + + Select icon... + + + + :/icons/view-preview.png:/icons/view-preview.png + + + + + + + + + K file: + + + + + + + + + + X file: + + + + + + + + + + C file: + + + + + + + + + + Sync files + + + + + + + + + K + + + + + + + X + + + + + + + C + + + + + + + M + + + + + + + + + Default config + + + + + + + M file: + + + + + + + + + + + + + 0 + 0 + + + + include = ip.conf +[connection] +device.cd = eth://udp:${ip.pult}:27002:${ip.app}:27001 #s +[] + + + + + DejaVu Sans Mono + 9 + + + + + + + + + + + :/icons/legend.png:/icons/legend.png + + + C + + + 1 + + + + + + + + + + + + + :/icons/format-stroke-color.png:/icons/format-stroke-color.png + + + Graphics + + + 8 + + + + + + + + + + + + + :/icons/tools-wizard.png:/icons/tools-wizard.png + + + Direct K + + + 8 + + + + + + + + + + + + + :/icons/accessories-text-editor.png:/icons/accessories-text-editor.png + + + M + + + 1 + + + + + + + + + + + + + :/icons/document-open.png:/icons/document-open.png + + + Open... + + + Ctrl+O + + + + + + :/icons/document-save.png:/icons/document-save.png + + + Save + + + Ctrl+S + + + + + + :/icons/document-save-as.png:/icons/document-save-as.png + + + Save As... + + + Ctrl+Shift+S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EMainWindow + QMainWindow +
emainwindow.h
+ 1 +
+ + CLineEdit + QLineEdit +
clineedit.h
+
+ + QCodeEdit + QWidget +
qcodeedit.h
+
+ + QVariantEdit + QWidget +
qvariantedit.h
+
+ + EDockWidget + QDockWidget +
edockwidget.h
+ 1 +
+ + CDViewWidget + QWidget +
cdviewwidget.h
+ 1 +
+ + CDGraphics + QWidget +
cdgraphics.h
+ 1 +
+ + CDDirectK + QWidget +
cddirectk.h
+ 1 +
+
+ + + + + + + + + actionSave + triggered() + CDPultWindow + saveFile() + + + -1 + -1 + + + 399 + 299 + + + + + actionSaveAs + triggered() + CDPultWindow + saveAsFile() + + + -1 + -1 + + + 399 + 299 + + + + + actionOpen + triggered() + CDPultWindow + openFile() + + + -1 + -1 + + + 399 + 299 + + + + + checkSyncFiles + toggled(bool) + editFileX + setDisabled(bool) + + + 786 + 220 + + + 786 + 151 + + + + + checkSyncFiles + toggled(bool) + editFileC + setDisabled(bool) + + + 786 + 220 + + + 786 + 172 + + + + + checkDefaultConfig + toggled(bool) + codeConfig + setDisabled(bool) + + + 786 + 276 + + + 581 + 304 + + + + + checkSyncFiles + toggled(bool) + editFileM + setDisabled(bool) + + + 767 + 205 + + + 767 + 187 + + + + +
diff --git a/qcd_utils/pult/cdviewwidget.cpp b/piqt/utils/cd_pult/cdviewwidget.cpp similarity index 96% rename from qcd_utils/pult/cdviewwidget.cpp rename to piqt/utils/cd_pult/cdviewwidget.cpp index a01c87a..67fa124 100644 --- a/qcd_utils/pult/cdviewwidget.cpp +++ b/piqt/utils/cd_pult/cdviewwidget.cpp @@ -1,78 +1,78 @@ -#include "cdviewwidget.h" -#include "cdutils_core.h" -#include "qcd_core.h" -#include "qcd_model.h" -#include "qcd_modedialog.h" -#include "qvariantedit.h" -#include - - -CDViewWidget::CDViewWidget(QWidget * parent) : QWidget(parent), Ui::CDViewWidget() { - qRegisterMetaType("CDViewWidget::LogIcon"); - setupUi(this); - connect(view, SIGNAL(sendSucceed()), this, SLOT(sended())); - connect(view, SIGNAL(receiveSucceed()), this, SLOT(received())); - connect(view, SIGNAL(sendFailed()), this, SLOT(sendFailed())); - connect(view, SIGNAL(receiveFailed()), this, SLOT(receiveFailed())); -} - - -CDViewWidget::~CDViewWidget() { -} - - -void CDViewWidget::reset() { - setFile(""); -} - - -void CDViewWidget::setType(int t) { - view->setType((CDUtils::CDType::cdT)t); - tl_u = view->typeLetter().toUpper(); - tl_l = view->typeLetter().toLower(); - view->refresh(); -} - - -void CDViewWidget::setFile(const QString & f) { - view->setFile(f); - view->load(); -} - - -void CDViewWidget::on_buttonSend_clicked() { - if (view->inProgress()) {addToLog(WaitIcon, "processing..."); return;} - addToLog(WaitIcon, "Sending " + tl_u + "..."); - view->send(); -} - - -void CDViewWidget::on_buttonReceive_clicked() { - if (view->inProgress()) {addToLog(WaitIcon, "processing..."); return;} - addToLog(WaitIcon, "Receiving " + tl_u + "..."); - view->receive(); -} - - -void CDViewWidget::on_buttonLoad_clicked() { - view->load(); -} - - -void CDViewWidget::on_buttonSave_clicked() { - view->save(); -} - - -void CDViewWidget::on_buttonParse_clicked() { - QString path = QFileDialog::getOpenFileName(this, "Select header file", "", - QString("%1 Description(%2_description.h);;Headers(*.h)").arg(tl_u, tl_l)); - if (path.isEmpty()) return; - CDUtils::UpdateModeFlags mode = CDUtils::SaveByName; - if (!view->root()->isEmpty()) { - QCDModeDialog cdm; - if (cdm.exec() != QDialog::Accepted) return; - mode = cdm.mode(); - } - view->buildFromHeader(path, mode); -} +#include "cdviewwidget.h" +#include "cdutils_core.h" +#include "qcd_core.h" +#include "qcd_model.h" +#include "qcd_modedialog.h" +#include "qvariantedit.h" +#include + + +CDViewWidget::CDViewWidget(QWidget * parent) : QWidget(parent), Ui::CDViewWidget() { + qRegisterMetaType("CDViewWidget::LogIcon"); + setupUi(this); + connect(view, SIGNAL(sendSucceed()), this, SLOT(sended())); + connect(view, SIGNAL(receiveSucceed()), this, SLOT(received())); + connect(view, SIGNAL(sendFailed()), this, SLOT(sendFailed())); + connect(view, SIGNAL(receiveFailed()), this, SLOT(receiveFailed())); +} + + +CDViewWidget::~CDViewWidget() { +} + + +void CDViewWidget::reset() { + setFile(""); +} + + +void CDViewWidget::setType(int t) { + view->setType((CDUtils::CDType::cdT)t); + tl_u = view->typeLetter().toUpper(); + tl_l = view->typeLetter().toLower(); + view->refresh(); +} + + +void CDViewWidget::setFile(const QString & f) { + view->setFile(f); + view->load(); +} + + +void CDViewWidget::on_buttonSend_clicked() { + if (view->inProgress()) {addToLog(WaitIcon, "processing..."); return;} + addToLog(WaitIcon, "Sending " + tl_u + "..."); + view->send(); +} + + +void CDViewWidget::on_buttonReceive_clicked() { + if (view->inProgress()) {addToLog(WaitIcon, "processing..."); return;} + addToLog(WaitIcon, "Receiving " + tl_u + "..."); + view->receive(); +} + + +void CDViewWidget::on_buttonLoad_clicked() { + view->load(); +} + + +void CDViewWidget::on_buttonSave_clicked() { + view->save(); +} + + +void CDViewWidget::on_buttonParse_clicked() { + QString path = QFileDialog::getOpenFileName(this, "Select header file", "", + QString("%1 Description(%2_description.h);;Headers(*.h)").arg(tl_u, tl_l)); + if (path.isEmpty()) return; + CDUtils::UpdateModeFlags mode = CDUtils::SaveByName; + if (!view->root()->isEmpty()) { + QCDModeDialog cdm; + if (cdm.exec() != QDialog::Accepted) return; + mode = cdm.mode(); + } + view->buildFromHeader(path, mode); +} diff --git a/qcd_utils/pult/cdviewwidget.h b/piqt/utils/cd_pult/cdviewwidget.h similarity index 96% rename from qcd_utils/pult/cdviewwidget.h rename to piqt/utils/cd_pult/cdviewwidget.h index 3145666..9b1abb1 100644 --- a/qcd_utils/pult/cdviewwidget.h +++ b/piqt/utils/cd_pult/cdviewwidget.h @@ -1,41 +1,41 @@ -#ifndef CDVIEWWIDGET_H -#define CDVIEWWIDGET_H - -#include -#include "ui_cdviewwidget.h" - - -class CDViewWidget : public QWidget, public Ui::CDViewWidget -{ - Q_OBJECT -public: - explicit CDViewWidget(QWidget *parent = 0); - ~CDViewWidget(); - - enum LogIcon {NoIcon, OKIcon, FailIcon, WaitIcon}; - - void reset(); - void setType(int t); - void setFile(const QString & f); - -private: - QString tl_u, tl_l; - -private slots: - void sended() {addToLog(OKIcon, tl_u + " " + tr("sended succesfull"));} - void received() {addToLog(OKIcon, tl_u + " " + tr("received succesfull"));} - void sendFailed() {addToLog(FailIcon, tl_u + " " + tr("NOT sended"));} - void receiveFailed() {addToLog(FailIcon, tl_u + " " + tr("NOT received"));} - void on_buttonSend_clicked(); - void on_buttonReceive_clicked(); - void on_buttonLoad_clicked(); - void on_buttonSave_clicked(); - void on_buttonParse_clicked(); - //void on_buttonCalculate_clicked(); - -signals: - void addToLog(CDViewWidget::LogIcon icon, const QString & msg); - -}; - -#endif // CDVIEWWIDGET_H +#ifndef CDVIEWWIDGET_H +#define CDVIEWWIDGET_H + +#include +#include "ui_cdviewwidget.h" + + +class CDViewWidget : public QWidget, public Ui::CDViewWidget +{ + Q_OBJECT +public: + explicit CDViewWidget(QWidget *parent = 0); + ~CDViewWidget(); + + enum LogIcon {NoIcon, OKIcon, FailIcon, WaitIcon}; + + void reset(); + void setType(int t); + void setFile(const QString & f); + +private: + QString tl_u, tl_l; + +private slots: + void sended() {addToLog(OKIcon, tl_u + " " + tr("sended succesfull"));} + void received() {addToLog(OKIcon, tl_u + " " + tr("received succesfull"));} + void sendFailed() {addToLog(FailIcon, tl_u + " " + tr("NOT sended"));} + void receiveFailed() {addToLog(FailIcon, tl_u + " " + tr("NOT received"));} + void on_buttonSend_clicked(); + void on_buttonReceive_clicked(); + void on_buttonLoad_clicked(); + void on_buttonSave_clicked(); + void on_buttonParse_clicked(); + //void on_buttonCalculate_clicked(); + +signals: + void addToLog(CDViewWidget::LogIcon icon, const QString & msg); + +}; + +#endif // CDVIEWWIDGET_H diff --git a/qcd_utils/pult/cdviewwidget.ui b/piqt/utils/cd_pult/cdviewwidget.ui similarity index 96% rename from qcd_utils/pult/cdviewwidget.ui rename to piqt/utils/cd_pult/cdviewwidget.ui index 5b0ff0b..eb2d44c 100644 --- a/qcd_utils/pult/cdviewwidget.ui +++ b/piqt/utils/cd_pult/cdviewwidget.ui @@ -1,176 +1,176 @@ - - - CDViewWidget - - - - 0 - 0 - 689 - 459 - - - - CD Pult - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - Send - - - - :/icons/flame.png:/icons/flame.png - - - - - - - Receive - - - - :/icons/document-revert.png:/icons/document-revert.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 20 - 20 - - - - - - - - Load - - - - :/icons/document-open.png:/icons/document-open.png - - - - - - - Save - - - - :/icons/document-save.png:/icons/document-save.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 20 - 20 - - - - - - - - Update description ... - - - - :/icons/view-refresh.png:/icons/view-refresh.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 1 - 20 - - - - - - - - - - - - Qt::CustomContextMenu - - - QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed - - - true - - - QAbstractItemView::DragOnly - - - QAbstractItemView::ScrollPerPixel - - - QAbstractItemView::ScrollPerPixel - - - - - - - - CDView - QTreeView -
qcd_view.h
-
-
- - - - - -
+ + + CDViewWidget + + + + 0 + 0 + 689 + 459 + + + + CD Pult + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + Send + + + + :/icons/flame.png:/icons/flame.png + + + + + + + Receive + + + + :/icons/document-revert.png:/icons/document-revert.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Load + + + + :/icons/document-open.png:/icons/document-open.png + + + + + + + Save + + + + :/icons/document-save.png:/icons/document-save.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Update description ... + + + + :/icons/view-refresh.png:/icons/view-refresh.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 1 + 20 + + + + + + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed + + + true + + + QAbstractItemView::DragOnly + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + + CDView + QTreeView +
qcd_view.h
+
+
+ + + + + +
diff --git a/piqt_utils/piconnedit/icons/Apps-accessories-calculator-icon.png b/piqt/utils/cd_pult/icons/Apps-accessories-calculator-icon.png similarity index 100% rename from piqt_utils/piconnedit/icons/Apps-accessories-calculator-icon.png rename to piqt/utils/cd_pult/icons/Apps-accessories-calculator-icon.png diff --git a/qcd_utils/pult/icons/accessories-text-editor.png b/piqt/utils/cd_pult/icons/accessories-text-editor.png similarity index 100% rename from qcd_utils/pult/icons/accessories-text-editor.png rename to piqt/utils/cd_pult/icons/accessories-text-editor.png diff --git a/qcd_utils/pult/icons/db-export.png b/piqt/utils/cd_pult/icons/db-export.png similarity index 100% rename from qcd_utils/pult/icons/db-export.png rename to piqt/utils/cd_pult/icons/db-export.png diff --git a/qcd_utils/pult/icons/db-import.png b/piqt/utils/cd_pult/icons/db-import.png similarity index 100% rename from qcd_utils/pult/icons/db-import.png rename to piqt/utils/cd_pult/icons/db-import.png diff --git a/qcd_utils/pult/icons/flame.png b/piqt/utils/cd_pult/icons/flame.png similarity index 100% rename from qcd_utils/pult/icons/flame.png rename to piqt/utils/cd_pult/icons/flame.png diff --git a/qcd_utils/pult/icons/timer.png b/piqt/utils/cd_pult/icons/timer.png similarity index 100% rename from qcd_utils/pult/icons/timer.png rename to piqt/utils/cd_pult/icons/timer.png diff --git a/qcd_utils/pult/main.cpp b/piqt/utils/cd_pult/main.cpp similarity index 97% rename from qcd_utils/pult/main.cpp rename to piqt/utils/cd_pult/main.cpp index e40a74c..505f4d0 100644 --- a/qcd_utils/pult/main.cpp +++ b/piqt/utils/cd_pult/main.cpp @@ -1,373 +1,373 @@ -#include -#include "cdpultwindow.h" - -template -class PIHash { - //template friend PIByteArray & operator >>(PIByteArray & s, PIHash & v); - //template friend PIByteArray & operator <<(PIByteArray & s, const PIHash & v); -public: - PIHash() {;} - PIHash(const PIHash & other) {*this = other;} - virtual ~PIHash() {;} - - PIHash & operator =(const PIHash & other) { - if (this == &other) return *this; - clear(); - pih_content = other.pih_content; - return *this; - } - - typedef T mapped_type; - typedef Key key_type; - typedef PIPair value_type; -/* - class iterator { - friend class PIHash; - private: - iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} - const PIHash * parent; - ssize_t pos; - public: - iterator(): parent(0), pos(0) {} - const Key & key() const {return const_cast * >(parent)->_key(pos);} - T & value() {return const_cast * >(parent)->_value(pos);} - void operator ++() {++pos;} - void operator ++(int) {++pos;} - void operator --() {--pos;} - void operator --(int) {--pos;} - bool operator ==(const iterator & it) const {return (pos == it.pos);} - bool operator !=(const iterator & it) const {return (pos != it.pos);} - }; - - class reverse_iterator { - friend class PIHash; - private: - reverse_iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} - const PIHash * parent; - ssize_t pos; - public: - reverse_iterator(): parent(0), pos(0) {} - const Key & key() const {return const_cast * >(parent)->_key(pos);} - T & value() const {return const_cast * >(parent)->_value(pos);} - void operator ++() {--pos;} - void operator ++(int) {--pos;} - void operator --() {++pos;} - void operator --(int) {++pos;} - bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} - bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} - }; -*/ - class const_iterator { - friend class PIHash; - private: - const_iterator(const PIHash * v, ssize_t p): parent(v), pos(p), bpos(0) { - if (pos == 0) { - pos = -1; - nextPos(); - } - } - void nextPos() { - while (++pos < parent->pih_content.size_s()) { - if (!parent->pih_content[pos].isEmpty()) - return; - } - } - const PIHash * parent; - ssize_t pos, bpos; - public: - const_iterator(): parent(0), pos(0) {} - //const value_type operator *() const {return parent->_pair(pos);} - //const value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} - const Key & key() const {return const_cast * >(parent)->pih_content[pos][bpos].key;} - const T & value() const {return const_cast * >(parent)->pih_content[pos][bpos].value;} - void operator ++() { - if (pos < parent->pih_content.size_s()) { - if (bpos >= parent->pih_content[pos].size_s() - 1) { - bpos = 0; - nextPos(); - } else - ++bpos; - } else { - bpos = 0; - ++pos; - } - printf(" ++: %d %d\n", pos, bpos); - } - //void operator ++(int) {++pos;} - void operator --() { - --pos; - } - //void operator --(int) {--pos;} - bool operator ==(const const_iterator & it) const {return (pos == it.pos && bpos == it.bpos);} - bool operator !=(const const_iterator & it) const {return !(*this == it);} - mutable value_type cval; - }; -/* - class const_reverse_iterator { - friend class PIHash; - private: - const_reverse_iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} - const PIHash * parent; - ssize_t pos; - public: - const_reverse_iterator(): parent(0), pos(0) {} - const value_type operator *() const {return parent->_pair(pos);} - const value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} - void operator ++() {--pos;} - void operator ++(int) {--pos;} - void operator --() {++pos;} - void operator --(int) {++pos;} - bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} - bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} - mutable value_type cval; - }; -*/ - //iterator begin() {return iterator(this, 0);} - //iterator end() {return iterator(this, size());} - const_iterator begin() const {return const_iterator(this, 0);} - const_iterator end() const {return const_iterator(this, size());} - const_iterator constBegin() const {return const_iterator(this, 0);} - const_iterator constEnd() const {return const_iterator(this, size());} - //reverse_iterator rbegin() {return reverse_iterator(this, size() - 1);} - //reverse_iterator rend() {return reverse_iterator(this, -1);} - //const_reverse_iterator rbegin() const {return const_reverse_iterator(this, size() - 1);} - //const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} - //const_reverse_iterator constRbegin() const {return const_reverse_iterator(this, size() - 1);} - //const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);} - - size_t size() const {return pih_content.size();} - int size_s() const {return pih_content.size_s();} - size_t length() const {return pih_content.size();} - size_t capacity() const {return pih_content.size();} - bool isEmpty() const {return (pih_content.size() == 0);} - - T & operator [](const Key & key) { - if (pih_content.isEmpty()) _rehash(1); - uint k = piHash(key); - int i = _index(k); - if (i < pih_content.size_s()) { - PIVector & hv(pih_content[i]); - if (hv.size_s() == 1) { - if (hv[0].key == k) - return hv[0].value; - } - for (int j = 0; j < hv.size_s(); ++j) - if (hv[j].key == k) - return hv[j].value; - } - if (pih_content[i].size_s() >= 4) - _rehash(pih_content.size_s() * 2); - i = _index(k); - pih_content[i] << HashEntry(k); - return pih_content[i].back().value; - } - const T operator [](const Key & key) const {return value(key);} - T & at(const Key & key) {return (*this)[key];} - const T at(const Key & key) const {return (*this)[key];} - - PIHash & operator <<(const PIHash & other) { - if (other.isEmpty()) return *this; - for (int i = 0; i < other.pih_content.size_s(); ++i) - for (int j = 0; j < other.pih_content[i].size_s(); ++j) - insert(other.pih_content[i][j].key, other.pih_content[i][j].value); - return *this; - } - - bool operator ==(const PIHash & t) const {return (pih_content == t.pih_content);} - bool operator !=(const PIHash & t) const {return (pih_content != t.pih_content);} - bool contains(const Key & key) const { - bool f(false); - _find(key, f); - return f; - } - - PIHash & reserve(size_t new_size) {_rehash(new_size); return *this;} - - PIHash & remove(const Key & key) { - uint k = piHash(key); - int i = _index(k); - if (i >= pih_content.size_s()) return *this; - PIVector & hv(pih_content[i]); - for (int j = 0; j < hv.size_s(); ++j) - if (hv[j].key == k) { - hv.remove(j); - --j; - } - return *this; - } - PIHash & erase(const Key & key) {return remove(key);} - PIHash & clear() {pih_content.clear(); return *this;} - - void swap(PIHash & other) { - pih_content.swap(other.pih_content); - } - - PIHash & insert(const Key & key, const T & value) { - (*this)[key] = value; - return *this; - } - const T value(const Key & key, const T & default_ = T()) const { - uint k = piHash(key); - int i = _index(k); - if (i >= pih_content.size_s()) return default_; - const PIVector & hv(pih_content[i]); - for (int j = 0; j < hv.size_s(); ++j) - if (hv[j].key == k) - return hv[j].value; - return default_; - } - PIVector values() const { - PIVector ret; - for (int i = 0; i < pih_content.size_s(); ++i) - for (int j = 0; j < pih_content[i].size_s(); ++j) - ret << pih_content[i][j].value; - return ret; - } - /*Key key(const T & value_, const Key & default_ = Key()) const { - for (int i = 0; i < pih_content.size_s(); ++i) - for (int j = 0; j < pih_content[i].size_s(); ++j) - if (pih_content[i][j].value == value_) - return pih_content[i][j].key; - return default_; - } - PIVector keys() const { - PIVector ret; - for (int i = 0; i < pih_content.size_s(); ++i) - for (int j = 0; j < pih_content[i].size_s(); ++j) - ret << pih_content[i][j].key; - return ret; - }*/ - - /*void dump() { - piCout << "PIHash" << size() << "entries" << PICoutManipulators::NewLine << "content:"; - for (size_t i = 0; i < pih_content.size(); ++i) - piCout << PICoutManipulators::Tab << i << ":" << pih_content[i]; - piCout << "index:"; - for (size_t i = 0; i < pim_index.size(); ++i) - piCout << PICoutManipulators::Tab << i << ":" << pim_index[i].key << "->" << pim_index[i].index; - }*/ - -protected: - struct HashEntry { - HashEntry(uint k = 0, const T & v = T()): key(k), value(v) {;} - uint key; - T value; - bool operator ==(const HashEntry & s) const {return key == s.key;} - bool operator !=(const HashEntry & s) const {return key != s.key;} - bool operator <(const HashEntry & s) const {return key < s.key;} - bool operator >(const HashEntry & s) const {return key > s.key;} - }; - /*template friend PIByteArray & operator >>(PIByteArray & s, PIDeque::HashEntry> & v); - template friend PIByteArray & operator <<(PIByteArray & s, const PIDeque::HashEntry> & v); - - const value_type _pair(ssize_t index) const { - if (index < 0 || index >= pim_index.size_s()) - return value_type(); - //piCout << "_pair" << index << pim_index[index].index; - return value_type(pim_index[index].key, pih_content[pim_index[index].index]); - } - Key & _key(ssize_t index) {return pim_index[index].key;} - T & _value(ssize_t index) {return pih_content[pim_index[index].index];}*/ - - inline size_t asize(size_t s) { - if (s == 0) return 0; - if (pih_content.size() + pih_content.size() >= s && pih_content.size() < s) - return pih_content.size() + pih_content.size(); - ssize_t t = 0, s_ = s - 1; - while (s_ >> t) ++t; - return (1 << t); - } - int _index(const uint & k) const { - return k % pih_content.size_s(); - } - void _rehash(int ns) { - ns = asize(ns); - if (pih_content.size_s() == ns) return; - PIVector > nhc; - nhc.resize(ns); - for (int i = 0; i < pih_content.size_s(); ++i) { - for (int j = 0; j < pih_content[i].size_s(); ++j) { - HashEntry & e(pih_content[i][j]); - int ni = e.key % ns; - nhc[ni] << e; - } - } - pih_content.swap(nhc); - } - - PIVector > pih_content; -}; - - -uint qHash(const PIString & v, uint seed = 0) {return piHash(v);} - - -#include "logview.h" -int main(int argc, char *argv[]) { - QApplication a(argc, argv); -#if QT_VERSION >= 0x050000 - a.setAttribute(Qt::AA_UseHighDpiPixmaps, true); -#endif - //################################ - /*QHash h2; - QMap m2; - PIString prefix = "1234567890"; - PITimeMeasurer tm; - double el = 0.; - - tm.reset(); - for (int i=0; i<10000; ++i) { - h2[prefix + PIString::fromNumber(i)+"1234567890"] = PIString::fromNumber(randomi()); - } - el = tm.elapsed_m(); piCout << el << h2.capacity(); - - tm.reset(); - for (int i=0; i<10000; ++i) { - m2[prefix + PIString::fromNumber(i)+"1234567890"] = PIString::fromNumber(randomi()); - } - el = tm.elapsed_m(); piCout << el; - piCout << "*********"; - - PIString _s; - tm.reset(); - for (int i=0; i<10000; ++i) { - _s = h2.value(prefix + PIString::fromNumber(i)+"1234567890"); - } - el = tm.elapsed_m(); piCout << el << h2.capacity(); - - tm.reset(); - for (int i=0; i<10000; ++i) { - _s = m2.value(prefix + PIString::fromNumber(i)+"1234567890"); - } - el = tm.elapsed_m(); piCout << el; - - return 0;*/ - //################################ -//1245hghgfhfdgshrgnhdsgfhjshdszdgsdgnjedghrbnlcvleabjmbassfdggfhbnsjkgnfdvfdsdfojbwasv213443gr2t4sfth - /*LogView lw; - lw.setLogFont(QFont("dejavu sans mono", 9)); - lw.registerCategory("Warning", "Warning", QImage(":/icons/flame.png"), Qt::darkYellow); - lw.registerCategory("Error", "Error", QImage(":/icons/dialog-cancel.png"), Qt::darkRed, true); - //lw.setLinesLimit(12); - lw.show(); - piForTimes(100) - lw.addText(QString("row %1").arg(_i100)); - lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/scene_tree.h"); - lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/scene_tree.h"); - lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/view_editor.h"); - lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/material_map_editor.h\n" - "-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/materials_editor\n" - "-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/object_editor.h"); - lw.addText("[Warning] sdfkjhdfgj"); - lw.addText("[Error] gbflknwed"); - QLineEdit * le = new QLineEdit(); - QObject::connect(le, &QLineEdit::returnPressed, [&](){lw.addText(le->text());}); - le->show(); - return a.exec();*/ - - CDPultWindow w; - w.show(); - if (a.arguments().size() > 1) - w.loadFile(a.arguments()[1]); - return a.exec(); -} +#include +#include "cdpultwindow.h" + +template +class PIHash { + //template friend PIByteArray & operator >>(PIByteArray & s, PIHash & v); + //template friend PIByteArray & operator <<(PIByteArray & s, const PIHash & v); +public: + PIHash() {;} + PIHash(const PIHash & other) {*this = other;} + virtual ~PIHash() {;} + + PIHash & operator =(const PIHash & other) { + if (this == &other) return *this; + clear(); + pih_content = other.pih_content; + return *this; + } + + typedef T mapped_type; + typedef Key key_type; + typedef PIPair value_type; +/* + class iterator { + friend class PIHash; + private: + iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} + const PIHash * parent; + ssize_t pos; + public: + iterator(): parent(0), pos(0) {} + const Key & key() const {return const_cast * >(parent)->_key(pos);} + T & value() {return const_cast * >(parent)->_value(pos);} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const iterator & it) const {return (pos == it.pos);} + bool operator !=(const iterator & it) const {return (pos != it.pos);} + }; + + class reverse_iterator { + friend class PIHash; + private: + reverse_iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} + const PIHash * parent; + ssize_t pos; + public: + reverse_iterator(): parent(0), pos(0) {} + const Key & key() const {return const_cast * >(parent)->_key(pos);} + T & value() const {return const_cast * >(parent)->_value(pos);} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} + }; +*/ + class const_iterator { + friend class PIHash; + private: + const_iterator(const PIHash * v, ssize_t p): parent(v), pos(p), bpos(0) { + if (pos == 0) { + pos = -1; + nextPos(); + } + } + void nextPos() { + while (++pos < parent->pih_content.size_s()) { + if (!parent->pih_content[pos].isEmpty()) + return; + } + } + const PIHash * parent; + ssize_t pos, bpos; + public: + const_iterator(): parent(0), pos(0) {} + //const value_type operator *() const {return parent->_pair(pos);} + //const value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} + const Key & key() const {return const_cast * >(parent)->pih_content[pos][bpos].key;} + const T & value() const {return const_cast * >(parent)->pih_content[pos][bpos].value;} + void operator ++() { + if (pos < parent->pih_content.size_s()) { + if (bpos >= parent->pih_content[pos].size_s() - 1) { + bpos = 0; + nextPos(); + } else + ++bpos; + } else { + bpos = 0; + ++pos; + } + printf(" ++: %d %d\n", pos, bpos); + } + //void operator ++(int) {++pos;} + void operator --() { + --pos; + } + //void operator --(int) {--pos;} + bool operator ==(const const_iterator & it) const {return (pos == it.pos && bpos == it.bpos);} + bool operator !=(const const_iterator & it) const {return !(*this == it);} + mutable value_type cval; + }; +/* + class const_reverse_iterator { + friend class PIHash; + private: + const_reverse_iterator(const PIHash * v, ssize_t p): parent(v), pos(p) {} + const PIHash * parent; + ssize_t pos; + public: + const_reverse_iterator(): parent(0), pos(0) {} + const value_type operator *() const {return parent->_pair(pos);} + const value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} + mutable value_type cval; + }; +*/ + //iterator begin() {return iterator(this, 0);} + //iterator end() {return iterator(this, size());} + const_iterator begin() const {return const_iterator(this, 0);} + const_iterator end() const {return const_iterator(this, size());} + const_iterator constBegin() const {return const_iterator(this, 0);} + const_iterator constEnd() const {return const_iterator(this, size());} + //reverse_iterator rbegin() {return reverse_iterator(this, size() - 1);} + //reverse_iterator rend() {return reverse_iterator(this, -1);} + //const_reverse_iterator rbegin() const {return const_reverse_iterator(this, size() - 1);} + //const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} + //const_reverse_iterator constRbegin() const {return const_reverse_iterator(this, size() - 1);} + //const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);} + + size_t size() const {return pih_content.size();} + int size_s() const {return pih_content.size_s();} + size_t length() const {return pih_content.size();} + size_t capacity() const {return pih_content.size();} + bool isEmpty() const {return (pih_content.size() == 0);} + + T & operator [](const Key & key) { + if (pih_content.isEmpty()) _rehash(1); + uint k = piHash(key); + int i = _index(k); + if (i < pih_content.size_s()) { + PIVector & hv(pih_content[i]); + if (hv.size_s() == 1) { + if (hv[0].key == k) + return hv[0].value; + } + for (int j = 0; j < hv.size_s(); ++j) + if (hv[j].key == k) + return hv[j].value; + } + if (pih_content[i].size_s() >= 4) + _rehash(pih_content.size_s() * 2); + i = _index(k); + pih_content[i] << HashEntry(k); + return pih_content[i].back().value; + } + const T operator [](const Key & key) const {return value(key);} + T & at(const Key & key) {return (*this)[key];} + const T at(const Key & key) const {return (*this)[key];} + + PIHash & operator <<(const PIHash & other) { + if (other.isEmpty()) return *this; + for (int i = 0; i < other.pih_content.size_s(); ++i) + for (int j = 0; j < other.pih_content[i].size_s(); ++j) + insert(other.pih_content[i][j].key, other.pih_content[i][j].value); + return *this; + } + + bool operator ==(const PIHash & t) const {return (pih_content == t.pih_content);} + bool operator !=(const PIHash & t) const {return (pih_content != t.pih_content);} + bool contains(const Key & key) const { + bool f(false); + _find(key, f); + return f; + } + + PIHash & reserve(size_t new_size) {_rehash(new_size); return *this;} + + PIHash & remove(const Key & key) { + uint k = piHash(key); + int i = _index(k); + if (i >= pih_content.size_s()) return *this; + PIVector & hv(pih_content[i]); + for (int j = 0; j < hv.size_s(); ++j) + if (hv[j].key == k) { + hv.remove(j); + --j; + } + return *this; + } + PIHash & erase(const Key & key) {return remove(key);} + PIHash & clear() {pih_content.clear(); return *this;} + + void swap(PIHash & other) { + pih_content.swap(other.pih_content); + } + + PIHash & insert(const Key & key, const T & value) { + (*this)[key] = value; + return *this; + } + const T value(const Key & key, const T & default_ = T()) const { + uint k = piHash(key); + int i = _index(k); + if (i >= pih_content.size_s()) return default_; + const PIVector & hv(pih_content[i]); + for (int j = 0; j < hv.size_s(); ++j) + if (hv[j].key == k) + return hv[j].value; + return default_; + } + PIVector values() const { + PIVector ret; + for (int i = 0; i < pih_content.size_s(); ++i) + for (int j = 0; j < pih_content[i].size_s(); ++j) + ret << pih_content[i][j].value; + return ret; + } + /*Key key(const T & value_, const Key & default_ = Key()) const { + for (int i = 0; i < pih_content.size_s(); ++i) + for (int j = 0; j < pih_content[i].size_s(); ++j) + if (pih_content[i][j].value == value_) + return pih_content[i][j].key; + return default_; + } + PIVector keys() const { + PIVector ret; + for (int i = 0; i < pih_content.size_s(); ++i) + for (int j = 0; j < pih_content[i].size_s(); ++j) + ret << pih_content[i][j].key; + return ret; + }*/ + + /*void dump() { + piCout << "PIHash" << size() << "entries" << PICoutManipulators::NewLine << "content:"; + for (size_t i = 0; i < pih_content.size(); ++i) + piCout << PICoutManipulators::Tab << i << ":" << pih_content[i]; + piCout << "index:"; + for (size_t i = 0; i < pim_index.size(); ++i) + piCout << PICoutManipulators::Tab << i << ":" << pim_index[i].key << "->" << pim_index[i].index; + }*/ + +protected: + struct HashEntry { + HashEntry(uint k = 0, const T & v = T()): key(k), value(v) {;} + uint key; + T value; + bool operator ==(const HashEntry & s) const {return key == s.key;} + bool operator !=(const HashEntry & s) const {return key != s.key;} + bool operator <(const HashEntry & s) const {return key < s.key;} + bool operator >(const HashEntry & s) const {return key > s.key;} + }; + /*template friend PIByteArray & operator >>(PIByteArray & s, PIDeque::HashEntry> & v); + template friend PIByteArray & operator <<(PIByteArray & s, const PIDeque::HashEntry> & v); + + const value_type _pair(ssize_t index) const { + if (index < 0 || index >= pim_index.size_s()) + return value_type(); + //piCout << "_pair" << index << pim_index[index].index; + return value_type(pim_index[index].key, pih_content[pim_index[index].index]); + } + Key & _key(ssize_t index) {return pim_index[index].key;} + T & _value(ssize_t index) {return pih_content[pim_index[index].index];}*/ + + inline size_t asize(size_t s) { + if (s == 0) return 0; + if (pih_content.size() + pih_content.size() >= s && pih_content.size() < s) + return pih_content.size() + pih_content.size(); + ssize_t t = 0, s_ = s - 1; + while (s_ >> t) ++t; + return (1 << t); + } + int _index(const uint & k) const { + return k % pih_content.size_s(); + } + void _rehash(int ns) { + ns = asize(ns); + if (pih_content.size_s() == ns) return; + PIVector > nhc; + nhc.resize(ns); + for (int i = 0; i < pih_content.size_s(); ++i) { + for (int j = 0; j < pih_content[i].size_s(); ++j) { + HashEntry & e(pih_content[i][j]); + int ni = e.key % ns; + nhc[ni] << e; + } + } + pih_content.swap(nhc); + } + + PIVector > pih_content; +}; + + +uint qHash(const PIString & v, uint seed = 0) {return piHash(v);} + + +#include "logview.h" +int main(int argc, char *argv[]) { + QApplication a(argc, argv); +#if QT_VERSION >= 0x050000 + a.setAttribute(Qt::AA_UseHighDpiPixmaps, true); +#endif + //################################ + /*QHash h2; + QMap m2; + PIString prefix = "1234567890"; + PITimeMeasurer tm; + double el = 0.; + + tm.reset(); + for (int i=0; i<10000; ++i) { + h2[prefix + PIString::fromNumber(i)+"1234567890"] = PIString::fromNumber(randomi()); + } + el = tm.elapsed_m(); piCout << el << h2.capacity(); + + tm.reset(); + for (int i=0; i<10000; ++i) { + m2[prefix + PIString::fromNumber(i)+"1234567890"] = PIString::fromNumber(randomi()); + } + el = tm.elapsed_m(); piCout << el; + piCout << "*********"; + + PIString _s; + tm.reset(); + for (int i=0; i<10000; ++i) { + _s = h2.value(prefix + PIString::fromNumber(i)+"1234567890"); + } + el = tm.elapsed_m(); piCout << el << h2.capacity(); + + tm.reset(); + for (int i=0; i<10000; ++i) { + _s = m2.value(prefix + PIString::fromNumber(i)+"1234567890"); + } + el = tm.elapsed_m(); piCout << el; + + return 0;*/ + //################################ +//1245hghgfhfdgshrgnhdsgfhjshdszdgsdgnjedghrbnlcvleabjmbassfdggfhbnsjkgnfdvfdsdfojbwasv213443gr2t4sfth + /*LogView lw; + lw.setLogFont(QFont("dejavu sans mono", 9)); + lw.registerCategory("Warning", "Warning", QImage(":/icons/flame.png"), Qt::darkYellow); + lw.registerCategory("Error", "Error", QImage(":/icons/dialog-cancel.png"), Qt::darkRed, true); + //lw.setLinesLimit(12); + lw.show(); + piForTimes(100) + lw.addText(QString("row %1").arg(_i100)); + lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/scene_tree.h"); + lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/scene_tree.h"); + lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/view_editor.h"); + lw.addText("-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/material_map_editor.h\n" + "-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/materials_editor\n" + "-- Up-to-date: C:/sdk/MinGW/x32/i686-w64-mingw32/include/qglengine/object_editor.h"); + lw.addText("[Warning] sdfkjhdfgj"); + lw.addText("[Error] gbflknwed"); + QLineEdit * le = new QLineEdit(); + QObject::connect(le, &QLineEdit::returnPressed, [&](){lw.addText(le->text());}); + le->show(); + return a.exec();*/ + + CDPultWindow w; + w.show(); + if (a.arguments().size() > 1) + w.loadFile(a.arguments()[1]); + return a.exec(); +} diff --git a/piqt/utils/piconnedit/CMakeLists.txt b/piqt/utils/piconnedit/CMakeLists.txt new file mode 100644 index 0000000..7467cfa --- /dev/null +++ b/piqt/utils/piconnedit/CMakeLists.txt @@ -0,0 +1,10 @@ +project(piconnedit) +if(APPLE) + set(APP_ICON "") +elseif(WIN32) + set(APP_ICON "") +else() + set(APP_ICON "") +endif() +set(APP_INFO "PIConnection GUI editor") +piqt_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_blockview;piqt_utils") diff --git a/piqt/utils/piconnedit/piconnedit.qrc b/piqt/utils/piconnedit/piconnedit.qrc new file mode 100644 index 0000000..d378e6b --- /dev/null +++ b/piqt/utils/piconnedit/piconnedit.qrc @@ -0,0 +1,4 @@ + + + + diff --git a/piqt_utils/piconnedit/piconnedit_main.cpp b/piqt/utils/piconnedit/piconnedit_main.cpp similarity index 100% rename from piqt_utils/piconnedit/piconnedit_main.cpp rename to piqt/utils/piconnedit/piconnedit_main.cpp diff --git a/piqt/utils/pidumper/CMakeLists.txt b/piqt/utils/pidumper/CMakeLists.txt new file mode 100644 index 0000000..7383642 --- /dev/null +++ b/piqt/utils/pidumper/CMakeLists.txt @@ -0,0 +1,10 @@ +project(pidumper) +if(APPLE) + set(APP_ICON "") +elseif(WIN32) + set(APP_ICON "") +else() + set(APP_ICON "") +endif() +set(APP_INFO "PIConnection GUI editor") +piqt_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;piqt_utils") diff --git a/piqt_utils/pidumper/pidumper.cpp b/piqt/utils/pidumper/pidumper.cpp similarity index 100% rename from piqt_utils/pidumper/pidumper.cpp rename to piqt/utils/pidumper/pidumper.cpp diff --git a/piqt_utils/pidumper/pidumper.h b/piqt/utils/pidumper/pidumper.h similarity index 100% rename from piqt_utils/pidumper/pidumper.h rename to piqt/utils/pidumper/pidumper.h diff --git a/piqt_utils/pidumper/pidumper.ui b/piqt/utils/pidumper/pidumper.ui similarity index 100% rename from piqt_utils/pidumper/pidumper.ui rename to piqt/utils/pidumper/pidumper.ui diff --git a/piqt_utils/pidumper/pidumper_main.cpp b/piqt/utils/pidumper/pidumper_main.cpp similarity index 100% rename from piqt_utils/pidumper/pidumper_main.cpp rename to piqt/utils/pidumper/pidumper_main.cpp diff --git a/piqt/utils/piintrospector/CMakeLists.txt b/piqt/utils/piintrospector/CMakeLists.txt new file mode 100644 index 0000000..df74f4b --- /dev/null +++ b/piqt/utils/piintrospector/CMakeLists.txt @@ -0,0 +1,13 @@ +project(piintrospector) +if(APPLE) + set(APP_ICON "") +elseif(WIN32) + set(APP_ICON "") +else() + set(APP_ICON "") +endif() +set(APP_INFO "PIConnection GUI editor") +include(PIPMacros) +set(PII_ROOT "${ROOT_DIR}/pip/libs/main/introspection") +pip_code_model(CCM "${PII_ROOT}/piintrospection_server_p.h" "${PII_ROOT}/piintrospection_threads_p.h" OPTIONS "-DPIP_EXPORT" "-Es") +piqt_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_application;piqt_utils" ${CCM}) diff --git a/piqt_utils/piintrospector/containers_view.cpp b/piqt/utils/piintrospector/containers_view.cpp similarity index 100% rename from piqt_utils/piintrospector/containers_view.cpp rename to piqt/utils/piintrospector/containers_view.cpp diff --git a/piqt_utils/piintrospector/containers_view.h b/piqt/utils/piintrospector/containers_view.h similarity index 100% rename from piqt_utils/piintrospector/containers_view.h rename to piqt/utils/piintrospector/containers_view.h diff --git a/piqt_utils/piintrospector/containers_view.ui b/piqt/utils/piintrospector/containers_view.ui similarity index 100% rename from piqt_utils/piintrospector/containers_view.ui rename to piqt/utils/piintrospector/containers_view.ui diff --git a/piqt_utils/piintrospector/objects_view.cpp b/piqt/utils/piintrospector/objects_view.cpp similarity index 100% rename from piqt_utils/piintrospector/objects_view.cpp rename to piqt/utils/piintrospector/objects_view.cpp diff --git a/piqt_utils/piintrospector/objects_view.h b/piqt/utils/piintrospector/objects_view.h similarity index 100% rename from piqt_utils/piintrospector/objects_view.h rename to piqt/utils/piintrospector/objects_view.h diff --git a/piqt_utils/piintrospector/objects_view.ui b/piqt/utils/piintrospector/objects_view.ui similarity index 100% rename from piqt_utils/piintrospector/objects_view.ui rename to piqt/utils/piintrospector/objects_view.ui diff --git a/piqt_utils/piintrospector/piintrospector.cpp b/piqt/utils/piintrospector/piintrospector.cpp similarity index 100% rename from piqt_utils/piintrospector/piintrospector.cpp rename to piqt/utils/piintrospector/piintrospector.cpp diff --git a/piqt_utils/piintrospector/piintrospector.h b/piqt/utils/piintrospector/piintrospector.h similarity index 100% rename from piqt_utils/piintrospector/piintrospector.h rename to piqt/utils/piintrospector/piintrospector.h diff --git a/piqt_utils/piintrospector/piintrospector.ui b/piqt/utils/piintrospector/piintrospector.ui similarity index 100% rename from piqt_utils/piintrospector/piintrospector.ui rename to piqt/utils/piintrospector/piintrospector.ui diff --git a/piqt_utils/piintrospector/piintrospector_main.cpp b/piqt/utils/piintrospector/piintrospector_main.cpp similarity index 100% rename from piqt_utils/piintrospector/piintrospector_main.cpp rename to piqt/utils/piintrospector/piintrospector_main.cpp diff --git a/piqt_utils/piintrospector/threads_view.cpp b/piqt/utils/piintrospector/threads_view.cpp similarity index 100% rename from piqt_utils/piintrospector/threads_view.cpp rename to piqt/utils/piintrospector/threads_view.cpp diff --git a/piqt_utils/piintrospector/threads_view.h b/piqt/utils/piintrospector/threads_view.h similarity index 100% rename from piqt_utils/piintrospector/threads_view.h rename to piqt/utils/piintrospector/threads_view.h diff --git a/piqt_utils/piintrospector/threads_view.ui b/piqt/utils/piintrospector/threads_view.ui similarity index 100% rename from piqt_utils/piintrospector/threads_view.ui rename to piqt/utils/piintrospector/threads_view.ui diff --git a/piqt_utils/CMakeLists.txt b/piqt_utils/CMakeLists.txt deleted file mode 100644 index 666672b..0000000 --- a/piqt_utils/CMakeLists.txt +++ /dev/null @@ -1,73 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -project(piqt_utils) -set(PIQT_UTILS_UTILS 1) -if(LIBPROJECT) - include(PIPMacros) - include(SDKMacros) - set(PIQT_UTILS_UTILS ${UTILS}) -else() - find_package(PIP REQUIRED) - option(LIB "System install" 0) - option(DEBUG "Build with -g3" 0) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall") - if(DEBUG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") - endif() -endif() -set(LIBTYPE SHARED) -if(DEFINED ENV{QNX_HOST}) - set(LIBTYPE STATIC) -endif() -find_package(QAD REQUIRED) -list(APPEND QT_MULTILIB_LIST ${PROJECT_NAME}) -set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE) -include_directories(${PIP_INCLUDES} ${QAD_INCLUDES}) -file(GLOB SRC "*.h" "*.cpp" "*.ui" "*.qrc" "lang/*.ts") -pip_code_model(CCM "../pip/libs/main/io_devices/piiodevice.h" "../pip/libs/main/io_utils/pipacketextractor.h" OPTIONS "-DPIP_EXPORT" "-Es") -find_qt(${QtVersions} Core Gui) -qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) -qt_add_library(${PROJECT_NAME} ${LIBTYPE} out_CPP CCM) -qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets qad_blockview piqt) -message(STATUS "Building ${PROJECT_NAME}") - -if (LIBPROJECT) - foreach(_v ${_QT_VERSIONS_}) - if (LOCAL_FOUND${_v}) - add_dependencies(piqt_utils${_v} pip_cmg) - endif() - endforeach() -endif() - -if (NOT DEFINED ENV{QNX_HOST}) - if (PIQT_UTILS_UTILS) - add_subdirectory(piconnedit) - add_subdirectory(pidumper) - add_subdirectory(piintrospector) - endif() -endif() - -if(LIBPROJECT) - sdk_install("pip" "${PROJECT_NAME}" "${out_HDR}" "${out_QM}") -else() - if(LIB) - if(WIN32) - install(FILES ${out_HDR} DESTINATION ${MINGW_INCLUDE}/pip) - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${MINGW_LIB}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${MINGW_BIN}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION QtBin) - else() - install(FILES ${out_HDR} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/pip) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) - endif() - message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") - else() - if(WIN32) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib) - else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION lib) - endif() - install(FILES ${out_HDR} DESTINATION include/pip) - message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"") - endif() -endif() diff --git a/piqt_utils/LICENSE.txt b/piqt_utils/LICENSE.txt deleted file mode 100644 index 0a04128..0000000 --- a/piqt_utils/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/piqt_utils/piconnedit/CMakeLists.txt b/piqt_utils/piconnedit/CMakeLists.txt deleted file mode 100644 index fd96b3d..0000000 --- a/piqt_utils/piconnedit/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -project(piconnedit) -file(GLOB SRC "*.h" "*.cpp" "*.ui" "*.qrc" "lang/*.ts") -find_qt(${QtVersions} Core Gui) -qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) -qt_add_executable(${PROJECT_NAME} WIN32 out_CPP) -qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets piqt_utils) -qt_target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../") -message(STATUS "Building ${PROJECT_NAME}") -if(LIB) - if(WIN32) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_BIN}) - else() - if (DEFINED ANDROID_PLATFORM) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${ANDROID_SYSTEM_LIBRARY_PATH}/usr/bin) - else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION /usr/local/bin) - endif() - endif() - #message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") -else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION bin) - #message(STATUS "Install ${PROJECT_NAME} to local \"bin\"") -endif() diff --git a/piqt_utils/piconnedit/icons/DALI-designer.png b/piqt_utils/piconnedit/icons/DALI-designer.png deleted file mode 100644 index 23b1946f385f18232c55505c4c048e7e49cb6e12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7837 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 diff --git a/piqt_utils/piconnedit/icons/application-exit.png b/piqt_utils/piconnedit/icons/application-exit.png deleted file mode 100644 index ed5f8b2515e72608d2de9d45fb80ff481926066e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmV-!1d;oRP)(xC=n00006VoOIv0RI600RN!9r;`8x1N%ut zK~#9!wUS?G990y?zx!uqcQ)CO3Qb9*q)kbepkNXsL>fp%(uUwejD?y8p{)=!q9{uI zgNUFMD`JgLd5}{2)TjDbX(&h)iK5opBqla%!fsPV$ZoQ`*`3+BGvk@tY+BYL;-3Q_ zbGUQA-}(0J;J>IK2tw^3)mP3K37K=}c6+n4r`M;ZdQ>*cgNlLlcl&$x?F+W`_y4@Q zyxhNgd^{yVZgTFam#l;R5QCNuU}|&|FIk9vK+Wf7}ljFCx0I0B)M_DpyEQn_xvs z?A=Q~uEAY2z;11YDwXs*lI}}%*4fvmp>$V!D(@6yRp3GaWzxc#GqBTX3h8TOTW>GW z*$HJAwfv3_Bzk(_c^;HfD5X-`LtYKmiMLikQ{7@wgTlHxF@gKW#vq%T^x3ZNZrqey z_l*xe6hd{cR#q@KIf=k^p*fBN@6N=&lzJ8Aiq_UJcj|qp8>tYY(>JttV*3LfVM;B3 zC5?rTKY+@u!KI`;5`mk~p={fCBo-WNi;EDJ1tVr5Y8ikJBu~AAJo`vlHhy9SSvSW$s^eS~DeuZ?2*i_g*i_>&r1 zfnT}w8N{XYaEdNU#3_a$6~JQA>QxAU0mO$XJP1_;ck)<&>?w2%4eOMoE%>g1C*T}= z1y+rLs0l<2@=5YbUJd5dF-Qrmh-JbbeGLyEAA=A=e|mK{=TQIKd^kYE6N4iNM&E=< zYcmLJgkUoS<2E=DoVWxI6H^51#kUFi93)NQoD*~w{KF$KCq~eaStO95b^qa`sD1ea z4D!%?$Ui4$y5pqA*WX3=v1dY~2FFrALY+K}7`IVtI2yivHHm063ez;ve&lJ~`^HJ_ z6%qtS6?pTYxn++|sdfE(WZyaj=GtK4Y!XuroD(!CJ&Q;rqVF{|H{XJVoJwNa84C=q z!F~Wtj}9aM&1KkEzrylMgK$eW$_gktK%oRUWx%x^{5n1aH8YKkZ@bQ9%$&{Sz-KQY)<$WQoy6H`v`YyN&rXNhX`! znK$qG+jR+wE2alQzwqI~@a8kW`Mo!9nARHqMhxOVB)&K*@DJHiE4~@a-N&QgTq96L ztvBK-3YiLZE1s~wQ*7h-{u6rcw#1j;+4i&%b5EP@V0L)VVK97;^3@ASra2r-z+bY| ziXZxS74LnnaQNy+TM?5qJDwcccBFXl3~V=z@|Bk``@^?*=zxapFhtTo*s!rYo5a-g z#)b^yPaHj2n?N@`dv)op%m=wb-;o^;KLuuwnV&9V_%>Zz^7ywfWrY(`~3lX<@ z;mq?+{%T>H>GLDyrA(DC`CF5{W_p*6&i?1fUo=SKy|?P%35a-Ywq; zaG+3}L-fs6!vPhud&0nVURTSznjL<|(VW`L6=5wl@i@*Zl3=qVOl-|xgD zsBn>FAp{I)kQgK)3H0VjbIcApv`8wD&9dZ+hmz^Ph~ImbIaZ?aASYF}Us1&hg3*nV z1Pww8=r$3D3apM)HnUK!3p-ba8?2fyyqrJzrygH?gNg0?*tM7yB;-0EY@p!@IEIVR zW8iiR%nZSphSmn6Xo&Xl8UTsNn}X+=;HjKy1uNCfeSH2L8+3hkt-l}nrpH+_Dd8pn zi{!%D1&0ZU0TaRUJVF^EQYN%NhoA|>QUjsDS7fw%>!!dIHDnJ?3IGY$q z505-@3V}b5TIm#O3n2`H%zqRn{p&s!e1W066^0X{vqr6uBjegYltI|c0PB&So>`jzWPG{w*~E>~ zm7j4LKwEl?@Cmuu3dTBH|MAzJ5hsd8RTvpD2J?BAG0DdqM6zjxwTkJLXLNn+(^l#8 zubPtpW{5fB7s4YVO#$VPVh*66*g@CC5 zB1WVMi-@`cpJ=w}%G7P2$K8i?zlu&&8%@C$^Z)zj{RS|9lbb}P^g93m002ovPDHLk FV1ha$)&T$j diff --git a/piqt_utils/piconnedit/icons/archive-extract.png b/piqt_utils/piconnedit/icons/archive-extract.png deleted file mode 100644 index aa7b1fa1743f1bfbfdcab8a9dc2531208234c799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~&H|6fVxZ#d zAk65bF}ngN$X?><>&kwUNlZvidizCNPoN&w0G|+7pcH-(6B82~8=H}tk)DyBUywgx z!i0&FKwvTuOqnus)~q>m=FDHPU?C7JTC{la;w4L#EC+%WD^>%+nl&3XY}mYc^R{i< z_JF`%AUJT~z~RG(Pn^4W^5n@=r%s)}eD%`h%h#@7zj+G;?%cU^_wL>M_wPS=@Zj;| z$4{R=efI3x^A{lS^3|)CuU@|bg4eHKzX5}{Z{NNHgZCit2?#y|0f_kW<;&NvU%!3( z_Wk?!A3*RE41WLl_3PK~-@pI-`STYD{(->%|NoncRxJjGfy*VR{6VV@&dPcM0R-ec1`*obq&W43UszJ$TUTu!Bh3#rOAqD&O=lKc>|o zUAUM-?}*qhF1x(=MQ*!-HM*KKLIs_JWTK_gY}|J+OwKjFpdNVd!12GL<UVN*UyPkIYsOQzD2TA{GuZShC zui~BV&0@v-E0p8#DHf(DaT;$T3LF|(*LzuinZm;|V(W2OTNt;_msIW!n2rPbRim<2O<%;x#PU*+N!kT6X;9h3+>UHx3vIVCg!0ObWW Ay#N3J diff --git a/piqt_utils/piconnedit/icons/archive-insert-directory.png b/piqt_utils/piconnedit/icons/archive-insert-directory.png deleted file mode 100644 index 06722056a99c86b7011621051bacfac6797d666d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0Nr%}0Nr%~tcSyc00007bV*G`2iXD^ z5D63^X>cF_00GQNL_t(|+NG1fOB_KQ#ou>kc5X+{sCP;HdFH?$Tp2;${D@?d6) zna|_R8wUR?GSlFD#|I!T?R^F?^6_&SS{tRFyfiV4oiRh-!3rz6xNC7D@VAqCNczD6YKIcm|~NeLUyA&HnE zl7ivKpCWV(&37g&7*-gVGeX?1p5VM>tx;wSTfTy{7~<;RaQ7_>{T%{E-+%kaorEx~ zF@PNzpvnu}O-U?mzlqLT810(Ex>JB*qYfA;$szdF4WyGCT?r12sI;9mG}hH)ECmc@ zY@B+koS>v)jN7_Wbb;rqW7s)%aHq8mMIB;t?J-jEZoJ4$Yauy(%e($Sd%^}?(Kcg* z&8!1A$V1tHQXE^kT?DtaDSns6->%$GcJ$1thUPRy!X;(eY}`xR&lq?4V+omX|mX$dS6{%PE2D<;ickfNXOv5~p6lPl4rDN&$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - MB - diff --git a/qad/utils/qpicalculator/icons/mbricks_128.png b/qad/utils/qpicalculator/icons/mbricks_128.png deleted file mode 100644 index 7eb729b28f4f95b249e303582029fa917fe31a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9458 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 diff --git a/qad/utils/qpicalculator/icons/mbricks_256.png b/qad/utils/qpicalculator/icons/mbricks_256.png deleted file mode 100644 index 22c4f53895b5ada786797fd0cd87b2d9f3ac61d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24538 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 RaC7(p`r0PoubM8e{|7+R0UZDU diff --git a/qad/utils/qpicalculator/icons/mbricks_64.png b/qad/utils/qpicalculator/icons/mbricks_64.png deleted file mode 100644 index 11fbb756a703f9eea1872317af3180103f7c0397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3764 zcmV;l4omTgP)Hq)$8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H14lzkYK~#90?V5Xx71w>oKfg0G_bz*Py}NjK0kgcpEEortN1b4b zu}PdLMXgcWsBwr}lT>y7ssCwIz!qs^t2l9EC914Qw%STDajVFwQ6H&Y+dN{+n3&}u zKk!0$n0LFtK472s&iVC^dEA-17uZYWZY6Wj?94sq%y7Qn-{bs#=NwU0J}pH={v7zR zs^+6QGlt_Ci*g^}Br85`1dJ#*2^i}EjCHw5z*rAptjkRT#(Dr_U2YOE)&m&p;@-$h zBI35SE!o)I+`P1*p}q->K_LpNtqtx`l&xx0zp-F}zXxdwm$vzGi@_w%r>fuwZWjGXSHCXX9a6DtV=(u)v&Jo zv)Z74{2aYg@_h2tu{F;=yW#g58)vM$aN+nzmEft!1VqGLuwcQ~mtNYoWaiA-1`-m2 zSVXDxs$5;Nslr^WT=$lindZqS|7pqGx%0M)NJT=eh=8`XB^#f9`k6KngK8l0;0~y! z0O|F}C_!@7x>SW;wcUu}TaRpMn=_|vV+D{ZBcQptd1;{bMeu|KgdBwTv^{GX;0e=C zBhhQrB}>^4O(HV&8r@Cg*t7(EQu<}d2>TW#tk=|t5w4{KcnODboiU~&txk4+ z4fr;2LPWNU$RCSH4S)n??f!l3E#2Kcv8PUfFTG01;9B>DmL!N7ohcOS`uc>!haYMY zVXX)<8UiG_Bqkzn5UiR+r62egU=a8^kX^of1+V<)P81jz7>Ea;;k4v>Sz;#{O<@{L zXZhhF3I&U*K-gv+55&Y%W?^_3>-+IE7knqsHpIcIK`~{g%10lq=DqhEfFWSBD&J3m z71;*-k*W?xb*_kP0KOFdZY?3G8dw*~K>$vlK286?0NG3xzxelU3=R!rHE1*<+_UNn z+}b#CgmzfpvTyfx1}=A@2#yFK%(~+)>Kdm2g0;%oBYU}g=?q3e2*fCWXjL>cJhpVbj0Z)Yt?FJ@aDb@yNu90M8G#ri&L|KRIIEeLJ@N^ckc_@fOJ2Cm>a2G0l? z&*2Zh^*!pwx1b`Z`h4)_&p7+x4m<(Rk>E0d=NK}si|4u2Hr-C+;;%Ap>gT{@Q6QUv z`SW}_JBNMWuQ~&hpH$Uo4#It~iOa|J3Ujr`yFR1GAMEmP2SFYai+;cD78ANqCjw!|p)++BGc!x`!=WwuOOaRQ!xcK?ul&$B7`WWu- zMGe76o#2x2!U+9Cy_~;vnC5%_lH9EO0fPdYHVx3z`?nvqw}1CuRW4o+JfxlAEZ{y> zoujJXO@aqd)r;fDH})69-e7F55nKa~5k!=Id*9}APj@&=XsrJGcfW?H26iOGs-4sl zLQ{&1fa6u+W^y>0Y7hqzuznsp&_&m~&*KmGrJQD6-QoVxf=>~ks=rj#x3Bj??38Q( z+A#?dL>Rcz%f7w4@vV))4G#}-aPKZuZ45jjAvyTSA4h$}7$(hM&Gfq;rscODBsXC$ zh#NDP?>*ACY7-SsX8iQ&mGI z*Fqe@BY*fxFs}H|CrCgs`U{ANzbV+> z5C`N3E;DrHBKh9`ru*nF2F`zggeb+U!mXbTBI$_pMhF1j1)c}ai^xBS$SM(uowA6` zKXLrn_(I-~%^=bMH}nCYTX8?0<6s2#zw_u8yLY?@^D8DmRWAbV zKrQevumd*8=yhe%8?_7=5|O4beDMfbRY!mZxbTe#SK|6mM6xLYRP`xUU8Sn4fQ}LZJ_eoyHUXDJjLw?XN;WeN zjpKlT1Y-oj(014TIF3P3-h5>%g`qxNBTR2yOs=*emcAo`k&y%t0}sGf)lQ(QVJcPi zQ}M<%V2p`v_M8-(gB(tz;-X9#{-q23{h_ z0d{GaE{e#%E?l^D+jGyoJllq|K@B!Ll`RfZ?yc z)5l+Y`)5ZxI{x$lRX!M%2_&AE0e=QeRMqvWx-$Y#Ft`tb|-QN9d zni7Pz#Ow0OS-_DXpGRTd;#FibnK(qAx9C2MxTp;j%8|fnnlKp9a4$hMa(cy?05lbV z6$ZOO{o2`Nl{DLaoLQkT4%m3pm29&C{7W`%W&MIf~=D%vrb!8%}pd zBlQj>j7l-EOSVUGg3V(KLxJYy2N*i}c02|ESZ5Klz}M3RT16Ldl+=t@Ao zu^>){FF*Jgy_e1b!fi7ahCnqY%OTL9C=vt>m%SqO4^A`no!STaLDc%>&+ljO?k4) zU0oNe<6NL*7I2KD_V7eJ#LZ&dY`B0KE`m~wAB+Lfgb%RbAPFZ36#CJjUKs903xh-x zlkvvkHQqsH=I@{yIn&>O098E$><4B8e+?WJkzFG44H5YYaA41#9rHImwmzN-a=BV^ z)iqRC*HBfJOKe~!H!q8;w`#$-8M0M1WU6vxt7>o@FO?4%FN>Sa;bn8U;pJq4OENW> zsydwNCbF~EP_uk9WNPCXBzA-q6gQOa4}nEMQtAS%3@-)5_X`|2@D76m17y4`OYdJ# zVR#S}YU-L$HL2B^_^y$I7MiAfhCA+AAFlWa)lD<8VKk&F+&X79HMhJ*tRV=6ec%m(Q21q4?GMx9SEo&z^P^{e@X}-(P6ci@7pt6-IJgjj z4}oif5HTLc^U`g}WXNPOULrS$j5{JWG_BM^iI()Qpd_8(y#$HR6jlAAs{S;J3N$0pUx* zE&g4UbfP(B2F1jOqC`vT%L234ASkh6TWP5%5K{GR90?{sryfU;kamhG;9+}dN_;I% zD6LEGR)?BZQ7~8$0X;q4owm&9Q-Fz3meYVT+AxBc-vGQqUw?OJC73EohPt~i>^*tv zm`&PkZ0nk^do6~|DIXARsV99yq~3{`A(?TG*ksl80jy-7^XHG-o}SLVpBMoh9s9RD z`|O7OzV8RlD0Q+c>8Q#CM3FNq0Unc*BBO+mcrQZ3|F?{jw3ZjPKDPh(@q=4FF#=Sz z(9v;d-Q$mcwf)qoW40V{wP~$L?c*nbrv`rwsoV0JP%8N!JhQI-dy+_Bw(xuFxKTJ0b@OYu`V|W80!Iyb-78vSPx*VOGLnH eV>*g4EdL935w^0AH9$H50000MzCV_|S* zE^l&Yo9;Xs0004FNklB9I38p(Iz6IO^dEMQjt>}>^t3llMXiwcw)!{H|)}++uwH(K|-~|IrqGh@yQpO zH=a3ThfpD++=dBxU5K?1eFDKBVp?BowuED$I} zkR>PRm)K&!hzw1}kQOC^{*qJ33LIZ~rbLxp_E@EaXM7bn6PpN9cKz5(7SqMlOZ>Pz a(ftDwiElIZXxcXb0000MzCV_|S* zE^l&Yo9;Xs0004WNkl zYnIH1=*_xx>SF|Ngh5}Rs6lxM@#19}#d-$sFy8p}`-Kof9M%r9Ebou{qbxtj4r@XP z5kmBny|h<$Z0qaW*3m2X(taXDh~1<&*z(MYp&!nCcVfqu-e5NoA-d^?SHAga?8-ld zU(Oxd&`m|8wav2Y)E}jHu1r-X3KzC*mT4{4vt=LsR+>6?KYoWuxj3n8IOEc8GB)A6pN#dQ-vvRyY8A>?)zk_@Y3Qa+WC^9 zu?lzGbVJ8qRK}iY=h4m@-n%rxJ$HQoOq^+G@5jShvwZ4Yq4Guns1&-I<-=NtRyya% zg~CK-sxnb{YfdW_Ar_L>VAh(UOJjwxGaa*9gM~zd5Ur$<*2`Ioc0Bjkta{lYIBdh20qxn%iZ)DAy5JLP1do6CCFD*BW00000NkvXXu0mjf%^}{d diff --git a/qad/utils/qpicalculator/icons/media-playback-stop.png b/qad/utils/qpicalculator/icons/media-playback-stop.png deleted file mode 100644 index 180280e8ba359d2a4389e93284454cf943b27dbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVMzCV_|S* zE^l&Yo9;Xs0004UNklyX+scBW;@{ixB;GHteD? zi4zVk%KMm2d+-vpg@ZO1m$9PhNBs_CwvU6gp6B-T^cklp z%LPGv>rmBAl^Q-iHLBFjq4KSMp<&gV+w9V!%@Z9SXtBdK^=89D1o6}c7u@qo%qL%H z-gxGm4LpU2vNw&#BOe&P>Cq!4LGwb5O`~jC4;H!Q9m5r89H7`jk)mm{$oi2~!WHh& zq+HUVf=iBBAfd||l~Br&N1K?GJ(kHa#W>SIO3XgxNJ>$aM>IXMj535U#3;~1b3iGQ zVp#4kxJ)p@Fe6O#7nUi8QVbk!=#sF+43ms8$qbOt!J&90^LD|k@{A_sUnv@of|<7k zaaER6UeF|@gCDNR;wnUtIm>NkSffps7)?xvDjD47oYjZrT8_$_3?+8hV}T5L<0#h} p&_s}e?F9KS7v-XS=mdoU?jMapX0!E+{+R#(002ovPDHLkV1o6$+0Fm} diff --git a/qad/utils/qpicalculator/icons/media-skip-forward.png b/qad/utils/qpicalculator/icons/media-skip-forward.png deleted file mode 100644 index 0d22924eef18d1f675d39e9c1468682f47365f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 506 zcmVMzCV_|S* zE^l&Yo9;Xs0004bNklPHu8N*UY6P4s` zVoj6z5W7`$3L^Rz8)eWJ2x3qkLcDl+8P$3TJFJagzh4L;#9`?m%etMslV{z7?64$+ z5Ftb-*-P8QrY#*ETbkO#y|j}E5n?B4_clFpr0<&(Ume-DsomR2M2J?p?zu0%8~E!& z;fGVttZStr($dDT<=A__{4+5zHc~jVWn-9@Vl7+p(NAx^atzp1SLj=^wjayg6`vJe z+V#*I7g#ZEabo4 zQA=k%b*3;fHZe9*cx_fK6(Q!6T5raxzHqLoy+I)a<`IIOF{_oABo&%w-$tV_5c6?07*qoM6N<$g1p4kZvX%Q diff --git a/qad/utils/qpicalculator/icons/object-flip-horizontal.png b/qad/utils/qpicalculator/icons/object-flip-horizontal.png deleted file mode 100644 index 6b428d04b760ca5ecd9c10e342cee7be389b931f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00!&;00!&<9(6c100007bV*G`2iO7` z3K%0ugA-~100L}DL_t(I%eB%^NEC4t2k`fPv$H!pv+K;dj=Q$*Xt*Nz56MFoB2sh; zgsxT)wfW~@5EOKfz^LfbDGQ7i*+^3Q<00xGq!9%jJ5*#sb?6|`AN-R$)6BfrAzTzi zy!3AG@%ZqC_W=G!<#PG*T<*^E)&Ac;0RTH!JI^P}_vz%efYH&r z8X_KBJ99loB0f4e_942B1l(1+5RVAiJbYx2)pC1nZVAirK*Dd)ztL#$2U5rLrwq}mEK?R#)|Q($D|F(P7Lb+sjQU5~6|iNW1+zpdCM8l`%8Bo=0t&i0l*huLH)$CYr)wr9GKU2qN-{$c@KK<<_BvBp`f! z_A#Udl&BWf!ojL|fTD_M%ieg?QUnmOFP*LwhGFPYJyxpgx{*kj!GWsDd1g3wbH;(z zi;HmU6^4=tv#g^&7G(aH0>{Vir-hJSc6PRFDrs^#P1L(BZ83F)$aAM-YYa*^BB2bi&l*!bni9~r&Rn@}m?6 diff --git a/qad/utils/qpicalculator/icons/player-time.png b/qad/utils/qpicalculator/icons/player-time.png deleted file mode 100644 index 77ba33c8c48cf0fd537057f57183ff8d4d6f2319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 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 VB+=-fo9O@m002ovPDHLkV1gmzbans$ diff --git a/qad/utils/qpicalculator/icons/qpicalculator.ico b/qad/utils/qpicalculator/icons/qpicalculator.ico new file mode 100644 index 0000000000000000000000000000000000000000..99388c507ff46aefa64f51f99547ce24c9f85698 GIT binary patch literal 161593 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�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 literal 0 HcmV?d00001 diff --git a/qad/utils/qpicalculator/icons/qpicalculator.png b/qad/utils/qpicalculator/icons/qpicalculator.png new file mode 100644 index 0000000000000000000000000000000000000000..dad22b76a864f634c035f5a36b85197fb10426ef GIT binary patch literal 23336 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 literal 0 HcmV?d00001 diff --git a/qad/utils/qpicalculator/icons/run-build.png b/qad/utils/qpicalculator/icons/run-build.png deleted file mode 100644 index d5fa88f9044395b63b392b540dc6ef985f123018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 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 diff --git a/qad/utils/qpicalculator/icons/view-mode-compact.png b/qad/utils/qpicalculator/icons/view-mode-compact.png deleted file mode 100644 index d02228c0ed7ccb7e5f11cdaf5073878dffba3076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipb& z5;rQ~5jsZz00Le~L_t(I%cYaQi(FL{$3OSJH}B2tuCu!{8<8MrAt=~rB!xi?7J_z) z7K(p?ogxS}B4V(yv9_{aP!M4oVx&y38wDW{L%<1;GY*h5s*0*&?wFaGq#sq}QUDl_$GX42Urf*K zvA1`Qx*n1&(=3E}rzFpG9=Wqnj!tiKdVGVA-+IH^#iEP=qtU3CPN!UL5714a88mF~ zOxWI?Fy7f^YkNYm*)kX}`D=8*aBG)AH7o!kK!}m)-u=A#=%93!D9 z$wYpg9rE_!^E@?qiE3ku90LCXfO<5fCPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipb& z5;z`4J<>e@00NasL_t(I%SDsFi(FL{$3N%J+nIgY%eTGppq%nayUpySpp%?d`O=wZ+D% z4M>Sxon^0d#i$Wvhg^k+Cmj!uj(Biy&p!L;GELjIqxpP}eDgJpMG`!PD>JnMhqj<2$l?cINz%J(G>SP^iuf7^E zRP!O?#sPI9D|k5Sfm={~u#?rv<`i|RI_lsNc%)SZDUm&B4BUe-#XRU0ss;Tj3*3TVg+g}^CommWW)V0e4&BMm zoT1y=;rQULTj@i_P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipb& z5<4-*!Mvvc00I+9L_t(I%Z<}dNK{c2$MNrd^PD$BlYby_#)VK~i-^FYMJ3X%g+&lp z*g~XDi)hm>f>v$X7A=JmLNIcX3N=AO1W^Qniy$;j3nR!(obkPP|D6_}0sR4?mk~|q3qpet^(9}$v3csr<6(juINLl)}!tJXUsI0AS<-+ZN0$SUO z>}zeKAl>mxjh*KMQS{;`P)KlJgK&*-CDrIm!+>1T3QLCJk~>M z9NIyuE$hEl5vc`s3{vzi%tlAEQ7%+LfcO626@?(^WYb!mey~QL*aFJq^Zhe#R?aSe zT0iz+>fGUaM)}(LiJ6YhrrGYE_Q^m&Ff}?iSUOPnSnn=$bT-XSjm`}s5{9pyEnK;E tulF({0r%?zx_jCuyHAy#Pfsik{Q(Kd45_pm-?#t(002ovPDHLkV1lbNAmac4 diff --git a/qad/utils/qpicalculator/icons/view-refresh.png b/qad/utils/qpicalculator/icons/view-refresh.png deleted file mode 100644 index 86b6f82c1ddd53740bd95cd9a252d6d0341b0656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=%xP)4TMNw)Y6{994!H+hHY0`A;By%&J`*F@a z_jpGPX3-x!yYsx~<$2$ij4{{`Jx5hAT(G*VCr2tHljW{5TiIM$s&CaVL*qm9nfdd- zcS8Vpr@)?(f$&OswEV{T6X)GZe+7emgRq!|AP8{d_6^Kjor$;Cwl5*WkEKfSlO#yu zPJw^T%%N|mPMw-MGx?NYHpBhUQse5v74_@-FLd$gm-u@hzYC5WVtBPS_VCn+vByLZ z2B478Xf&{Kdjn($)!{0<9uFNRj@HCPwT8?XFc5hD`-A-hJ(rFi85fOa13J~1|9KvN zto#l~3wXAND|6qYw^GK*<0sKu>;(*984HXUI1yf`l!lyk+(t)>*B9}3ebW?NAw#Jy zCz;Yd6K9)o!=7E8rRni$xW)xZf<*-G_~MMwpzY>1c7t7P+**h4i)c4W9_=KacQ^?P z&zMJu9yojuE#5+OFG8>rfHD{^99E09LK+09->t*a3~i~t-Wyk!=k|#r^F*(Q^iG1c z;3iskS}^SlX{^5_|ALTN+Y;b_aukFjNU3M_Om=qPZnywS0v3Uc&T?sEl=;-Om`wCF zgehVXLzgwoDB!r(bSGT=&ml(i5lv8^u4P;dTdKS0#K_^P%)W4K@i-2oggzka&QLB2 zhnCn+?0NbeMC91~Txr;yONX-4iK5lGlx|wfY>O_^CgE8;twq17uc8msD$B!Kj$-w?zax~(J9FoG0Riq43dd}+ zCK$>7OcZ>(+U3~eCEFiM7W8ZJR(b?EdprA1V=Mfo=cb$VFb}Q}paNm{V2qtZ5t@TB zTKx%%+^I&_<>{~~mjHZ+oc+f{0AB7s;J)RJa<4L0Wbv^S?XrY*i{b8E+vsaq7~WHF z0(d*`Tq5Uw=X@Bzi@Bb#7#%kTlo_)C;D=oA=f-vH;~!CSYaU5(-z)$C002ovPDHLk FV1l!GvY-F} diff --git a/qad/utils/qpicalculator/icons/view-restore.png b/qad/utils/qpicalculator/icons/view-restore.png deleted file mode 100644 index 7726c3546aa71ad49c31755dd4fcacaf848eee2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~&H|6fVxZ#d zAk65bF}ngN$X?><>&kwEM@HCM-YMps0#GPFz$e5NNJD_?9LeBK-r<}5(s#vY>`o}z zpIdq`ukuh)?cvh3w^pvZwQ9rd)f;ZF*?4E|raNo5-rczE?xxeH&zwGe_RQ(Cw{PFQ zckjWQZ?E5efBo*=hj-uKzWe_E{jawleth`w>;1=H??3(g`03Zj|NsAol~#TO+Q(cH z zCF<+GLZ@3(EJU6PaA|nGxL_xxmoa6PcJSJeV#YJlH~K_Pbn2$PST6D}gP}+)>wyo0 z#DqIn9~5RjJm(}>{lopFl1VcECz0HlRU3Nmp1<&Z>wCWmY9a^u=9gH30>RVO&t;uc GLK6UKbD~uM diff --git a/qad/utils/qpicalculator/icons/view-tooltips.png b/qad/utils/qpicalculator/icons/view-tooltips.png deleted file mode 100644 index ca5652c1de11789dcfa70cd3647b566eff977065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmV;E0&M+>P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipY+ z6CgV~DpnZ)00I+9L_t(I%bk+XOH@%9hM(`8bFXu*(~S{Z7|g<^qL3EVLYSnDSSuli zKpk4NaVKFy3-_*Cx$O@qVMN-uZE&S+42?+W*APSCU|l8ko_ku%XiK#h4(HpPhxdEm zBa@SpZ__l5jWM?u7Z+2`D7Ck@H#9Rdb0bNTkNk&}bB=PkEE5wG{bOTe8)pR=?>zw3 zYLz5Ot}CV9EiW(MIyFE<0I1jNOifLZB*{&sRDEe_Y3Njdqd{xU>gp=f)6?wk?%olR zH?>;r-ia9iWLZW&pC=4M*4NjWot>prDvgYfkH0<gbN~=V(J=&|*=#a8I_lFj9X?eH)>@o%WLd`ck2O-)*|^J6Em>m->oGSMObwD}Wa$oKB7B%fcb!ARZcqX3)C7Va1i0Ke!QkLvWnf_7 z@xzhW-!E^7OLq{RLm7(%7EuQ8JtES+O^gN-paFbsG#YExTCESaO2Z@lkr;ytx)GB@ zls*ow-JD09LjeaJ$S>f_%F4>~f^EFQU(HvFXc}|vPWCy=VcRv67i5;cDw~H4{ t6SB6=cCvT?pOLwJ{GS$wtu3^6`~~LTzHo>F`)mLJ002ovPDHLkV1jvG8)^Um diff --git a/qad/utils/qpicalculator/icons/window-new.png b/qad/utils/qpicalculator/icons/window-new.png deleted file mode 100644 index 426818910dfbef525c3133dea3bed328593c62f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFzyCnMyofE9{~j=OI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe3E=IP=X zQgQ3;<&9pM3~6?eyAhn|Ii~7gPxisAHULea71h{!f}<$onI~yWvxc(c1?b zOJodh&-uIK^t?Uo42v&H%+Ih?vJnbve7!2jyG5F{Yfl?P=B!7X!&Y7Tap!5}yoYy~ z$|D(?->@uLW4T2xI%}63_j6X$>2A0Eb4w%tu-55GfAId#TEEbN;eYz4>K{xeO<&z^ TQO}$L3;_mDS3j3^P6Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00!&;00!&<9(6c100007bV*G`2iOG+ z3Mv{e5wxxV00EmxL_t(|+Le(#OT$nUhToeAqSPt~7F=}E#m&jxk6AiZaa0lNq(4P} zfH)N?Iu^vKpin^+#eYycXiYUqwMmnEJh|qgUb6VW!%Z%{Cnx6!d^5(*;eR}`Z%A3D zf0AUt3?L=Bt5&OcX}2K&OcV-OT3iH#fJjXcY%Z76kFfBIHit{464ut&@$&o(%d%kG zHf%mwez&n(k>~~l%>WEIr1U}yH&26j?*UCmqS;}c7-zQH5XsWG;o0^C8zPoE9-x+R<0fk-=e?aDu)R;z_Zqk()ruN)c~ z1ruc!Na%Fw_nitCi$x^xkg>PFe*xgi+=80=&ap@Na)&mLe2Qbq##F1-NJ>eb=TUjL zd=Fp}8nb}og|vF$(W@6FA+@%8y-u#{>hKISMuAMiD5mSX2in@+I?wvD-pM#SuimqX d*h@Bm!56}ZCMId;HE{p{002ovPDHLkV1lrt=VJf> diff --git a/qad/utils/qpicalculator/icons/zoom-in.png b/qad/utils/qpicalculator/icons/zoom-in.png deleted file mode 100644 index 6b7a6826a5dfceacd46838d29fe3641993a4c252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmV+y1L*vTP)p@A6^g+~yr4T(3bu-rza>ca$fvG!nPTk$+*6ojXmxK`5D)If~^WY0Fz7W_6 zMN#lZtIHyA;v$T|hggg($q;2-@0T3W84jZIB`W;@;X#X-Xi2k|J+f|Kcq zd|?iz(P_1}2L}hDe*>WBFZwm3=FoLUBHOG|=EH1!+!hjv@Ka+Jj#;!PsftAXt*tlO z008`M0J+)TUO-2ZG9!U_|LP~Hn=1)0MplgYgs zfH8?g{e2Y*pr?*aEehhMT|8o;0|;0Gh@BJ&zink_7_I9Fg<+T)#7Mw#9KpqlX(UNZ zy?Z>|AxJq6Sf2>=UF~UL18z{!{oqMJB%uIUB4PsJaF|RH!*Om1MAZ))?xZImp=Wn( zPj9{K>R1kQ!UgAsl)wZ+h6$0e0N8B)I+QEr4*Zy3#e-3nhhQj75IjHxaEM`fo*~y$ z@}z9)%*@PCEC6vjooj`8IpPv|+GUG}_e8Kne?e9L5E+PyJhRJLD#WWUk|zi=Gvu#y zIvx230JfW)G)$b%Nkdf`2e09wErrMzI3eHkR+R9|#j}RDbF`1nK6k#lQB_-O(d+eA zzu*5G*jd(K&`*qyei%qaqw}oWKEGi8IMVm1`<~5a)j$9wcs!n}(z3Ek+sK;DW}9}o zTwu@1<#MRGx%qx)XD4g?Wa5lQV~<*`hIc;re>6>lU@$mN5X8E7W1|Kqh_gziGHv_x z9szrdqA1{SI6f;Bin&NQT!*4)ad~-pE(G>bZ*Olkj^nR=K3^BuZWdP)Fe|P6?o_}^~>fM~ZP*b5avtYUet#pXS+=~JQO^}Mvd{>|^EQ$mn ze7!g3OMO*}kr2L+bhFJBxe5NeE&Q`hr%vxSw{E-bertsgn3ni?@jNe{FCQNGBH$1l z$HBXi(F-(1-$pT1E{fvTw%a}4(4et{fACw-(sB=PY-;Ma+PIE6JBRWRiQ-WaTs)r` zy;?}>Mn^`T4i687PZA&lZw7Uf*5CtPrZ}ilm!Oc4M$nKDHGW!v{Dv*H{u(jZ-u|c~ zmW>`2V2?XHOF1D`XM^;HN>lFqKL1T_(i=&oTE$4I49EHw9~9XA8dYiD2eaAiJ}N*- znM}L9jrj3P`Nq{a$t+AsojW)Xqb`6ks~B#H6y%y#JQz!oq!t_l3L&Ind@={gBu{{l zI?i1$8*}YRfIkAQJRxY;wNx4 zj9{oplW`KB4?2$(SgrG8#hEaLU)!co5lROizIZL{E+YeNPx>%HNZ_5G^vjuIhQ(qT zJF$hXuI@g0an1b+Bx^LUM6r>cB=NI9A_>gmR#vs(zEeU)5;tAW+Sb-q<6kZO8Z$G7 z=_`fVcwKH7<-hBEN*n&`Hzty@2j_xHW*W|$Qn0zksf&Q4XiN_96T*<~2!tHa>{rzR&S2Wf6@ ze%{m5BbsK-&}1^b(rUHn;RpYR<2Voq1g2=3_U!NN)lxKlL#4N}rx3{;PN@iQV0WXUO5bt?Ax z`Ny6~jUI+*60o5~z-*Dg`0&9CTB3*nuugy@LRpse=gMJm5QezMdoBIAR76XVa~#7p zppm_lG_aXa5lU3VFbV%r0PJ@E94plbs=bvE&S3~Ek)!cEbyh^ClErzclx6&zxn&wY zZ*FdG>?i`&g|uun}+d>YQfxD`I=U0HR19Upx5YAGC86@KIcz%#1367mk zr-M2>JNx_k`grFzm*8|dpIR&yc>f3gkD@3*)AS@k5S!7ht!p?zG?+}L{LIq_1RS$i zECzf&-*07*qoM6N<$f>N$(i2wiq diff --git a/qad/utils/qpicalculator/icons/zoom-range.png b/qad/utils/qpicalculator/icons/zoom-range.png deleted file mode 100644 index c052512129ec092362c7e45a3f4ea72d09c3d87e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 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 diff --git a/qad/utils/qpicalculator/mainwindow.ui b/qad/utils/qpicalculator/mainwindow.ui index 234fed7..dae08e6 100644 --- a/qad/utils/qpicalculator/mainwindow.ui +++ b/qad/utils/qpicalculator/mainwindow.ui @@ -15,7 +15,7 @@ - :/icons/Apps-accessories-calculator-icon.png:/icons/Apps-accessories-calculator-icon.png + :/icons/qpicalculator.png:/icons/qpicalculator.png diff --git a/qad/utils/qpicalculator/qpicalculator.qrc b/qad/utils/qpicalculator/qpicalculator.qrc index 823218d..1a48626 100644 --- a/qad/utils/qpicalculator/qpicalculator.qrc +++ b/qad/utils/qpicalculator/qpicalculator.qrc @@ -1,9 +1,5 @@ - icons/edit-clear.png - icons/edit-delete.png - icons/list-add.png - icons/application-exit.png - icons/Apps-accessories-calculator-icon.png + icons/qpicalculator.png diff --git a/qcd_utils/CMakeLists.txt b/qcd_utils/CMakeLists.txt deleted file mode 100644 index 913edec..0000000 --- a/qcd_utils/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -project(qcd_utils) -set(_QCD_MAJOR 1) -set(_QCD_MINOR 0) -set(_QCD_REVISION 0) -set(_QCD_SUFFIX "") -set(_QCD_COMPANY SHS) -set(_QCD_DOMAIN org.SHS) -if(NOT DEFINED BUILD_NUMBER) - set(BUILD_NUMBER 9999) -endif() -if (NOT LIBPROJECT) - find_package(PIP REQUIRED) - option(LIB "System install" 0) - if (CMAKE_BUILD_TYPE MATCHES Debug) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3 -Wall") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3 -Wall") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall") - endif() - include(DeployMacros) -endif() -set_version(${PROJECT_NAME} - MAJOR ${_QCD_MAJOR} - MINOR ${_QCD_MINOR} - REVISION ${_QCD_REVISION} - BUILD "${BUILD_NUMBER}" - SUFFIX "${_QCD_SUFFIX}") - -find_package(QAD REQUIRED) -list(APPEND QT_MULTILIB_LIST ${PROJECT_NAME}) -set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE) -include_directories(${PIP_INCLUDES} ${QAD_INCLUDES}) -file(GLOB SRC "*.h" "*.cpp" "*.ui" "*.qrc" "lang/*.ts") -find_qt(${QtVersions} Core Gui) -set_deploy_property(${PROJECT_NAME} SHARED - LABEL ${PROJECT_NAME} - FULLNAME "${_QCD_DOMAIN}.${PROJECT_NAME}" - COMPANY ${_QCD_COMPANY} - INFO "QCD library") -make_rc(${PROJECT_NAME} out_RC) -qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) -qt_add_library(${PROJECT_NAME} SHARED out_CPP ${out_RC}) -qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets qad_graphic cd_utils piqt) -message(STATUS "Building ${PROJECT_NAME}") - -set(QCD_UTILS_UTILS 1) -if(LIBPROJECT) - sdk_install("" "${PROJECT_NAME}" "${out_HDR}" "${out_QM}") - set(QCD_UTILS_UTILS ${UTILS}) -else() - if(LIB) - if(WIN32) - install(FILES ${out_HDR} DESTINATION ${MINGW_INCLUDE}) - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${MINGW_LIB}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${MINGW_BIN}) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION QtBin) - else() - install(FILES ${out_HDR} DESTINATION ${CMAKE_INSTALL_PREFIX}/include) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) - endif() - message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") - else() - if(WIN32) - qt_install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) - qt_install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib) - else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION lib) - endif() - install(FILES ${out_HDR} DESTINATION include) - message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"") - endif() -endif() - -if(QCD_UTILS_UTILS) - add_subdirectory(pult) -endif() diff --git a/qcd_utils/LICENSE.txt b/qcd_utils/LICENSE.txt deleted file mode 100644 index 0a04128..0000000 --- a/qcd_utils/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/qcd_utils/pult/CMakeLists.txt b/qcd_utils/pult/CMakeLists.txt deleted file mode 100644 index b7f80cb..0000000 --- a/qcd_utils/pult/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -project(cd_pult) -import_version(${PROJECT_NAME} qcd_utils) -find_qt(${QtVersions} Core Gui OpenGL) -set_deploy_property(${PROJECT_NAME} - LABEL ${PROJECT_NAME} - FULLNAME "${_QCD_DOMAIN}.${PROJECT_NAME}" - COMPANY ${_QCD_COMPANY} - INFO "CD Pult") -if (Qt5_FOUND) - import_version(${PROJECT_NAME}5 ${PROJECT_NAME}) - import_deploy_properties(${PROJECT_NAME}5 ${PROJECT_NAME}) -endif() -make_rc(${PROJECT_NAME} out_RC) -qt_sources(SRC) -qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) -qt_add_executable(${PROJECT_NAME} WIN32 out_CPP ${out_RC}) -qt_target_link_libraries(${PROJECT_NAME} qad_utils qad_widgets qad_graphic qad_application qcd_utils piqt_utils) -qt_target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../" "${CMAKE_CURRENT_SOURCE_DIR}/../../piqt_utils" ${QAD_INCLUDES}) -message(STATUS "Building ${PROJECT_NAME}") -if(LIB) - if(WIN32) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_BIN}) - else() - if (DEFINED ANDROID_PLATFORM) - qt_install(TARGETS ${PROJECT_NAME} DESTINATION ${ANDROID_SYSTEM_LIBRARY_PATH}/usr/bin) - else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION /usr/local/bin) - endif() - endif() - #message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") -else() - qt_install(TARGETS ${PROJECT_NAME} DESTINATION bin) -endif() -if (Qt5_FOUND) - deploy_target(${PROJECT_NAME}5 VERBOSE DEPLOY_DIR ${CMAKE_CURRENT_BINARY_DIR} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/../release) -endif() diff --git a/qcd_utils/pult/cdpult.qrc b/qcd_utils/pult/cdpult.qrc deleted file mode 100644 index 76a8d63..0000000 --- a/qcd_utils/pult/cdpult.qrc +++ /dev/null @@ -1,16 +0,0 @@ - - - icons/db-export.png - icons/db-import.png - icons/Apps-accessories-calculator-icon.png - icons/dialog-information.png - icons/dialog-cancel.png - icons/dialog-ok-apply.png - icons/timer.png - icons/document-revert.png - icons/flame.png - icons/view-refresh.png - icons/format-stroke-color.png - icons/accessories-text-editor.png - - diff --git a/qcd_utils/pult/icons/Apps-accessories-calculator-icon.png b/qcd_utils/pult/icons/Apps-accessories-calculator-icon.png deleted file mode 100644 index 37a303523edfb12dc581be38e29835d52f44661b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9661 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

`1wA0LNvU0ZM46;*CiDnG|ED(~o^Jn(`L=>A(e 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 C`rU~D diff --git a/qcd_utils/pult/icons/dialog-cancel.png b/qcd_utils/pult/icons/dialog-cancel.png deleted file mode 100644 index ace88ab0b4ad7d743e0173d7638eae6b807afe7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45200 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 diff --git a/qcd_utils/pult/icons/dialog-ok-apply.png b/qcd_utils/pult/icons/dialog-ok-apply.png deleted file mode 100644 index 3260f60459bcde9e333ec2b041447482ef401a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24550 zcmeFY)k9m~^934$ySo;5FHqbH#c50N;#S<9pv9$u;$EN>D^^^BI|Ygtm*N^U5R%L1 z`@4_#Pq;M4s z8Z~7FJ^#NaA(&yT20o`1zh7w+NHvP&Hof9x!p7E>MKLgo9Ct^{dcg zdF6qY-=ao)g)!1>u(6Bj#9~HYO?m(Rfb2H-C^Nq{FVmRn>t|Q~+i`CG!`giM@3yVA zy8-~cq<6I;mi+_3`(WB*uLw7cfS!k{9dIyRA5r}Ozx;prAgU|qj)q|C3wExB=FN9a z*AA06!?TJbRAXX;Ii9BuI_E1bI?}VlFi#~)06hZ-K+G(@) zB7aY)U$C&H#$`E>#b`x*S|SskEO1eLc7Ad?p5^{}zHiW<^-V8WGq&qi)9<1y#lqQr zUqia)Us+-*f53Qq7ns%q_qjHbunF(rKnq73Zs^Hk!DQZHWT+8;PqyrHOn+njjH&R%3|MlCIQkUSigfM=9q&@`|Y=Z#Pu6}4& z7H$04%aDlV=a5 zqQ~giy7`&^lMu(Z_Y;YxgZE1-zkXL|JXhuX5(2X-O6|tRO_Tu+IDdw2Nf1JSQR5HXSx^P{ZQQak^F;m@zsMTTfH}^USep@h0 zp!bogt8t~x`8a6`Fr}cJzz`9(irxo&Pn$i+J?>8{(Xm3#fikFe*Ta_t5VDKuk7TL- zpjYw#`SQ2#$S$LDN3VVBP*eX6F%%$8!rBdHdw`3{H7~gSGn4Nq&xhCpEnXUeDQ2QW`M8?(7yiuk-#FToPltIKU7%5wh z@h~|@ZWX%1m?A~75VpAgnv=TE!iGpEN#^r# zG~>?rp{X%3pu5Uh=QgzT1xYxanLL`;`0M{I->lekQ|AGt#WQI4>$oF0#snmpY!2s0~)yt0XjjfSu;(VB{wuvUL-7-H>;(bFY z48BjhKkU)5y_3r=;6MgbF$pB3viio!fgef*SRzsX-_^wwdZa7|@r?1<`<hg05Q~rK63x9jmq;@eCU>72BCkVGpqbR zZ=(pqIA+jr`7h6JH(a5)G#YASnHrs8Q|8wJoj#8yGx>)qI?d(VgiC0&z9xPw`D!~2 zkNo}hBSNRrVUnywWqJOZaQjt3s6@+rE*B{d#OkR5)Lx{4lPU=q;g!2cgy05sshug0@co8+sU}7#S32qRk^}S?` zWW$`Y{B!vorv~2kB|a&Gz$1{D5k|pU?)YJit}u9Wh}7NI8f7PK$e}Eq4x{-sp(Gx` zN&UG3FLi&}-N$%@Kg5?o{*>6}a6{;jcDFc~REz|Lsa@~?79|IY5yMtu;bNu-8;6iJ zl3%|X@yTmE7#ROPyjXSL!avZt+c7*^QbX3wZVoUEGenVEnnLq61i#XxhALG~3-^Ge zBCEYk+bK!!#ZD~b+FAc^*=PJpP0ME>$q`rZ79*#c{G*BBw|zRc*+`#R$aY9(Cn4$~ z3Y{85zzpW5aBJOg8)jp@QRflDz>@XlyN`gSP$Mp-ISA(aRz@RZ&lkSmU;obogt->I zG;?Vmx|rNSoBB@qKKblh>Z_Nu3majy<~}UZv;7iZC9YEm`(3=PQ=ACdS<+f}5gLNo z+0_RDWXW7CWgcYa?8Nu{af@*xeE+LvW=o@MAQi+FumiPa`N)N~l7t^}y5_W=l*`|N z&2mUg7fbKIOfYPHy=i*aMunTQwS8`u*fx>(>`^{->QZ+!KTC=Y4xOT7&HvT03_>c{ zaV*>}PeTYP8x$ELV$$^m&{^_CzZ5iRmS{UvC)W;X{jg~pwzxaUaL0f*NwD={BZypa zS@)lyJnU4IGJNVq1mhQu=_E`dHnHwb%;x`<@qjQe1biT1krEn%v{Oy9HkqFY05{(PA*Rr&h-TNk-h&Ku=Gd)(Rd`Rz`_?go5O-d`!(|;TW!@~Q;8#rHfV)5XCo}d{KiAm_WOnDecO8#5ITw%prfl}MrJu_ z9OO^^ZP{Vw@<$aq?i(-`-B7;rQ(>P*K~G3*p*Ha}y8Q5;Xhj6sEfGv^+w9-^`_YEV z%v#r08b7lj4!g!ifA;GME)GaU5!=Y?&HE(})5{VbqN%}`{i)2QMEwdR;jADG!T{i1 z8rJ4DUEP1_!_Oa%-INFKfak&)Jz6@Z%sHFwR`{zr@CrlL?1eJ(cXlbuW~IP7HDweX z!5!`n*F-`cnrTFWg+T*6mEvZLjm7q99uHIa4(V6X7b%5K^gN+F-`( z<{$xZ)L5xOhQNh+SjW0QrIl4;njA;|vSLS|iOd~Z!C@%IBI3kYwy(}}!g1RqNq=cV zY$;KUYIZ2re(B1HBpi9&@}QF^5}*y&`#+RDGY>v2-Can3%cx(8ThsZ=JopdOtzpFJ zH#aGS-5;0BB;Gxk5=7Slb4(;3SA-@##b|8y?X!%w(YiUY_)o#itHxqT&rU zVb95~%K!27rib$0C$hrwLIVjeo2!tNeWpvi^qjjbmbrdOcTb2W#5l?;j-S~Vk#tvX zes05=8`rj_2ODYcb;dG$v5S{y5>LBN@83@qUSybeqT8iqr)}8!UShvl623xPx{uNX zEQPVORjeX%+Hz9n7w6;_#Ad}pDmwxH{SCe#v}229u@H=#=k=^fvW6#XTx=9crLkZcpLaH>Clr8|)Z+)akwH6(2dZ`dezS?k6efK1F*LZXvuGH#&T^b8XN| zLj2j+PpbL8#hv(mVaDz9y)CdPkB3F>(b|flFplt^Js3InXB9f#b>1eKY!OHL)X^XV- zNiU_-hri;uD!p~n7P)-QcCIi!J6t0K$CnAVggc&3{QPy$>xfC&&V>$&HKnzCwJ9Bm zEm$EZq=A)*G|XLs&Xcem*=v4|oS)jb^LmbL9$QumoK}XuAoRzY;Uh()g`i`q*$3F7 zMa{5GEd*1niate0T6~vXpz}H(Do!fZJ`*!^NybfwY-&VDp5r;F6PY?trNS z|2B%gDjqsUU!J_ESCA==+iixmLxW zgmDa)F#9{1Dh?E#ht8iIv?6NbVE7|J?7fg-&=E-kHV+mK4BgpXyaU<1l^5-oy5eS) ztDgHfS1g~z7TfU?2JF;k1S35L8ZRmLk2F5G!nr`q!TOADccFU+BL2>M^*~s_M6KCx zTt(r6#14#);yLttNY9-762kMK`>$l;c|Jh*(RB??ks0b^Wn@(US-limnnf|LQzCmw z;=K?T$7{Q2`)&WMl%8+6y@x;+xlKhf+K-bzA)o&Kz2?q%G) zHQ0GKs%%hLjTtOG8!7w~i*r}UD!=NPv9ukYkDQ7da6{i_$f$_Rdd=JGp4V`UBhkJc za$DBvUB7Dv^-dKq3tgw<8jE}yY zBoEeB{2t6=bh*8ahB^PN?NO;w(5S&X2}L02R54LxK=^NmaBn(^XMt;gI&!c?G<(1l&P4b@J)hnTO) z_gcvLWp7Djp$^-79S#DHA@{6=Fb0y&Jlzqu9%K8+tJ<6v(T(Q}7W=>rwM5ckNXZ7k zIHpOQ2j7$GFz4Yoopno&mVMT*5aYEfmKA1PP;Yj@P zZfd{u5LO~A%COlK{ZeQN!wEY=@mhF=j5i&>YsN6yPL8AZI5t3&Dbz!J zMCk{egDI4@UR+Py76lbODsQ|G5&xIiHawH!Aw%a+-P7J-t|}Btk)IqmoNLnjt8>a( zXhl@@Jbe$_QYg#g*vVBv^&>|?zCT7|g;7n2!NVl?C8YG`T|lV73)LQJ9f~`~Q@MB( zgttaG`~x~u5)~M!9XKC@WI{d z&|XGt!9_U+f{LOVCf>yf?2!gg0H1ZE=5Tr2jhs*j@ckth1H(k}Bm*7D^1kF3vRqJI zxG13~Av~;QrVHD{67+s0xtVrS|DB~?9PCqe69(x1522;?j*7G#jP5(>?B5{s>RhuA zM3w%i-)?0oNJ-|}9ovpKME*pEq?{-zYU;6eIab!81zu7|#lgReh=})il7{u6+IblM ztX(m?19|eDR*RF4nMIP!3}Y0znU`irADGYv2yXF)Jd>mTwp4`g-~CC z=l}XFckC8zt~Y1%j17OQ`D^xMJ_D*v62hZkA(U{^<|fyEM8#8~VLSAx{JeOqxX5~85k zVPy5myAfm>l2q`e@Xf$TG1$a%P=pobeLI%k=U_LC8CMUJpKRkuOJ=#Mn;88+DI&2y z8x_bdQfgaKqzq2`!Vf70sS7!fR%1RdN4fdyJ~|=a9cpV(yyS&6oCoU2fFTst@2y*5 zTPZKT#*LH^8IXqMeWi#Q=nzUe|MR%>uv?VyY6y;M=b8JnX3hAKm>D7^XQvDX)QKVI zyXTjdf1#ct#O~h^(V$MoPA7R}=Sj#0(rsyyO(n^uSf>pKJPLPMmH~TiUkQm`md_}a zwEV#jq$u(3@Ft#)2y;4IH>?|TtT&tOE_t#Rib^I@0S9;@(avx)Ej)D&Jf;F zPbp})lM`suZ&Lr`^I6#vYrF7YEWEfscu$6L&62Km*{AvM@#sk?kuXtC*w^`l;LpMS zf!HClE*{Eazl!S#cjI{Qhy8-zUCJQyvQbGYJPh|mq?;e&^$=Mcj6#ELmQj_!9GwOjxru3Xx&wS-r}xdjK- zzsg0lLD6Nr04S=;u6P!{!My8_HK!(%E_9xcM<`TihDj8^{Btf0q!1)d#|xXA*WsN` zqs_E+O}|2(~iwq zwFeTlI}{z`X9CP!V^5h)>9&vf{wudF+Y!HUJ-jo(p;7voauEqHf}8w9iVeG+gTVf8 z(p!X}L9{cPQ%jmQG>;$%;d>j?hG164iXY#L-vE@kG%}F1+j;kV%t%XKV(7TI=cjKL zAMwok$(xRy?u_y%LcwMF#2Ia0H38170P#HJokY1UZn8GxkiT~@f^7653yq~YmBT{B z(BrPeuf*wlrfY%Wy_#+4QAp#&$(y^8bB=b7v(j7`9sTSo4kZd~y>wdhTOjQ3)#CcL zyQJeUyJO2J!Mfv7E6_vG@t)l9>tnMx>&9UrI_jK_5`B{ny|tXH7LM#XlTPuXQ*2R^ z%iJz4tU)`E@yHg7y!|hRlxFo8UBWHq>`1=>>dWJ6FpG3jm-5I|9T|Gjvms*rwlDYR zRvmqeQK8W!C`Cvrn3f8v+fmTenV+TVBg2_-vMLpf4Tkoi| z&X2+toXb@$^z#VUYSF(^54o3Tmr|c@5ahf-;5s%BOo2}&@^XInc4O~a!l`LBge&wk z31eBR1Jr-)F%zvZ^D-#Hz>-4ASkG%c;YFuivITKLMCpUD6ye@&EwqW5j&SD|)2-j# znJn8>-}i~_w84&xI>5u|V<;vhVTu7!AXjnKp7gL}^cl3~H9!_QYa_-_|xSkBc`A7vbLdj;G z43heMERT$fT77dCWCMdJ7VlX46B#@1+8e3^b+5xB;FIyT&-)>4CLtw zl4RefJED5rBQZ*qti#+pT5&Xp9k}Aya{09OcwjKfos=pyO!Dfg(0X^DL0~Nt(Q$gAtAv*!MJIx4abM ztV@{0%&~k**;um77)QFjcAZFPTKQ}aH}E+&7QJQ9T6e|8)dY2;2we1j#I2a)q{d`D z@oLd5s-TS@FGgjT_QxKi2}n&sA!(S-t|1^S(1 z1Yv|q%1AtYE<0K8!Xv87JR3_>29fd~tuDhn3Wpaf3##A0(_{-O{*w4j$nXuoY~JIA znb&V8Au4KR0dOH{bq+a3Wvn84O3}Ls2o)t{tb3`;_4Z{6ODj!udl27_kKCC1&G~9 zTx-~bY2e&O!vZFTP6Y05XZ2-@f$;cU#rzNjR-t7}PwS7($qHb-v5$vBY3 zhb3?9J(WTAg3*PZ2&h3opU#-34G5e&7Q!&j`8Jpxy=bKUe(}MrF~H^2crqAjdSr7m z+G(i8ZrXuR_v8~$4Rr|H9#ep!@DM&GO#Q4BXX>$Qve1~Muo3QheR{9k?7W()w35cDv zs$XzBqB*}cc>E<*QWBIQ^PSpoE;=7_R20cKHlNAeLhv=XpyNpy(d6TF*v)Y{7y}7= zB8~aN+9H=fNlubi)*GBd}>wg2hzCoj+-Af;&Du{j|K+j&9)E zMzM40aXsNZK3N5&9P<#~lK*V8^^G(n_2>r=8O(j0(P1lp)YA&%PTG^QfO}Rbg9(!HMT52|K3WP z1uVbxVlI5c*UOxHdB4r96s{iE`7Pu}7fRBU7xdAjt{B9E9Y|pwu&d!8c=9R`qd^%# zCveTx_^`R1a_#+~z>F-iXTS9C>Uyu3^|i2Tz#Y_%c*^r-Yz~(gfmMYDVKi3`b8nO3VKc z+7AgAn*OFA(yj$?F0dtd$+#4lIHRn*vUQc?q2>FsfyeRmaSp`rlNG8nz&;~Vhr zudC@^oOMrQ&&|t*l#|zg$MA?^H_Gy+oYm$kU-m1J{6}8a)blq5JzdXZ zMO=-ds{Mpk@s|_O78i$(q><3%hKjix`}{y&n;Vzi+d`$?(9>ooA&tcfr*hBN(g=^oj)DeJAS}yH*_o@6GuK! z>}hyHcW;Lb%6H7aQ?3KhTNqs1>t1H~<(5uZ^vi(p{yQ>A?R z<-ADY>0;v5%PjL8I#Zhwri;8VQd%c5=G3gg6b2;M-nIwptfyGkVr`XDINVb#S1XO< zBK<=7UdleOE+(yAJQ2=y@&dY{xVwR&@PUA5g7UuZxUW-K1#zQQ1?$Sz`0NpUryNtA1Q zN-0;J^~=ML9Li%r8IiM4nei{En!gds-DocPqNR^3UjX+_qvo%o4l?%JJgTYf*9*p2 zd%rePabD`VTgl#EX;Z5boOG&=Ns&1pe$)HR2)|#C4hBzK_uZK!V4?kJg_x?ut7NvJZoLL+Pa%T_Qm<;oB~OWMkA*jD26L_ zIJIja{Juj@Z6cW0A88|OyRh(5KZMSKo7=1qr_^%l2$OO54x2 zhRngCe-e5>r`pUSJ& zeR9heyo%?Y(^U`A6Y32!(w`@YP}KTtEwUh!x~@w))2>s=sMHtUTE15_A#KNw|DDb)$_Nah=7HpF9vFfw7+1LHcD%M<&Hu<)RbIaS$kY|ka&m` z5!&_oVA}Vnh|U$gw!FFwpNYfn1VtD*alMML>WAt?Pzs^PL&8+d81$fSba?s`8!3cO>qE|u$Oc1^&u50)rVC234 zoCq1RyJ%x`!0`Q_FG9UP0Q^rbk4_Dg2wdj)-8^coT?W8vrID?gf53Sjvbxr8bi`}T zSqd5H*)~nw?pu7rOp*@uMjLHf4SuOuL1l#Cf3^I5y;%2b%8A%4z`TOF&bZ8i>vDd> zlD}l?>~%~n>Z~P6I7g`J0!xx1cmL}!+n#iWDD`E*pvh8^%d>(rouQq}!h+wQ3ZJKu zZVCW>XAbDbobHNy+;%;u5QMq4x-*mfzSY^Ty0WI9T*@q=lrv2(Ep4{`UsMJKYsa2g z#lt@An|=qVVx_iT$5+mnlD_=K<% zr!CpA*|)yB{0q`ouoLdn5(MFb5IK5W*p$u=} zVbYtz{TdfWSQT=bmBmKv|3C~y6OK(4?|IEsNUCf4e667`+~F?nY=xwL0M&ur9_k$* zrUpEhr(?lLvU=jFy#&=Z509c12tZJW03#{RXeEOThdV!|5z zK9sg^)Z7ZjL+tgo9`Q{Yy~YmsHQ}`yDa(~v1cAWcP8X_N>K>&jX>CINoI+K8jV-{y zw+72Hmbcvb@!mJSYpG+UAcfz%0FVcbvV1bEi|op+#^py>eOdRvrU*;359!@-$Cg4c zq<$!7+_wv(`n}DfCSjrJOM{EY4~9MMloS+9zx1(mUlQu>-A*L{I`*nit1jbjabLk0 zC2yUAk;{x0>=fl+_{NVPabW|gpT_@OdYcD-87Ukrk;oi@oS(4D^>dK}ocbQr%{$Il zP|S-KY<oPDLVHLt&5eo4>8Ah*K#s}J#BQ|my`44Buw`C$_T z#`6CwD7lsrQxFu<7cM%5TbCE6FP0l8FPx9(cjvv4hf@wx(+>d1sgRT(p;$L^PJQ_& zZmprEF^Oau4^0YRsy$oaDg44pSgoG1amob6?DD_)Z2+!vV;bK`(&K08c;d)j<=N2x zh-Eg{o~jRAhSm;!t`hi8G#jPb0ZMo*cp#h@B8`2wT1e6OIt^5bdBqAP9E!FU2S*@@ zpIK-NSkm^+4tsMByQj&0$+`Jzjql7&7i)S*8jw3WgqdU!?<``p>19Y<1d)USJuz6g z8ae&ixA+g?#QGea7bMC>{*MtbAi|9Efkvv(xSY`Ci~>*RW(T}q`2Ak^vmx{N$}nt~ z9JZSi*y;fVC~_p{FXgJ)gI;F@TzriMu!LsuLWpxCCwuRj7Mi*X6zdcxYDHl}nT7cj z$KL;ZQdbx+wo}(Kr+r!46jF^%*>-; z_tQX&5WN;tp8Dlh=T~P4ya_g7&R#&BoUAOTS+LCVV{l|y8w3l?=dPoZU--2)y9=wV z9cp<^3`m<9$VFNH@|GZh7wDRceZva;W}zaj#QY_HO3^J4rVrJsNNQnOoC8X8BOXUz;@u@y$q2{`xH57t3{FkJ-V)Jtg za1kSf_>3FP*VXv;AL<07nimoWvS>1`-iw1@@Yt_^-@X8=QL@2*jq(>e+%RLCH-p|D zm&RM6oZYtUr2by)QJh+yMNRonFw-~Ivnr03(wW6yEtnyU*P$GW33FTI?E2NkhlnO46g3v(0XMe|vRzpxcC z0V_+$)hm%jm)Wlqy?4!`zdEy(7j^aOO6a6`phBduQRw31 z$5!vD*F^Ys+6aI453)W5cEPpIJWe=29=a-(YiX`B+39tekY)LqSM>~qj1Q#Uw*qCTUy-f7(VqB7evvO z1}xC@M1>`U%|A~WF$4w+sz$ylz_VjGLyJ$HKRM1^RkmWd_yqUyZ z;8l^%x3zy>U29EaHwp& zDqqlwW_E_Yf5;zs6CHu|1~y<3AfXEqQ+#usDnTWaq%Jgv@%Pney&g(r1zV5ElUR}bs6f9D>w zQLEZh=P+~R3OiTM{lNe3q%Pw>c39LcP0NXE?&?sCn0qIN?X{z?92I}Wts{bITwxnC zhXwbY$NMZ^)HA2(oD63o?{KLIU;8s>%=5;ox2%&K7i!ttGxvjY2V3uR->;K2MtM}C zTXa*8#ntGi+%SIh`6*r}cJOT(1m)+VeVqE#Sd^h$G`ipW$|e6zf+pHPC)OKX>3zkE zB=p#y56)^I-x_&Yd?227e;TLw0C6cr&UcKGy3biy)KLo19d7Y|5-rGgJJh{n90`4u zlbC#sfBR&@pKcONE7~#iw!M$N`tG4KbkTU@fq%OjTh}N=cB)vf4lbKXcU1@pl1j9b z!cgpw{hkJ67b350y4>F|;E)?zC;N<^UL906MJ9%GaN)N(c2m0}6uP(z3cl=}vSub5 zbmo2Gcbq-|Je&u9(b(VX>)#6b#)O#qR5fV$P2vXFQ>0f+T|ar$gh=B#2+U{d0HC96 z^8aEoz-q77Cqa?QftxwInkYpHF{O?%52k&3=RvxaKo-h#dSb6R3C4;y{*|Szv$WUQDUh*HE=?! z?l^Wwk$>@PW74e<-PtVnf6nC+w%Uj|LQ{Rtz+=N_Qzi%^Fj8NL4FUaSV9l@aEVV6k zC5xBpCij}25*mjB$nVgK25znj0J*JcNf>(j9!2x#{X@3|tPS$4*(}6F`>!pCYk=e? znCic~C&n^~O|nAGdufS8r7;&^QUB16@<7+Oemm3k3YwqOVh8@LlIk8!rymzBZ8$JX zPD{-_x_vmF-seNoqzqsE&S=jFEg~8>ZI^R}<4-_oiQP$IPXu`_LAZ$&IKeCd(9HIy zY3-qkOx)YfR9(GGg0b70zcIdLg>aNtTZ`dNVx4g&i120W`|WeNBycv7+wuNO+*e7T z+Och5EXBpsr&jOawIU0Q)^S_c*nmi8pxuc(8vS_*gy*ZFybO}@4lP!KAs7F~4AVHm ztlE4&*DK( zo&GE=4x+d*t*9eOZ=Zf^R`SEsbv7$KIr=?NyRl4eig8u2jX zGH+JR=TGf=!ww@RAZ-wYzQflgZ1Akl-8)aZasZCi{edKeLwv?AeOlf)3_gbZC5_cS zL$8cD7VFAh1>vf&$lPzcohu{f$i8z`TcK;D4_%JidI@(+S^HoRLBYEKlcr=N|JM*oY04n2EF!t}pDsyCuyOl(-+9 z*$k^Y1oRHcf26Z;K7kJ1{+TZya=i*Knv7gOGow4F8MNUHcNbNP$l#H#D+>sBXAaI& z-i)*;nVGYo5wUPZIL1s~W-PQX++}OoUK@U~*WKH_YdE$aPX2go;nglgmMt$q zJvHT2`(QSzI5=Pq`Zx#<`M}?iL8+S#A9I@7r-DgcJ|ww?C#@pl9OPv0a-{?%UPg|- zp~GIN5$B*V3i!5>+$%`0b}*C^1tW^$Vh#!M|TM z6v%eqiIeA!v}smG6Rp18u0;FHTw-1W(=kC4RRpJoP@@HWOT%CX z+I$Xb5A@g`kYL{<=_Dl<2>&@9B1T3?PfbJrAlL@Sbm$tk^y#c`D!zGQFZomeuiUV^ z!Qx$+;tf>_Tdny>UneO|6|c>l7f;#tWGr&^CSA-iP6<6lo)3-FNH4VZz}l8NbYX5W zTs;3uOdC1!{-qPgXTyzrB(z3xR^HwfS zRc;;OBW?!f<$btL`_C0ng=EsDh@yd*pPi ze@3Z!Sv2mAwDRCu3LIkR4xiU{dL5kY3g9`3wR!ad)eFx10vq9W^bn|Al3nk&z;L*5 zhw^E+HheGx@?zXgN#a$q0Q^>rj*-51$uw$eIg{MWv%B7Ah~YtFD(UxHew^)@xfp3< zo&qoa^Kqx#6YI66aA!sm?gB-rOpAar(iX~YHWa@)cm`ideSP%mKJVTew0Gz_76`m? zX~4YG+kzr>tGa8)Phwn-A7^j^P;DW;ELUj37e;T;lD}YGPg*!jCbv0wnxU1#DOr<3 z_FFulCKEqiK*bk`U@a|uha6B<`!`J1|8}R8D&_re+SLbNefFUt2aVxWTn8B!M|0a) zz{a01yO^}V=}+ucJ@}0Ay!57oS!v=s9ASJ35NUO0aLmDosypkJd03!kezf z|6yufl+N;FRgaUb_8mPb&vZSt)(@}1tro+X5P!6;ClM+(;>`kiUrU`ZaN*5)G(t7WTwe_ zKVK-XOp*W+;Y&wz)PLao^{#S4eL3Qv0WKi7_?0vG^aHyxmke zm(87RuAjrTuy}>Sqv73lVu~hd{07Z2BC9yYhCe%XWnq2`!2JtH4-Yd6dTLw91&L4u z|8X$CY$)6;01#&>_c+xT-Cb}7KH3QhlbZ83#{hCU~)9BttR3NaAAU8NJCHSV&a z4VjUwFeR)s^1bn8+bUnqFh{`NwIFMo;iyI+T9WK%ibO$2ckpl5KIFlR##Qc7fa4z( z43ZsR){R1&EYE@bR)38aMnB6AMU$Kcpz<^6Y*KXecmLc(|IvvOz%4`ybd}Pd_pfVz z6-ETb54U?tHghR$RkoPd0ZU`@JT05C|=c2x~+fD`SVbUeh_xHov+JY`Fi9tzQPb&QSB{xto}3`6zf4| zCWHHIe;-B;S5;&tdHs|xRI=Eq2t@UK@d94Xjfl(r6I^xipLwe;xuz) zl%(&6`M0xbX47$NvZTTp%{=5lOnM~1}Rq6-)>BgaY0xQLgl4n+8&vYVDSEhv5DU*NUre?FONUh zMj26X)D%&+2qjUEGoNWN;G+4%&-(5N4bODiQ4I~wj@wSCX<@;XSd7h#dM?F8@%_Lq zKhXFn&k$0Ekt|8cPO6NsQDlG`cbz-B+?E}4&jB3pyFM;MDfbDgF=%s4T^wHYwY1v) zk(&4&{AM`%EwKS+;pnrP0u1dBm=4plebtkW6K!bsC* z(AxSx$u7U?{m1)>#MF7P=(%071vT)xOXx1yqTpoSv@lCr!)_T(L_EzN&|-NITXbP1 zv7-*c392i-tS9XlrSWZGq(a(=Zvo_UoP0wS_tampqkOkgO4a;*%_D9lnS-TrK33Jo zW0@a2?CqC&KNVyu4J;Yi`PtMOfK&)niwM}bvdLz&~L>JIXxypz-aVk2SD@9If$ zhMf!dVOmZ4d8i~Ic`HqjB-_tnU>iwZ@4=WOBRkg?{6;m8Dkt9BT{1D-5V%~ObzW7( zEEiOku8b&ro>>UIh(J|-Bw|pxwGG+UC(4Kfj0}$|ThL9C5tx!x0m^uU zShTwq<8A{57Jk7jt(kjd!k=YwL~~Q^?n7oEux#aRHzCYlo!{fN<@6Ha?%U7)E8UaY z%oc+^2&0L~QVV9nqKdSr;$?;1lq=JiybC=`1vXA{w2H)&vWQ-*yD&btwS3_%r&BG> zKwRcm)U+y7t3uvjA2~?`Z~J!w%7#02*{}d79N6(1sI*TTPbc+XVe07AK7-y^(EMlF zM0n#CGEsHMZ)OFR72qWaGpET&c(!Cr*@BF37u%GkdY^e(_XxcXxwJEaLG1!1 zv$b2OQD1-V`GvysSi|6h6LwL4+oUX1mWJrp0*iwa6S1RmeiyNRNy#)_?#RG2rDSr! za=(Na44AAXo!~C4r+;Ih30j7V2Xrcf7=;U-`O;E${KXH<;VEcVYdct8j z)vDX$-Ozx#JT!UP^)oTozE-yBLK-^oPCQDu7I6|l(ng}M^3rixE5SOh}IKtP4>o};O(h?$2$%32b} z#T*(7mdmV>4gP?NwAuQJdI%)?T%$W@~hy zwMS9ZsM)I3XzdZDLL}e3KmWz|_viI`o^#*lJm)^wb=_B+r>!+VzqNneS(c?F)KGsoA(H(@977H#NZN>SRoy@7Q5=Gk>K2NEAN= z&6`z5U-q@D;Cb)`=BLjXao0-l%sS+x1VzYa7&8E1oZTRdnhokwHf-+K_TCnV%T-Ur z&@G32A7KHvPZ|Hw{BvJTA0_))KzjUW$&sCrjP(KWivVLjV~V@J=y!E6E?8T3wq z%L(f~47N?`c2SlVGY|T{+`}>CW|1TT|75UKS%p;vXh`~tB z;Da0dHIg-q+yr5g`!p&IgQsCU_or?FlC=PwFPr>_=ETWi#Kz|sLGCrytljl{f&7`f z2g1<{*9p<%A0K!oZOKRUDoUqq&w_+6kYQlwW3trvP-*6UO%?9kK(m>6wH`5#H`!^V6heTLOcX;HuXAo_{_?eiA5*X+-KX8t3^Hw6uR zZx@>)%3;#el*cFbQ=3}sF4s*rb{nW<9JvG*q~gQ5J&Adx#z6Ed?veuECE#?5MsjZs zxjYwB5(vpjLKE`%>(qaDJl-u@Ib^0hC+tq&J)jd4 z8Sw>5e2Pm!Jgnj^<+nD=>9yr>~!0(S|m0Kjy70~z<$dk-OJ!8Oj%YB z{AaE2r1!r7*a5hkD+U>(eBVWGw#Osa1dyVJ)9+q9w^4c|DB>ea>W>ZvEWyBC6`co& zdFi4i7REo9*K)GLy01mH!86MXKrGZL_+hA=H0P%4+rIH19cjP^-cW{EJCD*i_dkOY znaf+h6NYt5Q)V8;I)y^yhBjncG?6>jNEun=k#%x*cFHG+kVjN~_}`PJI2`s}EW)`1 zwr-h(cZ2jK7!+_K)13%?Os)7T{?tjWtZ__`uW`$HSkXIthIZAoaR1x&AKPzKtFwu- z8(xe6oJs*$zj8pZ(2l*9df7$3&^B(`pVcrjO;Sf@&9|VXem>^?M1-~%MGD)Q@y>~PMqOK%J@7ZN3EWphXEws`n)C_Voa4TYXBxjwwq?N*U3GQwM2(D#xmo&_$g z64Ro%wEqV)S#~oJcS6kpA^KG;O^M_9r=DTUC`$~0fG0;wK{$T@BK=ni6jyy*Y0xUo zI%CV{G2_v)`9FWXJM!#%?}f-Rhq%2|{2Mp&Csk_`1FZO+MTrv_-e4fJds`ERy zabSd~lC5inhN(lY?@B8p;vRUGr!N{qRd%}MAzwAUuU*_kS@6`^0X90SCNr^2*b5ux z$=!U|loYhlyS%(?*IY5FEnSgK{JXZt44~8kkt|W1TJVLFe?rlYe{FQNOhz>Q-)6;I zDm3eA<7-_Zd|ydS+)(Je>nN>N2{=cAH}9H~NegFlGYZyyL-Opaj!??n=lzDWZWrtQ z4NGVbg@FX5ha_@eb6_5hU);KDJh%kzE-0fl);(*vg0hSbyscQusDr9akD`lw&PXGc z=XbG`QLJ0fFj12A+Tt8TS>_=_uL@b&kK}Yp-XsJ-?yf z@j9*K@f$PF`A<5GY$F%!A9AfD>c*XoMpkt&-v8!+Z;^y3P&z}aaav_!^$g?5{$-p? z8QNqsq`}*uME6DS104`y)LrWS+|uu8a6#&k^5ZS{zm7je z)jTc!NR^gq9hQgzJDr;KL9xDu4pFXz)?PqWHT;IO)n8V-9k)*WWgIhFE6@J43y3RC z#Xpm3F6dEYaD4{uC|D;vj-&E@uFNPLflH)48(wU<+dRAgm(nSK)ij;nMNfXVd zxH|hBq()fWf3p}SgO5Z;Mp(AIu+HJP;>b%C_5T~@WtbBA1U9h{qoEy3#@Lw-8ap$d zHJ4_-mh{^>psI#fLF=x5m9m9WZ;P`h9<=-8^VtTIW` zrAccT_2yU3`X1YV+dppg@V(XQK_HH3Ck19Z#fR$c0*a%>)>@qnQh2$(1Ho^;Iza|} zfxim$?q=m-_=m^($w&aS(H*H<`wFt*<%-yd?2BT$h)Wr7Ha}Pi4_0yACsf2 zY7?PnL*JHguT;xN$aQMIk$+p?F3u#W0@$k-YqE*@>wD|~5*8RqtIJH*aM~0uvHEE= zq;Sqdp*nokNs521#hE*pY}Yai?C&Q1qOiip0r<@ZWcBl-S(k^=*hX0_nDsT9saDlP z*ogC2{*zlQz`FCdjgWp1nX0H|0;(1NN--H1`VBs-5Jz|lLCXvzKqOxuI3JpB&ra!k z{f1%^@&DuQqfrFe_*{MfT{0NiGX1;xDs5pqoIQ>l`fMz6M&G@{r~LC6k}vUeUlnAL z!ZD^_sc<`~kV30m&u>iw0yqs(zslMP)H9K-g^v!i8_MrC?U|MyjS(pWFVoz3P6E$& z9O;9nR!jTWqeT9uP4Kfl95URgDr`EObdeGG_Ouo6p%Q&Rbqk|*Vx{;$0P-3`=_zIL z+*zPq!ar`xC?w+e$92u2SNl%C4uWqkHj5@cYtRKL`EpF?pEy-)o0+{R(lbgRPZ8{9 z+dhd!PapIE(*(=SI-6^uYNx*HASpxAk(32DU`H2F?Nb{_(}g6ss|@_v9V?p%Q&zLB z(N~g{=Po8lDPA&E@eC;8@+mFy08%gr01MjtK>YPSc=ayC0RyslA9(A8aUNGCfuf~C00GJT?Bki7((9!p!5|6E5u_x0%rqitMo-4Z z9POE@XH`A-**-{8JRSdB1yOhB@GLNd(;*{RDo89QrYn1kADiGT5?u7;^pu4LQ&vPj z8DVxiu_q>1jF^!Xiy{cc45LV5jPd@Z4IRC>dcC^Q9nA&H7IgJ0bIs1ij&j((t z?T$OZ6qCA-1R1E#2kZ?%=dDJLT{~Lg3Untav_D_U$k$QQ)Nv9m8G!~^WgwCe0{`WL z%Xsy)SsSXx)vcV*Ygl1q-?xm8%0|1%%Untuv!ZE*DW72_?=;$wITZW@eSkNnqy3ea zy@5Ew@W5)GoD*}kU{xl@RqI6#ot#tpPFR`4n-t1iD ztSt6(c})=wVLFXAdjm!L+)&w_MEs+lX-Cj-4tP!e7jd&eQl|$Uux$rJ4s6y7uHnIr@el(+b+Cj zQ>uY>0)`t8vB0RQGKt+4NX8sj@Fv8lwX^naDZ}#WuW64TaW+5g%1=Rfmmv9|B%~Wv&U}1Nl=2o7WZc;msW&?_eo@uR zmU{Va<2Qf=hNUVe+9x@BG6P(czdnG#S0S2A0`JCY_S#>Xk)$5!{~lU92hr4d-@SPkD>>+>n6 z9}5e9OwHNgzk|aa!i-^bK0N4y;{!fmT_ zu@3Ty6*1N-=&+j!Ay8>Z2_WD zNq`#~$d+%9ebKXy{x;=aCZAg@`^n@lr|Kyg0v>w_G9C4O|BQ5?3l{`c=$B-~3V1x@ z6t#Zij*G*Z%K{mM_&MGDi55c0OW?qMWk;JX=XAvIj9-a}J2Pvf-hGxyh|+lqVuWtMZZMWL#g5 z2R@2My;$T3`PC}iDgGH_-=R z0U|5Z&3UADq)C<4nAy}(8XtFiX0Px z$H8z!<1=IU)XLt_L7Ks0`zY;Ly&!5(o3#8EDS&cY-ttDvHX4VBPf)?Mww->S%`QsZ zYh;8QZb7NoNRm?8*9e1Ao05wLc+elRP{FQO?MSR{VCOXDe!sZ0h)7 zzsdQ5KGcu5OR*vw9jwV7ITW3Q5ZKvD-X{@C7R4?pNTiqh>H4x?5f+k( zu=L^x*9ZAlL-@oXAcQp!qM@w}+bsq%`Uf1(?upM@T}q{_V{=aM4LX~G+rd@Sk39EW45Eq*D1!d^N@^xf-kRV{T4^Ncnxs>$w}m$_w<}2y)Ny@qO=CrgcMu>LlsGpY(KR ze^Ha1Bhz65>qnQW!mR~UjUBFL7M!|t52>aYYyl`XU${{Q-B$so_5t9SQg`=Dm&K8O zvKoqA3yP;Jc~DY9XBKV1)z<;LYQ0E=Muf#iToI)-v765I>dKfISdNHDamX1xbO$LC z3IyAT9i`T3s#B2ZKC9KJ90d{oqQRB+eu#}UoyNBFv z1q(S5u}M+Wd?~#b0Z`z?;=4Jj7XIX4$0XN2UF1-waHOa~jM3|c$mCWq>(T zE}9Z!#4%)Vs=?DArl&duLHcX{Pm(>41ub(dT%U5ceNWIxd!QL#T1&+efsdY_bRmbDCv$h zE0^z93+2>ddJ?GQ(Y^AGQL5&t%cebGUIMyiDe?6esJ+Y{?e54!2R_wdFY2q z=O!J8UnM#SB{FZ;j%F5^xUR!-YVYYyDywJU=0!@-x}|ZAd6hx`YNNcvPGj^}(<->= zI`2*De*5-TPeTe%D;#kT_SJh`_guEX@!VSt7MYO{&5i^fCW8D`%=RsNDs$hx`ojIC z$LY=%Xr{#oShmte@d*jUT`2nhh?${I1nEJdm_^@kbpCGaYiP#KudLmp(|u}%V=-VR z7!({>Ob7ddv{Cl`y(3~Japs|-DDj+6jA)({^waQv=1F*uc;ZO;(JN*hXai|hegOK`vempk))*G=fvJ zW8XVPp;D_Kjk`l%DlCYvk*M$vaudPVhLx?Eiw#{g*uF!@sGus?@^27+u+yx4Hp=UT zb5`&1j06?hb4qdci;u~^%CY3FN2P!Q=6_Wf0j;f`$!@h=PM7iKqk2VnlX_P8dt3im z@euBd$CMsJy-c~J{ZM@^ELB05FX`%P6DF(g}KdRVe9pXSL`qKYJcA=pj39@-8Oa|2OA|a%Xr|ug-!d@yN>7PF4fq!8wT##U%c&SreI z;VHlD>#7u0?K--<`@H=!eFE;|P5b@K+);^Jr<^@zD5;s{=sG%A!N_I2NpI88S(}6K z+DDSp1gCxcxh0}=K{*Lm68O66%17>Bv#XU_LYzdrT9FYzft@0wAE_^xY1vZ{Fr$`> z;^Tf|9UOpIFtRTm>U z(A2)1@_P!gY5evtA1Y~0cwvIe(D^}p9u{cJF$@~uHGoAH8(ITZ@4LW{YIW9vvk;y* z5Z5}&DQYdbFaD$G@~2NsR0oglKH`g-75sP--Yz&m_JDG$j~?lGUcEmFtBX5Q5LlI5 zKfF0y5g79HtRLBdy{u05_%ybf3e@&XUuu!UYu_NaYmzNpK|F*Ez)TCaD$sU0^N&z z_=m$zZ6@X5f0CIQ)I0@5pyjnJJOVOuJ#H&Yp={ zrRrP{TVEQD>NRQ!))egw-paact8fhjR{e&DB$IR8LJb)Cd*vTdJ?>F0=}&qijsNwU z7Jg;N7}0i6UT9JqyNcJ}z&shqYTh}T}_?w@^^=Ja$^$#HYx%>OX; zdfSWa$(25-&m0lV2(o3*=nA5O7Eo3uOmfR!mit7zs7c7;;8iV+zNx0RpZK-C)%2@C zxrz#d1n2LGx&ArOjrJ+ogf>IEwZ%IAzt<*uTP-`Lguy*Kr;ECm!nC>QoOR(8Bfz7+ zO34%M!9V(c_RdfY-o8Cs;O_l1@+y?`>A!=!ULLaRzr#wDmAO_X zSN$S@O(!h z_v?SvtZ07c>8&nl^Uh@c?a?u>O>bhX8iT}=R-QUpqfmzWfJ*&KrM7LYD{9$?5%x-C z0*mk30Ul}Ka;S6sTbjqLOdxi;;1?M!b&BH?!9JZDix-BIN?0G)2RM`(HM-38{$!%V ziqrY%`*Og1krs9BVjb>#TXqK~kenKHLJehB+G&N()WOHwqhkF*PqQ?PHcm{oV{U}S z3@O`CUy%si*;MY8om~;q<#qAgo=Alj-hrU3b>Rk0vPLR4A&2sxK54=%0UIK=#?QXp z?&n8*6iqLvhE&so^B;x^9?f%d8!0>{oD>{O3Ul+cvAIrIO})EnmcdY(zf5|NK09@-k=*+*>mCk1 z4&Wk+$IpT>B5-hYaZ)k;M6&I^sM>(x8*&xn4{M0s$ zD+J!;kh#0&Z!cBl{q;2Y!*A|@jgUc&AG{) z4}_rc1qIJ|lbjv<@yqUF$qQMEZ&y_{IfU&$dww0p`jxjjTN2iV7bqy2BaD3*?;G5y zPmTzy;xy%?hjGmoyowtpEO-8b?U;#pGbo!EL<$h$p^~^vBfu^%MWCkkt-s$nzAS)U z)(t_s!9m!q++;M2PPIW5H)RBfMRL$YW`Z@z7?~Ym01XHo1wtpb0su~uVg>Ls#RK^S f`~SZ^M5OX$g5V64 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 MWi6#Dm{rLC0A@5kjsO4v diff --git a/qcd_utils/pult/icons/view-refresh.png b/qcd_utils/pult/icons/view-refresh.png deleted file mode 100644 index 66f0cebe10de3813d2c7d752637bd45151e56756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40505 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