From bd421ff5afa84c91abb808f1b4df0de7ff1ac7e8 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Fri, 28 Aug 2020 13:33:06 +0300 Subject: [PATCH] removed qcd_utils --- libs/qcd/CMakeLists.txt | 1 - libs/qcd/qcd_core.cpp | 297 --------- libs/qcd/qcd_core.h | 97 --- libs/qcd/qcd_graphic.cpp | 40 -- libs/qcd/qcd_graphic.h | 67 -- libs/qcd/qcd_graphic.ui | 169 ----- libs/qcd/qcd_modedialog.cpp | 46 -- libs/qcd/qcd_modedialog.h | 51 -- libs/qcd/qcd_modedialog.ui | 98 --- libs/qcd/qcd_model.cpp | 460 ------------- libs/qcd/qcd_model.h | 133 ---- libs/qcd/qcd_view.cpp | 371 ----------- libs/qcd/qcd_view.h | 113 ---- utils/cd_pult/CMakeLists.txt | 14 - utils/cd_pult/cddirectk.cpp | 312 --------- utils/cd_pult/cddirectk.h | 77 --- utils/cd_pult/cddirectk.ui | 85 --- utils/cd_pult/cddirectk_type_dialog.cpp | 76 --- utils/cd_pult/cddirectk_type_dialog.h | 44 -- utils/cd_pult/cddirectk_type_dialog.ui | 232 ------- utils/cd_pult/cdgraphics.cpp | 354 ---------- utils/cd_pult/cdgraphics.h | 92 --- utils/cd_pult/cdgraphics.ui | 168 ----- utils/cd_pult/cdpult.qrc | 16 - utils/cd_pult/cdpultwindow.cpp | 292 --------- utils/cd_pult/cdpultwindow.h | 53 -- utils/cd_pult/cdpultwindow.ui | 612 ------------------ utils/cd_pult/cdviewwidget.cpp | 78 --- utils/cd_pult/cdviewwidget.h | 41 -- utils/cd_pult/cdviewwidget.ui | 176 ----- .../Apps-accessories-calculator-icon.png | Bin 9661 -> 0 bytes .../cd_pult/icons/accessories-text-editor.png | Bin 36782 -> 0 bytes utils/cd_pult/icons/db-export.png | Bin 33510 -> 0 bytes utils/cd_pult/icons/db-import.png | Bin 32628 -> 0 bytes utils/cd_pult/icons/flame.png | Bin 3342 -> 0 bytes utils/cd_pult/icons/timer.png | Bin 45230 -> 0 bytes utils/cd_pult/main.cpp | 373 ----------- 37 files changed, 5038 deletions(-) delete mode 100644 libs/qcd/CMakeLists.txt delete mode 100644 libs/qcd/qcd_core.cpp delete mode 100644 libs/qcd/qcd_core.h delete mode 100644 libs/qcd/qcd_graphic.cpp delete mode 100644 libs/qcd/qcd_graphic.h delete mode 100644 libs/qcd/qcd_graphic.ui delete mode 100644 libs/qcd/qcd_modedialog.cpp delete mode 100644 libs/qcd/qcd_modedialog.h delete mode 100644 libs/qcd/qcd_modedialog.ui delete mode 100644 libs/qcd/qcd_model.cpp delete mode 100644 libs/qcd/qcd_model.h delete mode 100644 libs/qcd/qcd_view.cpp delete mode 100644 libs/qcd/qcd_view.h delete mode 100644 utils/cd_pult/CMakeLists.txt delete mode 100644 utils/cd_pult/cddirectk.cpp delete mode 100644 utils/cd_pult/cddirectk.h delete mode 100644 utils/cd_pult/cddirectk.ui delete mode 100644 utils/cd_pult/cddirectk_type_dialog.cpp delete mode 100644 utils/cd_pult/cddirectk_type_dialog.h delete mode 100644 utils/cd_pult/cddirectk_type_dialog.ui delete mode 100644 utils/cd_pult/cdgraphics.cpp delete mode 100644 utils/cd_pult/cdgraphics.h delete mode 100644 utils/cd_pult/cdgraphics.ui delete mode 100644 utils/cd_pult/cdpult.qrc delete mode 100644 utils/cd_pult/cdpultwindow.cpp delete mode 100644 utils/cd_pult/cdpultwindow.h delete mode 100644 utils/cd_pult/cdpultwindow.ui delete mode 100644 utils/cd_pult/cdviewwidget.cpp delete mode 100644 utils/cd_pult/cdviewwidget.h delete mode 100644 utils/cd_pult/cdviewwidget.ui delete mode 100644 utils/cd_pult/icons/Apps-accessories-calculator-icon.png delete mode 100644 utils/cd_pult/icons/accessories-text-editor.png delete mode 100644 utils/cd_pult/icons/db-export.png delete mode 100644 utils/cd_pult/icons/db-import.png delete mode 100644 utils/cd_pult/icons/flame.png delete mode 100644 utils/cd_pult/icons/timer.png delete mode 100644 utils/cd_pult/main.cpp diff --git a/libs/qcd/CMakeLists.txt b/libs/qcd/CMakeLists.txt deleted file mode 100644 index f3e84e8..0000000 --- a/libs/qcd/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -piqt_library(qcd_utils "Gui" "pip;qad_utils;qad_widgets;qad_graphic;cd_utils;piqt") diff --git a/libs/qcd/qcd_core.cpp b/libs/qcd/qcd_core.cpp deleted file mode 100644 index 95511a8..0000000 --- a/libs/qcd/qcd_core.cpp +++ /dev/null @@ -1,297 +0,0 @@ -#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/libs/qcd/qcd_core.h b/libs/qcd/qcd_core.h deleted file mode 100644 index 64695ff..0000000 --- a/libs/qcd/qcd_core.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - 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" -#include "qcd_utils_export.h" - - -class QCDCore; - - -class QCD_UTILS_EXPORT __QCore_Initializer__ { -public: - __QCore_Initializer__(); - ~__QCore_Initializer__(); - static int count_; - static QCDCore * __instance__; -}; - - -class QCD_UTILS_EXPORT 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/libs/qcd/qcd_graphic.cpp b/libs/qcd/qcd_graphic.cpp deleted file mode 100644 index c53a9ae..0000000 --- a/libs/qcd/qcd_graphic.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#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/libs/qcd/qcd_graphic.h b/libs/qcd/qcd_graphic.h deleted file mode 100644 index 68b7fd8..0000000 --- a/libs/qcd/qcd_graphic.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - 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 -#include "qcd_utils_export.h" - -namespace CDUtils { - class CDType; - class CDSection; -} - -namespace Ui { - class CDGraphicWidget; -} - -class Graphic; -class Graphic; - - -class QCD_UTILS_EXPORT 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/libs/qcd/qcd_graphic.ui b/libs/qcd/qcd_graphic.ui deleted file mode 100644 index f08198f..0000000 --- a/libs/qcd/qcd_graphic.ui +++ /dev/null @@ -1,169 +0,0 @@ - - - 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/libs/qcd/qcd_modedialog.cpp b/libs/qcd/qcd_modedialog.cpp deleted file mode 100644 index c6e2bb6..0000000 --- a/libs/qcd/qcd_modedialog.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#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/libs/qcd/qcd_modedialog.h b/libs/qcd/qcd_modedialog.h deleted file mode 100644 index dc57713..0000000 --- a/libs/qcd/qcd_modedialog.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - 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 -#include "qcd_utils_export.h" - -namespace Ui { - class QCDModeDialog; -} - -class QCD_UTILS_EXPORT 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/libs/qcd/qcd_modedialog.ui b/libs/qcd/qcd_modedialog.ui deleted file mode 100644 index 38c2dff..0000000 --- a/libs/qcd/qcd_modedialog.ui +++ /dev/null @@ -1,98 +0,0 @@ - - - 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/libs/qcd/qcd_model.cpp b/libs/qcd/qcd_model.cpp deleted file mode 100644 index 2b1f203..0000000 --- a/libs/qcd/qcd_model.cpp +++ /dev/null @@ -1,460 +0,0 @@ -#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 Qt::ItemFlags(); - Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; - CDItem * item = getItem(index); - if (!item) return Qt::ItemFlags(); - 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/libs/qcd/qcd_model.h b/libs/qcd/qcd_model.h deleted file mode 100644 index 506f0f0..0000000 --- a/libs/qcd/qcd_model.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - 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" -#include "qcd_utils_export.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 QCD_UTILS_EXPORT 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 QCD_UTILS_EXPORT 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 QCD_UTILS_EXPORT 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/libs/qcd/qcd_view.cpp b/libs/qcd/qcd_view.cpp deleted file mode 100644 index 619c46e..0000000 --- a/libs/qcd/qcd_view.cpp +++ /dev/null @@ -1,371 +0,0 @@ -#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/libs/qcd/qcd_view.h b/libs/qcd/qcd_view.h deleted file mode 100644 index ff3d68a..0000000 --- a/libs/qcd/qcd_view.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - 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 -#include "piobject.h" -#include "qcd_utils_export.h" - -namespace CDUtils { - class CDType; - class CDSection; -} - -class CDItemModel; -class QSortFilterProxyModel; - -class QCD_UTILS_EXPORT 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/utils/cd_pult/CMakeLists.txt b/utils/cd_pult/CMakeLists.txt deleted file mode 100644 index 1ffaae3..0000000 --- a/utils/cd_pult/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -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/utils/cd_pult/cddirectk.cpp b/utils/cd_pult/cddirectk.cpp deleted file mode 100644 index ce7e756..0000000 --- a/utils/cd_pult/cddirectk.cpp +++ /dev/null @@ -1,312 +0,0 @@ -#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/utils/cd_pult/cddirectk.h b/utils/cd_pult/cddirectk.h deleted file mode 100644 index 47ade06..0000000 --- a/utils/cd_pult/cddirectk.h +++ /dev/null @@ -1,77 +0,0 @@ -#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/utils/cd_pult/cddirectk.ui b/utils/cd_pult/cddirectk.ui deleted file mode 100644 index 731498b..0000000 --- a/utils/cd_pult/cddirectk.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - 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/utils/cd_pult/cddirectk_type_dialog.cpp b/utils/cd_pult/cddirectk_type_dialog.cpp deleted file mode 100644 index c6be2fa..0000000 --- a/utils/cd_pult/cddirectk_type_dialog.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#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/utils/cd_pult/cddirectk_type_dialog.h b/utils/cd_pult/cddirectk_type_dialog.h deleted file mode 100644 index 9881864..0000000 --- a/utils/cd_pult/cddirectk_type_dialog.h +++ /dev/null @@ -1,44 +0,0 @@ -#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/utils/cd_pult/cddirectk_type_dialog.ui b/utils/cd_pult/cddirectk_type_dialog.ui deleted file mode 100644 index 0b5ec15..0000000 --- a/utils/cd_pult/cddirectk_type_dialog.ui +++ /dev/null @@ -1,232 +0,0 @@ - - - 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/utils/cd_pult/cdgraphics.cpp b/utils/cd_pult/cdgraphics.cpp deleted file mode 100644 index b067683..0000000 --- a/utils/cd_pult/cdgraphics.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#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/utils/cd_pult/cdgraphics.h b/utils/cd_pult/cdgraphics.h deleted file mode 100644 index 51e3483..0000000 --- a/utils/cd_pult/cdgraphics.h +++ /dev/null @@ -1,92 +0,0 @@ -#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/utils/cd_pult/cdgraphics.ui b/utils/cd_pult/cdgraphics.ui deleted file mode 100644 index 6a40b06..0000000 --- a/utils/cd_pult/cdgraphics.ui +++ /dev/null @@ -1,168 +0,0 @@ - - - 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/utils/cd_pult/cdpult.qrc b/utils/cd_pult/cdpult.qrc deleted file mode 100644 index 08a59ac..0000000 --- a/utils/cd_pult/cdpult.qrc +++ /dev/null @@ -1,16 +0,0 @@ - - - ../../../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/utils/cd_pult/cdpultwindow.cpp b/utils/cd_pult/cdpultwindow.cpp deleted file mode 100644 index c388c5a..0000000 --- a/utils/cd_pult/cdpultwindow.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#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/utils/cd_pult/cdpultwindow.h b/utils/cd_pult/cdpultwindow.h deleted file mode 100644 index dad2c2b..0000000 --- a/utils/cd_pult/cdpultwindow.h +++ /dev/null @@ -1,53 +0,0 @@ -#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/utils/cd_pult/cdpultwindow.ui b/utils/cd_pult/cdpultwindow.ui deleted file mode 100644 index ee0273c..0000000 --- a/utils/cd_pult/cdpultwindow.ui +++ /dev/null @@ -1,612 +0,0 @@ - - - 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/utils/cd_pult/cdviewwidget.cpp b/utils/cd_pult/cdviewwidget.cpp deleted file mode 100644 index 67fa124..0000000 --- a/utils/cd_pult/cdviewwidget.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#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/utils/cd_pult/cdviewwidget.h b/utils/cd_pult/cdviewwidget.h deleted file mode 100644 index 9b1abb1..0000000 --- a/utils/cd_pult/cdviewwidget.h +++ /dev/null @@ -1,41 +0,0 @@ -#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/utils/cd_pult/cdviewwidget.ui b/utils/cd_pult/cdviewwidget.ui deleted file mode 100644 index eb2d44c..0000000 --- a/utils/cd_pult/cdviewwidget.ui +++ /dev/null @@ -1,176 +0,0 @@ - - - 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/utils/cd_pult/icons/Apps-accessories-calculator-icon.png b/utils/cd_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/utils/cd_pult/icons/accessories-text-editor.png b/utils/cd_pult/icons/accessories-text-editor.png deleted file mode 100644 index 1d9dca26221995e8939ccb7294cec284ed6ae5ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36782 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

(C4f(<`o2|&R5 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 VWO1`r?N10izTStu8V^M0{s$gRkv#wa diff --git a/utils/cd_pult/icons/db-export.png b/utils/cd_pult/icons/db-export.png deleted file mode 100644 index 7cfba88eec612b651f35917fbc58b7f36097c0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33510 zcmW(+byyT%7oKHd=@KL*R1^@9?pmZ91O@3XK_sNvT|gy7TDlvhQ>3Ltx|>D1I~R8M z3KXbKlM( zzKUMz*aSQQf)JV&T0g-uiCVA3{5bKb?rE*{obOx^rYT47hNj)zG>%O){rA@BT0b1a zVn4*>J$$~&L`iS(Mg#6+MK66ZmU{nObKkxNeY4wead}!$a>+pogo=M{yn@T5q-9)> zlc!63+Q^bh0f1<_kkYLQ_4_64{Sil;Q|!|+0lUMfo0Rd1(>q~06X*a~_ZYg9@&FX8 zl29(;4>278_?93D;j{73rNUIy>y1FqSQRSQ0b9N0MGWjf=$!k%$?|nK;fMF^wv>~r zuCwq6wG9OBY&WORAe;M<=GI?$@w|7MlO~$#S6CjNLgF#mEl3lMzIEIYR|B_ODm@-< zd5f!lUNCT5fZGbeDE3w6^nHX;3=^w4kiaKWsVWA9`)_Bi|Lc(Kdm zWBbvf3d!(`iH2p4Z?ra}{rw{2_N_NUjZSUEK&Cu}vH6?R5l!U5p|`r;|9uMdD)agr zDY&_`#aBrT9QdsicbxsGFxPr}DXRCj>G4QSE@i4jEdqA>XZNhP_ciVSF#3QyqE@#{ z!toAF>lE@ZsSsQw1Uy*L_uZH-e-wc{N9vq&j`vn|H`} z%ETi1B`R4w(QD#k=tVzKHRp81=(#ycQn=xTB*p&26&wU98~n}b^4IB$%cjEZ_Wxpq zgH#sHwLJ9cHe9<_|ED(F)p1SFNJiE##1isV+KEK`GsvjAYehj5>{6-yp~H0}=;zX4 zDc)^s8&X`;^gnrWg>Gwk7yGg<-+GlIzpTcS0@uFcXUmJCW1mxLoZf2h|B0@w=c}py zcyM)HbM`mRbZrw?!NlWts{_;FfE|V5BJwb!uw0h`Ad_S8+M(S%-cht0Au)K-^iNXx z9NTB`yg+XKNo`wBf!;LNpT7Lq?nckmB&^oW?p(rS-Ev3oyawM*A4t%UsgNc(_%4vc zMl1DNb)eMde+R@~|3F94TZ}%jAIwiHmkOWq%toaNedo^d+AGZ+Mmywq3_{-_h;b6n z!4Smor8i@K$$t?lANe`sBs>|3jPtiwl`_w@OM zg{@AY-j7RB(~h9M0S-+@-4|KEc3EmI{p0<~l~G)J7VL))`dBM}w9P-(WYW7+3nhc! z*uJ&zIT?KHk*u3?vfvArwgVf9?T_2FzS^b@2YO}+>M6~bF7M2|M3G12&Kwp*Qhiv{ z%8j7irgFRd5^c^qGXtcO*Qc>QrD$8b=GB0rEVctfA?q=MU%RrrMYhJ5mw(WOl{7~u zx#yn4Asm$1h#pbA_j}kXn)lxD2F=u$|KR|A7yDO(tmnWy;q9JQzo_Eil8nckg%~>; zYYGZC)UmfHH51oEsdGB`*U$Em%_^>C#gAS_R@4Ft;3#VfpQ5&TcFn#!EcoKD(%;Yb z4Ybg$vYdn3$Qvj-H0SrJ^1auD@hNV+Uhqq;OV$G(@f=uP^c#mLpVDBlk}6?N4e7@{T< z#=}I{A;{0YjSD!_@BD*eJjORGAWU|7T}$OT-31pXPqsOHlg6ke@AI5>21`Biz8=t! zD(*#q-VX0R>*}B94Ch3E4fqM9W{~^e3KjkXpeDZ&xIz;#?kcTx3bc>nU^a)y@7dbx zy$U=WI`|f!BB!VPZ4{2a%Bpot($i+`qAuRR+EsH_R<+IZXv+Qf1r_pMU}Xp&;XOq0?Z0y<=-HTRM}EL3k&yp+ z8N2#@!V-jVkBJacOeeI%wnemJd;QSlIs9 znaE@c>5^J_$3sFwS6k%Lf7NaS)FsgimF6%QGkQ<5VGNZaJTW(wcp_0McedlP;u}RL z8Oa=gGW9zsYf0#$Zbw<)(OGrd{Q3L;*bG<5XNZTzwg+vVG9o`b6LN&i$ZClriumGS zKG?4EvwvtHTlI1OHe;LLr@`2%O3DzisXxk5X6W|w{+k z@SDi~UXDZREY&X%%^WpdLYBOI1pcTu?2=|u5uryy0^nsVMe z!&_5~MCWag3~a`AtSj~`E9+-^qRY(Ezq-j zXS4@FGQWkgetnQ3WzyAZx{$0xzn|FH1Xh0xJ3VpEmq=GRZhv;H9CCVI?n3kv-@RJE z;eqVs;$^G6r0si`+0v8X7Yo-W(!i?vs}D=o6|L0nQi5TQ?Jz^IJ-Xo z<$e@<)-_+=9bk%Q(kFA=xij+vT!L&1n_%ciwFu&EM)RNHQ}2-K`vMtB1?z#i2S_Rn za-s&hdmXHqN8ZODzi1Rcc;U)3uNK|*i~Sqtd)_o0mc3Q&_l7SS00_Z1X189kEcge7<-(a-%=JC&m{^8Dcnnax-kF zXQ9~!OP9Z+@R4DC_qEA&>bLMDS;bEU$;f};FG{b;^5$jTp0u?2HvD*L9C4_rq}_Um zRa{{|6njdc?HBjPo|T!8bOl5a?mr!_w;p3PSKpL)0Dp(yz1DY6Gf31o5GMr6RZwDZ zhaRo*M6lc^!eG18=B5 zN7Dy}l{f8}r1HVo_Mt)Ky2o{^ycD1#xrYm!4hnd`uGXoTg2D@-CLjd+af^KTrj5OA z6T#Ha^G+1ErD)mShXeAdP7XrU%#<~>7w=SivQ~6Yvx49jp#}{<*6GP(cwz=81!WaLNWuZ5NrVE=-O&@EW_QV*KW$p}seG z%&g=j(e4Z(uk(ZeFY0_?Gm1SKD7-Wml*EI!FGcnS)*uY5KYtsGyYwEFrJc+dz{|AI zTmFr?whDdzpKiiH%d`vEvNXv(UvBrK;cM=HdAaky|0=|Fg+o{H+uM;|@NcAwuLZtj zdr*@bU16$xa>-dM_p=V!sjgWmzA8BkjJ))_`b1g_v*&ukj|UKCS@JBiqfaNvG}XXR z7QN%z{^wSc*u$+s82hC>j6G8tOe%n&b5!ia{^zPmB zEUzBr%!Q@~KP{becH=q4T-{&$RMWcZ16G7HJ0+NZLv3sGc7`L8b3BXYdezRdmkmET z(dWks=jIj1HhHtuKA5tvwKgtb--2ONipokap%8OHARr&xx{)J)HwT`RqoZ7t*7`cz zn}h4lU|n zXf_rP+YhD@7Ns?U0>#ax2+YZv)12|Hh9p@}@80GT8%Hy?@rS*vM?an(Y?%F4l8fuD zIu>>ul62?D;EB1p)Q%ssYl64o%?W*nhh;|E_U1Q=kk2CB3$3KGu-}HiFgvG?c^Nyq z;E)nL+}a?mEAYg2f@di-Nu}sKwKrHESna7NL*wPcx!(bD=@G>4C3QSnKg6GYRQnRXGs&|^P}WAQQ* z{Bc@jb}Vkx0{g*xejKt3{?j*Dpbft@nqNhZ(VVtFTp(t2rZ%sA)toR>Df^Gexs~1;wpq$A#ShsEGU;E$Rl*oYg!VG-mMn`)E1O&$B zf^vm`eAdJh-)4y~4+`55NfG6@Xew+##=GWyf3M98D&s%K!8G$`gbM-|%Nw*h{ zL;y}Kf}#!4L{lxq_p^a06_UWQ7=Iq@Q@t3|#gcn8)AnyW8vgz`_uZ<5BcZ%fNzg-p#0z5OiJ)zyj2f4pU8?v^;ug+)cR*Ct7uO@{lo4$Kb6jN7z$ zTdRb&jyj)u@2LpA5MA`VZ);<#C$E>bOIAtpN+y@BO$|Z>{)pRa@%ktKLimM$S_OZH6jr{}ruAjU1KG$Gg zVt03UvTetHGIhYBC#(I(@QFJWukT_@=IaWiX;suv;{ox++)irZ^F!;eWTxWZ1<1FN#-Ib8|$Ad{vw?)Vxn$5@woA8=hi@h?{0mdOA01*EDJL>hH<{ z?BzoRDp*hdFg*cTUu;tIgZbcX%z%)fu&+HrDb6)zd1Oh`$F2$h`pI02nV*QW%!J6aY`!QIxF zQJW>~GVt&|jmCQb^;B*^N_*%y07vV7j&Rz=$Z17|!BBfKEpwNE+k}PRRU2>K-hjhz zzV&w$wLmhy?BBsb(@8yACIZhtV5q!2_>$t+$E4w7cW3Vk+C*jE-gix__MV4G%(g&v zKcT`qYQ$DB@o?V1Z;y-Xb7t#yAA^+56|O;2SqRw&A{NX)MH6cu77)(JUTq*Qn10HB zNO@s}2^xhf1xMdfd!M5F=3mk+O3K7sea=4D%MDAw_d;Tds`Nx zMF`GYutBD9Mk^*Z9^HE=&f5Md#`vhSxw-k1^oLPQzB~=Ev%A}Ib+iWmlvH(R?7l0z zr%Tqut!fPc7ydRUDV3cQj(Xc?f?96-F!y|#@b8Dcw;?1fZX0;Vk8o2*2NNvd`#sbP z_IbD^EHgXB_#eA(YHV%mbjJzbmC+Vim7%QlI@wV7(zZ0FuAabvd4c;B+W(2 zqMp9>bSWo?rr?y@9mNl4Y1W7(lvMY8=Rb;W*w9eU*I#v0XhZ-p?gvq{K73w z(>r0ua`WE%){|I~@8#b;;BL}02WFPKl%^j0_w}b|)b?X+=9U_`wHYgYh41N3PyK_Q zOu(54M{>GH{y>3P5@kzTj?w;#=^c{&H9>v&C_(z^gN5*!j~h|i?b{LWcF+KUfSYN zkOL-9zZUmF!4GAIm6y{ugF<_84?bkbzGs=T@Y)w8c%aciahy$-EqLomFoKWpDJExS zw%g?LU>&%ojqcX>gbsWb(|lkmSJ6_FNyCfWc;KxGC=WP*0?=hgixz6?1er zqJ)=C8nE(xbt~S0IsRy`uf9oja7}@N&3$BEO$*Py9JKU_y-H+1545-F%D4y3 z#lbY@(@9d$kC1iXvS$}i2LU)&hof@-U7b-|@6EV5(BSQsE^MYgq>^KSqbP;@ab^3HVXK6FfPC+P!3H~SB%e#Do zU+cImNz|zc_U{!XKjVM-y=|LH~-c57sWB9o;Qk=Ai`5 zZ9t-jCvXHT{>#^D_L=@N!c}v~Ihx0VwM+NH>Bh`H z0WPIs9A5!%O(DW`haeA)G(0=;eQ0jX=_9Af*r6!=E9%oOdbA>n6OvhV%oXu-0Qy&E8LaD`9gXTg0=Ov5qV@=Y7YsQduCPq z05SxM$jK2+NKBNO)1%#cPU>@4D-8detnl3)yzc)cHk95gR9K*EN@&l|x3?SI~+ zq$H$esTXB_c)CtYtqazN7Z+0^TQ8a5Y6av7`4LV!LNR>BU-(QROV=mq4`qVd{jYg# z>s3^^=>JI{R#x1{y@$Zjk{M=P-rKco%@k$9O2*01XrEz-D?H-(nF`tyryCR=2XAlLH= zye4@t18{M$D4A{m?YH(jE0FBFwG%r!Fqc-rqR0IwV}AycK}yy(Hb-KW2MgV(*k?;x z_p5$(UYX%fFd)8tyr!zdBLYI`iOzcQuOcflB`KsUvE*)KUK&R0m(FnUr_W?Km9tNd z*gsqm%J&8iwiDt(hSeu4$8Vplci8h?D=p~qdOW4nJJTHanq zJCMt}=$VU!W$+RD%{&04yZSY4ZEev;O9AaT?U~a4F%zevW}nZuh*?-qdClrmpTGE1 z(K4uuj&<*6;!CA0XkK{0!0*JyX0yKK<6-63hN`0~ z)9;c5-S+RGW(3(B7xN6kX8=qOvnjrM7HS>}suPT^t)0Hc&iyNz3_NctBE=m5<^Egm z7OJm~#GG6)>KjaJoPXu9fs?7yZ+sAnle-K!ek8G79NXc&k9&H_N5Q>ei&^dn5k0?i z^cUcJfY;&DSAGiO5fOMwRA`jmU`dHlBnP3fFj()ck4;Z^e#XO@v#Kqb zaal8iasD80L}`qsO+$JEC{<{p=0yub{Wh=wp3xB)6?xhOe!qc>%<)uwbN@|-Or#&Dc6$57K-cH|N z%YSu|Tr&(C1>3+zirP-B{Tw=o*K7xVktAkh$bAYSa-6CV4`oR5Yq8YpM%$eG@}{tL zP1A3{&q`>wWih+T-*X#e-HnKt>0@%5#3qGyJB7D`%tWE zL64xY2w?Yg;PhZ!zBcHLpsE3fEA+pw_v~bQK$w&LY&jJDVE{QB<)~Uw2YlOBjyp-y z-`BQSmrG{8Yjv<&&bYS}jl#vfIC6JVRP3(KY<>TXfe&aOfXj%Bz>~Nny{_Uo z^I^|`nO}jT8L)Nx;=*4`mQRgQz5DO=-dW0!GD;-av3Tb)9lQ-r-S$H>*?CE0KcA7S zT!cNC9+O@nhun*oOT)|5iWpiZ~1Ts$VfCr1WVUeZhNM_gz z*iqOfkHGc*z&L~LJtMeSf|LP}MIW|h*}1}1d2jp^dJDMjT^HoSw_5J>79hzMfQ2tm`sa)y#2TM9 zRopE#YYcNYZ4?cI?N5F)=zBrd*N=YhJ2oj^?bTm+*`3+VnU6znelR+?zRK7inD307 zUs@_pUa-CTIXBg7O406ND;SfIK%=ANB_b?TJGK;fUN6gf5JemIb2NxpEA<5uHPd$> zdGUi2FdFPnx9t2p>2;&Vq|=7eUhgvR?t2b7A3GXWk!`{W&p-Qs(HIhdXE#yEnqrp4^G3h&0BEY4P@|RtSrXoP$<*UUY z!lxkV+B-$K{jKpDYxsC^*I<${dU(&V*fpNi9`#lvhpnxW%ZAs~kQdqf9)0;Wj-8`b zIO+L=@R#Rb2kS3tv*bMCuO8nO*nD}t3u`QvJ3eB0y-Z5ey`50N#Uv(akX1(|66fLp z_*Fo~YyUC1280S*=MrWLo-Vh^B0J^VO$Nnx>h^B`am+9R}m#oT^Dn4PKmOo9k|AM`oJ~pX7w-B0C=s zmdoF#_i69zP=-J~(iEG#CTGNP>Om`og!0539DfSh0z70$SxlCj{o|w%GGjPU7J7cG zt_uI%6{f%&vjQIDde((Yi;5OQ_I!Bq4tBd@K@;x3qNsfy-NYJm|Le=+7%K_)3ugua zPwrPW(sLtQL!0(0m@r98MYi^>zw9w%Z12x3NhxR?5juS@%uMCbGJYn|u0hfxX#fXD zce*xA>2ZAo+0!78@i&sa9czZ~OUtC+rAZ8Oi>JlDjdn2;6>9hyc_3i%Vl4V_a(XGi za!-MRkA4w72#GQby(fFsbV&YZs4xHF{qBTsY1%ilBr`P)iAD>>fDq8j5+f)0^!12q zTR=J56oQ}``P0Af_wV0JzpvVUyT41qQds<^B%7(v=e~RhKGp=T=Bco`!vW{LY@?np zMLxVUBm0^r6%>{3@j$qm?S~!X{iiS3a+&;FcUZ#dB6-JTa-Xyv0u$NUPXdBPvgJC) zDNO7j)`B{=N8-A6Mgve>rO!m~1br3aqA6s(_5Br|XM0(B{b|DKl# zI$?x%NMP1TuL!#?H8%`~+6=iVajiHJti>n20eoRkg5_TFAZQWBZjPXD-;(A|Ne&iT zqjwmLR5$1%XY3GE%+1HaDQDsR(K|xG)@lp%=mpCl>j)QTCmIJx6LtOEi~YUy3llVh zVH9!AJ1uWq{I-+t3=egTP{$uVW@plVazD>uIMd0g_^rD&MmH-ZFKV238CU2xj529f zQ6Ad+(WAr8?ABDj9WX*nais6gMDC{&Mt!C{hfHg}gkaaQd zKZL|{Q7p+!CWM_ac3kVCFxT$?_QnAHKar<65p=I>L{%ISA-d;C+e7 zL+hgSW{8I+No_4ufJHFWf4QM~!I^=-Fjz^GUe(|0)huPYA!Fl1RlxRR*4M!dkuQaj z&x>4_{L%vh+oVz5B)~%kzIPMFy8eFY27ad{oerx#UwMyqCYG9&?e}4`W>;gop8fl> zo-QlJg8D*_JGJhG+gT>NGLte2r%(2d>YGoiNqX<)+12|8)*$q2`LV9|7NBBi+2Pq zi44%TnwiOweN8b`UA6mK)Z%}sE3X-^XG9|3q^roWp-&aTf7jUU-ZE}@p!`_P1D&`f z3jk<~v#rsrLpQVS{i3PbJF>6wo!q73^uz-$_UDz&u^oq7*9J6tc3L9qRel7YhySjA znx?*n$&V*$ujVhuqg?zA!36k-b}u0UAhl0gr}6~=O(7~tmeo{{O?Z=MDB`2pY63yEHN*nwh6FP_YFYQ5#J99xUo$|Hg9)G&7X3`fYkCpEnRYOx-t7NiXZF^U#)dP4BfF$oA+S z&zdj`7Y9#)$pObrl8e>3o2>9eLyTbiu>D1`l68@|yq z{6-+;i$hlxRq+$S7q99_>+`6FY1R)Tx*<4h&-n>z1%LrMqZcgcqH)pe63}qe0{|+^ zBI&iq?w4SIS}Bp+ohsY?Fpu;v(Q*Qe8(fRnX<9X-Wo{sXFpw>+!0IOL%uCtdH?hq) z5u59e(ZfR=T-KyHj{9Ctu`( zPwvrSE;Ax8P{7tm$y$?w$>C?CN`wQhYe<7pmf`2(ff?)_4F5pv)AI&IQ z-rDO^z?;d?1t9!j=38I`v{I@ktm*j#?s1RV9{w%KTP6*8if^&XX2BVf zn>*xtE9K%-c_x@~9X(A_ae3`04NI>+*~Wj2&DZ%X(d$l^vLH_u z&sg;#&LjO_&6-*Ns6vKKTJFjt2Fbu@8Sf7UYhCTXGJPXhgKRm=ZFa|pKn=A=tbr9b zEIkPY0ps5<$eI%XP(1s)+LnEO$dmUy@Kt%r?}1H6Mcty;K~{dFh(8%?RGZx<9(`$~ z$+stFOMC53%s?D+A*anP+24hKO0Bv$K!N@~xuqs6Zzza0Etf>UYcAtkhRfl6c2=w$ zkEV;~`j(uhz8qw|@i7HH0dVVfdvz>&G0}~}1zwjK3Cl2iE#Lm)Kg&BQw?aPEpTt|F z8~=2);lMxY!gf>F&XHgJ6L(Q>LvDEdjdxj=qol-L2C#C5K*;~^OY0U-q} z&++Oy`X;2$=O^C;ae~^y}Ol$d2$C2WK{A9z;*hO-2y}G}|Dy=?QX6 zDHYt^_h2LXNHy$-6_vk^#d&g{J{_8N7_tX1yB1mm6kgbVO`~I{8uS zedBdG8VFEq(DpG~1oWTKnIeAcqVcG40d8T%pLv8=?f;@L9#3DJoch%iX`RNl~|dNHCEEMK~{(gbY(zId6thPci* z$XaN@{Qbs7d$jZWr=-&mrh_hFd{tD-5;9SxfUI|6WD@sy8hDCjE@-%z(!2hnR&A78 z+%jc(``XNCXScZgS0X)}cXF>R*DmQgka5Xb#X!+35TrHxzJHWxAW~wKx;b2NrF@^) zo8t80!C_Nx`%L$JTcOh~s;xER8QhuI*3oK_xDb+0Vz^Im>6~!rkS`u0=x?+EoX1Ot z$v}#}KyI=bY%l5TK%I9q(`BAX@#)IkdE&b5k}pX)NN(b~-R;TjVuVa#A!{$^N*eW$ zuz<-R>x)_LeRXxBl1dI_=AS2Aj7Eq&kVQsk8yqt>tDneJP-fhqMHZUgb!-3SB$QxW&M_`FdXq`83jE9(>g#{Kv3#bdQ*sf7+t6In(PG{DXg`@akylfC zGv`FWm^s9;My|b+el^OQgV{(2( zR@f?5isg?3Qp#YT>tp0d99$6KdpujgyVKS?lW32<5os+($xR|X$o%Y}Y#k&780Pfn z3n{{MqbVe5$HXV@dz6{)4T%U0Z|8YvhjLe+e$%Cy$52q;Z9jMg8^ZbFcZBh7uGX;u zm6697F!oma(CjANV<;T6r7Szw;t#-nRt3Y&HNDu|9k#qBEA zq3<`XzNp}f+?!^^Y%1|;m?xV9`03;~A4 znBgIeU0a0RZ;yNJSpv^SKiuLZLI74LS1aeI}!7 zCq&WUQH3(rI0B+I6!EP`0F;mEqZsWcQ^Dk8!5V>*>fD6q|0O2)t=M7U-Qj}0RvZ9; zp4DxdC!2kL$ccG_3SqgmAiG4)h_)Voedh>j=?T0oB1qJMf(yKxsq<(E>WrHOn zR^rze)o1m*?J(86noiu}ii)DXcy@mvI}7x(EN4`lnIAKy+T$hzV|#RdW->YVXw~GE z>##ffHQ#})V&pC(T=LzNZ@wmJFRleZClYCw^?_kfa?|L$7YKR-#PPR95wP{+9UUkJ z>vmLT)y8t33lrG902kYkE^qrg_MP&M9B8JQNS$)A1aVF`uiAWWXt?>O^}%1VQ+sZ{ z)pg)-7gLptq54*!vg6(F-PaSK(_@@B#ut&1{N0Nt4fn3OQKt!9GY9gZtuH9{z5HWg z9RW2rv~5?4Pfqo3QtUJ7+fX|{tnvM_%>GHie0GEInJW`{jAo`8B6^_o&Y1s{s+`v2ppss-&?Fe3u#=&K@n?&Dv>3y^n zpzftML|?>@*~gt1kVSv6mrc=EzJczzS}g}t@$IEAvBh33GY(2F)5FSVet#k+zPg;s zkq_;GumR2IQ^u6s<3-xCh1uE5wqm1|i1u3tlhT%eYqO_=4h{pCOa9RtgK74%@eWTn zd`q6;e{x~@bBEqN;P)s;8tcNAGRPSa+vHC5-uR~9RPa|26ab8PP_m5!wS*Ka;G=i+ z`j>sR=v9o4c^?=-sM7@;&7G2u#Mxt1n?#*!-%`aCok$wB-?++T#^p#@Z49Nym%djP z*yv>lqYy`bb%KY&WF z{W*?#T@R(G2iI!q>R)=Dq5Q=LI5>fpkQv?|2UYItY7DY4srxiEe(e(}Ih`9`+IvM3 zBHPJdsBS?qdm+jsMYEe(n!TBB;*eCTS~C|ze7Z{CwT6p4y4aZfVW4ek;l#tm^@Zt<9~& zY7SE|=96V;=tT$EVu{~2ttkoa7FLB z)^3&9J4~ZU4{Yz2pHp0BfeM#tHt3R0>%~_$nl~(g9{q_t^$4iB=6Qg$rqw0!>HNbj zp9Pxq_ZlLiqHVqC%b)z#J-|8sb3os~z}|V`r`tuPWhe6**&9M7s#i*8g?Eu~Q^3=& zWRMK<*c>`%Xy*EWD=~L4@c%$qTYaueC_g0nS%{bMm8!D25A&e(IXDWUGjDZTL2spb z|Gvr}LY3R7C5h41!wu|P9_W2cq}A(8{wHS_Ux*z>skBEAJ}^EYZPvW~00T@R%? zpuHe56;F)39`uL<0r}j?WG`O)zy`_{o`uFU%(EU5`4r~l{1e9P5B%#4Z8)i^uR$>R z0PQ~rLZCf&Ioyt#mKGaJ`GEm|PSEp%5w$*5trIvOm;ZH3vuh+&4d^yp`QDdMvCC>~5-;5! z&@ zrQ!n=3Z2B^^sI$Yb0-k15chw-5WR;B`PnPoOKmHi!UeAM8piE;rD6W<3=`^zY~$ImF}7?;iG>@hJ3=KJT-j-=50TkSrI4#0IO zsQL6H{%mMfd#t=}cab8KdFbtE6Y=40ZGvbtOPF_CUV<4P-HWc9%R~113jfN64;n@& z;?pmvXiT_0xMFXqgMI~| zD;T1C7|UOZ_4L_;X84x?(BI?E^)DSAOOnvjv~0t9ui)GxklHhQSa_9JHR{jf==4qo zHR6yv36>Q>?_KQ5BMa1%qHKgr`Q6w4*uffcisy3i90Z|nL4htr&NG!AFtYjrXFceT z5HtA#3(SxcWW&ooipi~dfNb6V@!Zq)r`qoj+O!w|g|7E*yHc5$>w1 zUP|^~l?Yr(wGlOt(m9`Q3|=tI!UGk5X)2=R=~PeBulkQPZs*l#3_smHOOx{4(h&pQ zh4j(Az=Ouk&vyq+T)4TpO^i%T0&L{v<)OsDDj|WzB1<8V3AXH@e5^zv`YfHBN#MP? zBc5`mdl~HI=7WRM^;MR;%fC#pNlFzQD-*Fs^;;PDDrr*O-iR8Q}n4 z5ewUM0W2ymU)s$z_BI!zuJkB#SW^=gGW^4W)MD-;CDsTKMAkXGf5aI0(#Bf{Hle=6YSqT3_Z&L7|x~s0uX&1(gSP42+kPM~TKr zA*x6K12Z+jXvvUN5gZ^j@LX2MWCA~!4;aylVPqNcz@!v3Q_;&Bh7OB>PHH&fg%P%2 z%<>iCfsuD>2f^^~8g*+p?Z(>ZiZj|8Z2p4Q`l$AYOyB4*=}qhBdrmiLm!XTiQL=n3 z5TKR|_fe*H;$3!d9UK^NPVZa8f!+kE!JDGbSH8R<0qE~qR$LqVrnfK3Zrk?<9K;@0Q>Aa@OG_w1?yJs>y()I`8ET)^aDUG%)tQ6HF70#UXJ22Sn5xmxtAjvQqjP*-0>FYNNA?Iz z$3hv7LZQl5yd3rfot}5-l0MfDO4>1dHds&r<-9 zDl-h}&@e}6Q5}$b0M|&L^6l}Wd8gz6l8R9Y5X7(PhegiiX8MOOyl5U(JUc3jTSJMB z)PBdFQFguE&w*sX&lH3JaTNsAw&t_)eh+FD8Z;DJHMU1Owe;o5#6oXzJ%&B(v>W)_h4I?OLf9h5a$`C=NVo>;DSxS8^lXz90m5o(Z2<*Ba#5(+uIgh z->ANS4miB%^P8on3${*nNeE6Sc*ZuL1!Za;*LOR&OAd?47b1|idGrER6aKOj?H0pW z;&VA^U@q;uGf{HRax>G*ngL-3_!QqYANO#>O2)4LN77XWMENxF=k9=`yYpyJkdqF9 zBL$^V1e6jaML<&W4x|KWq#Ft85((i1q@=r~ySwAPzwf8}bkD@j&TnRSX7*^UY>lS3 zC9KlWNXqMUTizO|3~^SGf`EV| zFo|i4xa8?&k#%?RQlSq&kSW0k#GsI;1RbIDWG4|4gq8d9?IW&?n})!Fo$rN>U=Afo}uZho|-b8UVU7kIplrysk&Dnz^D3{ zre8LlAe;n~vi!VQO>w>6#(p<66Z068hw=GFCg-Pn;*-0eK}gq&m4wIop9JTYiJKOJ z7`_~Zt<-P2FrJDur(zQU1aIxT2+#zdsA1ZuTPzU#rrveS`h0)EEe;WBt2PPnrdQoh z3g9-r=FRVpQg^DI$cF$OGamfvGVdS!rUirv^SaOpJy0IkKcCQJ z702ZJhrhP5Pv8YIq4nt^B-LXv^wbamtmn7-$8ho(B1@SD#$m`cWgDJwVg@10@HCcE z=W3}@SQ-}A(L`5*cl!}Y1w_CAa7E;szpIbnVsaAxJ-*9YlqazcQTYZ^+%Ei693m8- zgoBl|2BThF(Cpr~Z8kz78sWjkp#e5K-Ct*3-YGZe6}zPdWWV{rg?9FrQa0loWLZL+T76FMCByM#FQXbH2-|m&#hTn=^3IGcrqe2mps9xox;MCZ#hmr`{)=hns|__oamGb!LOuWA zR+UP%!7|c0n$Rhh8!olOtyg|zzOZB0eH=zVQ%`uaw0X^atiPxyVRzSSvL^lGQ{6XZ z?*_A#pxe;(_%YKH+4?tssMqg(y+$wTL-f&1Ir>o=^sg}|DsJo8#BvkUrd-z#V6Y3& z6bmdFC@6a_&iaU3{;>yhqL7EiLvv4m7jEgD?tTWAF6}g^W;&u{=Dqai6i-S6J2&0j zdetOAPC3$To@RhpF6!eA`SUxDE4(IOl4{$s#5gVH5dK^{bDW)V1 zsJz+ZmIQHH!3MrK$x87XBnpVY+w6%leQdGqU!BSD*PXFWRlTjr;Z@}a#OU|W1!Sk$ zcQ|~MdPKU`xBhth#wrSpEM1+@`bkef`-$6wm!U@ru%?^S>GXlvvjBtzpzk^7bLNvA zS@tGtUJJv_IM%`2rX@GGd~rleU}%NX+D1we3ne;X}QqLp)SXd-{lR) z=4rc72_uz11*x7`Xal?~c~;zd=BOSvmWK-WaS1?A+)SnV=;GAvb?;gK2@w~sm8tbUKf?z>gzFWJ)eNBj$L{yvV9&8pCU3D5hx;5PCpx-+> z9@g}#gBy~{LriBq_kKZHt{>ff|CI1|Wo6|v1Rt0OEJTWtEZ$hn%Vc6Rj;)#(=JBDe z3d$0ykYBBRehM+HxW^QjxCrqWYGHyvK;-<$)9KPk?bNuj;pn68$Fii7SM_B-N^D8+ zTtu@#YH9M$GM?<8UjyZ$FSM)kCN1Z!M|f}-)m7hxgZ3k0xuZWMq9{K2ys%ad*X_nacEC}L? zb&3y^+h=qMJns|`j$xQDuq&-wec+42FNDIFT`GJKT3M0ei?~-}L|{Rfd;l`D2@hP@ zzI4X9khXsfKuD2@)r4V|W+9h8X!9oV5V!l~+ptOlop6Z*{bY{|?|Upl>1@4(aXU>e z@uH6BQze%<%2x(0+q-^2{tJx(XCiM9QD^T_I%c=2C{IHnOHBH`vQ0QuVJlMNw@vrW zxR%WL83SzUrTNIr2&R$U{&-zecC64X$|3T5VEc0;BYQtDI7wnov+CNt5YypVUm`$o zkT9J=O+XYA*<{>Z=a=-Vu!s&XgMbG2J>yE#U;Ylx8GexoJH=!pECuZ4FM#%xyhWfS3M zK@d-}S{KQvGeNth*Xw_DsBT=zHPA2K!gf z4-T4&cZ6^=F8}D<1u|JO7hX(*E5dwfDOz1TejqM<>1(KAMaGr337NlW60Y?uFMZ~-qI{3G95U3@P z<&v7{9&h$xx7jmzZff@L03KuU5ZtPX!y3`%n{<0}EZMJHBGn>L)dQka;%1|^Dr;VL z1eY+8@$eM`2Z12uonxyw!4i=jx%x$hJ=nxdO$n=q| znh1e6_3hBCCip~!yJN;;%+Ymx;WKz0dfI2CxRo1s!qioQVB79;)OMh6QCR zm_W1{;COqH?y=f29+7O8mwVS2*xk&pl#?DD)zVPv;>+%J=f=(7k+fUp%CT6trf@C5_s3srZ0aEQ%`L%{oRebD2X{=YNOUlJZI^XK zFl|vuqn~bu0H=ed+01eTr0PIVnChdiwq;{DZ5*U5{$oJT1+=vq6#&9b_cND}uBl5u z?1-#Lv(w(?sMx$`JNrWEs&*&$bJ5s`o~@TVUsyz|{dH!c*mEFSK73mZ%GbsU4;v*r z&PY`11lDRRKMB%HzX21`iza3V;1|X>AM|~mwjQ?I8|uy1%o19S*xKXLP&M0Zay!Nw z-r{XM7B(hNr;KL_Cklpdk|JpoF_=pb5xPvXiV3slYVD`LU#%pV+)|$HoSi3qKU^9m zDuBZd0sR#L3$7AI(YF&D6kKXQ7}mM#j;6>8YCudB@z{O=OA0}R6}5u{i!jP71MV4X zB3KW{fJRGz96S1@&z`2{@RvrNd-nxczm?>iextX2O=LRPCtd9`U5Yh5%a#;30|L)Q zh|Ru;Fi_UlDmvK>mD7be%{2$j*7DrvP6>*nS6+#yqFf+ubT=WgH>r)cBxF&%b6rxs z`PH} zpIkE~9ErH^|AbNl-si0>%Dm;?@1o3vEPH;$?OZsZv>!(>s$yj81%z>FpAYB&3PbEp zj6@-?A;qWy0z+j60H3|DC9x*x1PV{&j5r!0&uD zI>#L*J*xr6eU9+5ug&Q%b#i4c%O|!M#}Rc-sqA!RY&X9zc!i!59HpGfj_ozy$;fvd ztfhOslQ~;j@!owWV=S8~2-^Fx6tSMCo^nWA5~P+aydgh^v#WeU)pqVGnkfphfPXG{ zLeBLo+d0>X*^bIBpi|s-5Etv&vUw;AI-GQ!N3PNd8&cwoZ$I~3slnjWlZA+ZejB>0 zT&dbI%H@vobo0Pt;`_^S%LX`?f~PK)zb}Mc9L@a1%)nn?dsm#ezK(Re3}t!J?XG(9 zj!!25!TlfzrBRU!Hv7X8!fp zd}h8yxWH+{>GmHr>1`X_hDZx!7aLJ=2MDRvZz7ZV>Zu*ploY{GQowsAX`yJ@01b~FlrSyhqmk(9 zal4YKrx|39q;hNl&Wie~%J(kGE`=Uli*wDhHi7ZX30m!ds3fEsrbYvri4La~v8D7j zzi;e)@cR!fp_@kfqq=t(zh{pL&f(l>2+5X`H5wWkmJXfEweTQw00U^xh6iPU zhuCd6Llmr?*{wV+#Z$ka@(RCHd02EzUVQr8`FN19v<46|%ml#Hwyb6=djo_IO+!6940jP%+vf?*)hOeLCBg}J|YJIE0{4@ARmMn z@*PBGgRD=UAQ7pohMrpofc4wlkrv^BBm*#(=OXsSddrMuAF?hnPj2E-kWFvqoyt?s z-gU0l;J}mPrc{EM+pnWOT|=?A(9p;xf+1D8Z1v6?CDPEg@t#PLQoA6aB18g|K_d+0 zjgOU?_(`OUKiAFIu$S4X9wzp9hct!&-?g)+YaRMu=ce?j9eTY(+wfF;ZU<8&8zTGg zDOYI<1=62i0G?Q^Dt3@>j@d?y6a|G8B0Vz@5Lg`rPA=ujJc3rs{(7gFu;H2=J&v|P ztc&0mF}@Wnx0y>x_u;PyT=pVRu#JE9BG(@tAT0o?Q){OIvHKv3Zam2l15SPhIkF0u z>>|tn`f2#pj;G$$ntHNuA+^vuqYo?b5C_kFD2q3|MF53|XwUk@E97`z)`fY5BW@6E z&bITS5~41P^mwLDgn%G%!1mOgFjlkoiP#8@l4QIi0@`(wd?|k$dTUaZmHR4RY!Y!k zLh>!Xwur=XSM9ZOG=JQ;u-D5RiV!!7q8{!rTV_rj63=tK`#mdWmDt{7=}C9Zk%?>` zb!$cf2%H;oAKGN0IcI5;`@#JgeUC;QF_APoo|$PMapT*`%JBI6FZ2WhN>o#-jad7l?LmJI!wsy>K)*o1={B_5z;y*^o}m^goxDQk*jb8MvgGC1f{^Jo(C zP|Z@7G{4qOBTPtZ+i&<3ia_YI?J14;-Cq5^_Tm+~3y+D3$&+wittMHYL`4%m)77mC zG_e$s-B*Os(`zS;j|t_3Sd0Otw%~KP8Ow8e<6O~FNIx$oI#@Qx2h zaUQ!OD42qnSoMgCbifh`Z!&J#me6HD1f%j$k)if*Ntt9MGW;RpF)#!U8F+Zy_Iauz zr^EBl56JMW5ZyE*s^Bd4f(W%{IGM$jltW14EUL-djz0FraxnGe6sAAeeDpLb-0{ZPR7#tFvO&OSOTi}M z4HfPd=x=|L{9tRoi_=$}|X;ja0Uxo3S+N3W{6r}}71k4chkfb9wNr(XR+Y1N$zh@uL zYQ~MFepo_Rl{>*Xj;&)AH%3V1U;zY15^-Z%mM1*`Z)yRZNeak}GpXm{G+fA$Wk$1| zdY)czNJ|*B9oCga5s|ABswd%U{G;!5Xn{otr&y})uXyQZq8h=vH8Q5_JT1wRZ`2{r zV0dz)zQ;Ls^2jXHw0-Bq=|;@bqW#%c4F^rbEF*bo>yIDIA0tK>;tqIP5?j_QJ42*Z zXQK;Z5`n@)<#OWK%gXi}&LYw)j|azMxG*H)GrzZG`W4yfSFf9{jG=4W=u&&xyP7fU4^bAC)y}p<1@A67lVIVV;Dcp>Va56!oNN8~RETZL; z*(#DQLYPS}Evr27`^E`z?EdA4W$(i6;yLZaXR{9t5}!XkD!(MQq*Rtizb0SDjr`sf z*d^ke%znb5OLYSRkV^PpHeZnq_p@hN^IyDq*%IpU03b;wEz>FXUk~gIG8kc%$ zKYB5bR6(Bd%QlKH9{!gkQa{8V5I0raP?H2>>e6VU)I@_A>=FSLL`#j*-yxAPmvp(r zC2cFV&B87V#cUT_rtIzYq@I~0iv!yYm8mMG_BgZf396drqP0Mjd?E|mw!}xd)@yb) z?HXr|qBFytgsVR%oV_neK;um*5%Nx}FeWok>3T}bdxv>;>*BbppG}U)Pc~C2D(^sX3nD12Z^?@mUBCuFOLy8DM$texll15EFE2n-b`Swxm z+oj6^z>%b?z5YQh-&J8dTSyN4ZTo8wR#K;8HID91g5#H@fOr0ZbZa;pXZYsb7NT_< zxm)iar$Zz9C7^on547)1Hvk4Axr=i`iHPfC2D;)kC^Z8qXv-ETPm4bXVMIE-`<_2e3@> z0W6CqF{hzSCl_O+#3TKpM6Tg^nIF_RY*})gOWm(N*11Y>5fNYNPo!eywW>-6HRe-B zl5%KT(xmj4o%Oa+UwAo3+u7iUX}Pq`n^{D-;}ZA;?F4f^4P1H3;rwaytrTO2d(_#G znuD@kHTofEL)UqB=~mr+VPL)ib&*wl+ABw3#0ruhg`!crl7evaiA4YYbMxbYCq5Z`$?JCO_r8r zh$V)_XD5)xSS6AEIx2-p|CwpyBQ6~5;V?}^s=tmL)n_OvGA%dkqYCGjaz*l=fIa{Q zXeu^NyzN%MvfBRvu75b3sN@~ z3W?&A-ybzwK6@D4Wv|=AVAh!ocAr@OJLPR2(&lkgH=V1e8LQ-&g6800gI4%$7 za(c)RfshvwbRoB;rPo3t+My~|BWaW$=c1eeA%vDVA)scD#sc#h*4yEXPodlhxr*dM ztjO15B)-PsfU9hyH>_|8WCMweH+fdXdr*mQ=fZVV7~Cl@qLg;?32Ksc(K)><_4Vp% zT;pNyWPkFDT=eK1=TT=y+CW)pDSJpPMHGs-fRN*kxtu%OHKEJ2++2dA*6GM4ho2{3 z_|MzCCATf1${4JNtI>WZX9EKuB!-FZ4!Kr2=ctRZmLW|MU_KcD0MzN`mX_%~XqI|vg=pl6en2Rou6ES{NCMr_`AneIy{2Q$#g^&T% zKr=6eYKgDD9+Ih0!su{a+KxRKqi0Ba zuVa=3ZuuJ7S8?MO+BYUq2GU@*7FMu5u$HAgfY>K8CDZ(Ns{#P$qyt)($%Wr#K|G6u zgu_5fHHd<+dWU88Vy_dAXS!ar@c~uI(r}j=p3!e{HHv|QqjFAz8gunk_;dt-sb%6C zPA(ieOzCTj!!tYn?%iJsZ(>d{o4U(0@3%NDHz!pF06ghr7|cGzH#D2|ywq^h9F>nL z=DeY&N2+~*u8LXVJ?SUjUR_-Z{52AD4{t*Nvp+y|^}L}}yU2+B~D_Z{Tzv-+@2XePECsR1GrG|2)!)?!ah7tPz2z!b_9^# z@Ysu9H8i{zof`3o4=eErd(;{!>3}ILY@(}h`}*1Q&>jvdv(vr^*fvkKt-pLF%D}R_ zYK(mU!Kygn#VHt^R&%6o5}*MhHh*W7{?x%vSM7;YXr!v0riZ{WJE7>XFJY+Kf^_C) zz(!4Xq{ICx$d*mZP!)t5!y6$^gX*Us6%-B#RB$4>^hAxoE6yD zkaOa9-i_G6TbFGUJ0LHh-{RJSVE6Maq=qS%z#C>q6&~p}{DF;pj>d}RG96d=m`?n1 z!0-26Y&z4A*eXcQLo{yGW=thsI}}j)>te5KXGMRjF~rBIgLKYC6rN&#RQ0VAFO=Xy z7b_PB7ji*Bj{?pGTM!6`5LOhwhEk5TFLAe0iRT59k!$76QN?uQTFPJGb317W}EhmQUJMS&~V| znN-aAlp=B@SOBjd>7(MEm@dh#S#+g8zaFd9;wAp#+x5Ix9)>5>Bk)w`C6~cAU_tGV%(NB}Wbj@H5!PW38#WeDK8Ai`gWF#FO`Ur8-Q5#gq zQ*~-v*7!h!olw9I&n(->%<>73khGK|Nk4J;7FrD1{-vEN^j;V|A!&uP9~LVv?>sOx z$H-i~ROe|@Io30X;^JAKQ)DN#9H&Pnf^^v7e6w>@8Hh@_si1SFklNhyQCYQ}@e7d7 zrTW`9JGjaW!STk!-dd(8z)%tMI_f1S@2 z1z`a_(Seqj!8s&PfhVFIFKA_xa0a3~WDR5xf_Wr=RuUGO3?ZbXfbK#qyutYUn^&P< zE-Onon{3Wf4EzL-UupIg3hk>&ncy6Td=u~sXu?{9-HKvV!qP_^9uX4cAFD;N??=+5b-S=|VyKs@u*t>><~ zX#M18-5y{YAxa%JF2dY{GPP8ElHThA{^##euJxB9bWxSej-oxg=DWNRhpKj2Tl+VoHnKc^z1f z^E3D3W-eO^QQ}osHl(W^_v0IAw`4p7KKbL?!uYm4tHCVE>$Pr}AwRaD(v8?tufPki z;@|eOnD<92_0dBw^HjO+HESG=i8kq7IjP-Jf7JF3Vg70b)c|3}D_B95AsUJBUsZ$E zLMkMkctS)jwA$X(hrcQ!Bak5!_mKI;tD8s z!&K!L=AU9Vh6E{Xc@;##&>Xjda)q?36uOv5A#MwY-)BfF%m?G*PIk_`LpVk&F4jib zrgP&^gb27>8%QZDcWE!}XsnmV(g83?|w%qMlHns4w^G zzr3s*d~M0W9{=srn!*I`_f!k^78fM11s8S~n|AawcEZ>dyu?*`!4A{MGRTO=t5rS~ zvx-{_1vjM|ns}3^e${jwl9!=y$tF%(tzcA*xk&gyD}IAD%3p@lwpKB*eBSr<62^ne z0Fo1y&~^uez7a}Ujbi875birJ!40i!94w;*ji<`jL6JoKayXw=RPfe9t2gj*t!=Dt zEhX_=s{!2`&6N!r)8TuLl?Qib2-tz&!;Lm>_V}!o)bfW^Q=$1`mfcguyB5mvE}fcF zkh9?KlC&0#-8F!K|I&Uzi5z&giyH`1l^Vy4vQ8G7a>!&d?8?n&Y^_Qe>PhVwsJ^S2 zViD!26S71I0#R1@VM}%Zd`?O2zH?@5uCMt^*{Y3Z_|sB5)iTc7(v*Cmvo_~4kUWGv z9fV{*p}`>e86y)p#_PTR#5|L&j$PG`>a&5f1vl?4VP0w4#fH7Wl)8xDascMlWfKLFIh|&r*ZmP>YBw z8h$z8!P|1J2@aUy;$%Sv2eyQPjZjr(4D)l|sYthNPROGhcfneusO!G5sYUT`Sr^h? z;+eiR<(0qdrWs6$3^hJ|sS<+$AKXm6Uky^K=VGkv2%d>8FWCn1<`$FP&wJmx7fTZ~eU14jD%)<_?mg2Oua?a?b!#k^nMV_;-Pb zEw0~eyd4A$i%%N&S7*ELZEfo+9SB&s(-<_oqVig@SZH&Tn|$tAQC2rDDwwD*FAvV5 z0jsV{$M)Cezhq=mmd_klIokSGx_gu;w069)SL=7PC3Dj&!bVpAqK->F@Q~;>@%-SG z%x6ajlxe_{aP{@z!lZfuaq7ZF?BL-;*Ln3!;$qU`pmWkU)!6+jO#P#qj~f^Uof9s> z0#AbK#*_&;;;UZsRUXHvuc~J zCBvxfFPxL^w86L?G%wY8E?+$bi35+)`$Z@oKJi%a{KpV>Au(eJYbkN#NU~2In%QB} z86@NR&P4@2zPA|hYlTmW*_E&ThHl|UAtXhzyb#iHxmPFS@rnG2_m#o0*V4!G?S%Ty zWYA#Q-}fb#6g%mP4GaeoM+auVOtn{%18Jc*ucuMK;wB=GxUn6J^aa%S?&j?7^OuG< zHKVBC>4O5b*{kmwE4LE=`}{t&HuQGsg^AC}UZHw6vG;14`|QPwo@@4hoPrXy^9u?g zvKf+&US3zf@4qO$hUSL?hcB2C6ULwXN|kWmooP0eNfUH6)rCg*3tp0i7eWL~n9dJZ z{@nRsrk_N9C~c&K8kvIj;bl#?ms`!UPK#|ON&lphr4@9YUwZ+)y*}!f-QC!@C{s)~ z1p4qoKIA0%T`2*NBbjgVYiB*T>~*1{uJb&gwm)+it>+V84?bqOL3uid9$rP?^-HlJ z*#YMF(0E4{F%Nv?b#E|>?|DBU{ALrKN6c75e$0o_gSV^cuHA90rpyJz@9y#Lisaht z3SGyMEv?oOaJ<1Lke$@x8R%oRL48e(Q!M&V8aEP`^nb$q$jMo{dtlOZ{jkbwM^j+_m@Wxlk+|8&&$#98_l=j_ zm#zqyBWlJ}Z0gcHc-5H_iK5hTXu7cEjejS008E$Zbj@Zm>_gQsv^DBjr z;lne(qh7HLojk!izxm6*aicljSM&o$H1|yzZql9{dVM&j$ZeMJKF7RJBk8*N=AVk! zuYrFI?9-TdJJCHoBi}oD`EGA5UISvR3l6yiO~`cjHYsy{SaQI7^eXfpJs7h5zr_?N zCHB6%y$OC%W_-iaeI>Pc_G*v1BS>%P&g3cBG0fk^#U)NhYjkE??%gG2!`wuz!<>U= zhKvtp8>usi+kz4$_hUBENlz0V+yvG;1#WqFG~A))+>Yi*Cd-uMj^3#wu*KM;f~UKl z+E~8K0hN)N{FXfD7c+VN-y#=}V9Y`fns>tT6VnpO`QYFu+nG;nwZqrdJ3|WO7LFF_ z%FI49{#to4uxR)B^Jj;2O#k}mKgx+eF~(6K>A1R8)_jXPx@{A=YkT8sig~H26s!6H z*1Rgh6Nsmrm{lCZ7iVY7WN@T*)JyzNV9d^0+(f(NK&7Ol${f>Vos;ZR-D9`raw5WO zYHN#5{LGI0O7LLO`s;)<3apITXpNYrZ*=}v{pr#gh8F*EjqyyHMG#$@JortS(`OcJ z-`%ChrE|Xz%(|`Le=WK5Bt^#JHh3IlSAi$qF0vZ0qBM?R+#e=8DzFUIm?r+?{+!o! z{utAY?G?86?yTg_BxGv0b&(NregECfcpyMdW&)7p1o} zfQhsE;P9#X|B3(T`EbM9l)>ZIh5WO97wWacA^U?q{q8diIP*cSVr!in^5h!K;f7#Y z5bb9^#tr5{zW!%p=WcOW-|Hp!1E3^al2THB3%9;mjc-8LZCgK-nj-BY4l{&`MlZ{_ zK|k(>tXi<}g7l6MS3K9|k23S{SlF3cs%;iHss3#?!Mb_44^+`3uZeqjZdP(saMDFGH8dsyr;=MSl~ukF?4qxwb|N7k)m&YvG(mP#WBAQcE7Zl*we7SU=7(AP2E1?1KzplBf!h< zI8L{m1MOTm?VBGYv+!tZ%;_{5& z8#}Nn#ow0WZ+}GqWgKI`)x?W_83XWW`Jw1P4gO|C4PJW|LFVdR?cO^&YH{6>23wp$ z_wTzoJDi2GZ>MCw>n(nqAxpD<$p7O57>RJxtGfnM+A?8(PndXO`~^V}IHlsNiK$uX ztuXI!+n%iAw)uyVCX$bq$90*`cmFmxi#g0Pt{CG?iXjaCs$2Y;>vE%+mTr@qU0_dl z^~ZVZR?>cvf%pC7wsmDT!IBUh@mj4w&=@&JRczM0O3*1b@FebeW)03(0pnxXrzWw-TzeUBwsad}>@-#k|^T!(hA-74?)b(mm`TEE?VT~#G zzytTdj(3r6Z+jZP-{9V??RU+1wssBPB-bijp_(eB&hY=TJ1?V&bx0uWRQx63XUdbB zt*;5jQ=!kb;_Prz|KWgbA;jIytq%inkJw~eDxkSHjGNC{GOV__cAlGL+>m&Ps^2Dk zQrmG&n6yUP2hG=G?d-GArv{m!KPxNDtA>4bZH=TCr3uA)8?okeYyWMB{+%_Li*Ad zIi*(8bIN3^1pSQF9R9$xFVZRiWL(kbywi9;tJYL=Nr0{%6f5_?a>Ep|@PWlS8yzL^ z+`%n>nUBHEn8jfew(g8-T&3y^F0U#rEq%Q=`;#*YG4xMUWUlkVuI9EL9v*5{$2>SS zmxuEt=NpahxBnh}P(O~QaEx<_DgDOLuzL8lteG-O)H#tGJoMU7!-nk3(P9l&T@|he z>*e>%L3g~kggHcP-Tgw9OSH;S$Wzek=t789>wE4yzVYM!H>Z!+pvy^;j(Oj{-Rl*Z zNTtoc776RGIS=LQTp1YFGG;k@FzknXmhNYOLosvY(v*A^2C}Y#o)MaLk|L=8$f61O z5+?hz{xr^eMgRnsj2-w2#?`dIQRlC$#Qs=2L{cs#X{S1s+71NDdF<-<| zf-BcOdKRYXi%z*Z^O@?uAvq#`d|qOBjkg(KcsyO#IWNdqd|LN+H?Zpmwb5? z)-xUs!*-LvvAd31V3rL=_ugAh?39=Be{VpZ9FnW~WovWuQ%XvTE{2@M2+GULYZ&kg zI!s%Z$ZHH0nE&JLx7=|Me68Qqc&=c(QDai_6N9D%L^pWnLYqq&Qtl6a{zsJK<)fY} z+y};u>&iqPsN~05Y;}V7o?!>OcMI+-guW-mVbe0kVr3i9%IO;|&$%Y}s*m*sv!A97 z4GncpPEIhO*T>*$N;KUYtuZ|Hr#d4hAfn^F&y^zex!@5?LCx7b%i)br&9S6t-dOrg ztjkH>q*y~zs#iaD1Q`D)2M6<5MNw?Tf7Id92U>#=bTp_^3nhLVJc#o8F<^F)y zBJts+WNtXV{wGc?e7ZPcVPVQJ(sJ_ul>BZJZ3ATB>{t2t_~@nzF@bI{f;%*=ZeH0m zZ2k!Ygwyv;h>KL%-s{2~MW4alvBB1M$G^0qT3 z7|RtJdKfp2v6Bwm$M){!QG0Yi)_JdB2p7DzgZl+kq4ou|_JwCaU5oFXy*)o>rJp2A z?r#=A=IWfe|Ni}()?PjCc{vPz)L-C`zY?0UTpL-(f|{*4-kgpN;&HxX?Y|r7UvG17;BJ51CZO;nAr!YWE$?qQ#-TSEoGeM1s zP||fu4%DGYk8kAhI&$NR_0`@8d|{Ex&AdChKhFhHsYH&Tgx*>Sujp~rQjY+~Li#`z zBgF*vrOn~+`^D%4p}h*|jsBu)^DM|DuZbJ5w_}S`kz13jL~lBB#PDbhJPsg3?3N=5 z3pi8_aL6Bg)!Dp)STS)_ay6&=CkMTfd!xH0Ffa9fziplm;z}X@fQ{$ODVNY;3N`s+lgdb+I zUXPyGK?YSgkj|98$<=9v;Jg=O03(oN$A5NAZh*^%#Zntasz?~Rjm7?$)T~)2BHoKY z&Vp1WtF2?vI*y9%J?s;s@QK9lJKM|m-LW6DS9z_Q*>MHD(!>3#&=*}aTF^elK($fB z$JM)nfP_M=>b&05biH)({5Y={sY|jW*?*3>2O8q6oK|ZM-BHpDFKvcG=i9=LH{L8p zUNzc{)}1+(UL|@Z&wt3na!WdSKkqclH(ixHb-yKx;0y1_7vBm~tbK1Y5FN(6UD)v} ziI1gGxN@sMRpdS*em}dL!_=Q=K0Ct0^40`TOY>rFWrok$Datn!jG>-VXx5XUD3{Af z-z#h$ZfiP4{J9dQd%gU$`Qp)8ri_MQeDe6vAB$@_2PTW_4`%MlmJP_XPO!udib=0J zEiBjh+Va6zWkcsJ;8}Bcq~HpEbhd-sJ2LZwVUPRKOz@uZ;#zS5>DQ^L9=0nLae_FP zUjxX{VZqju(n`2445=HXU#4qk``Vz^;Hoct1Tukwd)9mq?>?sjbJo!UdA8~2j_ibN z0Ux=+I=>fbS+R;(mmzYUHLwA0_A}N` zShTwnz6zk||2h@1JFaEC55iqX8c!21GdkabYj)$zlHaQBaqQ7* z6XJm%vfr-YK@@^33VG_pl<;2GIW=R|*G0d?&5*_7eI&TX85e9RvF!3LXf1xS)I3Ri zfW~Ih+5V-z930#kxlj2JD@=}o4f<8vA5c`q9D%4>3r6bz37FqRt-|b83TqBTVQH4I z;%D-Y-q%5ZtFpF&J8KzjgtYJVggwNKrcNvYe}a>fQwQzJixm|Lc{NVj8BaeTCQ1uh zc2{{&Bm0CLAH_qdNX;rRgnNO3pU=Ph9l}(oube?*%dBB)US17<2s#Ikzy(y`aw@iY zJ$=FfoMR$FWgtbiu~W)Bdae;yi)iKpb2z}K&ogg|W%^4V1Z4*ZsPV;VLHgxd=wG;K z|3EOYGC<8o>G;1HFl|U!*w8H4z{<@k^H2WXs^7bLHBNK@m(ehIy85}Sb4q9e0Jj`X Am;e9( diff --git a/utils/cd_pult/icons/db-import.png b/utils/cd_pult/icons/db-import.png deleted file mode 100644 index 85bc12150113ef00ead53e8d7ce9d6bd29766382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32628 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

;L|6r4RSE-sF3Rh%wo#tl~R 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 -#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(); -}