From 1f71f140eb25239e5dee7936d9d7f926eab85084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Fri, 22 Jul 2016 20:13:49 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@104 a8b55f48-bf90-11e4-a774-851b48703e85 --- cd_utils/cdutils_k_parser.cpp | 3 + cd_utils/pult/CMakeLists.txt | 61 + cd_utils/pult/cd_pult.conf | 0 cd_utils/pult/cd_pult.cpp | 541 +++++++ cd_utils/pult/cd_pult.h | 121 ++ cd_utils/pult/cd_pult.qrc | 40 + cd_utils/pult/cd_pult.ui | 1262 +++++++++++++++++ .../pult/icons/accessories-calculator.png | Bin 0 -> 1525 bytes cd_utils/pult/icons/alpha.png | Bin 0 -> 158 bytes cd_utils/pult/icons/application-exit.png | Bin 0 -> 1134 bytes cd_utils/pult/icons/archive-extract.png | Bin 0 -> 1005 bytes cd_utils/pult/icons/configure.png | Bin 0 -> 717 bytes cd_utils/pult/icons/dialog-close.png | Bin 0 -> 813 bytes cd_utils/pult/icons/document-export.png | Bin 0 -> 1106 bytes cd_utils/pult/icons/document-import.png | Bin 0 -> 1017 bytes cd_utils/pult/icons/document-open.png | Bin 0 -> 1798 bytes cd_utils/pult/icons/document-save-.png | Bin 0 -> 1263 bytes cd_utils/pult/icons/document-save.png | Bin 0 -> 563 bytes cd_utils/pult/icons/edit-clear-.png | Bin 0 -> 2066 bytes .../pult/icons/edit-clear-locationbar-rtl.png | Bin 0 -> 644 bytes cd_utils/pult/icons/edit-clear.png | Bin 0 -> 802 bytes cd_utils/pult/icons/edit-copy.png | Bin 0 -> 485 bytes cd_utils/pult/icons/edit-delete.png | Bin 0 -> 640 bytes cd_utils/pult/icons/edit-find-.png | Bin 0 -> 1631 bytes cd_utils/pult/icons/edit-find.png | Bin 0 -> 634 bytes cd_utils/pult/icons/edit-guides.png | Bin 0 -> 544 bytes cd_utils/pult/icons/edit-paste.png | Bin 0 -> 529 bytes cd_utils/pult/icons/expand_s_x.png | Bin 0 -> 571 bytes cd_utils/pult/icons/expand_s_y.png | Bin 0 -> 577 bytes cd_utils/pult/icons/expand_x.png | Bin 0 -> 579 bytes cd_utils/pult/icons/expand_y.png | Bin 0 -> 577 bytes cd_utils/pult/icons/item-add.png | Bin 0 -> 639 bytes cd_utils/pult/icons/item.png | Bin 0 -> 448 bytes cd_utils/pult/icons/layer-visible-off.png | Bin 0 -> 1766 bytes cd_utils/pult/icons/layer-visible-on.png | Bin 0 -> 2001 bytes cd_utils/pult/icons/list-add.png | Bin 0 -> 564 bytes cd_utils/pult/icons/media-playback-pause.png | Bin 0 -> 1145 bytes cd_utils/pult/icons/media-playback-stop.png | Bin 0 -> 1165 bytes cd_utils/pult/icons/media-record.png | Bin 0 -> 1843 bytes cd_utils/pult/icons/node-add.png | Bin 0 -> 694 bytes cd_utils/pult/icons/node.png | Bin 0 -> 658 bytes cd_utils/pult/icons/view-grid.png | Bin 0 -> 691 bytes cd_utils/pult/icons/view-refresh.png | Bin 0 -> 2182 bytes cd_utils/pult/icons/zoom-fit-best.png | Bin 0 -> 539 bytes cd_utils/pult/icons/zoom-fit-height.png | Bin 0 -> 929 bytes cd_utils/pult/main.cpp | 10 + 46 files changed, 2038 insertions(+) create mode 100644 cd_utils/pult/CMakeLists.txt create mode 100644 cd_utils/pult/cd_pult.conf create mode 100644 cd_utils/pult/cd_pult.cpp create mode 100644 cd_utils/pult/cd_pult.h create mode 100644 cd_utils/pult/cd_pult.qrc create mode 100644 cd_utils/pult/cd_pult.ui create mode 100644 cd_utils/pult/icons/accessories-calculator.png create mode 100644 cd_utils/pult/icons/alpha.png create mode 100644 cd_utils/pult/icons/application-exit.png create mode 100644 cd_utils/pult/icons/archive-extract.png create mode 100644 cd_utils/pult/icons/configure.png create mode 100644 cd_utils/pult/icons/dialog-close.png create mode 100644 cd_utils/pult/icons/document-export.png create mode 100644 cd_utils/pult/icons/document-import.png create mode 100644 cd_utils/pult/icons/document-open.png create mode 100644 cd_utils/pult/icons/document-save-.png create mode 100644 cd_utils/pult/icons/document-save.png create mode 100644 cd_utils/pult/icons/edit-clear-.png create mode 100644 cd_utils/pult/icons/edit-clear-locationbar-rtl.png create mode 100644 cd_utils/pult/icons/edit-clear.png create mode 100644 cd_utils/pult/icons/edit-copy.png create mode 100644 cd_utils/pult/icons/edit-delete.png create mode 100644 cd_utils/pult/icons/edit-find-.png create mode 100644 cd_utils/pult/icons/edit-find.png create mode 100644 cd_utils/pult/icons/edit-guides.png create mode 100644 cd_utils/pult/icons/edit-paste.png create mode 100644 cd_utils/pult/icons/expand_s_x.png create mode 100644 cd_utils/pult/icons/expand_s_y.png create mode 100644 cd_utils/pult/icons/expand_x.png create mode 100644 cd_utils/pult/icons/expand_y.png create mode 100644 cd_utils/pult/icons/item-add.png create mode 100644 cd_utils/pult/icons/item.png create mode 100644 cd_utils/pult/icons/layer-visible-off.png create mode 100644 cd_utils/pult/icons/layer-visible-on.png create mode 100644 cd_utils/pult/icons/list-add.png create mode 100644 cd_utils/pult/icons/media-playback-pause.png create mode 100644 cd_utils/pult/icons/media-playback-stop.png create mode 100644 cd_utils/pult/icons/media-record.png create mode 100644 cd_utils/pult/icons/node-add.png create mode 100644 cd_utils/pult/icons/node.png create mode 100644 cd_utils/pult/icons/view-grid.png create mode 100644 cd_utils/pult/icons/view-refresh.png create mode 100644 cd_utils/pult/icons/zoom-fit-best.png create mode 100644 cd_utils/pult/icons/zoom-fit-height.png create mode 100644 cd_utils/pult/main.cpp diff --git a/cd_utils/cdutils_k_parser.cpp b/cd_utils/cdutils_k_parser.cpp index df306f2..609c003 100644 --- a/cd_utils/cdutils_k_parser.cpp +++ b/cd_utils/cdutils_k_parser.cpp @@ -122,11 +122,14 @@ KSection KParser::parse(PIIODevice * d) { //piCout << "insert" << alias << iarr; int aval = enum_values.value(alias); KSection is = sections.value(iarr.take_front()), ts; + int ibpos = is.name.size_s(); piForeachRC (PIString & a, iarr) { PIVector evals = enumValues(a, sections); //piCout << a << evals; piForeachC (int e, evals) ts.section(e) = is; + ts.name = is.name; + ts.name.insert(ibpos, PIString("[") << evals.size_s() << "]"); is = ts; ts = KSection(); } diff --git a/cd_utils/pult/CMakeLists.txt b/cd_utils/pult/CMakeLists.txt new file mode 100644 index 0000000..3a05de5 --- /dev/null +++ b/cd_utils/pult/CMakeLists.txt @@ -0,0 +1,61 @@ +project(cd_pult) +cmake_minimum_required(VERSION 2.6) +if (NOT LIBPROJECT) + find_package(PIP REQUIRED) +endif () +if (MINGW) + find_package(MinGW REQUIRED) +endif() +find_package(Qt4 REQUIRED) +find_package(OpenGL REQUIRED) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${PIP_INCLUDES} ${QT_INCLUDES}) +add_definitions(-DCDPULT) +file(GLOB CPPS "*.cpp") +file(GLOB MOCS "*.h") +file(GLOB UIS "*.ui") +file(GLOB RES "*.qrc") +qt4_wrap_cpp(CMOCS ${MOCS} OPTIONS -nw) +qt4_wrap_ui(CUIS ${UIS}) +qt4_add_resources(RESS ${RES}) +add_executable(${PROJECT_NAME} ${CPPS} ${CMOCS} ${CUIS} ${RESS} ${MOCS}) +set(LIBS ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${OPENGL_LIBRARIES} ${PIP_LIBRARY} qad_graphic qad_utils qad_widgets) +target_link_libraries(${PROJECT_NAME} ${LIBS} cd_utils) + +# if (NOT DEFINED ENV{QNX_HOST}) + # if (PULT) + # find_package(Qt4 REQUIRED) + # find_package(OpenGL REQUIRED) + # include_directories(${QT_INCLUDES}) + # set(CPPS "kx_pult.cpp" "kx_pult.h" "kx_pult.ui" "main_kx_pult.cpp") + # set(MOCS "kx_pult.h") + # file(GLOB UIS "*.ui") + # file(GLOB RES "*.qrc") + # qt4_wrap_cpp(CMOCS ${MOCS} OPTIONS -nw) + # qt4_wrap_ui(CUIS ${UIS}) + # qt4_add_resources(RESS ${RES}) + # add_executable(${KX_PULT_NAME} WIN32 ${CPPS} ${CMOCS} ${CUIS} ${RESS} ${MOCS}) + # set(LIBS ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${OPENGL_LIBRARIES} ${PIP_LIBRARY} qad_graphic qad_utils qad_widgets) + # target_link_libraries(${KX_PULT_NAME} ${LIBS} ${PROJECT_NAME}) + # endif () +# endif () +# if (LIB) + # if (WIN32) + # set(CMAKE_INSTALL_PREFIX ${MINGW_DIR}) + # install(FILES ${HDRS_UTILS} DESTINATION ${MINGW_INCLUDE}) + # install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_LIB}) + # install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_BIN}) + # else () + # set(CMAKE_INSTALL_PREFIX /usr) + # install(FILES ${HDRS_UTILS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include) + # install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) + # endif () + # message(STATUS "Install to system \"${CMAKE_INSTALL_PREFIX}\"") +# else () + # install(TARGETS ${PROJECT_NAME} DESTINATION bin) + # message(STATUS "Install to local \"bin\"") +# endif () +# if (NOT DEFINED ENV{QNX_HOST}) + # if (KX_PULT) + # install(TARGETS ${KX_PULT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + # endif () +# endif () diff --git a/cd_utils/pult/cd_pult.conf b/cd_utils/pult/cd_pult.conf new file mode 100644 index 0000000..e69de29 diff --git a/cd_utils/pult/cd_pult.cpp b/cd_utils/pult/cd_pult.cpp new file mode 100644 index 0000000..3f5c228 --- /dev/null +++ b/cd_utils/pult/cd_pult.cpp @@ -0,0 +1,541 @@ +#include +#include +#include +#include "cd_pult.h" +#include "ui_cd_pult.h" +#include "piqt.h" +#include "qpiconfig.h" + + +CD_Pult::CD_Pult(): QMainWindow(), config_("cd_pult.conf"), +config(piqt(config_), QIODevice::ReadWrite) { + //cout << sizeof(coeffsK.k_protocol->to_k) << endl; + ui = new Ui::CD_Pult(); + ui->setupUi(this); + ui->configWidget->setQPIConfig(&config); + ui->configWidget->expandAll(); + ui->list->viewport()->installEventFilter(this); + ui->treeK->viewport()->installEventFilter(this); + ui->scrollArea->setAutoFillBackground(false); + ui->scrollAreaWidgetContents->setAutoFillBackground(false); + ui->widget->setAutoFillBackground(false); + log_menu.addAction(ui->actionClear); + show_x = config.getValue("show_x", true); + if (!show_x) + ui->tabWidget->removeTab(1); + session.setFile("session_cd_pult.conf"); + session.addEntry(this); + session.addEntry(ui->tabWidget); + session.addEntry(ui->checkKHideNormal); + session.addEntry(ui->checkKHideExpressions); + session.addEntry(ui->checkKAutoCalculate); + needWrite = isPause = false; + timer = 0; + //x.resize(KX_X_PACKET_NUM); + //k.resize(K_NUM); + QPalette pal = palette(); + QColor col; + ui->graphic->setGraphicsCount(0); + //renew(); + ui->treeK->setColumnWidth(0, 60); + ui->treeK->setColumnWidth(1, 250); + ui->treeK->setColumnWidth(3, 100); + ui->treeK->setColumnWidth(4, 100); + //ui->table->setK(coeffsK.k()->data(), coeffsK.count()); + //addToList(trUtf8("Read K file \"%1\": %2 coeffs, %3 bytes").arg(PI2QString(coeffs.fileName())).arg(K.size_s()).arg(coeffs.k_content.size_s()), Qt::darkMagenta); + /*CONNECT(void, &coeffs, sendFailed, this, pip_sendFailed); + CONNECT(void, &coeffs, sendSucceed, this, pip_sendSucceed); + CONNECT(void, &coeffs, receiveFailed, this, pip_receiveFailed); + CONNECT(void, &coeffs, receiveSucceed, this, pip_receiveSucceed);*/ + connect(this, SIGNAL(q_k_sendFailed()), this, SLOT(k_sendFailed()), Qt::QueuedConnection); + connect(this, SIGNAL(q_k_sendSucceed()), this, SLOT(k_sendSucceed()), Qt::QueuedConnection); + connect(this, SIGNAL(q_k_receiveFailed()), this, SLOT(k_receiveFailed()), Qt::QueuedConnection); + connect(this, SIGNAL(q_k_receiveSucceed()), this, SLOT(k_receiveSucceed()), Qt::QueuedConnection); + connect(&timer_diag, SIGNAL(timeout()), this, SLOT(updateDiag())); + connect(&session, SIGNAL(loading(QPIConfig&)), this, SLOT(loading(QPIConfig&))); + connect(&session, SIGNAL(saving(QPIConfig&)), this, SLOT(saving(QPIConfig&))); + connect(ui->checkKHideNormal, SIGNAL(toggled(bool)), this, SLOT(filterTree())); + connect(ui->checkKHideExpressions, SIGNAL(toggled(bool)), this, SLOT(filterTree())); + connect(ui->lineKSearch, SIGNAL(textChanged(QString)), this, SLOT(filterTree())); + session.load(); + updateKDesc(); + updateCDesc(); + timer_diag.start(40); +} + + +CD_Pult::~CD_Pult() { + session.save(); +} + + +void CD_Pult::loading(QPIConfig & conf) { + kdesc_file = conf.getValue("kdesc_file").stringValue(); + cdesc_file = conf.getValue("cdesc_file").stringValue(); +} + + +void CD_Pult::saving(QPIConfig & conf) { + conf.setValue("kdesc_file", kdesc_file); + conf.setValue("cdesc_file", cdesc_file); +} + + +bool CD_Pult::eventFilter(QObject * o, QEvent * e) { + if (o == ui->list->viewport()) { + if (e->type() == QEvent::ContextMenu) { + clear_target = 0; + log_menu.popup(((QContextMenuEvent*)e)->globalPos()); + } + return QMainWindow::eventFilter(o, e); + } + if (o == ui->treeK->viewport()) { + if (e->type() == QEvent::ContextMenu) { + clear_target = 1; + log_menu.popup(((QContextMenuEvent*)e)->globalPos()); + } + return QMainWindow::eventFilter(o, e); + } + int ind = o->property("index").toInt(); + //qDebug() << "event" << i << e->type(); + switch (e->type()) { + case QEvent::Enter: + ui->graphic->setAutoUpdate(false); + //for (int i = 0; i < KX_X_PACKET_NUM; ++i) + // ui->graphic->setGraphicLineWidth(ind == i ? 3. : 1., i); + ui->graphic->setAutoUpdate(true); + ui->graphic->update(); + break; + case QEvent::Leave: + ui->graphic->setAutoUpdate(false); + //for (int i = 0; i < KX_X_PACKET_NUM; ++i) + // ui->graphic->setGraphicLineWidth(1., i); + ui->graphic->setAutoUpdate(true); + ui->graphic->update(); + break; + default: break; + } + return QMainWindow::eventFilter(o, e); +} + + +void CD_Pult::timerEvent(QTimerEvent * e) { + /*if (e->timerId() == timer_update) { + if (need_update) { + need_update = false; + ui->graphic->updateGraphics(); + } + }*/ + if (e->timerId() == timer) { + static QString sPI = QString::number(atan(1) * 4., 'f', 14).leftJustified(14); + static int cnt = 0; + int si = qMax(cnt - 6, 0); + ++cnt; + cnt %= 23; + ui->labelWait->setText(QString(si, QChar(' ')) + sPI.mid(cnt - 6, 6).trimmed()); + //if (!coeffs.isReady()) return; + //ui->table->setK(coeffsK.k()->data(), coeffsK.count()); + //ui->table->showK(); + } +} + + +void CD_Pult::addToList(const QString & s, const QColor & c) { + ui->list->addItem(QDateTime::currentDateTime().toString("dd/MM/yyyy hh:ss - ") + s); + ui->list->item(ui->list->count() - 1)->setTextColor(c); + ui->list->scrollToBottom(); +} + + +void CD_Pult::on_actionClear_triggered() { + switch (clear_target) { + case 0: + ui->list->clear(); + break; + case 1: + clearSelected(); + break; + default: break; + } +} + + +void CD_Pult::clearSelected() { + QList si = ui->treeK->selectedItems(); + ui->treeK->setUpdatesEnabled(false); + ui->treeK->blockSignals(true); + foreach (QTreeWidgetItem * i, si) { + int ki = i->text(0).toInt(); + i->setText(2, ""); + //coeffs.setFormula(ki, ""); + } + ui->treeK->blockSignals(false); + ui->treeK->setUpdatesEnabled(true); + if (ui->checkKAutoCalculate->isChecked()) { + QApplication::processEvents(); + //calculate(); + } +} + + +QString CD_Pult::typeName(const QString & n) const { + if (n.isEmpty()) return ""; + switch (n[0].toLatin1()) { + case 'l': return trUtf8("list"); break; + case 'b': return trUtf8("bool"); break; + case 'n': return trUtf8("int"); break; + case 'f': return trUtf8("double"); break; + case 'c': return trUtf8("color"); break; + case 'r': return trUtf8("rect"); break; + case 'a': return trUtf8("rect"); break; + case 'p': return trUtf8("point"); break; + case 'v': return trUtf8("vector"); break; + case 'i': return trUtf8("IP"); break; + case 'e': return trUtf8("enum"); break; + case 'F': return trUtf8("file"); break; + case 'D': return trUtf8("dir"); break; + } + return ""; +} + + +void CD_Pult::makeTreeSection(KSection & ks, QTreeWidgetItem * pi) { + PIMap::iterator ki; + for (ki = ks.k.begin(); ki != ks.k.end(); ++ki) { + QTreeWidgetItem * ti = new QTreeWidgetItem(pi); + const KType & ck(ki.value()); + ti->setText(0, QString::number(ck.index())); + ti->setText(1, PI2QString(ck.name())); + ti->setText(2, PI2QString(ck.formula())); + ti->setText(4, PI2QString(ck.comment())); + } + PIMap::iterator si; + for (si = ks.s.begin(); si != ks.s.end(); ++si) { + QTreeWidgetItem * ti = new QTreeWidgetItem(pi); + const KSection & cs(si.value()); + ti->setText(0, QString("[%1]").arg(si.key())); + ti->setText(1, PI2QString(cs.name)); + makeTreeSection(const_cast(cs), ti); + } +} + + +void CD_Pult::received(bool ok) { + if (!ok) return; +} + + +void CD_Pult::on_treeK_itemClicked(QTreeWidgetItem * item, int column) { + Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; + if (column == 2) f |= Qt::ItemIsEditable; + item->setFlags(f); +} + + +void CD_Pult::on_treeK_itemChanged(QTreeWidgetItem * item, int column) { + if (column != 2) return; + int ki = item->text(0).toInt(); + //coeffs.setFormula(ki, piqt(item->text(column))); + if (ui->checkKAutoCalculate->isChecked()) + ;//calculate(); +} + + +void CD_Pult::on_buttonSendK_clicked() { + on_buttonWrite_clicked(); + //coeffs.sendCoeffs(); + if (timer != 0) killTimer(timer); + timer = startTimer(100); +} + + +void CD_Pult::on_buttonReceiveK_clicked() { + //coeffs.receiveCoeffs(); + if (timer != 0) killTimer(timer); + timer = startTimer(100); +} + + +void CD_Pult::on_buttonShowAll_clicked() { + /*for (int i = 0; i < KX_X_PACKET_NUM; ++i) { + checks[i]->check.setChecked(true); + //ui->graphic->setGraphicVisible(true, i); + }*/ +} + + +void CD_Pult::on_buttonHideAll_clicked() { + /*for (int i = 0; i < KX_X_PACKET_NUM; ++i) { + checks[i]->check.setChecked(false); + //ui->graphic->setGraphicVisible(false, i); + }*/ +} + + +void CD_Pult::on_buttonRead_clicked() { + //coeffs.readCoeffs(); + //addToList(trUtf8("Read K file \"%1\": %2 coeffs, %3 bytes").arg(PI2QString(coeffs.fileName())).arg(K.size_s()).arg(coeffs.k_content.size_s()), Qt::darkMagenta); + updateTree(); +} + + +void CD_Pult::on_buttonWrite_clicked() { + //coeffs.writeCoeffs(); + //addToList(trUtf8("Write K file \"%1\": %2 coeffs, %3 bytes").arg(PI2QString(coeffs.fileName())).arg(K.size_s()).arg(coeffs.k_content.size_s()), Qt::darkMagenta); +} + + +void CD_Pult::on_buttonSetKDesc_clicked() { + QString ret = QFileDialog::getOpenFileName(this, trUtf8("Select *.h file with K description"), kdesc_file, "C/C++ header files(*.h *.hpp);;All files(*)"); + if (ret.isEmpty()) return; + kdesc_file = QDir::current().relativeFilePath(ret); + PIFile f(Q2PIString(kdesc_file), PIIODevice::ReadOnly); + K.update(&f); + updateKDesc(true); +} + + +void CD_Pult::on_buttonSetCDesc_clicked() { + QString ret = QFileDialog::getOpenFileName(this, trUtf8("Select *.h file with C description"), cdesc_file, "C/C++ header files(*.h *.hpp);;All files(*)"); + if (ret.isEmpty()) return; + cdesc_file = QDir::current().relativeFilePath(ret); + updateCDesc(); +} + + +void CD_Pult::k_sendFailed() { + stopWait(); + addToList(trUtf8("K not sended"), Qt::darkRed); +} + + +void CD_Pult::k_sendSucceed() { + stopWait(); + addToList(trUtf8("K sended"), Qt::darkGreen); +} + + +void CD_Pult::k_receiveFailed() { + stopWait(); + addToList(trUtf8("K not received"), Qt::darkRed); +} + + +void CD_Pult::k_receiveSucceed() { + stopWait(); + addToList(trUtf8("K received"), Qt::darkGreen); + //addToList(trUtf8("Write K file \"%1\": %2 coeffs, %3 bytes").arg(PI2QString(coeffs.fileName())).arg(K.size_s()).arg(coeffs.k_content.size_s()), Qt::darkMagenta); + //ui->spinSize->setValue(K.size_s()); + updateTree(); + //ui->table->setK(coeffsK.k()->data(), coeffsK.count()); +} + + +void CD_Pult::on_spinBuffer_editingFinished() { + ui->graphic->setHistorySize(ui->spinBuffer->value()); +} + + +void CD_Pult::stopWait() { + killTimer(timer); + timer = 0; + ui->labelWait->setText(" "); +} + + +void CD_Pult::updateGraph() { + ui->graphic->updateGraphics(); +} + + +void CD_Pult::updateDiag() { + /*ui->labelKReceiver->setText(piqt(coeffs.k_protocol->receiverDeviceName() + " - " + coeffs.k_protocol->receiverDeviceState())); + ui->labelKSender->setText(piqt(coeffs.k_protocol->senderDeviceName())); + ui->spinKSended->setValue(coeffs.k_protocol->sendCount()); + ui->spinKReceived->setValue(coeffs.k_protocol->receiveCount()); + ui->spinKWrong->setValue(coeffs.k_protocol->wrongCount()); + ui->spinKMissed->setValue(coeffs.k_protocol->missedCount()); + ui->labelKType->setText("0x" + QString::number(coeffs.k_protocol->from_k.type, 16).toUpper().rightJustified(2, '0')); + ui->labelKAddrPult->setText("0x" + QString::number(coeffs.k_protocol->from_k.addr_to, 16).toUpper().rightJustified(2, '0')); + ui->labelKAddr->setText("0x" + QString::number(coeffs.k_protocol->to_k.addr_to, 16).toUpper().rightJustified(2, '0')); + + ui->labelXReceiver->setText(piqt(prot_x->receiverDeviceName() + " - " + prot_x->receiverDeviceState())); + ui->labelXSender->setText(piqt(prot_x->senderDeviceName())); + ui->spinXSended->setValue(prot_x->sendCount()); + ui->spinXReceived->setValue(prot_x->receiveCount()); + ui->spinXWrong->setValue(prot_x->wrongCount()); + ui->spinXMissed->setValue(prot_x->missedCount()); + ui->labelXType->setText("0x" + QString::number(prot_x->from_x.type, 16).toUpper().rightJustified(2, '0')); + ui->labelXAddrPult->setText("0x" + QString::number(prot_x->from_x.addr_to, 16).toUpper().rightJustified(2, '0')); + ui->labelXAddr->setText("0x" + QString::number(prot_x->to_x.addr_to, 16).toUpper().rightJustified(2, '0')); + + ui->labelCReceiver->setText(piqt(prot_c->receiverDeviceName() + " - " + prot_c->receiverDeviceState())); + ui->labelCSender->setText(piqt(prot_c->senderDeviceName())); + ui->spinCSended->setValue(prot_c->sendCount()); + ui->spinCReceived->setValue(prot_c->receiveCount()); + ui->spinCWrong->setValue(prot_c->wrongCount()); + ui->spinCMissed->setValue(prot_c->missedCount()); + ui->labelCType->setText("0x" + QString::number(prot_c->from_c.type, 16).toUpper().rightJustified(2, '0')); + ui->labelCAddrPult->setText("0x" + QString::number(prot_c->from_c.addr_to, 16).toUpper().rightJustified(2, '0')); + ui->labelCAddr->setText("0x" + QString::number(prot_c->to_c.addr_to, 16).toUpper().rightJustified(2, '0')); + */ +} + + +void CD_Pult::updateKDesc(bool ask_move) { + /*int cind = parseHeader(kdesc_file, kdesc); + if (K.size_s() < cind) { + ui->spinSize->setValue(cind); + ui->spinSize->setStyleSheet("background-color: rgb(220, 220, 255);"); + } + bool move = false; + if (ask_move) + move = (QMessageBox::question(this, "KX Pult", "Save values at associated names?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes); + */ + updateTree(ask_move); +} + + +void CD_Pult::updateCDesc() { + //parseHeader(cdesc_file, cdesc); + updateCommands(); +} + + +bool stringComp(const QString & s1, const QString & s2) { + if (s1.size() != s2.size()) + return s1.size() > s2.size(); + return s1 > s2; +} + + +void CD_Pult::updateTree(bool move) { + int sp = ui->treeK->verticalScrollBar()->value(); + QApplication::setOverrideCursor(Qt::WaitCursor); + //qDebug() << "fill tree ..."; + ui->treeK->clear(); + ui->treeK->setUpdatesEnabled(false); + eval.clearCustomVariables(); + makeTreeSection(const_cast(K.root()), ui->treeK->invisibleRootItem()); + /*for (int i = 0; i < K.size_s(); ++i) { + QTreeWidgetItem * ti = new QTreeWidgetItem(); + KDesc kd = kdesc[i]; + QString kn = QString("k%1").arg(i); + knames[kn] = i; + knames_sort << kn; + if (eval.content.findVariable(kn) < 0) + eval.content.addVariable(kn, 0., false); + if (!kd.name.isEmpty()) { + knames[kd.name] = i; + knames_sort << kd.name; + eval.content.addVariable(kd.name, 0., false); + } + if (move && !kd.name.isEmpty()) { + if (prev_val.contains(kd.name)) + coeffs.setFormula(i, Q2PIString(prev_val[kd.name])); + } + ti->setText(0, QString::number(i)); + ti->setText(1, kd.name); + ti->setText(2, PI2QString(coeffs.formula(i))); + ti->setText(3, QString::number(K[i])); + ti->setText(4, typeName(kd.type)); + ti->setText(5, kd.comment); + ui->treeK->addTopLevelItem(ti); + }*/ + eval.content.sortVariables(); + //qDebug() << "fill tree ok"; + //qDebug() << "sort ..."; + qSort(knames_sort.begin(), knames_sort.end(), stringComp); + //qDebug() << "names" << knames_sort; + //qDebug() << "sort ok"; + QApplication::restoreOverrideCursor(); + ui->treeK->setUpdatesEnabled(true); + ui->treeK->verticalScrollBar()->setValue(sp); + //calculate(); + filterTree(); +} + + +void CD_Pult::updateCommands() { + while (ui->layoutCommands->count() > 0) + delete ui->layoutCommands->itemAt(0)->widget(); + /*QMapIterator it(cdesc); + while (it.hasNext()) { + it.next(); + KDesc kd = it.value(); + QPushButton * b = new QPushButton(); + QString text = kd.name; + if (!kd.comment.isEmpty()) + text += QString("\n(%1)").arg(kd.comment); + b->setText(text); + b->setProperty("_command", kd.index); + connect(b, SIGNAL(clicked()), this, SLOT(commandClicked())); + ui->layoutCommands->addWidget(b); + }*/ +} + + +void CD_Pult::filterTree() { + bool hn = ui->checkKHideNormal->isChecked(); + bool hs = ui->checkKHideExpressions->isChecked(); + bool ok = false; + QString fl = ui->lineKSearch->text(); + int lc = ui->treeK->topLevelItemCount(); + for (int i = 0; i < lc; ++i) { + QTreeWidgetItem * ti = ui->treeK->topLevelItem(i); + if (fl.isEmpty()) + ti->setHidden(false); + else + ti->setHidden(!ti->text(0).contains(fl, Qt::CaseInsensitive) && + !ti->text(1).contains(fl, Qt::CaseInsensitive) && + !ti->text(2).contains(fl, Qt::CaseInsensitive) && + !ti->text(3).contains(fl, Qt::CaseInsensitive) && + !ti->text(4).contains(fl, Qt::CaseInsensitive)); + if (hn) + if (ti->data(0, Qt::UserRole).toBool()) + ti->setHidden(true); + if (hs) { + ti->data(2, Qt::DisplayRole).toDouble(&ok); + if (!ok) + ti->setHidden(true); + } + } +} + + +void CD_Pult::markError(QTreeWidgetItem * item, const QString & tool_tip) { + int cc = item->columnCount(); + for (int i = 0; i < cc; ++i) + item->setBackgroundColor(i, QColor(255, 200, 200)); + if (item->toolTip(2).isEmpty()) + item->setToolTip(2, tool_tip); + if (item->toolTip(3).isEmpty()) + item->setToolTip(3, tool_tip); + item->setData(0, Qt::UserRole, false); + item->setText(3, "Error"); +} + + +void CD_Pult::markNormal(QTreeWidgetItem * item) { + int cc = item->columnCount(); + for (int i = 0; i < cc; ++i) + item->setBackground(i, Qt::NoBrush); + item->setToolTip(2, QString()); + item->setToolTip(3, QString()); + item->setData(0, Qt::UserRole, true); +} + + +void CD_Pult::progress(int val, int max) { + if (ctm.elapsed() < 50) return; + ctm.restart(); + ui->progress->setValue(qRound(val * 100. / max)); + QApplication::processEvents(); +} + + +void CD_Pult::commandClicked() { + QPushButton * b = qobject_cast(sender()); + if (!b) return; + //prot_c->sendCommand(b->property("_command").toInt()); +} diff --git a/cd_utils/pult/cd_pult.h b/cd_utils/pult/cd_pult.h new file mode 100644 index 0000000..b420817 --- /dev/null +++ b/cd_utils/pult/cd_pult.h @@ -0,0 +1,121 @@ +#ifndef CD_PULT_H +#define CD_PULT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "piqt.h" +#include "session_manager.h" +#include "qpievaluator.h" +#include "cdutils_k.h" + +using namespace CDUtils; + +namespace Ui { + class CD_Pult; +}; + +class CD_Pult: public QMainWindow, public PIObject +{ + Q_OBJECT + PIOBJECT(CD_Pult) +public: + CD_Pult(); + ~CD_Pult(); + +private: + bool eventFilter(QObject * o, QEvent * e); + void timerEvent(QTimerEvent * ); + void addToList(const QString & s, const QColor & c); + QColor invertColor(QColor col) {return QColor(255 - col.red(), 255 - col.green(), 255 - col.blue());} + void stopWait(); + bool calculateExpression(int i, QVector trace); + void markError(QTreeWidgetItem * item, const QString & tool_tip = QString()); + void markNormal(QTreeWidgetItem * item); + void progress(int val, int max); + void clearSelected(); + QString typeName(const QString & n) const; + void makeTreeSection(KSection & ks, QTreeWidgetItem * pi); + + EVENT_HANDLER1(void, received, bool, ok); + EVENT_HANDLER(void, pip_sendFailed) {emit q_k_sendFailed();} + EVENT_HANDLER(void, pip_sendSucceed) {emit q_k_sendSucceed();} + EVENT_HANDLER(void, pip_receiveFailed) {emit q_k_receiveFailed();} + EVENT_HANDLER(void, pip_receiveSucceed) {emit q_k_receiveSucceed();} + + Ui::CD_Pult * ui; + PIString config_, name_x, name_c; + QString kdesc_file, cdesc_file, xdesc_file; + QMenu log_menu; + QTime tm, ctm; + QTimer timer_diag; + QMap knames; + QSet calculated; + QStringList knames_sort; + QPIEvaluator eval; + SessionManager session; + QPIConfig config; + //QVector k, x; + int clear_target, timer; + bool needWrite, isPause, need_update, show_x; + +private slots: + void loading(QPIConfig & conf); + void saving(QPIConfig & conf); + void updateGraph(); + void updateDiag(); + void updateKDesc(bool ask_move = false); + void updateCDesc(); + void updateTree(bool move = false); + void updateCommands(); + void filterTree(); + //void calculate(); + //void renew(bool write = true); + void commandClicked(); + void k_sendFailed(); + void k_sendSucceed(); + void k_receiveFailed(); + void k_receiveSucceed(); + void on_spinBuffer_editingFinished(); + void on_buttonSendK_clicked(); + void on_buttonReceiveK_clicked(); + void on_buttonShowAll_clicked(); + void on_buttonHideAll_clicked(); + void on_buttonRead_clicked(); + void on_buttonWrite_clicked(); + void on_buttonSetKDesc_clicked(); + void on_buttonReparseKDesc_clicked() {updateKDesc(true);} + void on_buttonSetCDesc_clicked(); + void on_buttonReparseCDesc_clicked() {updateCDesc();} + //void on_buttonCalculate_clicked() {calculate();} + //void on_buttonApply_clicked() {renew();} + void on_buttonPause_toggled(bool on) {isPause = on;} + void on_treeK_itemClicked(QTreeWidgetItem * item, int column); + void on_treeK_itemChanged(QTreeWidgetItem * item, int column); + void on_actionClear_triggered(); + +signals: + void q_k_sendFailed(); + void q_k_sendSucceed(); + void q_k_receiveFailed(); + void q_k_receiveSucceed(); + +}; + +#endif // CD_PULT_H + diff --git a/cd_utils/pult/cd_pult.qrc b/cd_utils/pult/cd_pult.qrc new file mode 100644 index 0000000..99f4688 --- /dev/null +++ b/cd_utils/pult/cd_pult.qrc @@ -0,0 +1,40 @@ + + + icons/dialog-close.png + icons/edit-clear-.png + icons/edit-guides.png + icons/view-grid.png + icons/zoom-fit-best.png + icons/configure.png + icons/alpha.png + icons/document-save.png + icons/edit-clear-locationbar-rtl.png + icons/edit-find.png + icons/list-add.png + icons/edit-delete.png + icons/item-add.png + icons/item.png + icons/node-add.png + icons/node.png + icons/edit-copy.png + icons/edit-paste.png + icons/expand_s_x.png + icons/expand_s_y.png + icons/expand_x.png + icons/expand_y.png + icons/media-playback-pause.png + icons/media-playback-stop.png + icons/media-record.png + icons/application-exit.png + icons/document-save-.png + icons/view-refresh.png + icons/document-open.png + icons/archive-extract.png + icons/document-export.png + icons/document-import.png + icons/zoom-fit-height.png + icons/layer-visible-off.png + icons/layer-visible-on.png + icons/accessories-calculator.png + + diff --git a/cd_utils/pult/cd_pult.ui b/cd_utils/pult/cd_pult.ui new file mode 100644 index 0000000..4f51a38 --- /dev/null +++ b/cd_utils/pult/cd_pult.ui @@ -0,0 +1,1262 @@ + + + CD_Pult + + + + 0 + 0 + 1034 + 559 + + + + CD Pult + + + + + + + 0 + + + + Coefficients (K) + + + + + + + + Update + + + + :/icons/view-refresh.png:/icons/view-refresh.png + + + + + + + Read + + + + :/icons/archive-extract.png:/icons/archive-extract.png + + + + + + + Send + + + + :/icons/document-export.png:/icons/document-export.png + + + + + + + + 0 + 0 + + + + Qt::CustomContextMenu + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::NoSelection + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + Receive + + + + :/icons/document-import.png:/icons/document-import.png + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + + + + + + + Write + + + + :/icons/document-save-.png:/icons/document-save-.png + + + + + + + Make ... + + + + :/icons/document-open.png:/icons/document-open.png + + + + + + + + + + + Hide expressions + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Show only errors + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + :/icons/edit-find.png + + + Qt::AlignCenter + + + + + + + Search: + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 20 + + + + + + + + Auto calculate + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Calculate + + + Calculate + + + + :/icons/accessories-calculator.png:/icons/accessories-calculator.png + + + + + + + 100 + + + Calculate %p% + + + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed + + + true + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + 6 + + + 200 + + + 20 + + + + Index + + + + + Name + + + + + Expression + + + + + Calculated + + + + + Type + + + + + Comment + + + + + + + + + Commands (C) + + + + + + + + Set C desc file ... + + + + :/icons/document-open.png:/icons/document-open.png + + + + + + + Reparse C desc + + + + :/icons/view-refresh.png:/icons/view-refresh.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Commands + + + + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 100 + 30 + + + + + 0 + + + 0 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 66 + 441 + + + + + + + + + + + + + + + + + + Graphics (X) + + + + + + + 10 + + + + + + + + + + + 0 + 0 + + + + Show all + + + + :/icons/layer-visible-on.png:/icons/layer-visible-on.png + + + + + + + + 0 + 0 + + + + Hide all + + + + :/icons/layer-visible-off.png:/icons/layer-visible-off.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Start record + + + + :/icons/media-record.png:/icons/media-record.png + + + + + + + + + + + Pause + + + + :/icons/media-playback-pause.png:/icons/media-playback-pause.png + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Show + + + + + + + + 0 + 0 + + + + с + + + 1 + + + 0.100000000000000 + + + 9999.000000000000000 + + + 10.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 20 + + + + + + + + Save + + + + + + + + 0 + 0 + + + + с + + + 1 + + + 0.100000000000000 + + + 9999.000000000000000 + + + 60.000000000000000 + + + + + + + + + Graphic::Autofit|Graphic::BorderInputs|Graphic::Clear|Graphic::Configure|Graphic::CursorAxis|Graphic::Grid|Graphic::OnlyExpandX|Graphic::OnlyExpandY|Graphic::Save + + + false + + + false + + + 60.000000000000000 + + + 10.000000000000000 + + + + + + + + Configuration + + + + + + K + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + receiver: + + + + + + + + + + + + + + sender: + + + + + + + + + + + + + + sended count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + wrong received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + type: + + + + + + + + + + + + + + address K: + + + + + + + + + + + + + + + + + + + + + missed received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + address pult: + + + + + + + + + + X + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + receiver: + + + + + + + + + + + + + + sender: + + + + + + + + + + + + + + type: + + + + + + + + + + + + + + address X: + + + + + + + address pult: + + + + + + + + + + + + + + sended count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + wrong received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + + + + + + + + missed received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + + + + C + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + receiver: + + + + + + + + + + + + + + sender: + + + + + + + + + + + + + + type: + + + + + + + + + + + + + + address C: + + + + + + + address pult: + + + + + + + + + + + + + + sended count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + wrong received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + + + + + + + + missed received count: + + + + + + + true + + + 0 + + + 1999999999 + + + + + + + + + + + + true + + + true + + + true + + + false + + + 20 + + + + + + + Apply + + + + :/icons/document-save-.png:/icons/document-save-.png + + + + + + + + + + + + + + + :/icons/edit-clear-.png:/icons/edit-clear-.png + + + Clear + + + + + + Graphic + QFrame +
graphic.h
+
+ + QPIConfigWidget + QTreeWidget +
qpiconfigwidget.h
+
+ + CLineEdit + QLineEdit +
clineedit.h
+
+
+ + + + + + + spinHistory + valueChanged(double) + graphic + setMaxVisibleTime(double) + + + 919 + 107 + + + 932 + 132 + + + + +
diff --git a/cd_utils/pult/icons/accessories-calculator.png b/cd_utils/pult/icons/accessories-calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1dd1e44dbf286667d71b20d0eb1a42b29a23ed GIT binary patch literal 1525 zcmYk6c~DbV7{yaE%2KRAt*F>)X?5I+3rrA@fEt7#U?4#VW#0r8AtnkVA_WY%v5G(@ zVG#%fOaj>m1TicjVF`pK?8q)_!ai!%La*)A>6v%mz4v?XkMExId+!m-!Fq?rJ`D&2 zvIA*@a02teFGCFq?ueqtVlYAR7mye=HMQZ1E8}3R9&UrhgX*0xF^BD|Ad3ia9!vV$8(o#B|{^G@pqM{-ymHPbo^Q^3_?Cfk3i9{xo zDHKX>Zf;sy+S8{`{rvo5Vq&_xyAu);Qc_Zql9G-bIdb~+=`&}}7#SJCU@&828X6i#xQ@f&ZsBowJf1)x+y=Ufi;O1RyLT@dC^j?M#OAJ_{FXVexlnM`1NMMVXR#bN^q zOW5_r?1mB$1gDY46_s*DWjvrpI!{yzV&aRKd{KE7kce3Y7ER!)s1nnwfy5QnVwON4 z0Lj)!xUYbkxv!cl0Ry!yd=P6LkhHqKz8-|$*x2|l6@U{!1z-kH0pI~F0YU&O|KbFa z?dj=}%jE#SzP`Tx{{Df1fx*GSp`oGS;o*^ykvDJNjE;_ujg5_uk55cYOioTtO-)Tt zPrrTpc4lT~c6N4dZf<^leqmu@adAi%?mDSbNwY9bN_4SR74W-8^ zUw|^4;N*aYs6f>;H23J~8yLb&&CaD2l+Xd2z#=xA!{Ksyynk8+2uuHK7W6CY?C$Md z`TTkF%6;8*@EM&zBF5(xI>F(P2ih z--}m+8hSiTh(6E0+ooz3#Z-1>2om{hjXkTH_0`W}#3%|nypRz-<#yb?nzSpobdeEG z!XIXwVsX4Bs1ut0kOL=Gl6EXs+_5Xy+b^K2*pp{^KH=6|%q_|~gR(IgIe)-crqXRq#Khf#;N-DQsWz-g@9p$5eA=I5N;A^qe@%0&ZJ6XD59E;MT5NA350 zY1`D=S_K-~$BfkJM>l7st4kk84bPwl;JEWMnL%`gTlq8&M53J0jTyPB%um%D Q`|?*sS~(z?7rf*C28+}ws{jB1 literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/alpha.png b/cd_utils/pult/icons/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..543566938cf5681db007530efc6b64c4ae67c096 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPaBR`)C--V~^b^?X8JzX3_G|ngA*^(*DZ1&*w>+aAw xosBLAs~RN^{P_RBevQy<^L#m8)nAzm45u$~80FZyPX%gY@O1TaS?83{1ONw+E@}V( literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/application-exit.png b/cd_utils/pult/icons/application-exit.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5f8b2515e72608d2de9d45fb80ff481926066e GIT binary patch literal 1134 zcmV-!1d;oRP)(xC=n00006VoOIv0RI600RN!9r;`8x1N%ut zK~#9!wUS?G990y?zx!uqcQ)CO3Qb9*q)kbepkNXsL>fp%(uUwejD?y8p{)=!q9{uI zgNUFMD`JgLd5}{2)TjDbX(&h)iK5opBqla%!fsPV$ZoQ`*`3+BGvk@tY+BYL;-3Q_ zbGUQA-}(0J;J>IK2tw^3)mP3K37K=}c6+n4r`M;ZdQ>*cgNlLlcl&$x?F+W`_y4@Q zyxhNgd^{yVZgTFam#l;R5QCNuU}|&|FIk9vK+Wf7}ljFCx0I0B)M_DpyEQn_xvs z?A=Q~uEAY2z;11YDwXs*lI}}%*4fvmp>$V!D(@6yRp3GaWzxc#GqBTX3h8TOTW>GW z*$HJAwfv3_Bzk(_c^;HfD5X-`LtYKmiMLikQ{7@wgTlHxF@gKW#vq%T^x3ZNZrqey z_l*xe6hd{cR#q@KIf=k^p*fBN@6N=&lzJ8Aiq_UJcj|qp8>tYY(>JttV*3LfVM;B3 zC5?rTKY+@u!KI`;5`mk~p={fCBo-WNi;EDJ1tVr5Y8ikJBu~AAJo`vlHhy9SSvSW$s^eS~DeuZ?2*i_g*i_>&r1 zfnT}w8N{XYaEdNU#3_a$6~JQA>QxAU0mO$XJP1_;ck)<&>?w2%4eOMoE%>g1C*T}= z1y+rLs0l<2@=5YbUJd5dF-Qrmh-JbbeGLyEAA=A=e|mK{=TQIKd^kYE6N4iNM&E=< zYcmLJgkUoS<2E=DoVWxI6H^51#kUFi93)NQoD*~w{KF$KCq~eaStO95b^qa`sD1ea z4D!%?$Ui4$y5pqA*WX3=v1dY~2FFrALY+K}7`IVtI2yivHHm063ez;ve&lJ~`^HJ_ z6%qtS6?pTYxn++|sdfE(WZyaj=GtK4Y!XuroD(!CJ&Q;rqVF{|H{XJVoJwNa84C=q z!F~Wtj}9aM&1KkEzrylMgK$eW$_gktK%oRUWx%x^{5n1aH8YKkZ@&Vh`t_^VZ(hB5^BM?%e;s-|%XY&(r4?7hUI(^vEK0iGCUi(hX!_KS+oi5OKgxHz zA69$ZW4tf^{_XSTlU;gzZ-0M(W6qE6i5CrBi@r}hc+vLcMqW2}v!;*_J1>9yoA>)% zEL-F^Gqp+Y`a>j2;zWCbZq7Jc#>i0j?orm>xb3;Kd6?(_-hOOnYnf+*n10B@hF1?t zcP9DRyS^8B@iXV_(-#lCcLvRfabvg>!T3OmA@1LvR)M6$4Iy5}uIEkG&tX|ssg*nH z-fwTdW45vkkBbgR&E97hx^>OUGd@?Fiun{LCS0v4v#L+yT(;Itxi@}}u8)}J(puS& z>}#K5Ha<;F*gRA5%Bi{(8QC@0b)?N=uhd;Ax?3qG#KU}Q?_;Gm`bs_X4Xy>dH0}EI zWU0SL+$lSCA(L5`f_M07J_$3FV7s4iT6msd-ON+RnPd$L7kKX!4SHE|!KtX>Wa ztAg8eSIBGBy>{SfiF@S`^GlNR5aZKkIY+({yO$0;8T-Fw{HxR3zM&*1T%zW9UCM(0 z0dk6ue{Xx~5Ieyx;ro*L78-lGYMj0@oa3s0G~tWZ3s?Kbo7;EP*F^lzP`I})=IQ&^ z>x|v3`FWE#_x-&SMGn4WLZx M>FVdQ&MBb@0Gy;gf&c&j literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/configure.png b/cd_utils/pult/icons/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce478b1adfefacc19d35d61e88a6c02ebe97454 GIT binary patch literal 717 zcmV;;0y6!HP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02{9W02{9XUK)`c00007bV*G`2iXAx z12+)F5m%`I00K=(L_t(|+KrN3NRx3C#*f?DM%ip+yqb-i;h^3{#n{|Ose_>C#@NE# z7GW2nLRnqZRk>l z!E^IGoWld>6hQ%)Ob;ZrwY8lTqK?F3D=U#m#6CX$#%MA3twKK3jp{=S3-bwzqR{g1 zWn_6|PHT0V4^ml84HUxVD;?&gUq4YYxrThci3GMzVQs_8wx>aE7+A7!I1H&&3b@>z z8%!qi9rhAf2rzWW0VzB{sMRWCC={ZTLLqRr7qhDNRaNlz?0&5`==X~y;%hk@XtmlC z)z#Ho0)bh$({nG|qLN>Ej>p>@6bJ+}b93`2b1k5YM55;Lw?1I9w}RI{3DeUbfmgwU zk`fL#FdNvgKDCcf%4E{WJ?36(INk6~Szl-8a=AAFK#9fNG~C_Y#rJsJGrheQ zBv;6hcfyN?hOCn~Qef@KUgduny7b2#PFv(s$3;Yx5y)(Lh@2zNPdMU39%!A08&{uL z2UAU&vxvjtpqADa^wRZWsl2>Q3i-Hgymh^|--2{HEh0%0sm`d7%`u#mNW_}#x8;FB z5JX#iH3q4425MvyP%7)Gf&RxmQ&aDUagOpXV6s?qkSO9GJthSE-4*}<0=h{= zK~#9!WzSn^)dc{@@z4K%&e_h+uIFq=%jRlhi`pDHEu;s75`r%D5=B@K77|LMhcYtB zu_)9aeCwfntVjt2>7mQOAXr+9^^#1|9GtD`ZtZrqbGCB}A8nt9-{Tj40h@h9LxO!V z9temQ$rQNw4io<8j=*th8yKhw!#7%Y@2*Yv^ax`yi{s-m!^7olE_Z&Nw~vw86c}Jj z6W_OP-`>~P->3c$VnnTx?4w_de8rShOxK5(ZQP zN|Z|!OC5~hy?t0~b6;C=n z)zxm_N=G8;IHwSVh$J|ijD%uMd4=Yrnr+*49Xe*Zv@SC@uH(%k>N`8dd%G=7PDs_) zOYq`*G)E4Q?%sk^EO23`--RVK`hNN^?k3WC<(delcw71NvYRrn(QjIEF!*z;P z2uhTT6iX}?Q+l6#4nX_Phs8U3RT`;kCQ?HTF$&>1CPG%%bL18opHJB{Fr;&U2HSaeDWsC5=5FFCVs!)oxmmJTNUXBK&;g!bWF-JV!{;2kpSPBY zt%j7V5fT=NZ_tEgE_}eDQKnIe0AT%Feu*)BAN9$KbX`#*QJ}75wan!|7&yquoBWFk r1U3tiK&qRTdZHuDlvzL)B>?yjfS~`FyINaO00000NkvXXu0mjf;$wU` literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/document-export.png b/cd_utils/pult/icons/document-export.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1b6a620cf19c87ece3788fc8bdd77378f38d74 GIT binary patch literal 1106 zcmZA0c}$aM90zcY4k#^cCy+%3Z11KLmq9rlV3?FqkgI75-4Meu$244-WT4|v4H&-uLJ3BkKgyXRcuzqa2T^vEi-mMqf+1ZcNlhdf+H7Y8qxVRWR1Ox<-$>fNL zh!h$vJ3AXx{^jB6NhA`Tot-fl%zw52uXsG(6^9E83k?YkVlvYR1OkafVx%(i3-j{| z@+vCJW@ct!7~TdDLI zUtd4)_%V;i8yFZ62n2(JgHHwrhlYlRhlfW-o&lqyqtAhH8=+7*F)=YYIXN};5&)-6 zi(i4$XJ%1zb0U#QEE2r}=I0lHl{bJy@>VL9NCBBlwk};?m#x1;ZJ;(cH#asm<#PF^ zE#zBUav0tMKq?e4tbi3LB}#=tR4N2f+1f=AkZQH9cQs0*(WuoRG@x@dw6=-ZW@4j9 z?V=2*y*-23x(67IMuP!_30x+V*=)90EMRE&T-MgW2MH`;&{Dx_k8*ItV4S=U1O^2k z2|pS`jf*cjTUJ?F$zrz&w|DeLBiL#~Ts#8yI^YvxDQQ0~wlwQ2MA63|Le<0*l4p(z~?&nT5DT?HiBt$z16@z{{+d?v{PT_`BOOZH&! z;u-zOsZ;8rUW9Tz*U)gMb?QdBrSP^8>n^C-J<;rWFYRG|Smq52Hc?jHe40C z(|Axe{%OV6vslbQ=^qkkwmtY}IkRQ_X*x}nwa+DgEORW9A5zR>{^&>%f9Rtu>$U7n zb{M~Svp+ZYNSM1bG$1E1bmX$)6GZQ*`Z9!a^zw;MiQJ?F-*HLabu zC+K_q$XLhwndJ2Y*7WXXyxu>fFnS^g8awvugZ)kJ>5lWzY8$=2H!C#AkN4aO@*64` z`IeKjKvx-DLTWEgpH?jk%*dR$^zzlvOSy-W_GGP|{iNg^r)M4=?ZUaiY< zD2TpR*02w5Qe}Krf}OzKx=I=dPOjF^x`*3efw`9s7k`;`zgA+#(lDp#g?|cKeP3g% zYJGkB%*xg7o<>c~Hy4+e@y6{F?edvL*{D@Y&iNp*`N0#S!S<6UP-(HfF*!B=0F}aQ A^#A|> literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/document-import.png b/cd_utils/pult/icons/document-import.png new file mode 100644 index 0000000000000000000000000000000000000000..97e683ae5523e3f377a6a73be7f66d480f029ea3 GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V4ND@6XFWwA_Gw|F#$nAZZP2F zo-o5(|95`_B;NinZfZ!Mi96xsa z_^~tRjswAo6DLod27)tZ&H$}AckbMIAh-Ym7cXAC1O(TvU%q_#3J_ccf$P_=-?@GJ z4iMbEd+*-8`}gnNe{k=?gZmF3K70ZMPoF&pf)`-$^5rWac>VhIn>VlDzI_7(Z{NOs z2L|uK;KTd(AHd+_#}8k=eFTC}VDK3XzJS43F!%-r-@)Jq82tM669|C80S=L0fB!*( z1r#no@bBN>|NsB}`}hC<|A+sxU4Q|qS`y?J%)rRR%)-JZBr2m~WM<*$<>Q-M zP*PS|)7~)yr~wEhpZ)_z6yrNj7srr_TfGxs#$Ps&Xn3s~cllxMf{Oc1-+S48K1e(Y z*mJ@0b=dWslGrm@y~|S6>bJj_<~nWn z+=`cYzx)U=&|h}{HzT98*#xR5G&pV%YZtAz{(m24NtucLl?V4XUIcvBf$5w5Po2j|R~=dK^b+32+9LCvFo^J-34KAWofCgD-m zuU$Jz?20=?UG(Mm9$@XA?xo$C9pTu0k)`z6(ga1tUi-TZMl}aQJaoQncS?M7@^NSK z`EBLR6{!tDn-)wI&i|Gh!zsZQp|Mg`{%QcPpKR3oh{m0a>=}Z62i!khnpo=RuVAr9 z_TGew?Iu4OP5VT*Ojh~L7Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipY# z76LTg?MOlZ00xFhL_t(o!=;y9h+S6|$A4?>eLs>(GDE&ZTWug%O^uod1!*K2G?e-v zl8#?cUqz%3g5rxx5eh*OjQAuizFEYGB8sSq5hGMd15Jww{m6tS!6cnzCNp>D&fI&? z*?al0_qpfvPAVyG=5o&2XPv$NYyJOg?L9(c?A^P!GdDN48));^!y5OJpXZMpIkI~4 zkr2aKQi6E-@RtrEbUc6|h zPM!L-_x|XiLx=7;6Z)m6{@i@-R}RLJo7JQ@0BQa?Ra&hUiwg@fJu_oJf99DJ+qZ8& zx_|%vdjg@q{O%)s@u|O_{M?g&vqJ)btF?{VpRf4nda3J?KREJj2G%lvD$Q&nP2x@))F zU?yv8eSY}0!#w?`*VwV=gS4Fo0TrPX^Zz<`;aflg5Jm&$7y4kuMlq^lW*f?-0$K@G zHBs(cEfB$gH8Z|)_yL}L_Bs5{_u-uq0_>db%I%x~(Ygwpqa3a?8jUtoLUlE>H*v12 zIOlNA(Q38WvSrKI)_YI8(_!=GDY~1c_|EKm>0LX|aIlV*Ll##DtSsHMu?EbH_0fQ` z9No3{E2n0*Va_>6x7%fUdK!RErvpH@+l8%L*|BREWpN)r`T8_p{n1~Tx&H&WXcU9> zFa}VL3d&+gEJqu9Y!!8KZiHYMF>6wA&eQE~V&|@1Jb&&SMNxtoqL~&;x|rU!jbD8K z^L*iZCz!eKA+T5jh+#x1M#QqHg{O*CK%!BElBHgs<=z@aSrTHz%!naShCo@Al);E0 zRfJ)fB`~o!;M&baM#YFHKD&?OzrRF?=EeYuqF^vsXOJ}zEF!@WNm!!6&09;Heeo48 zymp2D+92o0(w`+-q8V7qj*Z_L77Y_4gvjn)+j;r?b96hM(HOvJv_^k+GSC7g zM8nTrx&6_1?Ovc?l;a2{(N@nE4X3Fp%9x^yV+~}R9IlW6I!Wy}l0al>qyP*&21PU+ zmeA#Bs>NFhg(cKz78NNHvE0cdQz1~s+{LSPsw`SF(y5s9Xcs8W{at#KIB z>R#)pghaSCD#zy_B!3iQnlm882xhqx0uf6o4-h077O~cV04+(`u$tqla@AtlWe9mC1O7PiM$F?GX3v5FE@DMG}*|AF0nXx~081fqguffPVT8>N_6 ziV<3*RYJ(MUNxy$Ut{uti;43hB*#@xh@!l{c?o}OX^mcg$Z8SjWXDb9nj@_;;c`FM zM%{;o7-Pe>0-+gDQ)8%d>&_}3frb7$PK=?Yv%kxEEG?DeD5g3u8hH)Pipd*M)rx(t ze=^X}ph%@^$LZke1znn7T$vGjf0x!|n zI`fV>0oq$1JoF8Wsif+t1|lLVW*RJtfLJs^tP;OqreI=bBB~Lv7%^3%rTsi2Vk#0% oFhSBuO~gbbBC@{n>X{$^7YBB;Uy0h!LjV8(07*qoM6N<$f_AN4=>Px# literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/document-save-.png b/cd_utils/pult/icons/document-save-.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa489c0fe615ddfa1d1f8dae1de37c8ed858dcd GIT binary patch literal 1263 zcmVM8$}SF`)$W|Vz+h^3K1d&siN<^An_F5_&0!O z)Rzj0@&v6^_10 zg~*Nh4_Qv0^%;Z#{w#!k|1X#ZQ;;@Dp6+HDfFwzvR;z(y+w7a5d4<3CPl}Rf7-tVSvZMG^9)A0BAQf8V&LJ zVG9{>Z3|Y_U^M`ViOHx#!ZB013K_`6*9ZV_uqB#YC@zDZ2d0D?f6(P|tQ3#a@s(2L z01}P3@xh-TA45^onUU7wF%q&o*g97OmE=lL4uFOcKDoWQ{=CRE|L5o=qZ!D84eqm0 z(TY!}fpk-G0x@+f4Xgl&tX`6`UHUODLTUZqH4rBXBHE6TT3rHJy|_6BfHj~JeTEX? z(^0ITcRZGj$IvMk;Sv)L>kUjP&dLt6R- zyYa=Bbgatf8{D{glU698=svQ`7Y~CniEsL{qWLobmqjQA_hgE!!xHWaYvFXB9A-fFUE*Y87hrIt&Mc0u2-(v~0T& zKomz11c4+VD@>5(9wI1v4m741bguyr;G&{9J{<$#x*U9p55;jL|g$=_H zfzf=j5U4rdp6zxU`u#o_*fcf*z=O+|E`3m`*1o|~wbT1m=)U#UEdfQHwk8G7iBS9~ z3|T7zz%osq?{>Q^UTjrN8wdl&ql1G#H#RoD-hSocXL!RJi!cf~kv-Q!YQ;po(4Rhx zD7a`UT{6*-j6*c%v3CUk-TC)uH2Mye-|{@~A`$TRl`GZ{4<78euIssuZ~ literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/document-save.png b/cd_utils/pult/icons/document-save.png new file mode 100644 index 0000000000000000000000000000000000000000..8072aea3268164eb2028a0cebfe44da82b4f4aca GIT binary patch literal 563 zcmV-30?hr1P)XvKK@k7Ytwo{YB(9F? z;2_0Ku;{F~yQsL?!9iy?1;;|c4%SjZ%{70TwwHKcBH=J-%EN&+{;d zhN(E7P<- zOhP?!y}wyJm`;b*`kqJvqBiX|nL~L2fd*Ux1d!eYF6Tbg5P<9ZC&&uF5~UDVJ~Kya z$B9GKW9yGCk1)gXRIvtRXipPk@<6(R{ z10;&Qkze=csdPHpgO1qUX}3Wtm&>>~JBMXkI4Be#D>XTZ+DDB(A$cT#*xhj)kQiey zO%sM;K-YE1@`TY9(UZv}-m29|6TcYK$LKUNox!$kO4I`&Fl}aA7Py>1;e44jn~%EA z#v7jv1002ovPDHLkV1jI` B^11*3 literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/edit-clear-.png b/cd_utils/pult/icons/edit-clear-.png new file mode 100644 index 0000000000000000000000000000000000000000..631ed4457342d9e6f224012c842463ef09bfb8c7 GIT binary patch literal 2066 zcmV+t2<`WYP)x*e)JWac-SH#wQ-nR8CQ z??V9a&birHyP>V2D6Oi1xANEi_WvUA?O=O#N1Yt{FO}b!bpZ~OI%n`&{aCwN2zNS9 z<;}Xl^-CIRSECYcHRXZsglPS&3*5WjSf$N705{Jm`}F5o6%ZbYHS29I`~HkF7JAMW z9h!B4-ixPvn@;edOOyWUnB?HHSr-`S)M$I}4mtW`5AwSp2HFJOx?;+$L~N8m^(Bff|Ht{ui9&=7Wp`+_rHI)*!@x7XeD= zg~}9-Dj8ZUgp)(O_~DmAA;#H!Tty@*5nA)#^~VwVxSGK4al`P7qet=I3Kh7;_ETI< zB;HCO%6|(-!i#t%PmY*8D?9w+No*|EXCf&P-%sP>910ptM#xTIn~somDMGgf#@e37#LwL%m)+;BfE*HhU`HL`UPBN&7IH zg6{4`C^QS9zW%5{{3vSQbj`!CP&}f_#V1V+AD%?We#Y=5wo7uolKVr0G9HxaQBab3 z0OanQ{(ghzgunFh!TnU~RBp2vxHE={1r&sDgi`Tf5OexFeeU!2;}Zm~LTKlVM-b22 zw!bbv?p3!o4Vp_6K`ROdb#??Kc-o&XHZ-``>-`zNzI{9Hb#}%*B-cGX@YmcB+~@77 z|7Z@}RYn4;mp0bn;M;a;fJP2ssoG ziJo0{xZCbexXae|O~}~}-w6uBePm4i@xfS0;Q7<=83>RUMf%0={<8(KaJf7QE|eya z90W}U6Lcav$Pf9p>FZ=fB3IuDuTA)>g9E<0Wee_dalu_X-EhOaxwy@71{#^bp8BM12vn=r`+xhI4vboUDhwTr_v+mZ|YjpPBLS4Rh1s zc9(U-H_ge}aL!P_0R<138sp2Kufyp?BArP5qJSW5o1#oW1O2V`d*M|Y<+xh z;oR@;n;H&1FfhR1n3>=!uA6Zxkq{7xpA|?B+7ezZ^m~>OxdU2?BS9@q|v_3JGcuf()^)G z9t@gvI@F1opi1_$fOX49 zMb2w@HL~D8W;m=4-SOUnp$?kI@DHX&L(ho7GlcNOMq8|Q-GQ?#EErSpcEMId`2ja4 z1=qFzQV|C-BAuZvKO8RRv!VWIAk<{hq3Y-!(5BI#DK`kTS%FXxEOyFAZ|kN;vCvQu;@{m4DddIe+e>emV{RWNwbfY^-qQI%}MY zP$?OM5mLv}%ue!sw|hESb)U+hy_6i-0hi<)&`BAS4e5bX5@mcJXe$f>ozM@|nR}qK zBpeD7sIA2Tn|mr4&QCjH111t3t)Jw1+l%TXtk3ImLN+vrLzdUcg669QG-I))B{gB0 z<->lK{~LIj9zL}LIuUzGd758v5@%~~ZI(Zr6EonPoIP1DrcX9zFyMR+lg!-@+7wJs z6M^p1Fz7tKcQQAASBX|c7pQ#fJ7tbmqXoX7iECxS+Zv=S>sm3xLM^44snxVO`imI| z1V%Yam+n4dZ2Ywzo{Nz2o6%2ophgzo%gv^!w-4V@Z#_QvJ+GxFmd8k&x zVrryx$1|Bs%l7=p-?j?`hI;T@Jrk;Fv^i7uQqIB}8U6hRF=M$}#I(zfbx%%WZ&OwA zcRxKL@P1hq?=>QfcJHf~F`XL}jO7)%f%D!1Je{At0f9cGD^0o4CKZCfdHOw3C3tK~ w4tEYMH2CfEFY~e(IA|La%m4rY07*qoM6N<$f+Lgg_5c6? literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/edit-clear-locationbar-rtl.png b/cd_utils/pult/icons/edit-clear-locationbar-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4b83b7ac6e451f461973dac0c9a6c53dedef25 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfLzW3kH}&M z2FBeW%xLxI@gtz1WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~*(*`Bv~l~6?FSDYJaY8Nv17;1UpRl|%9VTf?mc|? z@cHxSFJHcV_3G8zw{Jgu`0)Aj=PzHr{QC9l_wV0-{`@KR`o0Pn77`^ve!&d#@_Ksq z_8}pusXI=cy7Kht(+?kh{P_EqYvr0*Ks9qcT^vIsBJkEM|1so z>*;dxIy;s3ojI&$kq&AP_I<(sjrDEsaU~GX3SIsdMei7bh)})pLEh`3!Xi^UM4W+LIZr$zxaOz7mw|A28X|&gK2(h zZfSoyEkX7Ar7SOshe$kJ@wtDv=f<5!bjpH@N4L9nR{6W;bYuBbX#H42w#$q|FGoYkR7TQxAVVC~AgvlcDbQ{K}v zz)cqHtE#WH+tMnPL>x$^K&cL@=%%l{d{cK)X)1KPX3v;gl4lwwgdERi@@M$WfsL{? zP3)eLTi{~|fOrH9%Ru@V9LpV0qngA+;sn5whQ6+jjvrr!>i^mx(;;26*la$T(-0mV zM6EV|5;_BFz$$UjH5GQd1)8dx zW$%Zmk#1*hIjlV+=?;EPa9k=7g`$b#;sWMW{kp}nRc!428shS@9j29Ip{OZjyKMj{ zG9;eH^E^zu)Bdikvh?_!mu@q(n3*v73Z?HG|HJ$KtcH9J10IQl4im gAunrc0{^W1Pl-(m{G3O!W1aTUgGKN%6@}cL`d0sS5o>yped=IE{-7;x28@w z?{(Ng;8?o(vZal2UCV9SDn2q^kz14h;ArvQ8^O9iIQDs;w`*7+VDp{f_ZlWKjr z)#jWRvnDK(uc_Jn=1hKh7{h^v8aJ_m2#-3&dS~D8ALfP$ET*!d=Iaj$ESaLv%HXJJ zadX**`|pc8)DD~|l;Q1I%+aL4pv!&XZJDLtiIt|8wDsLQZsnLs95p=my!g*?kHg2f ze}skYh-*HqEXlpecGB}onN3VDlz0sp?)p^E4K+@`E$^}V!kg~`uY(tgCWzj2SkAUA zhv5~wSpvTuPll7r+MOC)9ESz0WW}p&`9(OEY-(cc;=5QH8+dok<}z*b-~0I2y#2;5 zm%ceYifxa*+WiUnz4IqbQQ=IBY~#^CEhHY#9paTJbKGK|^!~uRnp-kXG?@4ro-by5 zaqMZ<%Gv6Zf0wV?sdn1z0IR9imMNmDb$a0zwKG0V)~~O%Gci?|KU*m}BkiApw!tmN Y4DJ^lh1J@%z&K#=boFyt=akR{0F^SkGXMYp literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/edit-delete.png b/cd_utils/pult/icons/edit-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..87cd0b0125d6193c16c59f25b88396493e885f6b GIT binary patch literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vkfLzW3kH}&M z2FBeW%xLxI@gtz1WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~*<;sHJ( zuK)l4Z(v|p!N9PVfuWs&p^JfGA_Kz=28KBd467IzAX4jDSb*GiKE6H%hCBv_Tn2_L z28Klp4AZo=>*d6nRHQFelpgl-Jed$XS6*hniPlkf`z7+iOXNkDC`v6+mRl+(v`kK5 zwTk$9b?ME9YMZs?_j%bL_HsDk<9sU2r$Je2`?nP^4n zy$lTd7#Q|j8XpwoI%I5o$k*ermDN#8qhmrm$Ax%K+S#3Uu|MtSb;ix@0t3SZA)d=& zVVA>0E~h43Ns7Cc5PLm2@wTwQZ4try!urld@myOUR3yfXZwfVuCELX$$gHBz;HAv3GxeOFfuao00U1?PcLu(fWV*& z*YDnY^6b^8FJFJbz;6)v0|bBn{{8pwYTmshp#IsOE{-7*lD!9A#hMrxSP$@P+)yej zFHd4mDu4d>{K5|<=XpdH-eIeeoFkI5#Mch*eE5E3q& zsDJ)QWe~HZu=JPqwHHm!J!tPMoAuVM<=A|yGuL0$MD)r}t=B23K4h_=$wxfq{j{s6 zvbJ;1RM`0b{&%I*Q{~<_^9mg*KC_8ox^*ST366Hw_&MDTLh{a=g|okJNlO7blfl!~ K&t;ucLK6VLNBNWh literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/edit-find-.png b/cd_utils/pult/icons/edit-find-.png new file mode 100644 index 0000000000000000000000000000000000000000..64a1e28d3afe98367cfe6e0dc06e617fd3045772 GIT binary patch literal 1631 zcmV-l2B7(gP)MNw`U7%Rx2bK8Bi(|P{(xd5FTJ76}M;B+{UX?H*-l_BDd$m@K* z;M=q`5flm)BogV($cTt9+2j_Jne%fHIyY=Yds`af4F3(o!_k*TbFVhQ(|~VO{~eZVwoZ78xQj3UAZcnMB6)-8nqf0 zs=dQz<5Z}eRl$)-O-Y5xXn@ORfj@T!@_b%;u0<|2X>H9sR)v(1h=_=74BhlP9mrCP zu&~I3b&CV&ZD~MndlRb5ixE2|7CH(@yBwNUHlks9Jyb*>DKYUTZA{;>E8V;M9W+xp zJXvneCp9?*W&;B^BgLZ9Y^+~aLow^ov$_H0g}E@(WW639ekg?MbX%iT!X`>YZbmFh zB|N<85TmKkigmSq)R*`m7YZO2iMcW?U9uGW_wIw1nsMydvHqy2sHLpr-J82{{QZ7z z&oCQ}&?@9`O8M{zqfxFEV3|*Yb+digzM=+=vvZJ^B4Aa!N86|Nv0f#IE0r8GqS0(g zM5{ds9lms|^NLU@n+%sU8N8Snw!T5RO!kP%aVI)Ddi8IeOxNvFvE;5&p?v6ZdxC7! zDyQ?|PM(NG#%XA@@zLrMVuLpgOAJ#{rH+R&BZcdm5UOQRClR4IeG=*!9@g3u(U&hq zZ%#UzjIl&09wlZOSN{p)$5%b?aEXbDaq(h!Fp87m7e!&AE)MJ6LiEm@j?HcXHaVwa z`)md|W(_yuA$FVXd$v(3lnLl@C*wqg0+;LbxLCvBNQoG$iNO4_0&W6mS|+@}aXdzt znu;8kl@y(X&MX0rl*%wzt-)YGj-y4Sgl9Ttda~GZ4TX@iS*1{-wyGT6C3>9n3vsPh zjgKlsI8vO3zLsUk%gbXAqOXQc{_LrEot3w_t`gneR2(asjw^H3_#`04sYO}nT+;~h zp(ak6$-TfZjFa~J;JiQ;j&0k3&yMWCwSj#&+_wdDD#~H8SZ=Tf)r%4!8%Gh172dWVk78Vs16%!K^ z7Z;b1kN}Fy$jB%wE32resHrNetE+2hXlQF|>*(m{>gpO98JQRvnrX&tshF9W zS!l>x>ZsZnXt+8#cqlS>d3pKz`ub^d`uX_<8_R?S2Ze=&MS9p~MEGW8WMqcBWoBk( zWn~o=vQON3vRn3KWzqag8Vm&QB{TPb^AhC@(M9%goCzPEIUH)ypqRpZ(583aDtGr;B5V z#MI;j1+D__&jtn`IEoMd$ocec)*P8x?>^-S*iBzCZ{MahYc{Q$ry<^PUhnzJ?6r@c ztw>t?TJt!ch=9q~LgNj=AsY+}HXDkvWCav`{CMp`Sm@PjAHEd^K1vcOGB7Ou6mb1w z;O7D(<3fQXf$bakxeCGr1p^Deac?shPo7|~?Gyi(Nr{OQKXQH9YC0+5!PO#O&aF?9 z6CP~l;Vr!SC^g~HbfYO^326xlViU}!JV|G|b^639jzYybjq(f(=Z{Mqoh4|b5A+Fx Mr>mdKI;Vst0N7E%9smFU literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/edit-guides.png b/cd_utils/pult/icons/edit-guides.png new file mode 100644 index 0000000000000000000000000000000000000000..d26483960a4dcbadb1f43e5338886914f179d9e3 GIT binary patch literal 544 zcmV+*0^j|KP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00!&;00!&<9(6c100007bV*G`2iXV< z7c?snYm~(R00E#$L_t(|+KrMwYZO5khoASIo!yNm$8O|E8he{GqNU=uNN;Zus-Gb4P}#Y7A?ygXPKr96UOJL@!>R*>ELDtA1kf(LUSRwVPELmLx=%zus$aSl7`2@O146zfYCK8uCTp@eddeLoc{v>-MjzqkF`<&0000j6lR&1TgAAr&ZD!k+qP}W%jJ@CJRS#CRRM9ND9TBQ-xjmkjMQ-h5{U#%r&Fla zYOo82VSMr$Ij3T=SddLTjly+Z+O#GUI#oqsWi!YTYX~Mp1c=N6n29LEN`M@2&z|S8 zz?K6UxCItq2SjA@zXAxJ_(ltgM1XRn1uCLIxCJIj9r$!Vb_lQ|29qtzg5l3_{kb(5 zjm9I~{uX%RpAOcb`;j_K(Y$)So_lkBnZvay{frS1X+EDb*~^{h3eETC3$-v9491ub zaDdSvvJu4^P)Guu8^Mp^E`ked2vSpt|61su;L2ij z<;PH$U8o=m7C~3tWcNTG)J7{b*F~FWqfP8t%?xJ_=iHei07;UR(=|yPDj=vjL>=voHq|p#I-L?Qk>AmS zzPxvY0Nbw1lMihQArOM+`NlI`aTj%p_iiAI9|$Hw>+3_T2;aNL;`?_!mV=+Kn@kKz5^$Yl9iaBspAwx;pX{S z#-xlBhlq@bpn{6fn5pNER231WR;dAk=m>$JMxhWW_&>=E-TxetbB4~q4s4q*7xMMe z`tqTiLx#AA`>z)1x*vO%1$<bC>TR zB179YWoA}u9idFEyi8O1+r)8vEX%UVenCc{Z$RQW{+MOi)^7ts%?QYKD)s;X002ov JPDHLkV1m)``fdOK literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/expand_s_y.png b/cd_utils/pult/icons/expand_s_y.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e8f78173c175483a1a98bff2ef435bc6ac7265 GIT binary patch literal 577 zcmV-H0>1r;P)pZR(Utz}U)y$1I+ZZs8Kv2x`d2p3=gC8!C(U?VCUV@$jgNlX-R zi)>vH3`HxaDxCIkPE*eJy1>>DO^h(fY$ln%XXb@dnpG;5QW%Dp0RO+a<#PE0z(t+V zfU5zZnPq4++5|xkGXo4W!<>7ywV!9^->9c~@kvb{FRy zW;W{jL?$jwQm_)_97=QCzC43;H09FT60Ycx7pY?EYxQF^tCF;{(@^v4XHBi%)VCik zMeRLx;z&snD@kIdX{?2Jvr4-i^?Kc75CQN$Bap-5b9iOQgC|Gej#fZM+keOV48#4t zWuHN#@rh^aFGxrju@UCRrZAUdD9AIv@{ogEf)x|2TcVH^cyzsfoWb*rmn1IXaJWs! z#nj&{54tRj-($p|L2-ehUY-Zz_y1(Dxw)n7?JeDUJ)!1qsOD~{-LR#-{r!R8cy&cl z6lp(-1`G_SPCwQ9Ngio=+D1?N%40#LQu%0R*Zv|V{X(9S literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/expand_x.png b/cd_utils/pult/icons/expand_x.png new file mode 100644 index 0000000000000000000000000000000000000000..217e3eae51e02886363f3e14aeb62ec7435a1fa0 GIT binary patch literal 579 zcmV-J0=)f+P)%Z}XCd`boz{X>GMd&T3|I?#(&(&JlnpitEP6L9farDlW}D1A7>uj{~Xfc44i@Q zy3Rje=$xw?i+wqLhS);o#a$ZaYfG|#4LtWZ7IDu0!?nE%;KIwZj8KH2!QAU9hV?jm zKNPV-`PD@{j|MAHgeRxh3H%WHEzj-Z5;MgcG>yk;K=srrI$(_*1s=F_Zl0i-!>Gfk zBP)5zXRaY41JgF{z4xW%LxgF$6Q=RbZo)7;nx^T=c0dk5TY!XN_%=<``fn;9*V(uq Rx_tlu002ovPDHLkV1kJN18@KU literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/expand_y.png b/cd_utils/pult/icons/expand_y.png new file mode 100644 index 0000000000000000000000000000000000000000..fedf9368a2fa13d85cb05ea6441438619a432d95 GIT binary patch literal 577 zcmV-H0>1r;P)o>cu7m&p0nSN8 zK~y-)rISBTR8bJcfAjX?%3F#xX7zhO43(}_R2F;%V_{(>5dUC8FmaVc#ER(0uu>aM zz)AxaHdcfL(3OV>Z};w7+KM-%U^Da$f>?+-V)803s37FHIBI_G)%{z(s9`E%_}jndC^JY1@AFngdw z4)E;LbFA2f%#-4n|1i%%pO{^mCFu9ai?$rKrP>iS2PJ89b3^rSUo`!8Qaiifl{9wM zbcxc`DNUW)ZKs*VTWaq&)#>aX5fK3IGeQM4{0}nUrC`ESAPlTW(P;P`yw5OxGq>Ib z%ePcllnnT?fy3T+vVXcVM zS&_TdoB1y@qf-p{2wX(5Tjc)ey+1WrU0u`q`kKaG4y(QutG*R$E8f=b-d>(#uZEQ* ziT08t*T8_m@yA*|&LPc>TlJ);d^xOCDxb}4Px#24YJ`L;wH)0002_L%V+f000SaNLh0L00VXa00VXbebs`@00007bV*G`2ipf2 z5f1MO_vl!NDy2!q(wRLC{lU>hk|7A?&#&NUx#3*NsEGh#?SNe z;e`kO5T(>j03J~;Y!}|myq)P3w~KYQF!|eTeA>7-S(}XK_vV#SNQYh!3z!VQ7k4G!;ogP ziSPSFQA8qV{b)8Hm!|3QJxm*tUCM>uMWb@|N zk(VREhnPkjVsVErLm!x?xwOB(zj$zP(C_m3JQEWW%g!z5DgQg-IL=C=(Rh4XTRNSl zQmJfOmNnaMw^wVm+T0+Yo}S(;7K^j8wzhU$E|-%)Ut1ikil9pxRc^=(v7tizPbUN6!eXiEiT>GUh2m+!gLPXFsjUWil)S61AP)hZ=mP{rC zUDq#anuds=RL^xbn;p`6nrAYZ-hg2kD~{tVA08h5rfqzDd>Oznj3vi$7SH1-rQ}~U Z{sb_v1Uf{wNjd-k002ovPDHLkV1mj;9L)d# literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/item.png b/cd_utils/pult/icons/item.png new file mode 100644 index 0000000000000000000000000000000000000000..50bfddbfa29e1b8edd2d07e365d3d554eb40581b GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37?{gIn6dV1(;1*3dx@v7EBkGB2|+ytC)E5ZC#9Ta_AqPjcJ8oi=#E=; z?DoPf3(O=mmZtwX|FHcq`=9Rt<{pz$>aFI+E!JSV_`J$!X2Q-Gxt!Z^{9-JQ3gX?Y z9ULw#%Q6f0-=C<$8FT&Z-OYIdZHhjZT>?ckP777eQ$B6v68PmY_ui&WI)ZJAU5gxI zuS@j0CGIgTv)5&$)aq-#J#eXJ_2{`!`Fhj@H=?B%}-8@m+M``_=&9uH*Pa^sRo>+4-6M^5QY@6L)8`()!D z8fv>uG3?t>wHBal3X8;U3up(2hH7+uIwX<3@#U_6BHG40$;U0f=WUPf&NZ7|$&es% lY+CWY$}R0vCeSATx?0 z4$ACc7(^1B6N8F^5>P=@_#xFcX*|1YeYp_A1C;0U<^6ak**RX%Ip1D;?X}nU@r$3Y z5nj3#fRqtrbzGSaEEv~=gyt5>V9UAy)earg4&%XueGobcmo-wK?5=FFMn%F4=$ zkW4OIxFF}wozoD)ICJKVl$4anl`B`ePM$m&MiBP)_CH+m0|ySwL*oAx6&0z3IXO9U z`0!ylbm)*|WMn7+1XWmAsPP>zR6B9v#4!#I4!W;So|>8(!m5uRJu0hKt?F2?U_qXT zhsVFBOqmkMz`vt>e0(yOFJIogfB$}hP*Gl9-o0$uGG|LmOWpTQo|Kg2&+5?krfJir zEyn+iGchr-!J?*SW@ZM4g@uJF!Wz$h?d0U-9T*r`zGu%KDJUq=z{Gz5!UgRZ83;#5 zN8S4M>!+uurwgjv$;EAKY|K9Q9e@~c8}01uJa5H{6)jm=S=7eA=gyt$IDY*25n-?f zogJ>OuD*J`-e#oA23S+v9Q^(Lvl9~&38EFht-g51*R5NZIcd_QKiJvXSq$L;dIYOA zHHKl35#+yr>E-1Wy>H(>inmz3Gu&k`7<4OFuKd&d`SbsXDn1q9f@Y@jUE??Ef>^Bp;%^YOczb(0>U2YN)WyX`H;_hDz*2sd zo12@)WKcGP356hdrwLuWcu@tP;oVGpGZy;cw>l#eR&(ae36G15t0xOzG=`)UA5De1 zv=C>k*0>U`^vnBniwt}w|vNOZ&be0g-Jfrn$TefVGty{Osix)5C#*G{D?AbH9fB(Kp zUW?!N?%k6|j~+=~U7du5g$b-%0m#qK*T4uF3NtdHM=Jyv=w;4V&TGt9;A_r zkY>{U?%g}7uCA5`4<1NkW2017RVfxKpo5y)TB*N%TRkH?+1c6Jh7B8p0FEC&u7MF2 z@DC#sI$K*?LuhE|jNstlF$43Pz|9;%V-M7>vCpKjy}e!DzJ1HSDhBSN;!+6m*s)_m z+buDQ^3I(*eL84sYtz=QT}wf7^U_!ZChRZ$G@*}*iW)nRdUL#Zi^!9clQksJ*k=MD z#q2c~uSWIppc$3QrcIlaAX#O6e7s!0eqB(tVyvU1L%@WVnVBiDW$o0dQ-aNG2FB35 zH)nr~R=r2k$E1x6AfeXU+A6PKzgB&&si~3DvNDMQy+J`ivUKTEf!zwu3Iapoc|hra zV49norK_t;Iy*aMVTzW$1MY7%0LW=KvMhrrBG`!Mijj9My!B6Eu^PJqDRvy?Qn6 znC%c)b8N3DzcUDQzLb=dTcna>hzhj#@846=N(Tf+TaCbkVB=y!bzq@B_ze?$`0zmh zTqP%q3<{VajvP6n)(Qv+@EFPuOc3^%=PHaNM@z9#Sy`z@DlILIASgsCT*AY{IkKuc z26fQg-AxvhfM33RDJ?B6avP%xuu9+r0kOBR6+>mKQ%ow7l9N@n zWPzY|?b@Zzi9J0%y}j=P@bKY7C1QFD-(>(u8%|da1TdT>TR@z@2OAXx!C7YoFcyur zylvYy+AT#U2M->k@<~0D_fgM@sIRZ5D{>_19|YTgwSS8Z%VdzegP#NN^7P%icV}Tb zdT2bX0%rmZ{bvGJ-q&{qK|Fc#M1wHZShHRH2Is^?>Wu4-^sgaV)ciO09ULzpYEf5oNe0>-dF*iD!)VKPS2%h%WU zuZtEf3c}sr&CSgR&t@2n$Jz+q@Gbwe)Aa*qVDtmZXFuKR|9|r7A=3LD`2YX_07*qo IM6N<$f}#jh3;+NC literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/layer-visible-on.png b/cd_utils/pult/icons/layer-visible-on.png new file mode 100644 index 0000000000000000000000000000000000000000..b24055207626a181301366abbf9c9992d6cfb1f3 GIT binary patch literal 2001 zcmV;?2QK)DP)U5({sLAW~f0Da+&l;-5${=cTUBtIK+XlUq53WXx)^&S5;N1&zw1}|3ySZ1Tr!*P+ngC@Yu0qVH||Hx%rO=o}Qk*=IGI*Pvhd^ z5E&VX&6_vF)6)|hH*UnHO`F63Vq#(t6%{39Wo4nVvhpK)dwUBCLh^&bv$M0e78Dd9 zARquvPENhHwzdjOOUrl*3kyHqR#sMVGiJ=FSh8fvy$u^SV8@Of*tKgHh^=8_XpWwq zp5%Lj@7=rCCnqNdME_j^+ai%jtc{F}OpJ|<^$ZOSrM&5XJrffXV_jWcEBel=*|TR~ z@bdCPN=k}ADH){{{btHcSX*05D9=mj5X_u8GlxF1B2fKrdvDsbX;QkeIkB>a*y@zY zWX!~)l`B`;+Su4kDF$Q8r^d|8%!6+{Rb?|nIyyQwbLY;jWNlE@bkWB~-?_#qmlXu= zNYolW#{+a|OKIzAw{(IMl+ZG>v$NX~9UYD8>gxCSJCh^RTDx|w>%4jMmYbTI>Q4at z0yE9GnLmI2@2C>|eSCZZU0hsVrO!*wb;pXg(t@k`2}q=%PNQ&X!B9z6Jj#mTi#LPc(FF7os9zuv!pe=SwRA}!t0aoRAV zO4*c_mIilsciZQpQ|(HgrICW+tNd#B?%kzqLhJ<;Bv|R*-rn%_^@YE`KY2r-`0UW3 zL!jU)=p9RbckDcUeSM=jbLK=OCMGJGh3`~`9Q=X>3l-hN26Ey#A6c^QB;Pi!d#K_*p>eZ{r6~jfVrko3u zb9P4`ZA!)fjn=JO_b!t%S*M#u;#x!C>}-OEhX+zqQ_$Pfg_4HPaQ*fu&VMqDs@8u& z(WF7$pNG(J;|rX8{}!BAcwkFlfEYkhQj$m&K>mj_Tm#|3l5y?N6d*nB-D38QCf_@wzi_Qv;<-P zeh58(3*l++p}775f?_f;I52?z{(g`N2~>Vu8GIgyQ3tXcgE34h&;QOnwbR?weg&#= zp{c1!=<4bc54!l_Rpd1c!ROoq{5mQdaoeMDw73{lo^V;R2v+jbaBtQi;YtreQVO8H zc?-kC!x$VK6m>+Gf?O^aXn+|eoat;>6FH&2v$OMh?&(~1H1!C4`vJO5Zrr$up`jr$fWE#y?A*CiAOizU zPCPGM=aw;%HS4fY!otE7oI9qjt*uQM=YK9!shd+(gf;|ot%p2 zwRX2 zDu=_?6L`hzAQrBX!80h44U51B7@VmW_q}`fpj0XaEjX2KDRBGFPO<9QgxHolXh4F>VD7qi>MM`_m-tGi%nYwe-wEYdpr<;H5w1PdmxD j;H13A0u`VAFR%Xq565XnM?5ki00000NkvXXu0mjf-tF2E literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/list-add.png b/cd_utils/pult/icons/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..1e03be9bc896c5f6d8a943ff9d153b42b67e6b16 GIT binary patch literal 564 zcmV-40?Yl0P)8Z)0JRB|3DF3=|YfF7jDEZ>IVpdRI~vVL~%?rHj{Mb-aA4?aN$HkpY6+e zIJ}%A@;qlRND8>Ne);a1hpoZcM@ORNcT0CDpm2lpt8;$t;5m`HA+Mts_V&s9W~>cf zetj;y8B(ff-fq3o6i^ss-tluMK}bpJ9RCvtKmqnoV4WvU2M7e2b^n@kK&}DWEA7Qj z+`01X%TpaFO`sJG5esISB#+&7>@2gVH>sP%}a+DuI`p-7R~pI$1Y5x z9J%rcDSiulyep{dI#Oy%ghc%waq@#~ax=Pj`qhjEu-38}b?Q6+eS$+ zxgkjtHlh#o1_P#oDl|xq z)$=3opuA-AQ-@kiO_W*dZ1Abw6Jy@#*R^Fg!5P*sA&3jgil^7k&X>BCo8zhBfN|0000j literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/media-playback-pause.png b/cd_utils/pult/icons/media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7d128ee8728707a6193eb41af32b4e28890533 GIT binary patch literal 1145 zcmV-<1cv*GP)kdg00002b3#c}2nbc| zMg#x=010qNS#tmY19kua19ky@)q>0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S* zE^l&Yo9;Xs000B{Nkl^Bw_qq@)F2oWehM>5RxKr%Hm6}!%+eJ5;P+bTi3lS*+iMTL0p`m}$nM`IT^X~QY zaG4NCay|}k4)2`reDBVC=eR(>eVF$r-4qj)1*i$D;c~M0PMbdKBbY0P8D8 zNRZe0(#=lS4j`Bv4AY$T#V)(F>5$@qgbX?I43H&hGVkVQTK`M%-dOl9R8v}PlTfBY zi6Kx_XPp{e(V)oOvODwsMjyfSW8sRgbZCm;7>{s>LF)-A9bt!GSz(YOIg)jEYVNmv z1n0)Wim$Y|!zjl&!d>KX1_-1=S4uXx!c9g*BZ^}mZ1f1;9t>A~RnmD}-Nz`9B_lW? z0AARoLt71gX2l*QS$4-iYC!^!PWx(`EtOXpXIQuMLe5;j%?k_(ck>KSD6@^PrqfZu zTjj9UEjB3e5=Y{bXGp9+X2H-k6+2RKUOr5==^p;LmOwhwEw*SeNk!$kNFa(HGKK-u zRZ!`3w1jRkodNeoK5Xumws?wX8B=*yiC?HsOV_htc8-SPJfF~|t$W)nvB)6?>h9je zpGZp`B~LIKJ2`?1ZgB&mdA7LD28rp&2~X$v@KS(GB*rNxdAP4PAj zxg#Mfs#4O^iJuSw4-k|P?C3C|O?k9NW=@#Snlh&M2Y27mKA zEr?d9!3_>$)>9G;NvH)J4GS>GWR~PWe;o5}V-&T-|4X2-ix-T>&Ur*`wm-HEFKilt zuO(p>asSD#JyU84ISQ2I(R#6!$GlZj6jqaPDd^{#{VCl@kf+FqJX$X{f|z$rRf;Yp zVTpQ%9ad=4p(}V53{#Rv>&23686AG2DFW(Y$pv2iG`yw>$eTRG5QX?gI{s@akKaO# zckR=1pMCXu0%0~Z#l`}6XweZQ5l`4(Y|?dCIiC~I12n@dB=B{O`HcAf;wlaCw*?)k z!5dP8Cbjkdfj`KLfO%Dt1z?WJOtrxGI3}@zeM2oyMbus8-%>#3%c|NNsxNA&2Aj$E z^C}f`g1y`TNQISea-KDt%T7aeVQ;7!g~ocQ=#cPC@ifIam82kQ`jKyNcEl<_wXkoj zo4qiG7K=BbLmcH%?&C0yTk3pGXxP9Lkdg00002b3#c}2nbc| zMg#x=010qNS#tmY19kua19ky@)q>0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S* zE^l&Yo9;Xs000CGNklrkmC6Jy9WesR^^K8P&yuG_6BOq91w;O z0FIbYMal#}U|XkRx6FwT6Tku#*>#;1HyPf+y_n^2g($1BtyaSfaR;8k6ZA~sI(gSC zc%vyhSu{W$FX5Pt^Vi%%4psu)qlr?gpwL-XKAv1R_HEJ~1I0WF4?Jpm~W5GYEj ztH#jhkPumvF9GJYitJ75H}MpnMT6lX9Y15XR54~N2ULy4d;0$f``E+=_o>u3cZcqz ztB)Df#=OsD0F^qVjg&%)$pL|--KDEznj~;+%&Pn%Kky?%Ctk&nW;j|!4e%6}nAfZ3nxTO315g7c|Bk-L zfaG<;pbU5l8X*cRv9L2JXw=|y1iD;xnjS1dKkxTfK@nT`F9Ew5D9F>4bh~(rnSG8{ z9IwEKi+b)Ufs3v5z@c9-(K+Snz+2!?KjqVA*sc&7?)`d7C_O6|h0Pt^l*|)UbjczO zpHqs6{c1tr{jM{Ly^B^h(GM`fHiqD-BOIzeI|&rCUIitq#~4@XO$B|~3_nj_UbE*a z_zsUE(wSO(Of&e;r{TG7?{D~uDlKGfEwz9w%aCkX=Os-r_7})Orh+paP4EeXiDW3t zT2Q`-u^N!^S6smWBcueERN)jwd!i#FYW(a`Q(s>b2 zBl1;=3cRN8@g?$5rZwm&>RT`nX;=;&DABsmLiTnzs1o-Ne$v fC9`oMo%a0)Lk#jiOZi|800000NkvXXu0mjfdhQk9 literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/media-record.png b/cd_utils/pult/icons/media-record.png new file mode 100644 index 0000000000000000000000000000000000000000..f926a8f27f85ef68165ae570e0237c53aabe19a9 GIT binary patch literal 1843 zcmV-32h8}1P)lUEc!{aPp#3JQ)<`D13Lv)N_>h<(9s;-2Q_ zc+qG;l5J#}ye#g?=tMywWZBd$S+)lRkr9X?WFwinEWq?ZW{{XD22Dsb+oUx%LH?B% zXuI>f>G^W0aS(5Ma_@J0@A>`Cx#!+{t|b ztgp{7jQ%4>j)YgEcSQnCO-(KyQ^(CpCg8+)t|@UI6C(zedWO3?x!rK|=uzKG5ol~| zOyU2&;^tunbSy0`(c7p-5vo}5l6rKP12%G}%>&CJZu#KZ*od_Lu!^z?K^ z#%i@<-c6Q@IXM~L_?Jn%f8xZ6yDubg^5jWaJ`8Xunx39kfL^bc3JVKq&6+i2 zx7%TnDJakZ5)dp6Nc;VMx_b30O-)TvMn(q62#He0@jpkPuC5Mi{wITb01lUL-MW>w zZQDkmIJziJpXmxX+9$!M0EhiU_|`RojWN% zKOf)-Af14aNEGyoU_2~^!0pQY6%`dqH!y$&Oki8N)6T3rxYG`%rKP3H{cG2*1-Q7> z1cu#Hm#FT_xGQ%ac4P; z6F~!zEnBuwR#uj7k*O>?`HXyDe?viDPYb)(2rp2K=Y=PHH23=-^sJ|s3V-;Xl5$@K zfOrEQR!idXcvMg_7XEj#lp75G5f4Bo0#3G?oMg)^_n-ZaLcGUqOeP6pSSZwa_`wPS*uUZd z5K$uiL^Ho#NhDx;bKSaiz!Cy38-uvyhC{T9>&1F0f%Xov!815aQaOm2Xp)T;$D*{v z@et+cw#u$Y z6{9g8#DX?ND~bAaOoKsv0xWAUu175;t)v(#2wgnd#0#?$)cEF~`aiX}NXOUp;gr=+ zPak5yCjo~)<(`M=WHLYefFf8b7FfK*vcRZe7S#AgKmK>}SREW9Is<_Ku%u5B7{fpW z$fHM(^Z-F^DtM*l6LP%cr6q1JGN;8ja5$of;9K?Ey*nuT(~ouVW%};lzpt=RfNgO7 zD+_`T1Z0cA6FLDbAief;JEeHN3>G!P!y1X?9c5I|(XPho1ay559y~Df2w+=_i;Mr^ zL0=G)M-1S=z&(KNn7AXX8BWTst|EgoBDD;B{KnEa^I@yAzC28M=e|{AP{i#3#-)UN z;M%ooG&(wp`$6)?T6G)N)YSaQ_2+U~)YjJ0#*G_sD`K#mj3$v4iVhBsLMKu+q3ym-<7!nFM0!GkI-XUT^$SOLYmckiaMvNEwmPtWwV zhp6T2?d`>X2sjW%Tczb49UXU9e3(>LR_1ag4-Bt=iG-&4fjeP hxBD+$y0oh2`F|miFh-s2`rH5j002ovPDHLkV1mqrSN#A0 literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/node-add.png b/cd_utils/pult/icons/node-add.png new file mode 100644 index 0000000000000000000000000000000000000000..80b5c61c6e67c8a593e30a12114e28a2a61bb3b7 GIT binary patch literal 694 zcmV;n0!jUeP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L00VXa00VXbebs`@00007bV*G`2ipf2 z5f3`g(CHQc00K5iL_t(I%cYP@NK|nYhrj=wJ2O5KhrmV+O)Mmhlm>MXZNf!uf(UAx z6lS$-QBD{HNkR}-q!O04&^Fb=AXLxp(H?`)`r9i~+yp zIp_DC!x3ZAXII`ux>~2^hg|?dfOkh(!dGccheug%Iz#N=D^J^(HoxxBmCTutC+N_ ztLyN2CO}+U$1oFY7%Rk$MK%l-FgpSF?C;qk?Xvby*jE<>{W*#m?eEPx#24YJ`L;wH)0002_L%V+f000SaNLh0L00VXa00VXbebs`@00007bV*G`2ipf2 z5fC$bR$nXt00I(8L_t(I%Z-vvNK|1IhM(`=J2Pg9Hj$$vSr|!RB}j{cHZ_ZC(WXV) zKo=FXkTxM03dsmT1QHlTwustjyMjn^jEaIpltx1`bDYY*adMoQJNN%Y&7MB!(?{Hy|+JvrK6b+ZUkBpG$_M~zsD{cTcl!J|7yw#lpT=av`O_d3kS-`D3&Uy8&ju3c&rZH#-5oavqOAF`G1HOS{3y~Q)>I;>C20TpF$?lLs3;?- z2m;MynFR`EV1FVF(^N{CsdMh$ZTIfp-LKu~EQdcYOOq?nITHLN!8`?=p5W^0+A7AZt-IFOoa=th)A$ z-9%_J04aD-)B}|aqZo#gB1(za<^~p&ypVLnhq--B#K%Pan8y#5m2uRC`#d-VD-(W< zAcz2g1xS(%;51D$l$W7!h9VdMScYLCIF1E?qXQgE^FcpPlRN`S@hru2Ojr;^o)iUM z1VG{_Nnj;Wlq4w<=AsfGjfk?y%Mvd~Lb4nM0s}-I$RdC>5C90nB>*A-Kq~_Pw4ok& zbVS`&Q&o#3BqklsFDxo9(H6!YgI$I7beYk%H>r9zG~Y}{eO=moqs7wH+^#%#N~KcW z`=ooJOYuvYva?%PtG_USq?~zszIxF9rlG~$tv6Wj#xLyHpOu-SwC&R7=MARY8nQ3F zJ`kL%e{9y+zC8b9+Bv6PdSGrpwDNnrf*Hm$PIlTmRAcwY)B7L2%KYAIiBhvirdjvJ u#=&`}$)5F4Wz8KypA;;;wDrx;G2l7IA&y5dTpJOVmGCB;F+kXKm7Lqgo literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/view-refresh.png b/cd_utils/pult/icons/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..afa2a9d77403a12cf6808fd4e551f8582e2599d6 GIT binary patch literal 2182 zcmV;12zmF3P)Dnz#_!jKNQq7A*Lpp`badk2@PWXqYX-|G^Br&q=F$>Qi+zP5MsM!mpA*k zuf20;?#!HXoIAVOWm%yVoA{l4@5#OM_&bhbJb6n1`H5BQ;7S*8aYsrg z(%8Ii3;uED#FnEM{<>~)`;y+z_k9UfuL=Wd3^^--)HY-9vi9Yh?_cu(n!Jfy$zTS8 zFo2)}vyvn?9M|-r={nrdg{hj@bLQ6=E!AfxklAj3tAllJUis0Fqv}*~qbQ*$kCrho zG=SmJ;ke;A=O|2uVNMJp+ zu;cEWP$ayjH}ek0J-mASRn(kXt0W9x0rd%pBpxKBqw^{10_ z%oVjGo>@EUS*iKf;$&9;O=?7MYMcQXV9*`JiNOiUq?uH19(+43b^r%Qh*N0-8PySL@{C>NTq zmAl*&&j?%;7m=-I(Us~#EHN?vgcGQQ0hk0J4Qw(qsrZhsSEW?J(B&a8Ns-d@z$hB4 z&i!^|7&j3whr5FWPw_8BZN)_edGBODPKjlmU)OlN& z4dJ>|3B=t!-WZQFVw^yzWIt}A)jJn2p(fkv>~xUJ=8+4c!VW>LUW;RQ#vRl~YN%eT z0!}M&0-I$B!U~}7K&Z}?pjDR^9 zW{w1fBn%*okZ2@|Mo`dfPy?U|ddU}J(~;eB;yI9g(5#EJY7>RVjYkxMPzh1xRX_*Q zgGN}L>lt#-?Jo$$M-mwReI4(mI02!^YNO`Zp&|eVz{136M>f%FB&97#EC=ugZbOBQ z1{xQHVXx5y)hVYs5kve(BsILL3O2L2eVrEoM3QY?Kgcb3@949XR>=y| zN9HIt>tOA)An!&l_%Kg4mvO7o?ddELGctBk@|Iqbzuk#2Bo z&hBJ8ZldsmjWTmA?MYAi&~*-)hk2IVeh$Mc&Y~^q*Rk^U(roGHs0>XDKJW)w2D&} zLr@aI9y*b6*=b_SODgY>+mHwoplwY`2+TZC2}AP}PN!W?UpF;VD9pM2G~W zv=zcESwU4AVsN?%Clyk$t6K5CULaO>RB3=w+Hwq`F$PVc@dDDMA*^l<0R@VEwgoBC zK!`SB>s*LjR9s;~MEqP3GO_+i2^oFJ_AnvesgxX9l+N^$J}LPp={csqlMPa&i2+9F zj44oKhzaYFr6Ez$U5wc-8i@dIWNt}C(P%E(pO2sm(K&6A^9rN6E-jV4e5RI?33*KZ zT*_Gq#1IGMUb2DoFS?k2bZmYj#*0&+QxLHOlOr$$LS29}0T6%)0v1HT&Bz{0YhaLo z5K{6CO^Wlcm!ukdMp#^1ui8avBL6 zumS>~gG4_FIunN4<@%g)A+7>w`9$QyDB!rPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00!&;00!&<9(6c100007bV*G`2iOG+ z3Mv{e5wxxV00EmxL_t(|+Le(#OT$nUhToeAqSPt~7F=}E#m&jxk6AiZaa0lNq(4P} zfH)N?Iu^vKpin^+#eYycXiYUqwMmnEJh|qgUb6VW!%Z%{Cnx6!d^5(*;eR}`Z%A3D zf0AUt3?L=Bt5&OcX}2K&OcV-OT3iH#fJjXcY%Z76kFfBIHit{464ut&@$&o(%d%kG zHf%mwez&n(k>~~l%>WEIr1U}yH&26j?*UCmqS;}c7-zQH5XsWG;o0^C8zPoE9-x+R<0fk-=e?aDu)R;z_Zqk()ruN)c~ z1ruc!Na%Fw_nitCi$x^xkg>PFe*xgi+=80=&ap@Na)&mLe2Qbq##F1-NJ>eb=TUjL zd=Fp}8nb}og|vF$(W@6FA+@%8y-u#{>hKISMuAMiD5mSX2in@+I?wvD-pM#SuimqX d*h@Bm!56}ZCMId;HE{p{002ovPDHLkV1lrt=VJf> literal 0 HcmV?d00001 diff --git a/cd_utils/pult/icons/zoom-fit-height.png b/cd_utils/pult/icons/zoom-fit-height.png new file mode 100644 index 0000000000000000000000000000000000000000..32e2190094920b70541fc499e4e801322af1de40 GIT binary patch literal 929 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V5|-B32_B-@q^H?(2$Vey!^bJ z+??9FnvTx)a~CfiK5^>i&6~IH+`e=74rj)Dft>fM74Ow5-m6!A(5ZcI)cDc4`=i%{ z&;FA>MbG*YJM&%KtanNCzm}~0TD9(58vQ_3PJf*sx*a#*KTge&2WP$Eh2yPv3fb=FHi1=gyx$f8o-lOINO3 zxpwW^bs)HL{l<+OK=<6b1w^;*-o0}l2wwhp@apHoXK$XoeE;m(^XD&KymxLU<_se!oOSSHJy=wt8P$>76RpzF=_0L5$_~N$m z`N%+;Pog9dqk_ z`_6gKQZ7x3dQkCC^3xjQC1PLnO#DssMfYtw(Z#o~a=Ei2@29IX9w>aAy|9D#%bND) z1(IF{Z2JmWWm?30A0JD7>#4Ng@__i9OVve{ZGYCV3d$@^c<@=|*S_cVPaHff&g}dB z;oshyH{JcW<*#UZ@3iW#)d@Kf`NogF*%l02r!#%3EZY7-IQl|(Ba7);{toLW<$130 ztSf82m;Ac<+sNZi^b7g?WPippK4&km-qO2wz_yx8h%;Pmeb~X*vkex$f309S?bU;C zKb~F9(LC`}Kj!DxuV?#u-*8_uYm3~U^~C-MbLupf$NA@OJpg4iPgg&ebxsLQ0G2=) A&;S4c literal 0 HcmV?d00001 diff --git a/cd_utils/pult/main.cpp b/cd_utils/pult/main.cpp new file mode 100644 index 0000000..4f8e616 --- /dev/null +++ b/cd_utils/pult/main.cpp @@ -0,0 +1,10 @@ +#include +#include "cd_pult.h" + + +int main(int argc, char *argv[]) { + QApplication a(argc, argv); + CD_Pult w; + w.show(); + return a.exec(); +}