code format
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "cdutils_c.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
@@ -6,8 +7,7 @@ using namespace CDUtils;
|
||||
CInterface C;
|
||||
|
||||
|
||||
CInterface::CInterface(): Interface(CDType::cdC) {
|
||||
}
|
||||
CInterface::CInterface(): Interface(CDType::cdC) {}
|
||||
|
||||
|
||||
void CInterface::sendCommand(const CDType & c) {
|
||||
@@ -28,10 +28,10 @@ void CInterface::autoConnect(PIObject * o, const PIString & prefix) {
|
||||
PIObject::__MetaData & md(PIObject::__meta_data()[cid]);
|
||||
for (auto it = md.eh_func.begin(); it != md.eh_func.end(); ++it) {
|
||||
eh_map[it.value().func_name] = (Handler)it.value().addr;
|
||||
//piCout << "func" << it.value().func_name;
|
||||
// piCout << "func" << it.value().func_name;
|
||||
}
|
||||
PIVector<CDType * > cl = C.root().children();
|
||||
piForeachC (CDType * c, cl) {
|
||||
PIVector<CDType *> cl = C.root().children();
|
||||
piForeachC(CDType * c, cl) {
|
||||
PIString cp = prefix + c->pathString().join("_");
|
||||
if (cp.isEmpty()) continue;
|
||||
if (!eh_map.contains(cp)) continue;
|
||||
|
||||
@@ -1,45 +1,44 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_C_H
|
||||
#define CDUTILS_C_H
|
||||
|
||||
#include "cdutils_interface.h"
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
|
||||
class CD_CORE_EXPORT CInterface: public Interface
|
||||
{
|
||||
class CD_CORE_EXPORT CInterface: public Interface {
|
||||
PIOBJECT_SUBCLASS(CInterface, Interface);
|
||||
|
||||
public:
|
||||
CInterface();
|
||||
|
||||
void sendCommand(const CDType & c);
|
||||
void connect(const CDType & c, PIObject * o, Handler eh);
|
||||
void autoConnect(PIObject * o, const PIString & prefix = PIStringAscii("c_"));
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
extern CD_CORE_EXPORT CDUtils::CInterface C;
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include "cdutils_core.h"
|
||||
|
||||
#include "cdutils_parser.h"
|
||||
#include "piconfig.h"
|
||||
#include "pifile.h"
|
||||
#include "piiobytearray.h"
|
||||
#include "piiostring.h"
|
||||
#include "pifile.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
const char CDCore::app_config[] =
|
||||
"include = cd_ip.conf\n\
|
||||
const char CDCore::app_config[] = "include = cd_ip.conf\n\
|
||||
port_rec = 2\n\
|
||||
port_send = 1\n\
|
||||
[connection]\n\
|
||||
@@ -17,8 +17,7 @@ const char CDCore::app_config[] =
|
||||
connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\
|
||||
";
|
||||
|
||||
const char CDCore::pult_config[] =
|
||||
"include = cd_ip.conf\n\
|
||||
const char CDCore::pult_config[] = "include = cd_ip.conf\n\
|
||||
port_rec = 1\n\
|
||||
port_send = 2\n\
|
||||
[connection]\n\
|
||||
@@ -55,8 +54,6 @@ __Core_Initializer__::~__Core_Initializer__() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
CDCore::CDCore() {
|
||||
setName("CDCore");
|
||||
x_timer.setName("__S__.CDCore.x_timer");
|
||||
@@ -67,10 +64,10 @@ CDCore::CDCore() {
|
||||
connection.configureFromString(&s);
|
||||
connection.start();*/
|
||||
need_rebuild_x = x_pult_side = false;
|
||||
k_.cd_type_ = CDType::cdK;
|
||||
x_.cd_type_ = CDType::cdX;
|
||||
c_.cd_type_ = CDType::cdC;
|
||||
m_.cd_type_ = CDType::cdM;
|
||||
k_.cd_type_ = CDType::cdK;
|
||||
x_.cd_type_ = CDType::cdX;
|
||||
c_.cd_type_ = CDType::cdC;
|
||||
m_.cd_type_ = CDType::cdM;
|
||||
initRoot(&k_);
|
||||
initRoot(&x_);
|
||||
initRoot(&c_);
|
||||
@@ -89,7 +86,7 @@ CDCore::CDCore() {
|
||||
k_.section(11)[3] = KType(3, "1", "1", "88");
|
||||
k_.section(11)[4] = KType(4, "0", "0", "88");
|
||||
k_.section(11)[6] = KType(6, "0", "0", "88");*/
|
||||
//piCout << s;
|
||||
// piCout << s;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,14 +107,13 @@ void CDCore::cd_write(CDSection * cd, PIIODevice * d) {
|
||||
void CDCore::cd_read(CDSection * cd, PIIODevice * d) {
|
||||
PIConfig conf(d, PIIODevice::ReadOnly);
|
||||
cd->read(&(conf.rootEntry()));
|
||||
if (cd->cd_type_ == CDType::cdX)
|
||||
x_selected = cd->collectX();
|
||||
if (cd->cd_type_ == CDType::cdX) x_selected = cd->collectX();
|
||||
initRoot(cd);
|
||||
raiseChangedGlobal(cd->cd_type_);
|
||||
/*PIVector<PIIODevice * > ds = connection.allDevices();
|
||||
piForeach(PIIODevice * d, ds) {
|
||||
if (d)
|
||||
piCoutObj << d->constructFullPath() << d->isOpened();
|
||||
if (d)
|
||||
piCoutObj << d->constructFullPath() << d->isOpened();
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -134,12 +130,12 @@ void CDCore::cd_update(CDSection * cd, PIIODevice * d, UpdateModeFlags mode) {
|
||||
cd_parse(cd, d);
|
||||
/*bool kn = true;
|
||||
if (!ucd.isEmpty())
|
||||
if (!ucd.isSameStructure(k_)) {
|
||||
piCout << "ask for save names";
|
||||
K_KeepNamesRequest(&kn);
|
||||
}*/
|
||||
if (!ucd.isSameStructure(k_)) {
|
||||
piCout << "ask for save names";
|
||||
K_KeepNamesRequest(&kn);
|
||||
}*/
|
||||
ucd.update(*cd, mode);
|
||||
//piCout << k_.count() << ucd.count();
|
||||
// piCout << k_.count() << ucd.count();
|
||||
*cd = ucd;
|
||||
initRoot(cd);
|
||||
raiseChangedGlobal(cd->cd_type_);
|
||||
@@ -157,7 +153,7 @@ void CDCore::cd_send(CDSection * cd, CDPacketType pt, bool direct) {
|
||||
PIByteArray ba, sba;
|
||||
PIIOByteArray iob(&ba, PIIODevice::ReadWrite);
|
||||
cd_write(cd, &iob);
|
||||
//piCoutObj << PIString(ba);
|
||||
// piCoutObj << PIString(ba);
|
||||
sba = makeHeader(pt, 0);
|
||||
sba << ba;
|
||||
if (direct)
|
||||
@@ -208,7 +204,7 @@ void CDCore::initPult() {
|
||||
|
||||
void CDCore::init(const PIString & configuration, bool pult) {
|
||||
PIString c = configuration;
|
||||
//piCoutObj << "init" << c;
|
||||
// piCoutObj << "init" << c;
|
||||
connection.stop();
|
||||
connection.removeAllDevices();
|
||||
connection.configureFromString(&c);
|
||||
@@ -230,9 +226,8 @@ void CDCore::release() {
|
||||
|
||||
|
||||
void CDCore::startX(double freq) {
|
||||
//piCout << "start x" << x_timer.isRunning() << freq;
|
||||
if (!x_timer.isRunning())
|
||||
x_timer.start(1000. / piMaxd(freq, 0.01));
|
||||
// piCout << "start x" << x_timer.isRunning() << freq;
|
||||
if (!x_timer.isRunning()) x_timer.start(1000. / piMaxd(freq, 0.01));
|
||||
}
|
||||
|
||||
|
||||
@@ -242,7 +237,7 @@ void CDCore::stopX() {
|
||||
|
||||
|
||||
void CDCore::sendCommand(const CDType & c) {
|
||||
//piCoutObj << "C_sendCommand" << c;
|
||||
// piCoutObj << "C_sendCommand" << c;
|
||||
PIByteArray sba = makeHeader(CD_Command, 0);
|
||||
sba << c.path();
|
||||
sendDirect(sba);
|
||||
@@ -252,7 +247,7 @@ void CDCore::sendCommand(const CDType & c) {
|
||||
void CDCore::registerCHandler(const CDType & c, PIObject * o, Handler h) {
|
||||
PIString sp = pathToString(c.path());
|
||||
if (sp.isEmpty() || !h) return;
|
||||
//piCout << "register" << sp;
|
||||
// piCout << "register" << sp;
|
||||
c_handlers[sp] = OHPair(o, h);
|
||||
}
|
||||
|
||||
@@ -298,20 +293,20 @@ CDCore * CDCore::instance() {
|
||||
|
||||
bool CDCore::destroy() {
|
||||
if (!__Core_Initializer__::__instance__) return false;
|
||||
// piCout << "delete Core ...";
|
||||
// piCout << "delete Core ...";
|
||||
delete __Core_Initializer__::__instance__;
|
||||
// piCout << "delete Core ok";
|
||||
// piCout << "delete Core ok";
|
||||
__Core_Initializer__::__instance__ = 0;
|
||||
__Core_Initializer__::count_ = 0;
|
||||
__Core_Initializer__::count_ = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CDUtils::CDCore::K_DirectChange(PIDeque<int> path, PIString value) {
|
||||
// piCoutObj << "K_DirectChange";
|
||||
// piCoutObj << "K_DirectChange";
|
||||
PacketKDirectChange p;
|
||||
p.path = path;
|
||||
p.value = value;
|
||||
p.path = path;
|
||||
p.value = value;
|
||||
PIByteArray sba = makeHeader(CD_KDirectChange, 0);
|
||||
sba << p;
|
||||
sendDirect(sba);
|
||||
@@ -325,29 +320,37 @@ void CDCore::sendThread() {
|
||||
bool ok = datatr.send(send_data);
|
||||
switch (h.type) {
|
||||
case CD_KSend:
|
||||
if (ok) K_Sended();
|
||||
else K_SendFail();
|
||||
if (ok)
|
||||
K_Sended();
|
||||
else
|
||||
K_SendFail();
|
||||
break;
|
||||
case CD_KQuery:
|
||||
if (!ok) K_ReceiveFail();
|
||||
break;
|
||||
case CD_XSend:
|
||||
if (ok) X_Sended();
|
||||
else X_SendFail();
|
||||
if (ok)
|
||||
X_Sended();
|
||||
else
|
||||
X_SendFail();
|
||||
break;
|
||||
case CD_XQuery:
|
||||
if (!ok) X_ReceiveFail();
|
||||
break;
|
||||
case CD_CSend:
|
||||
if (ok) C_Sended();
|
||||
else C_SendFail();
|
||||
if (ok)
|
||||
C_Sended();
|
||||
else
|
||||
C_SendFail();
|
||||
break;
|
||||
case CD_CQuery:
|
||||
if (!ok) C_ReceiveFail();
|
||||
break;
|
||||
case CD_MSend:
|
||||
if (ok) M_Sended();
|
||||
else M_SendFail();
|
||||
if (ok)
|
||||
M_Sended();
|
||||
else
|
||||
M_SendFail();
|
||||
break;
|
||||
case CD_MQuery:
|
||||
if (!ok) M_ReceiveFail();
|
||||
@@ -358,25 +361,25 @@ void CDCore::sendThread() {
|
||||
|
||||
|
||||
void CDCore::xTimerTick() {
|
||||
//piCout << "x tick" << x_pult_side;
|
||||
// piCout << "x tick" << x_pult_side;
|
||||
PIByteArray ba;
|
||||
x_mutex.lock();
|
||||
if (x_pult_side) {
|
||||
ba = makeHeader(CD_XRequest, 0);
|
||||
if (need_rebuild_x) {
|
||||
x_selected = x_.collectX();
|
||||
//piCout << "collectX" << x_selected.size();
|
||||
x_selected = x_.collectX();
|
||||
// piCout << "collectX" << x_selected.size();
|
||||
need_rebuild_x = false;
|
||||
}
|
||||
ba << x_selected;
|
||||
//piCout << "x pult send" << x_selected.size();
|
||||
// piCout << "x pult send" << x_selected.size();
|
||||
} else {
|
||||
ba = makeHeader(CD_XValues, 0);
|
||||
ba << x_selected;
|
||||
piForeachC (PIDeque<int> & p, x_selected) {
|
||||
piForeachC(PIDeque<int> & p, x_selected) {
|
||||
x_[p].writeX(ba);
|
||||
}
|
||||
//piCout << "x app" << x_selected.size();
|
||||
// piCout << "x app" << x_selected.size();
|
||||
}
|
||||
x_mutex.unlock();
|
||||
sendDirect(ba);
|
||||
@@ -385,7 +388,7 @@ void CDCore::xTimerTick() {
|
||||
|
||||
void CDCore::piCoutFinished(int id, PIString * buffer) {
|
||||
if (!buffer || !(id == 1)) return;
|
||||
PIString sp = buffer->takeRange("[", "]");
|
||||
PIString sp = buffer->takeRange("[", "]");
|
||||
PIDeque<int> p = CDCore::stringToPath(sp);
|
||||
sendMessage(m_[p], Log, *buffer);
|
||||
delete buffer;
|
||||
@@ -393,7 +396,7 @@ void CDCore::piCoutFinished(int id, PIString * buffer) {
|
||||
|
||||
|
||||
void CDCore::initRoot(CDSection * r) {
|
||||
r->name = "__root__";
|
||||
r->name = "__root__";
|
||||
r->alias = "root";
|
||||
r->makePath();
|
||||
r->calculate();
|
||||
@@ -402,9 +405,10 @@ void CDCore::initRoot(CDSection * r) {
|
||||
|
||||
PIByteArray CDCore::makeHeader(CDPacketType type, int session_id) const {
|
||||
PacketHeader h;
|
||||
h.type = type;
|
||||
h.type = type;
|
||||
h.session_id = session_id;
|
||||
PIByteArray ret; ret << h;
|
||||
PIByteArray ret;
|
||||
ret << h;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -428,13 +432,11 @@ void CDCore::sendThreaded(PIByteArray & ba) {
|
||||
void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
PacketHeader h;
|
||||
ba >> h;
|
||||
switch(h.type) {
|
||||
switch (h.type) {
|
||||
case CD_Ping:
|
||||
//piCoutObj << "ping";
|
||||
break;
|
||||
case CD_KQuery:
|
||||
send(CDType::cdK);
|
||||
// piCoutObj << "ping";
|
||||
break;
|
||||
case CD_KQuery: send(CDType::cdK); break;
|
||||
case CD_KSend: {
|
||||
PIByteArray k;
|
||||
ba >> k;
|
||||
@@ -444,15 +446,13 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
cd_read(&k_, &ios);
|
||||
K_Received();
|
||||
piCoutObj << "K received";
|
||||
} break;
|
||||
} break;
|
||||
case CD_KDirectChange: {
|
||||
PacketKDirectChange p;
|
||||
ba >> p;
|
||||
k_[p.path].setValue(p.value);
|
||||
} break;
|
||||
case CD_XQuery:
|
||||
send(CDType::cdX);
|
||||
break;
|
||||
} break;
|
||||
case CD_XQuery: send(CDType::cdX); break;
|
||||
case CD_XSend: {
|
||||
PIByteArray x;
|
||||
ba >> x;
|
||||
@@ -463,34 +463,32 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
x_selected = x_.collectX();
|
||||
X_Received();
|
||||
piCoutObj << "X received";
|
||||
} break;
|
||||
} break;
|
||||
case CD_XRequest: {
|
||||
if (x_pult_side) break;
|
||||
//break;
|
||||
// break;
|
||||
x_mutex.lock();
|
||||
x_selected.clear();
|
||||
ba >> x_selected;
|
||||
//piCout << "X req" << x_selected.size();
|
||||
// piCout << "X req" << x_selected.size();
|
||||
x_.setSelectedX(false);
|
||||
piForeachC (PIDeque<int> & p, x_selected) {
|
||||
piForeachC(PIDeque<int> & p, x_selected) {
|
||||
x_[p].x_enabled = true;
|
||||
}
|
||||
x_mutex.unlock();
|
||||
} break;
|
||||
} break;
|
||||
case CD_XValues: {
|
||||
if (!x_pult_side) break;
|
||||
PIVector<PIDeque<int> > x_vals;
|
||||
PIVector<PIDeque<int>> x_vals;
|
||||
ba >> x_vals;
|
||||
x_mutex.lock();
|
||||
piForeachC (PIDeque<int> & p, x_vals) {
|
||||
piForeachC(PIDeque<int> & p, x_vals) {
|
||||
x_[p].readX(ba);
|
||||
}
|
||||
x_mutex.unlock();
|
||||
X_ReceivedX(x_vals);
|
||||
} break;
|
||||
case CD_CQuery:
|
||||
send(CDType::cdC);
|
||||
break;
|
||||
} break;
|
||||
case CD_CQuery: send(CDType::cdC); break;
|
||||
case CD_CSend: {
|
||||
piCoutObj << "C received";
|
||||
PIByteArray c;
|
||||
@@ -500,20 +498,18 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
PIIOString ios(&s);
|
||||
cd_read(&c_, &ios);
|
||||
C_Received();
|
||||
} break;
|
||||
} break;
|
||||
case CD_Command: {
|
||||
piCoutObj << "C command";
|
||||
PIDeque<int> p;
|
||||
ba >> p;
|
||||
if (p.isEmpty()) return;
|
||||
PIString sp = pathToString(p);
|
||||
OHPair h = c_handlers.value(sp, OHPair(0, 0));
|
||||
//piCoutObj << "found" << sp << h.first;
|
||||
OHPair h = c_handlers.value(sp, OHPair(0, 0));
|
||||
// piCoutObj << "found" << sp << h.first;
|
||||
if (h.first && h.second) h.second(h.first);
|
||||
} break;
|
||||
case CD_MQuery:
|
||||
send(CDType::cdM);
|
||||
break;
|
||||
} break;
|
||||
case CD_MQuery: send(CDType::cdM); break;
|
||||
case CD_MSend: {
|
||||
piCoutObj << "M received";
|
||||
PIByteArray c;
|
||||
@@ -523,7 +519,7 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
PIIOString ios(&s);
|
||||
cd_read(&m_, &ios);
|
||||
M_Received();
|
||||
} break;
|
||||
} break;
|
||||
case CD_Message: {
|
||||
PIDeque<int> p;
|
||||
ba >> p;
|
||||
@@ -532,10 +528,10 @@ void CDCore::procReceivedPacket(PIByteArray & ba) {
|
||||
int t = 0;
|
||||
PIString msg;
|
||||
ba >> t >> msg;
|
||||
//piCoutObj << "found" << sp << h.first;
|
||||
//piCoutObj << "M message invoke";
|
||||
// piCoutObj << "found" << sp << h.first;
|
||||
// piCoutObj << "M message invoke";
|
||||
M_Message(p, t, msg);
|
||||
} break;
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -565,19 +561,19 @@ PIString CDCore::pathToString(const PIDeque<int> & p) {
|
||||
PIDeque<int> CDCore::stringToPath(const PIString & p) {
|
||||
PIDeque<int> ret;
|
||||
PIStringList sl = p.split(".");
|
||||
piForeachC (PIString & s, sl)
|
||||
piForeachC(PIString & s, sl)
|
||||
ret << s.toInt();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||
//piCoutObj << "dataReceived" << from << data.size();
|
||||
// piCoutObj << "dataReceived" << from << data.size();
|
||||
PIIODevice * d = connection.deviceByName("cd");
|
||||
if (d && d == connection.deviceByFullPath(from)) {
|
||||
if (data.size() >= sizeof(4)) {
|
||||
PIByteArray ba = data;
|
||||
uchar header = ba.take_front();
|
||||
uchar header = ba.take_front();
|
||||
if (header == header_transfer) {
|
||||
datatr.received(ba);
|
||||
}
|
||||
@@ -592,7 +588,7 @@ void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & da
|
||||
void CDCore::dtSendRequest(PIByteArray & data) {
|
||||
data.push_front(header_transfer);
|
||||
connection.writeByName("cd", data);
|
||||
//piCoutObj << "send" << data.size() << ret;
|
||||
// piCoutObj << "send" << data.size() << ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -601,4 +597,3 @@ void CDCore::dtReceiveFinished(bool ok) {
|
||||
PIByteArray ba = datatr.data();
|
||||
procReceivedPacket(ba);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_CORE_H
|
||||
#define CDUTILS_CORE_H
|
||||
|
||||
#include "cdutils_types.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "cdutils_protocol.h"
|
||||
#include "cdutils_types.h"
|
||||
#include "piconnection.h"
|
||||
#include "pidatatransfer.h"
|
||||
#include "cd_core_export.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
class CDCore;
|
||||
|
||||
typedef void (*Handler)(void*);
|
||||
typedef void (*Handler)(void *);
|
||||
|
||||
class CD_CORE_EXPORT __Core_Initializer__ {
|
||||
public:
|
||||
@@ -42,13 +42,13 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class CD_CORE_EXPORT CDCore: public PIObject
|
||||
{
|
||||
class CD_CORE_EXPORT CDCore: public PIObject {
|
||||
PIOBJECT(CDUtils::CDCore);
|
||||
friend class __Core_Initializer__;
|
||||
friend class CDSection;
|
||||
friend class Interface;
|
||||
friend class XInterface;
|
||||
|
||||
public:
|
||||
static CDCore * instance();
|
||||
static bool destroy();
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
EVENT(X_Received);
|
||||
EVENT(X_ReceiveFail);
|
||||
EVENT(X_ChangedGlobal);
|
||||
EVENT1(X_ReceivedX, PIVector<PIDeque<int> >, pathes);
|
||||
EVENT1(X_ReceivedX, PIVector<PIDeque<int>>, pathes);
|
||||
|
||||
EVENT(C_Sended);
|
||||
EVENT(C_SendFail);
|
||||
@@ -80,12 +80,12 @@ public:
|
||||
EVENT(M_ChangedGlobal);
|
||||
EVENT3(M_Message, PIDeque<int>, path, int, type, PIString, msg);
|
||||
|
||||
void cd_write (CDSection * cd, PIIODevice * d);
|
||||
void cd_read (CDSection * cd, PIIODevice * d);
|
||||
void cd_parse (CDSection * cd, PIIODevice * d);
|
||||
void cd_update (CDSection * cd, PIIODevice * d, UpdateModeFlags mode);
|
||||
void cd_write(CDSection * cd, PIIODevice * d);
|
||||
void cd_read(CDSection * cd, PIIODevice * d);
|
||||
void cd_parse(CDSection * cd, PIIODevice * d);
|
||||
void cd_update(CDSection * cd, PIIODevice * d, UpdateModeFlags mode);
|
||||
void cd_calculate(CDSection * cd);
|
||||
void cd_send (CDSection * cd, CDPacketType pt, bool direct = false);
|
||||
void cd_send(CDSection * cd, CDPacketType pt, bool direct = false);
|
||||
void send(CDType::cdT cdt);
|
||||
void request(CDType::cdT cdt);
|
||||
void initApp();
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
void stopX();
|
||||
void sendCommand(const CDType & c);
|
||||
void registerCHandler(const CDType & c, PIObject * o, Handler h);
|
||||
bool inProgress() {return sendt.isRunning();}
|
||||
bool inProgress() { return sendt.isRunning(); }
|
||||
void sendMessage(const CDType & m, MessageType mt, const PIString & msg);
|
||||
|
||||
CDSection * root(CDType::cdT cdt);
|
||||
@@ -105,8 +105,8 @@ public:
|
||||
static PIString pathToString(const PIDeque<int> & p);
|
||||
static PIDeque<int> stringToPath(const PIString & p);
|
||||
|
||||
static PIString pultConfig() {return PIString(pult_config);}
|
||||
static PIString appConfig() {return PIString(app_config);}
|
||||
static PIString pultConfig() { return PIString(pult_config); }
|
||||
static PIString appConfig() { return PIString(app_config); }
|
||||
|
||||
private:
|
||||
CDCore();
|
||||
@@ -116,7 +116,7 @@ private:
|
||||
EVENT_HANDLER1(void, dtReceiveFinished, bool, ok);
|
||||
EVENT_HANDLER(void, sendThread);
|
||||
EVENT_HANDLER(void, xTimerTick);
|
||||
EVENT_HANDLER2(void, piCoutFinished, int, id, PIString*, buffer);
|
||||
EVENT_HANDLER2(void, piCoutFinished, int, id, PIString *, buffer);
|
||||
void initRoot(CDSection * r);
|
||||
PIByteArray makeHeader(CDPacketType type, int session_id = 0) const;
|
||||
void sendDirect(PIByteArray & ba);
|
||||
@@ -124,7 +124,7 @@ private:
|
||||
void procReceivedPacket(PIByteArray & ba);
|
||||
void raiseChangedGlobal(CDType::cdT cdt);
|
||||
|
||||
typedef PIPair<PIObject * , Handler> OHPair;
|
||||
typedef PIPair<PIObject *, Handler> OHPair;
|
||||
|
||||
static const char app_config[], pult_config[];
|
||||
PIConnection connection;
|
||||
@@ -134,15 +134,14 @@ private:
|
||||
PITimer x_timer;
|
||||
CDSection k_, x_, c_, m_;
|
||||
PIMutex x_mutex;
|
||||
PIVector<PIDeque<int> > x_selected;
|
||||
PIVector<PIDeque<int>> x_selected;
|
||||
PIMap<PIString, OHPair> c_handlers;
|
||||
bool need_rebuild_x, x_pult_side;
|
||||
|
||||
};
|
||||
|
||||
|
||||
static __Core_Initializer__ __Core_initializer__;
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
#endif // CDUTILS_CORE_H
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
#include "piconfig.h"
|
||||
#include "pifile.h"
|
||||
@@ -7,11 +8,11 @@ using namespace CDUtils;
|
||||
|
||||
|
||||
Interface::Interface(CDType::cdT type_) {
|
||||
core = CDCore::instance();
|
||||
s = core->root(type_);
|
||||
type = type_;
|
||||
//piCoutObj << (void*)this << core;
|
||||
file_ = core->typeLetter(type_) + PIStringAscii(".dat");
|
||||
core = CDCore::instance();
|
||||
s = core->root(type_);
|
||||
type = type_;
|
||||
// piCoutObj << (void*)this << core;
|
||||
file_ = core->typeLetter(type_) + PIStringAscii(".dat");
|
||||
file_size = 0;
|
||||
switch (type) {
|
||||
case CDType::cdK:
|
||||
@@ -52,41 +53,41 @@ bool Interface::test(int v) {
|
||||
}
|
||||
|
||||
|
||||
CDType & Interface::operator [](const PIString & name_) {
|
||||
CDType & Interface::operator[](const PIString & name_) {
|
||||
return (*s)[name_];
|
||||
}
|
||||
|
||||
|
||||
const CDType Interface::operator [](const PIString & name_) const {
|
||||
const CDType Interface::operator[](const PIString & name_) const {
|
||||
return (*s)[name_];
|
||||
}
|
||||
|
||||
|
||||
CDType & Interface::operator [](const PIDeque<int> & path_) {
|
||||
CDType & Interface::operator[](const PIDeque<int> & path_) {
|
||||
return (*s)[path_];
|
||||
}
|
||||
|
||||
|
||||
const CDType Interface::operator [](const PIDeque<int> & path_) const {
|
||||
const CDType Interface::operator[](const PIDeque<int> & path_) const {
|
||||
return (*s)[path_];
|
||||
}
|
||||
|
||||
|
||||
CDType & Interface::operator [](int v) {
|
||||
//piCout << (void*)this << "[]" << core;
|
||||
CDType & Interface::operator[](int v) {
|
||||
// piCout << (void*)this << "[]" << core;
|
||||
return (*s)[v];
|
||||
}
|
||||
|
||||
|
||||
const CDType Interface::operator [](int v) const {
|
||||
//piCout << (void*)this << "[]" << core;
|
||||
const CDType Interface::operator[](int v) const {
|
||||
// piCout << (void*)this << "[]" << core;
|
||||
return (*s)[v];
|
||||
}
|
||||
|
||||
|
||||
CDSection & Interface::section(int v) {
|
||||
// CDSection & ret = s->section(v);
|
||||
// piCout << "[get section]" << v << ret.name;
|
||||
// CDSection & ret = s->section(v);
|
||||
// piCout << "[get section]" << v << ret.name;
|
||||
return s->section(v);
|
||||
}
|
||||
|
||||
@@ -96,9 +97,9 @@ const CDSection Interface::section(int v) const {
|
||||
}
|
||||
|
||||
|
||||
CDSection & Interface::section(const PIDeque<int> &path) {
|
||||
CDSection & Interface::section(const PIDeque<int> & path) {
|
||||
PIDeque<int> spath = path;
|
||||
CDSection * rs = s;
|
||||
CDSection * rs = s;
|
||||
while (!spath.isEmpty()) {
|
||||
rs = &(rs->section(spath.take_front()));
|
||||
}
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_INTERFACE_H
|
||||
#define CDUTILS_INTERFACE_H
|
||||
|
||||
#include "cd_core_export.h"
|
||||
#include "cdutils_types.h"
|
||||
#include "piobject.h"
|
||||
#include "cd_core_export.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
@@ -30,19 +30,19 @@ namespace CDUtils {
|
||||
class CDCore;
|
||||
|
||||
|
||||
class CD_CORE_EXPORT Interface: public PIObject
|
||||
{
|
||||
class CD_CORE_EXPORT Interface: public PIObject {
|
||||
PIOBJECT(CDUtils::Interface);
|
||||
|
||||
public:
|
||||
Interface(CDType::cdT type_);
|
||||
|
||||
bool test(int v);
|
||||
CDType & operator [](int v);
|
||||
const CDType operator [](int v) const;
|
||||
CDType & operator [](const PIString & name_);
|
||||
const CDType operator [](const PIString & name_) const;
|
||||
CDType & operator [](const PIDeque<int> & path_);
|
||||
const CDType operator [](const PIDeque<int> & path_) const;
|
||||
CDType & operator[](int v);
|
||||
const CDType operator[](int v) const;
|
||||
CDType & operator[](const PIString & name_);
|
||||
const CDType operator[](const PIString & name_) const;
|
||||
CDType & operator[](const PIDeque<int> & path_);
|
||||
const CDType operator[](const PIDeque<int> & path_) const;
|
||||
CDSection & section(int v);
|
||||
const CDSection section(int v) const;
|
||||
CDSection & section(const PIDeque<int> & path);
|
||||
@@ -50,9 +50,9 @@ public:
|
||||
const CDSection & root() const;
|
||||
|
||||
int count(bool recursive = true) const;
|
||||
const PIString file() const {return file_;}
|
||||
int fileSize() const {return file_size;}
|
||||
CDType::cdT cdType() const {return type;}
|
||||
const PIString file() const { return file_; }
|
||||
int fileSize() const { return file_size; }
|
||||
CDType::cdT cdType() const { return type; }
|
||||
bool exists(PIDeque<int> path) const;
|
||||
|
||||
void setFileName(const PIString & _file);
|
||||
@@ -86,11 +86,10 @@ protected:
|
||||
CDType::cdT type;
|
||||
PIString file_;
|
||||
int file_size;
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
|
||||
#endif // CDUTILS_INTERFACE_H
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "cdutils_k.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
@@ -6,8 +7,7 @@ using namespace CDUtils;
|
||||
KInterface K;
|
||||
|
||||
|
||||
KInterface::KInterface(): Interface(CDType::cdK) {
|
||||
}
|
||||
KInterface::KInterface(): Interface(CDType::cdK) {}
|
||||
|
||||
|
||||
void KInterface::directChange(const CDType & k) {
|
||||
|
||||
@@ -1,46 +1,45 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_K_H
|
||||
#define CDUTILS_K_H
|
||||
|
||||
#include "cdutils_interface.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
|
||||
class CD_CORE_EXPORT KInterface: public Interface
|
||||
{
|
||||
class CD_CORE_EXPORT KInterface: public Interface {
|
||||
PIOBJECT_SUBCLASS(KInterface, Interface);
|
||||
|
||||
public:
|
||||
KInterface();
|
||||
|
||||
EVENT1(keepNamesRequest, bool*, kn);
|
||||
EVENT1(keepNamesRequest, bool *, kn);
|
||||
|
||||
void directChange(const CDType & k);
|
||||
void directChange(const CDType & k, double v);
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
extern CD_CORE_EXPORT CDUtils::KInterface K;
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "cdutils_m.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
@@ -1,44 +1,44 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_M_H
|
||||
#define CDUTILS_M_H
|
||||
|
||||
#include "cdutils_interface.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
|
||||
class CD_CORE_EXPORT MInterface: public Interface
|
||||
{
|
||||
class CD_CORE_EXPORT MInterface: public Interface {
|
||||
PIOBJECT_SUBCLASS(MInterface, Interface);
|
||||
|
||||
public:
|
||||
MInterface();
|
||||
|
||||
PICout operator [](int v) {return createPICout((*s)[v]);}
|
||||
PICout operator [](int v) const {return createPICout((*s)[v]);}
|
||||
PICout operator [](const PIString & name_) {return createPICout((*s)[name_]);}
|
||||
PICout operator [](const PIString & name_) const {return createPICout((*s)[name_]);}
|
||||
PICout operator [](const PIDeque<int> & path_) {return createPICout((*s)[path_]);}
|
||||
PICout operator [](const PIDeque<int> & path_) const {return createPICout((*s)[path_]);}
|
||||
PICout operator[](int v) { return createPICout((*s)[v]); }
|
||||
PICout operator[](int v) const { return createPICout((*s)[v]); }
|
||||
PICout operator[](const PIString & name_) { return createPICout((*s)[name_]); }
|
||||
PICout operator[](const PIString & name_) const { return createPICout((*s)[name_]); }
|
||||
PICout operator[](const PIDeque<int> & path_) { return createPICout((*s)[path_]); }
|
||||
PICout operator[](const PIDeque<int> & path_) const { return createPICout((*s)[path_]); }
|
||||
|
||||
void messageBox(const CDType & m, const PIString & msg);
|
||||
|
||||
@@ -46,10 +46,9 @@ public:
|
||||
|
||||
private:
|
||||
PICout createPICout(const CDType & m) const;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
extern CD_CORE_EXPORT CDUtils::MInterface M;
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#include "cdutils_parser.h"
|
||||
|
||||
#include "cdutils_types.h"
|
||||
#include "piiostring.h"
|
||||
#include "piiobytearray.h"
|
||||
#include "pifile.h"
|
||||
#include "piiobytearray.h"
|
||||
#include "piiostring.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
@@ -63,14 +64,14 @@ PIVector<int> enumValues(const PIString & e, const PIMap<PIString, CDSection> &
|
||||
PIVector<int> ret;
|
||||
enames.clear();
|
||||
if (sections.contains(e)) {
|
||||
ret = sections.at(e).indexes();
|
||||
ret = sections.at(e).indexes();
|
||||
enames = sections.at(e).index_names();
|
||||
} else {
|
||||
int v = e.toInt();
|
||||
if (v < 2) return ret;
|
||||
for (int i = 0; i < v; ++i) {
|
||||
ret << i;
|
||||
enames << "";//PIString::fromNumber(i);
|
||||
enames << ""; // PIString::fromNumber(i);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -81,7 +82,7 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
CDType::cdT et = (CDType::cdT)cdsection_type;
|
||||
if (!d) return CDSection(et);
|
||||
if (!d->canRead()) return CDSection(et);
|
||||
//piCout << "[CDSection] parse start";
|
||||
// piCout << "[CDSection] parse start";
|
||||
CDSection cs(et);
|
||||
CDType ck;
|
||||
PIMap<PIString, CDSection> sections;
|
||||
@@ -89,14 +90,14 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
PIString content, line, alias, type, comment;
|
||||
PIStringList iarr;
|
||||
if (PIStringAscii(d->className()) == PIStringAscii("PIFile")) {
|
||||
PIByteArray c = ((PIFile*)d)->readAll();
|
||||
PIByteArray c = ((PIFile *)d)->readAll();
|
||||
c << uchar(0);
|
||||
content = PIString::fromUTF8((const char *)c.data());
|
||||
}
|
||||
if (PIStringAscii(d->className()) == PIStringAscii("PIIOString")) content = *(((PIIOString*)d)->string());
|
||||
if (PIStringAscii(d->className()) == PIStringAscii("PIIOByteArray")) content = PIString(*(((PIIOByteArray*)d)->byteArray()));
|
||||
if (PIStringAscii(d->className()) == PIStringAscii("PIIOString")) content = *(((PIIOString *)d)->string());
|
||||
if (PIStringAscii(d->className()) == PIStringAscii("PIIOByteArray")) content = PIString(*(((PIIOByteArray *)d)->byteArray()));
|
||||
PIIOString ios(&content);
|
||||
//int phase = 0;
|
||||
// int phase = 0;
|
||||
int cind = -1;
|
||||
while ((cind = content.find("enum", cind)) >= 0) {
|
||||
ios.seek(cind);
|
||||
@@ -114,11 +115,11 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
cind += 4;
|
||||
continue;
|
||||
}
|
||||
cs = CDSection(et);
|
||||
cs = CDSection(et);
|
||||
cs.name = line;
|
||||
//piCout << "enum" << cs.name;
|
||||
// piCout << "enum" << cs.name;
|
||||
int cev = 0;
|
||||
// cevalues.clear();
|
||||
// cevalues.clear();
|
||||
while (!ios.isEnd()) {
|
||||
line = ios.readLine().trim();
|
||||
comment.clear();
|
||||
@@ -128,7 +129,7 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
if (comment.find("=") >= 0) {
|
||||
parseInsert(comment, alias, iarr);
|
||||
if (!iarr.isEmpty()) {
|
||||
// piCout << "#" << enum_values;
|
||||
// piCout << "#" << enum_values;
|
||||
if (!enum_values.contains(alias)) {
|
||||
piCout << "Parse error: can`t find section alias \"" << alias << "\"!";
|
||||
return CDSection(et);
|
||||
@@ -137,16 +138,16 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
piCout << "Parse error: can`t find section \"" << iarr.front() << "\"!";
|
||||
return CDSection(et);
|
||||
}
|
||||
//piCout << "insert" << alias << iarr;
|
||||
int aval = enum_values.value(alias);
|
||||
// piCout << "insert" << alias << iarr;
|
||||
int aval = enum_values.value(alias);
|
||||
CDSection is = sections.value(iarr.take_front()), ts;
|
||||
int ibpos = is.name.size_s();
|
||||
piForeachRC (PIString & a, iarr) {
|
||||
int ibpos = is.name.size_s();
|
||||
piForeachRC(PIString & a, iarr) {
|
||||
PIStringList enames;
|
||||
PIVector<int> evals = enumValues(a, sections, enames);
|
||||
//piCout << a << evals;
|
||||
// piCout << a << evals;
|
||||
for (int i = 0; i < evals.size_s(); ++i) {
|
||||
ts.section(evals[i]) = is;
|
||||
ts.section(evals[i]) = is;
|
||||
ts.section(evals[i]).alias = enames[i];
|
||||
}
|
||||
ts.name = is.name;
|
||||
@@ -154,13 +155,13 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
is = ts;
|
||||
ts = CDSection(et);
|
||||
}
|
||||
is.alias = alias;
|
||||
is.alias = alias;
|
||||
cs.section(aval) = is;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
parseEnumLine(line, &cev, &type, &comment);
|
||||
//piCout << line << "=" << cev << "//" << type << comment;
|
||||
// piCout << line << "=" << cev << "//" << type << comment;
|
||||
ck = CDType(cev, line, type, "", "", comment, et);
|
||||
if (type == "e") {
|
||||
if (comment.startsWith("${")) {
|
||||
@@ -169,22 +170,22 @@ CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
|
||||
comment.cutLeft(en.size_s() + 2).trim();
|
||||
ck.setEnumValues(sections.value(en).enumValues());
|
||||
ck.setComment(comment);
|
||||
//piCout << "enum" << en << ck.enumValues();
|
||||
// piCout << "enum" << en << ck.enumValues();
|
||||
}
|
||||
}
|
||||
cs[cev] = ck;
|
||||
//cevalues[line] = cev;
|
||||
cs[cev] = ck;
|
||||
// cevalues[line] = cev;
|
||||
enum_values[line] = cev;
|
||||
++cev;
|
||||
}
|
||||
}
|
||||
//piCout << cs.name << cs.k;
|
||||
// piCout << cs.name << cs.k;
|
||||
sections[cs.name] = cs;
|
||||
// piCout << "#" << cevalues;
|
||||
// enum_values << cevalues;
|
||||
// piCout << "#" << cevalues;
|
||||
// enum_values << cevalues;
|
||||
cind += 4;
|
||||
}
|
||||
// piCout << "[CDSection] parse end";
|
||||
// piCout << "[CDSection] parse end";
|
||||
switch (et) {
|
||||
case CDType::cdK: return sections.value("KDescription");
|
||||
case CDType::cdX: return sections.value("XDescription");
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_PARSER_H
|
||||
@@ -34,6 +34,6 @@ CD_CORE_EXPORT CDSection parse(PIIODevice * d, int cdsection_type);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
#endif // CDUTILS_PARSER_H
|
||||
|
||||
@@ -1,74 +1,86 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_PROTOCOL_H
|
||||
#define CDUTILS_PROTOCOL_H
|
||||
|
||||
#include "pistring.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "pistring.h"
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
enum CDPacketType {
|
||||
CD_Ping,
|
||||
CD_Pong,
|
||||
enum CDPacketType {
|
||||
CD_Ping,
|
||||
CD_Pong,
|
||||
|
||||
CD_KQuery,
|
||||
CD_KSend,
|
||||
CD_KDirectChange,
|
||||
CD_KQuery,
|
||||
CD_KSend,
|
||||
CD_KDirectChange,
|
||||
|
||||
CD_XQuery,
|
||||
CD_XSend,
|
||||
CD_XRequest,
|
||||
CD_XValues,
|
||||
CD_XQuery,
|
||||
CD_XSend,
|
||||
CD_XRequest,
|
||||
CD_XValues,
|
||||
|
||||
CD_CQuery,
|
||||
CD_CSend,
|
||||
CD_Command,
|
||||
CD_CQuery,
|
||||
CD_CSend,
|
||||
CD_Command,
|
||||
|
||||
CD_MQuery,
|
||||
CD_MSend,
|
||||
CD_Message,
|
||||
};
|
||||
CD_MQuery,
|
||||
CD_MSend,
|
||||
CD_Message,
|
||||
};
|
||||
|
||||
# pragma pack(push,1)
|
||||
#pragma pack(push, 1)
|
||||
|
||||
struct CD_CORE_EXPORT PacketHeader {
|
||||
int type; // CDPacketType
|
||||
int session_id;
|
||||
};
|
||||
struct CD_CORE_EXPORT PacketHeader {
|
||||
int type; // CDPacketType
|
||||
int session_id;
|
||||
};
|
||||
|
||||
struct CD_CORE_EXPORT PacketKDirectChange {
|
||||
PIDeque<int> path;
|
||||
PIString value;
|
||||
};
|
||||
struct CD_CORE_EXPORT PacketKDirectChange {
|
||||
PIDeque<int> path;
|
||||
PIString value;
|
||||
};
|
||||
|
||||
# pragma pack(pop)
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef PIP_BINARY_STREAM
|
||||
BINARY_STREAM_WRITE(PacketKDirectChange) {s << v.path << v.value; return s;}
|
||||
BINARY_STREAM_READ (PacketKDirectChange) {s >> v.path >> v.value; return s;}
|
||||
BINARY_STREAM_WRITE(PacketKDirectChange) {
|
||||
s << v.path << v.value;
|
||||
return s;
|
||||
}
|
||||
BINARY_STREAM_READ(PacketKDirectChange) {
|
||||
s >> v.path >> v.value;
|
||||
return s;
|
||||
}
|
||||
#else
|
||||
inline PIByteArray & operator <<(PIByteArray & s, const PacketKDirectChange & v) {s << v.path << v.value; return s;}
|
||||
inline PIByteArray & operator >>(PIByteArray & s, PacketKDirectChange & v) {s >> v.path >> v.value; return s;}
|
||||
inline PIByteArray & operator<<(PIByteArray & s, const PacketKDirectChange & v) {
|
||||
s << v.path << v.value;
|
||||
return s;
|
||||
}
|
||||
inline PIByteArray & operator>>(PIByteArray & s, PacketKDirectChange & v) {
|
||||
s >> v.path >> v.value;
|
||||
return s;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
#endif // CDUTILS_PROTOCOL_H
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#include "cdutils_types.h"
|
||||
#include "piconfig.h"
|
||||
#include "pifile.h"
|
||||
#include "pievaluator.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
#include "piconfig.h"
|
||||
#include "pievaluator.h"
|
||||
#include "pifile.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
@@ -10,46 +11,45 @@ using namespace CDUtils;
|
||||
const int cd_x_history_max_size = 4000;
|
||||
|
||||
CDType::CDType() {
|
||||
index_ = -1;
|
||||
index_ = -1;
|
||||
value_d = 0.;
|
||||
value_i = 0;
|
||||
value_b = calculated = x_enabled = false;
|
||||
cd_type_ = cdNull;
|
||||
parent = 0;
|
||||
avg_size = 1;
|
||||
cd_type_ = cdNull;
|
||||
parent = 0;
|
||||
avg_size = 1;
|
||||
mode_ = rmode_ = X_Current;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
CDType::CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t) {
|
||||
index_ = i;
|
||||
name_ = n.trimmed();
|
||||
type_ = t.trimmed();
|
||||
value_s = v.trimmed();
|
||||
formula_ = f.trimmed();
|
||||
comment_ = c.trimmed();
|
||||
value_d = v.toDouble();
|
||||
value_i = v.toInt();
|
||||
value_b = v.toBool();
|
||||
cd_type_ = cd_t;
|
||||
index_ = i;
|
||||
name_ = n.trimmed();
|
||||
type_ = t.trimmed();
|
||||
value_s = v.trimmed();
|
||||
formula_ = f.trimmed();
|
||||
comment_ = c.trimmed();
|
||||
value_d = v.toDouble();
|
||||
value_i = v.toInt();
|
||||
value_b = v.toBool();
|
||||
cd_type_ = cd_t;
|
||||
calculated = x_enabled = false;
|
||||
parent = 0;
|
||||
avg_size = 1;
|
||||
parent = 0;
|
||||
avg_size = 1;
|
||||
mode_ = rmode_ = X_Current;
|
||||
if (type_ == "e") {
|
||||
enum_values = parseEnumComment(comment_);
|
||||
// piCout << enum_values.size() << enum_values;
|
||||
// piCout << enum_values.size() << enum_values;
|
||||
}
|
||||
// piCout << type_.size() << type_.toUTF8();
|
||||
// piCout << formula_.size() << formula_.toUTF8();
|
||||
// piCout << comment_.size() << comment_.toUTF8();
|
||||
// piCout << "[CDType] create" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ << ":" << (cd_type_ == cdK);
|
||||
// piCout << type_.size() << type_.toUTF8();
|
||||
// piCout << formula_.size() << formula_.toUTF8();
|
||||
// piCout << comment_.size() << comment_.toUTF8();
|
||||
// piCout << "[CDType] create" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ <<
|
||||
//":" << (cd_type_ == cdK);
|
||||
}
|
||||
|
||||
|
||||
CDType & CDType::operator =(double x) {
|
||||
CDType & CDType::operator=(double x) {
|
||||
value_d = x;
|
||||
value_i = x;
|
||||
value_b = x > 0.;
|
||||
@@ -96,7 +96,7 @@ PIVariant CDType::variantValue() const {
|
||||
e.selectValue(toInt());
|
||||
return PIVariant(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
return PIVariant(value());
|
||||
@@ -105,9 +105,9 @@ PIVariant CDType::variantValue() const {
|
||||
|
||||
void CDType::setValue(const PIString & value_) {
|
||||
formula_ = value_;
|
||||
value_d = formula_.toDouble();
|
||||
value_i = formula_.toInt();
|
||||
value_b = formula_.toBool();
|
||||
value_d = formula_.toDouble();
|
||||
value_i = formula_.toInt();
|
||||
value_b = formula_.toBool();
|
||||
}
|
||||
|
||||
|
||||
@@ -117,10 +117,10 @@ void CDType::setVariantValue(const PIVariant & value_) {
|
||||
|
||||
|
||||
void CDType::setFormula(const PIString & f) {
|
||||
formula_ = f;
|
||||
formula_ = f;
|
||||
calculated = false;
|
||||
//PIEvaluator e;
|
||||
//calculate(&e);
|
||||
// PIEvaluator e;
|
||||
// calculate(&e);
|
||||
}
|
||||
|
||||
|
||||
@@ -130,30 +130,32 @@ PIStringList CDType::pathString() const {
|
||||
if (!ps) return ret;
|
||||
for (int i = 0; i < path_.size_s() - 1; ++i) {
|
||||
ps = &(ps->section(path_[i]));
|
||||
if (!ps->alias.isEmpty()) ret << ps->alias;
|
||||
else ret << PIString::fromNumber(path_[i]);
|
||||
if (!ps->alias.isEmpty())
|
||||
ret << ps->alias;
|
||||
else
|
||||
ret << PIString::fromNumber(path_[i]);
|
||||
}
|
||||
if (!name_.isEmpty()) ret << name_;
|
||||
else ret << PIString::fromNumber(index_);
|
||||
if (!name_.isEmpty())
|
||||
ret << name_;
|
||||
else
|
||||
ret << PIString::fromNumber(index_);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void CDType::readX(PIByteArray & ba) {
|
||||
if (ba.size() < 5) return;
|
||||
uchar t(0); ba >> t;
|
||||
uchar t(0);
|
||||
ba >> t;
|
||||
rmode_ = (XMode)t;
|
||||
switch (rmode_) {
|
||||
case X_Current:
|
||||
ba >> value_d;
|
||||
break;
|
||||
case X_Current: ba >> value_d; break;
|
||||
case X_All_Avg: {
|
||||
PIVector<double> ah;
|
||||
ba >> ah;
|
||||
history << ah;
|
||||
if (!history.isEmpty())
|
||||
value_d = history.back();
|
||||
} break;
|
||||
if (!history.isEmpty()) value_d = history.back();
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
value_i = value_d;
|
||||
@@ -164,9 +166,7 @@ void CDType::readX(PIByteArray & ba) {
|
||||
void CDType::writeX(PIByteArray & ba) {
|
||||
ba << uchar(mode_);
|
||||
switch (mode_) {
|
||||
case X_Current:
|
||||
ba << value_d;
|
||||
break;
|
||||
case X_Current: ba << value_d; break;
|
||||
case X_All_Avg:
|
||||
ba << history;
|
||||
history.clear();
|
||||
@@ -176,14 +176,14 @@ void CDType::writeX(PIByteArray & ba) {
|
||||
}
|
||||
|
||||
|
||||
bool CDType::calculate(PIEvaluator * e, PIVector<const CDType * > stack) {
|
||||
bool CDType::calculate(PIEvaluator * e, PIVector<const CDType *> stack) {
|
||||
if (stack.contains(this)) {
|
||||
error_ = "Circular dependencies: ";
|
||||
for (const CDType * k : stack) {
|
||||
for (const CDType * k: stack) {
|
||||
error_ += k->name() + " -> ";
|
||||
}
|
||||
error_ += name();
|
||||
//piCout << error_;
|
||||
// piCout << error_;
|
||||
return false;
|
||||
}
|
||||
stack << this;
|
||||
@@ -191,7 +191,7 @@ bool CDType::calculate(PIEvaluator * e, PIVector<const CDType * > stack) {
|
||||
calculated = true;
|
||||
error_.clear();
|
||||
if (!parent) return true;
|
||||
//piCout << "calc" << name_ << (parent ? parent->alias : "root");
|
||||
// piCout << "calc" << name_ << (parent ? parent->alias : "root");
|
||||
value_s = formula_.trimmed();
|
||||
for (;;) {
|
||||
int ki = value_s.find("K[");
|
||||
@@ -199,14 +199,14 @@ bool CDType::calculate(PIEvaluator * e, PIVector<const CDType * > stack) {
|
||||
int ke = value_s.find("]", ki + 2);
|
||||
if (ke < 0) break;
|
||||
PIString kp = value_s.mid(ki + 2, ke - ki - 2);
|
||||
//piCout << kp;
|
||||
// piCout << kp;
|
||||
CDType & k((*parent)[kp]);
|
||||
k.calculate(e, stack);
|
||||
value_s.replace(ki, ke - ki + 1, PIString::fromNumber(k.value_d));
|
||||
}
|
||||
value_d = formula_.toDouble();
|
||||
value_i = formula_.toInt();
|
||||
value_b = formula_.toBool();
|
||||
value_d = formula_.toDouble();
|
||||
value_i = formula_.toInt();
|
||||
value_b = formula_.toBool();
|
||||
double ev = 0.;
|
||||
if (!e->check(value_s) && value_d == 0. && value_i == 0 && !value_b) {
|
||||
PIString f = formula_.trimmed().toLowerCase();
|
||||
@@ -214,12 +214,11 @@ bool CDType::calculate(PIEvaluator * e, PIVector<const CDType * > stack) {
|
||||
error_ = e->error();
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
if (e->isCorrect())
|
||||
ev = e->evaluate().real();
|
||||
//piCout << value_s << value_i << value_d << ev;
|
||||
//if ((value_d == 0.) || (piAbsd(value_d) < piAbsd(ev))) value_d = ev;
|
||||
//if ((value_i == 0) || (piAbsd(value_i) < piAbsd(ev))) value_i = int(ev);
|
||||
} else if (e->isCorrect())
|
||||
ev = e->evaluate().real();
|
||||
// piCout << value_s << value_i << value_d << ev;
|
||||
// if ((value_d == 0.) || (piAbsd(value_d) < piAbsd(ev))) value_d = ev;
|
||||
// if ((value_i == 0) || (piAbsd(value_i) < piAbsd(ev))) value_i = int(ev);
|
||||
if ((value_d == 0.) || (ev != 0.)) value_d = ev;
|
||||
if ((value_i == 0) || (ev != 0.)) value_i = int(ev);
|
||||
value_b = value_b || (ev > 0.);
|
||||
@@ -245,8 +244,8 @@ PIVariantTypes::Enum CDType::parseEnumComment(PIString c) {
|
||||
if (c.isEmpty()) return ret;
|
||||
if (type_ == "e") {
|
||||
PIStringList sl = c.inBrackets('{', '}').split(",");
|
||||
int cval = 0;
|
||||
for (PIString & s : sl) {
|
||||
int cval = 0;
|
||||
for (PIString & s: sl) {
|
||||
s.trim();
|
||||
if (s.isEmpty()) continue;
|
||||
if (s[0].isDigit()) {
|
||||
@@ -260,13 +259,13 @@ PIVariantTypes::Enum CDType::parseEnumComment(PIString c) {
|
||||
++cval;
|
||||
}
|
||||
}
|
||||
//piCout << c << "=" << ret;
|
||||
// piCout << c << "=" << ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
CDSection::CDSection(CDType::cdT type_) {
|
||||
cd_type_ = type_;
|
||||
cd_type_ = type_;
|
||||
null.cd_type_ = type_;
|
||||
}
|
||||
|
||||
@@ -331,8 +330,8 @@ void CDSection::calculate() {
|
||||
CDType & CDSection::getByName(const PIString & name_) {
|
||||
PIStringList np = name_.split(".");
|
||||
if (np.isEmpty()) return null;
|
||||
//piCout << np;
|
||||
CDSection * cs = this, * ns = 0;
|
||||
// piCout << np;
|
||||
CDSection *cs = this, *ns = 0;
|
||||
if (np.front().isEmpty()) {
|
||||
if (np.size_s() < 2) return null;
|
||||
cs = CDCore::instance()->root(cd_type_);
|
||||
@@ -341,37 +340,40 @@ CDType & CDSection::getByName(const PIString & name_) {
|
||||
for (int i = 0; i < np.size_s() - 1; ++i) {
|
||||
if (np[i].isEmpty()) return null;
|
||||
bool isd = np[i][0].isDigit() || (np[i][0] == '-');
|
||||
int dv = 0;
|
||||
int dv = 0;
|
||||
if (isd) dv = np[i].toInt();
|
||||
ns = 0;
|
||||
ns = 0;
|
||||
auto it = cs->s.makeIterator();
|
||||
while (it.next()) {
|
||||
bool f = false;
|
||||
if (isd) f = (dv == it.key());
|
||||
else f = (np[i] == it.value().alias);
|
||||
//piCout << "s..." << it.key() << it.value().alias << f;
|
||||
if (isd)
|
||||
f = (dv == it.key());
|
||||
else
|
||||
f = (np[i] == it.value().alias);
|
||||
// piCout << "s..." << it.key() << it.value().alias << f;
|
||||
if (f) {
|
||||
ns = &(it.value());
|
||||
break;
|
||||
}
|
||||
}
|
||||
//piCout << ns;
|
||||
// piCout << ns;
|
||||
if (!ns) return null;
|
||||
cs = ns;
|
||||
}
|
||||
if (np.back().isEmpty()) return null;
|
||||
bool isd = np.back()[0].isDigit() || (np.back()[0] == '-');
|
||||
int dv = 0;
|
||||
int dv = 0;
|
||||
if (isd) dv = np.back().toInt();
|
||||
//piCout << np.back() << isd << dv;
|
||||
// piCout << np.back() << isd << dv;
|
||||
auto it = cs->cd.makeIterator();
|
||||
while (it.next()) {
|
||||
bool f = false;
|
||||
if (isd) f = (dv == it.key());
|
||||
else f = (np.back() == it.value().name());
|
||||
//piCout << "k..." << it.key() << it.value().name() << f;
|
||||
if (f)
|
||||
return cs->cd[it.key()];
|
||||
if (isd)
|
||||
f = (dv == it.key());
|
||||
else
|
||||
f = (np.back() == it.value().name());
|
||||
// piCout << "k..." << it.key() << it.value().name() << f;
|
||||
if (f) return cs->cd[it.key()];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -390,12 +392,18 @@ CDType & CDSection::getByPath(const PIDeque<int> & path_) {
|
||||
void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
||||
if (!d) return;
|
||||
if (cd.isEmpty() && s.isEmpty()) return;
|
||||
// piCout << "[CDSection] write start";
|
||||
// piCout << "[CDSection] write start";
|
||||
PIString l;
|
||||
PIStringList cdtl;
|
||||
cdtl << "null" << "k" << "x" << "c" << "m";
|
||||
if (prefix.isEmpty()) l = "[" + cdtl[cd_type_] + "]";
|
||||
else l = "[" + prefix + "." + cdtl[cd_type_] + "]";
|
||||
cdtl << "null"
|
||||
<< "k"
|
||||
<< "x"
|
||||
<< "c"
|
||||
<< "m";
|
||||
if (prefix.isEmpty())
|
||||
l = "[" + cdtl[cd_type_] + "]";
|
||||
else
|
||||
l = "[" + prefix + "." + cdtl[cd_type_] + "]";
|
||||
l += "\n";
|
||||
d->write(l.toUTF8());
|
||||
l = "name = " + name + " \n";
|
||||
@@ -415,7 +423,7 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
||||
d->write(l.toUTF8());
|
||||
if (!ck.enumValues().enum_list.isEmpty()) {
|
||||
l = PIString::fromNumber(ck.index()) + ".ev = {";
|
||||
for (const PIVariantTypes::Enumerator & e : ck.enumValues().enum_list) {
|
||||
for (const PIVariantTypes::Enumerator & e: ck.enumValues().enum_list) {
|
||||
l += PIString::fromNumber(e.value) + " - " + e.name + ", ";
|
||||
}
|
||||
l.cutRight(2);
|
||||
@@ -426,7 +434,8 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
||||
case CDType::cdX:
|
||||
l = PIString::fromNumber(ck.index()) + ".name = " + ck.name() + " #s " + ck.comment() + " \n";
|
||||
d->write(l.toUTF8());
|
||||
l = PIString::fromNumber(ck.index()) + ".mode = " + PIString::fromNumber((int)ck.xmode()) + " #e (0 - cur, 1 - all_avg) " + "\n";
|
||||
l = PIString::fromNumber(ck.index()) + ".mode = " + PIString::fromNumber((int)ck.xmode()) + " #e (0 - cur, 1 - all_avg) " +
|
||||
"\n";
|
||||
d->write(l.toUTF8());
|
||||
l = PIString::fromNumber(ck.index()) + ".avg = " + PIString::fromNumber(ck.avg()) + " #n " + "\n";
|
||||
d->write(l.toUTF8());
|
||||
@@ -441,8 +450,10 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
||||
}
|
||||
}
|
||||
if (!s.isEmpty()) {
|
||||
if (prefix.isEmpty()) l = "s";
|
||||
else l = prefix + ".s";
|
||||
if (prefix.isEmpty())
|
||||
l = "s";
|
||||
else
|
||||
l = prefix + ".s";
|
||||
auto j = s.makeIterator();
|
||||
while (j.next()) {
|
||||
j.value().write(d, l + "." + PIString::fromNumber(j.key()));
|
||||
@@ -452,45 +463,54 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
||||
l = "[]\n";
|
||||
d->write(l.toUTF8());
|
||||
}
|
||||
// piCout << "[CDSection] write end";
|
||||
// piCout << "[CDSection] write end";
|
||||
}
|
||||
|
||||
|
||||
void CDSection::read(const void * ep) {
|
||||
// piCout << "[CDSection] read start";
|
||||
// piCout << "[CDSection] read start";
|
||||
PIStringList cdtl;
|
||||
cdtl << "null" << "k" << "x" << "c" << "m";
|
||||
cdtl << "null"
|
||||
<< "k"
|
||||
<< "x"
|
||||
<< "c"
|
||||
<< "m";
|
||||
cd.clear();
|
||||
s.clear();
|
||||
PIConfig::Entry & e(*(PIConfig::Entry*)ep);
|
||||
name = e.getValue(cdtl[cd_type_] + ".name").value();
|
||||
alias = e.getValue(cdtl[cd_type_] + ".alias").value();
|
||||
PIConfig::Entry & e(*(PIConfig::Entry *)ep);
|
||||
name = e.getValue(cdtl[cd_type_] + ".name").value();
|
||||
alias = e.getValue(cdtl[cd_type_] + ".alias").value();
|
||||
PIConfig::Entry & cdl = e.getValue(cdtl[cd_type_]);
|
||||
for (int i = 0; i < cdl.childCount(); ++i) {
|
||||
const PIConfig::Entry * e(cdl.child(i));
|
||||
bool ok = false;
|
||||
int id = e->name().toInt(-1, &ok);
|
||||
// piCout << "[read]" << ke->name() << ke->value() << ok;
|
||||
int id = e->name().toInt(-1, &ok);
|
||||
// piCout << "[read]" << ke->name() << ke->value() << ok;
|
||||
if (ok) {
|
||||
CDType c;
|
||||
PIString ev;
|
||||
switch (cd_type_) {
|
||||
case CDType::cdNull: break;
|
||||
case CDType::cdK:
|
||||
c = CDType(id, e->getValue("v").comment(), e->getValue("v").type(), e->getValue("v").value(), e->getValue("f").value(), e->getValue("f").comment(), cd_type_);
|
||||
c = CDType(id,
|
||||
e->getValue("v").comment(),
|
||||
e->getValue("v").type(),
|
||||
e->getValue("v").value(),
|
||||
e->getValue("f").value(),
|
||||
e->getValue("f").comment(),
|
||||
cd_type_);
|
||||
ev = e->getValue("ev", "").value();
|
||||
if (!ev.isEmpty())
|
||||
c.enum_values = c.parseEnumComment(ev);
|
||||
if (!ev.isEmpty()) c.enum_values = c.parseEnumComment(ev);
|
||||
break;
|
||||
case CDType::cdX:
|
||||
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cd_type_);
|
||||
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString(), e->getValue("name").comment(), cd_type_);
|
||||
c.setXMode((CDType::XMode)e->getValue("mode", int(CDType::X_Current)).value().toInt());
|
||||
c.setAvg((CDType::XMode)e->getValue("avg", 1).value().toInt());
|
||||
c.x_enabled = e->getValue("sel", false).value().toBool();
|
||||
break;
|
||||
case CDType::cdC:
|
||||
case CDType::cdM:
|
||||
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cd_type_);
|
||||
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString(), e->getValue("name").comment(), cd_type_);
|
||||
break;
|
||||
}
|
||||
cd[id] = c;
|
||||
@@ -504,7 +524,7 @@ void CDSection::read(const void * ep) {
|
||||
rs.cd_type_ = cd_type_;
|
||||
rs.read(se);
|
||||
}
|
||||
// piCout << "[CDSection] read end";
|
||||
// piCout << "[CDSection] read end";
|
||||
}
|
||||
|
||||
|
||||
@@ -513,8 +533,8 @@ void CDSection::update(CDSection & v, UpdateModeFlags mode) {
|
||||
piCout << "[CDSection] update error: SaveByIndex | SaveByName mode is denied!";
|
||||
return;
|
||||
}
|
||||
//piCout << "[CDSection] update start";
|
||||
//piCout << "before" << k.size() << v.k.size();
|
||||
// piCout << "[CDSection] update start";
|
||||
// piCout << "before" << k.size() << v.k.size();
|
||||
|
||||
PIMap<int, PIString> prev_cd_f_bi;
|
||||
PIMap<PIString, PIString> prev_cd_f_bn;
|
||||
@@ -530,9 +550,9 @@ void CDSection::update(CDSection & v, UpdateModeFlags mode) {
|
||||
}
|
||||
if (!mode[Merge]) cd.clear();
|
||||
for (auto i = v.cd.begin(); i != v.cd.end(); ++i) {
|
||||
int id = i.key();
|
||||
int id = i.key();
|
||||
PIString n = i.value().name();
|
||||
cd[id] = i.value();
|
||||
cd[id] = i.value();
|
||||
if (mode[SaveByIndex]) {
|
||||
if (prev_cd_f_bi.contains(id)) {
|
||||
cd[id].setFormula(prev_cd_f_bi[id]);
|
||||
@@ -559,9 +579,9 @@ void CDSection::update(CDSection & v, UpdateModeFlags mode) {
|
||||
}
|
||||
if (!mode[Merge]) s.clear();
|
||||
for (auto j = v.s.begin(); j != v.s.end(); ++j) {
|
||||
int id = j.key();
|
||||
int id = j.key();
|
||||
PIString n = j.value().alias;
|
||||
s[id] = j.value();
|
||||
s[id] = j.value();
|
||||
if (mode[SaveByIndex]) {
|
||||
if (prev_s_bi.contains(id)) s[id] = prev_s_bi[id];
|
||||
}
|
||||
@@ -580,7 +600,7 @@ bool CDSection::isSameStructure(CDSection & v) {
|
||||
}
|
||||
for (auto i = v.cd.begin(); i != v.cd.end(); ++i) {
|
||||
if (!cd_ids.contains(i.value().name())) continue;
|
||||
//piCout << i.key() << k[i.key()].name() << i.value().name();
|
||||
// piCout << i.key() << k[i.key()].name() << i.value().name();
|
||||
if (cd[cd_ids[i.value().name()]].index() != i.key()) return false;
|
||||
}
|
||||
for (auto j = v.s.begin(); j != v.s.end(); ++j) {
|
||||
@@ -593,7 +613,7 @@ bool CDSection::isSameStructure(CDSection & v) {
|
||||
|
||||
void CDSection::prepareCalculate() {
|
||||
for (auto i = cd.begin(); i != cd.end(); ++i) {
|
||||
i.value().parent = this;
|
||||
i.value().parent = this;
|
||||
i.value().calculated = false;
|
||||
}
|
||||
for (auto j = s.begin(); j != s.end(); ++j) {
|
||||
@@ -622,8 +642,8 @@ void CDSection::setSelectedX(bool yes) {
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIDeque<int> > CDSection::collectX() const {
|
||||
PIVector<PIDeque<int> > ret;
|
||||
PIVector<PIDeque<int>> CDSection::collectX() const {
|
||||
PIVector<PIDeque<int>> ret;
|
||||
for (auto i = cd.begin(); i != cd.end(); ++i) {
|
||||
if (i.value().x_enabled) {
|
||||
ret << i.value().path();
|
||||
@@ -642,7 +662,7 @@ void CDSection::makePath(PIDeque<int> p) {
|
||||
tp = p;
|
||||
tp << i.key();
|
||||
i.value().path_ = tp;
|
||||
//piCout << "path for" << i.value().name() << tp;
|
||||
// piCout << "path for" << i.value().name() << tp;
|
||||
}
|
||||
for (auto j = s.begin(); j != s.end(); ++j) {
|
||||
tp = p;
|
||||
@@ -652,10 +672,10 @@ void CDSection::makePath(PIDeque<int> p) {
|
||||
}
|
||||
|
||||
|
||||
PIVector<CDType * > CDSection::children(bool recursive) const {
|
||||
PIVector<CDType * > ret;
|
||||
PIVector<CDType *> CDSection::children(bool recursive) const {
|
||||
PIVector<CDType *> ret;
|
||||
for (auto i = cd.begin(); i != cd.end(); ++i) {
|
||||
ret << const_cast<CDType * >(&(i.value()));
|
||||
ret << const_cast<CDType *>(&(i.value()));
|
||||
}
|
||||
if (!recursive) return ret;
|
||||
for (auto j = s.begin(); j != s.end(); ++j) {
|
||||
@@ -672,5 +692,3 @@ PIVariantTypes::Enum CDSection::enumValues() const {
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_TYPES_H
|
||||
#define CDUTILS_TYPES_H
|
||||
|
||||
#include "pistring.h"
|
||||
#include "pimap.h"
|
||||
#include "pivariant.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "pimap.h"
|
||||
#include "pistring.h"
|
||||
#include "pivariant.h"
|
||||
|
||||
class PIIODevice;
|
||||
class PIEvaluator;
|
||||
@@ -53,49 +53,59 @@ class CD_CORE_EXPORT CDType {
|
||||
friend class CDCore;
|
||||
friend class Interface;
|
||||
friend class XInterface;
|
||||
|
||||
public:
|
||||
enum cdT {cdNull, cdK, cdX, cdC, cdM};
|
||||
enum XMode {X_Current, X_All_Avg};
|
||||
enum cdT {
|
||||
cdNull,
|
||||
cdK,
|
||||
cdX,
|
||||
cdC,
|
||||
cdM
|
||||
};
|
||||
enum XMode {
|
||||
X_Current,
|
||||
X_All_Avg
|
||||
};
|
||||
|
||||
CDType();
|
||||
CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t);
|
||||
|
||||
CDType & operator =(double x);
|
||||
int index() const {return index_;}
|
||||
PIString name() const {return name_;}
|
||||
CDType & operator=(double x);
|
||||
int index() const { return index_; }
|
||||
PIString name() const { return name_; }
|
||||
PIString type() const;
|
||||
PIString value() const;
|
||||
PIVariant variantValue() const;
|
||||
PIString formula() const {return formula_;}
|
||||
PIString comment() const {return comment_;}
|
||||
double toDouble() const {return value_d;}
|
||||
int toInt() const {return value_i;}
|
||||
bool toBool() const {return value_b;}
|
||||
cdT cd_type() const {return cd_type_;}
|
||||
PIString formula() const { return formula_; }
|
||||
PIString comment() const { return comment_; }
|
||||
double toDouble() const { return value_d; }
|
||||
int toInt() const { return value_i; }
|
||||
bool toBool() const { return value_b; }
|
||||
cdT cd_type() const { return cd_type_; }
|
||||
void setValue(const PIString & value_);
|
||||
void setVariantValue(const PIVariant & value_);
|
||||
void setFormula(const PIString & formula);
|
||||
void setComment(const PIString & comment) {comment_ = comment;}
|
||||
operator double() const {return value_d;}
|
||||
const PIVariantTypes::Enum & enumValues() const {return enum_values;}
|
||||
void setEnumValues(const PIVariantTypes::Enum & ev) {enum_values = ev;}
|
||||
const PIString & errorString() const {return error_;}
|
||||
PIDeque<int> path() const {return path_;}
|
||||
void setComment(const PIString & comment) { comment_ = comment; }
|
||||
operator double() const { return value_d; }
|
||||
const PIVariantTypes::Enum & enumValues() const { return enum_values; }
|
||||
void setEnumValues(const PIVariantTypes::Enum & ev) { enum_values = ev; }
|
||||
const PIString & errorString() const { return error_; }
|
||||
PIDeque<int> path() const { return path_; }
|
||||
PIStringList pathString() const;
|
||||
|
||||
void setXMode(XMode mode) {mode_ = mode;}
|
||||
void setAvg(int avg) {avg_size = avg;}
|
||||
XMode xmode() const {return mode_;}
|
||||
XMode xmode_rec() const {return rmode_;}
|
||||
int avg() const {return avg_size;}
|
||||
bool isSelectedX() const {return x_enabled;}
|
||||
void setXMode(XMode mode) { mode_ = mode; }
|
||||
void setAvg(int avg) { avg_size = avg; }
|
||||
XMode xmode() const { return mode_; }
|
||||
XMode xmode_rec() const { return rmode_; }
|
||||
int avg() const { return avg_size; }
|
||||
bool isSelectedX() const { return x_enabled; }
|
||||
void readX(PIByteArray & ba);
|
||||
void writeX(PIByteArray & ba);
|
||||
|
||||
PIVector<double> history;
|
||||
|
||||
protected:
|
||||
bool calculate(PIEvaluator * e, PIVector<const CDType * > stack = PIVector<const CDType * >());
|
||||
bool calculate(PIEvaluator * e, PIVector<const CDType *> stack = PIVector<const CDType *>());
|
||||
PIVariantTypes::Enum parseEnumComment(PIString c);
|
||||
cdT cd_type_;
|
||||
int index_;
|
||||
@@ -120,27 +130,27 @@ class CD_CORE_EXPORT CDSection {
|
||||
friend class ::CD_Pult;
|
||||
friend class ::CDItem;
|
||||
friend class ::CDItemModel;
|
||||
public:
|
||||
|
||||
public:
|
||||
CDSection(CDType::cdT type_ = CDType::cdNull);
|
||||
|
||||
bool test(int v) {return cd.value(v).toBool();}
|
||||
// CDType & operator [](int v) {if (!k.contains(v)) k[v].index_ = v; return k[v];}
|
||||
CDType & operator [](int v) {return cd[v];}
|
||||
CDType & operator [](const PIString & name_) {return getByName(name_);}
|
||||
CDType & operator [](const PIDeque<int> & path_) {return getByPath(path_);}
|
||||
bool test(int v) { return cd.value(v).toBool(); }
|
||||
// CDType & operator [](int v) {if (!k.contains(v)) k[v].index_ = v; return k[v];}
|
||||
CDType & operator[](int v) { return cd[v]; }
|
||||
CDType & operator[](const PIString & name_) { return getByName(name_); }
|
||||
CDType & operator[](const PIDeque<int> & path_) { return getByPath(path_); }
|
||||
CDSection & section(int v);
|
||||
const CDSection section(int v) const;
|
||||
|
||||
bool isEmpty() const {return cd.isEmpty() && s.isEmpty();}
|
||||
bool isEmpty() const { return cd.isEmpty() && s.isEmpty(); }
|
||||
bool exists(PIDeque<int> path) const;
|
||||
int count(bool recursive = true) const;
|
||||
int sectionsCount() const;
|
||||
PIVector<int> indexes() const {return cd.keys();}
|
||||
PIVector<int> indexes() const { return cd.keys(); }
|
||||
PIStringList index_names() const;
|
||||
void calculate();
|
||||
void makePath(PIDeque<int> p = PIDeque<int>());
|
||||
PIVector<CDType * > children(bool recursive = true) const;
|
||||
PIVector<CDType *> children(bool recursive = true) const;
|
||||
PIVariantTypes::Enum enumValues() const;
|
||||
|
||||
PIString name;
|
||||
@@ -149,7 +159,7 @@ public:
|
||||
protected:
|
||||
CDSection(PIMap<int, CDType> k_, PIMap<int, CDSection> s_) {
|
||||
cd = k_;
|
||||
s = s_;
|
||||
s = s_;
|
||||
}
|
||||
CDType & getByName(const PIString & name_);
|
||||
CDType & getByPath(const PIDeque<int> & path_);
|
||||
@@ -160,7 +170,7 @@ protected:
|
||||
void prepareCalculate();
|
||||
void calculateRecursive(PIEvaluator * e);
|
||||
void setSelectedX(bool yes);
|
||||
PIVector<PIDeque<int> > collectX() const;
|
||||
PIVector<PIDeque<int>> collectX() const;
|
||||
|
||||
PIMap<int, CDType> cd;
|
||||
mutable PIMap<int, CDSection> s;
|
||||
@@ -168,18 +178,18 @@ protected:
|
||||
CDType::cdT cd_type_;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
|
||||
inline PICout operator <<(PICout s, const CDUtils::CDType & v) {
|
||||
inline PICout operator<<(PICout s, const CDUtils::CDType & v) {
|
||||
s.space();
|
||||
s.saveAndSetControls(0);
|
||||
switch (v.cd_type()) {
|
||||
case CDUtils::CDType::cdK : s << "K["; break;
|
||||
case CDUtils::CDType::cdX : s << "X["; break;
|
||||
case CDUtils::CDType::cdC : s << "C["; break;
|
||||
case CDUtils::CDType::cdM : s << "M["; break;
|
||||
default : s << "Null["; break;
|
||||
case CDUtils::CDType::cdK: s << "K["; break;
|
||||
case CDUtils::CDType::cdX: s << "X["; break;
|
||||
case CDUtils::CDType::cdC: s << "C["; break;
|
||||
case CDUtils::CDType::cdM: s << "M["; break;
|
||||
default: s << "Null["; break;
|
||||
}
|
||||
s << v.name() << "(" << v.index() << ")] = " << v.value();
|
||||
s.restoreControls();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "cdutils_x.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
@@ -18,19 +19,19 @@ void XInterface::setEnabled(const CDType & x, bool en) {
|
||||
core->x_mutex.unlock();
|
||||
return;
|
||||
}
|
||||
t.x_enabled = en;
|
||||
//piCout << t << "x_enabled" << en;
|
||||
t.x_enabled = en;
|
||||
// piCout << t << "x_enabled" << en;
|
||||
core->need_rebuild_x = true;
|
||||
core->x_mutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIDeque<int> > XInterface::enabledList() const {
|
||||
PIVector<PIDeque<int>> XInterface::enabledList() const {
|
||||
return CDCore::instance()->x_selected;
|
||||
}
|
||||
|
||||
|
||||
void XInterface::setEnabledList(const PIVector<PIDeque<int> > & l) {
|
||||
void XInterface::setEnabledList(const PIVector<PIDeque<int>> & l) {
|
||||
CDCore::instance()->x_selected = l;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,56 +1,55 @@
|
||||
/*
|
||||
CD Utils - Control-Debug utilites
|
||||
CD Utils - Control-Debug utilites
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CDUTILS_X_H
|
||||
#define CDUTILS_X_H
|
||||
|
||||
#include "cdutils_interface.h"
|
||||
#include "cd_core_export.h"
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
|
||||
namespace CDUtils {
|
||||
|
||||
|
||||
class CD_CORE_EXPORT XInterface: public Interface
|
||||
{
|
||||
class CD_CORE_EXPORT XInterface: public Interface {
|
||||
PIOBJECT_SUBCLASS(XInterface, Interface);
|
||||
|
||||
public:
|
||||
XInterface();
|
||||
|
||||
EVENT1(keepNamesRequest, bool*, xn);
|
||||
EVENT1(receivedX, PIVector<PIDeque<int> >, pathes);
|
||||
EVENT1(keepNamesRequest, bool *, xn);
|
||||
EVENT1(receivedX, PIVector<PIDeque<int>>, pathes);
|
||||
|
||||
void enable(const CDType & x) {setEnabled(x, true);}
|
||||
void disable(const CDType & x) {setEnabled(x, false);}
|
||||
void enable(const CDType & x) { setEnabled(x, true); }
|
||||
void disable(const CDType & x) { setEnabled(x, false); }
|
||||
void setEnabled(const CDType & x, bool en);
|
||||
void setDisabled(const CDType & x, bool dis) {setEnabled(x, !dis);}
|
||||
PIVector<PIDeque<int> > enabledList() const;
|
||||
void setEnabledList(const PIVector<PIDeque<int> > & l);
|
||||
void setDisabled(const CDType & x, bool dis) { setEnabled(x, !dis); }
|
||||
PIVector<PIDeque<int>> enabledList() const;
|
||||
void setEnabledList(const PIVector<PIDeque<int>> & l);
|
||||
void lock();
|
||||
void unlock();
|
||||
|
||||
void start(double freq = 20.);
|
||||
void stop();
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace CDUtils
|
||||
|
||||
extern CD_CORE_EXPORT CDUtils::XInterface X;
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "cdutils_k.h"
|
||||
#include "cdutils_x.h"
|
||||
#include "cdutils_c.h"
|
||||
#include "cdutils_m.h"
|
||||
#include "cdutils_core.h"
|
||||
#include "cdtest.h"
|
||||
#include "pip.h"
|
||||
#include "cdutils_c.h"
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_k.h"
|
||||
#include "cdutils_m.h"
|
||||
#include "cdutils_x.h"
|
||||
#include "k_description.h"
|
||||
#include "pip.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
class Core : public PIObject
|
||||
{
|
||||
class Core: public PIObject {
|
||||
PIOBJECT(Core);
|
||||
|
||||
public:
|
||||
Core() {
|
||||
CDCore::instance()->initApp();
|
||||
@@ -33,25 +33,25 @@ public:
|
||||
rf.resize(0);
|
||||
K.write(&rf);
|
||||
rf.close();
|
||||
// rf.open("k_out.txt", PIIODevice::ReadWrite);
|
||||
// K.read(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
|
||||
// rf.resize(0);
|
||||
// K.write(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
|
||||
// K.read(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out3.txt", PIIODevice::ReadWrite);
|
||||
// rf.resize(0);
|
||||
// K.write(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out.txt", PIIODevice::ReadWrite);
|
||||
// K.read(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
|
||||
// rf.resize(0);
|
||||
// K.write(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
|
||||
// K.read(&rf);
|
||||
// rf.close();
|
||||
// rf.open("k_out3.txt", PIIODevice::ReadWrite);
|
||||
// rf.resize(0);
|
||||
// K.write(&rf);
|
||||
// rf.close();
|
||||
}
|
||||
|
||||
void test() {
|
||||
X.lock();
|
||||
X[KD::Frequency] = 100;
|
||||
X[KD::Frequency] = 100;
|
||||
X.section(KD::Spectrometer)[KD::Temperature_default] = sin(t);
|
||||
t += 0.01;
|
||||
X.unlock();
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
piCout << K[Second];*/
|
||||
}
|
||||
|
||||
EVENT_HANDLER(void, ksend) {piCout << "sended k";}
|
||||
EVENT_HANDLER(void, ksend) { piCout << "sended k"; }
|
||||
EVENT_HANDLER(void, crecv) {
|
||||
piCout << "received c";
|
||||
C.connect(C.section(KD::Logs).section(KD::Spec).section(KD::Formats)[KD::Binary], this, HANDLER(cmd));
|
||||
@@ -71,14 +71,14 @@ public:
|
||||
if (!timer.isRunning()) timer.start(10);
|
||||
X.start();
|
||||
}
|
||||
EVENT_HANDLER(void, timerDone) {test();}
|
||||
EVENT_HANDLER(void, cmd) {piCout << "command cmd";}
|
||||
EVENT_HANDLER(void, timerDone) { test(); }
|
||||
EVENT_HANDLER(void, cmd) { piCout << "command cmd"; }
|
||||
EVENT_HANDLER(void, c_Pause) {
|
||||
piCout << "command pause";
|
||||
M[KD::Main] << "rec command" << C[KD::Pause];
|
||||
M.messageBox(M.root()[KD::Core], "init successfull");
|
||||
}
|
||||
EVENT_HANDLER(void, c_Spectrometer_Connection) {piCout << "command spec_conn";}
|
||||
EVENT_HANDLER(void, c_Spectrometer_Connection) { piCout << "command spec_conn"; }
|
||||
|
||||
private:
|
||||
PIFile rf;
|
||||
@@ -87,11 +87,10 @@ private:
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int main(int argc, char * argv[]) {
|
||||
X.start();
|
||||
piSleep(1);
|
||||
//CDCore::instance()->destroy();
|
||||
// CDCore::instance()->destroy();
|
||||
piCout << "DELETED";
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
#include "qcd_core.h"
|
||||
#include "cdutils_k.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_k.h"
|
||||
#include "piqt.h"
|
||||
#include <QWidget>
|
||||
|
||||
#include <QCheckBox>
|
||||
#include <QGroupBox>
|
||||
#include <QSpinBox>
|
||||
#include <QSlider>
|
||||
#include <QScrollBar>
|
||||
#include <QDoubleSpinBox>
|
||||
#include <QGroupBox>
|
||||
#include <QLineEdit>
|
||||
#include <spinslider.h>
|
||||
#include <QScrollBar>
|
||||
#include <QSlider>
|
||||
#include <QSpinBox>
|
||||
#include <QWidget>
|
||||
#include <clineedit.h>
|
||||
#include <evalspinbox.h>
|
||||
#include <qvariantedit.h>
|
||||
#include <qcd_view.h>
|
||||
#include <qvariantedit.h>
|
||||
#include <spinslider.h>
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
@@ -40,8 +42,6 @@ __QCore_Initializer__::~__QCore_Initializer__() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QCDCore::QCDCore() {
|
||||
setObjectName("QCDCore");
|
||||
setName("QCDCore");
|
||||
@@ -50,8 +50,7 @@ QCDCore::QCDCore() {
|
||||
}
|
||||
|
||||
|
||||
QCDCore::~QCDCore() {
|
||||
}
|
||||
QCDCore::~QCDCore() {}
|
||||
|
||||
|
||||
void QCDCore::K_ChangedGlobal() {
|
||||
@@ -60,10 +59,10 @@ void QCDCore::K_ChangedGlobal() {
|
||||
|
||||
|
||||
void QCDCore::slotBool(bool v) {
|
||||
QWidget * w = (QWidget*)sender();
|
||||
QWidget * w = (QWidget *)sender();
|
||||
if (!w || updating) return;
|
||||
QList<PIDeque<int> > pathes = binded_widgets.values(w);
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
QList<PIDeque<int>> pathes = binded_widgets.values(w);
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K[path].setValue(PIString::fromBool(v));
|
||||
K.calculate();
|
||||
emit updateViewRequest();
|
||||
@@ -71,40 +70,40 @@ void QCDCore::slotBool(bool v) {
|
||||
|
||||
|
||||
void QCDCore::slotInt(int v) {
|
||||
QWidget * w = (QWidget*)sender();
|
||||
QWidget * w = (QWidget *)sender();
|
||||
if (!w || updating) return;
|
||||
QList<PIDeque<int> > pathes = binded_widgets.values(w);
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
QList<PIDeque<int>> pathes = binded_widgets.values(w);
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K[path].setValue(PIString::fromNumber(v));
|
||||
finishEdit(pathes);
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::slotDouble(double v) {
|
||||
QWidget * w = (QWidget*)sender();
|
||||
QWidget * w = (QWidget *)sender();
|
||||
if (!w || updating) return;
|
||||
QList<PIDeque<int> > pathes = binded_widgets.values(w);
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
QList<PIDeque<int>> pathes = binded_widgets.values(w);
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K[path].setValue(PIString::fromNumber(v));
|
||||
finishEdit(pathes);
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::slotText(QString v) {
|
||||
QWidget * w = (QWidget*)sender();
|
||||
QWidget * w = (QWidget *)sender();
|
||||
if (!w || updating) return;
|
||||
QList<PIDeque<int> > pathes = binded_widgets.values(w);
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
QList<PIDeque<int>> pathes = binded_widgets.values(w);
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K[path].setValue(Q2PIString(v));
|
||||
finishEdit(pathes);
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::slotVariant(QVariant v) {
|
||||
QWidget * w = (QWidget*)sender();
|
||||
QWidget * w = (QWidget *)sender();
|
||||
if (!w || updating) return;
|
||||
QList<PIDeque<int> > pathes = binded_widgets.values(w);
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
QList<PIDeque<int>> pathes = binded_widgets.values(w);
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K[path].setVariantValue(Q2PIVariant(v));
|
||||
finishEdit(pathes);
|
||||
}
|
||||
@@ -112,21 +111,21 @@ void QCDCore::slotVariant(QVariant v) {
|
||||
|
||||
void QCDCore::slotDestroyed(QObject * o) {
|
||||
if (!o) return;
|
||||
if (!binded_widgets.contains((QWidget*)o)) return;
|
||||
binded_widgets.remove((QWidget*)o);
|
||||
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<QWidget * >());
|
||||
// K.root().makePath();
|
||||
return bindWidgets(wnd->findChildren<QWidget *>());
|
||||
}
|
||||
|
||||
|
||||
int QCDCore::bindWidgets(QList<QWidget * > wl) {
|
||||
int QCDCore::bindWidgets(QList<QWidget *> wl) {
|
||||
int ret = 0;
|
||||
foreach (QWidget * w, wl)
|
||||
foreach(QWidget * w, wl)
|
||||
if (bindWidget(w)) ++ret;
|
||||
return ret;
|
||||
}
|
||||
@@ -140,8 +139,8 @@ bool QCDCore::bindWidget(QWidget * w) {
|
||||
bindView(w);
|
||||
return false;
|
||||
}
|
||||
PIVector<CDType * > ak = K.root().children();
|
||||
piForeachC (CDType * k, ak) {
|
||||
PIVector<CDType *> ak = K.root().children();
|
||||
piForeachC(CDType * k, ak) {
|
||||
if (!on.endsWith(PI2QString(k->pathString().join("_")))) continue;
|
||||
if (bindWidget(w, *k)) return true;
|
||||
}
|
||||
@@ -151,9 +150,9 @@ bool QCDCore::bindWidget(QWidget * w) {
|
||||
|
||||
bool QCDCore::bindWidget(QWidget * w, const CDType & k) {
|
||||
if (!w) return false;
|
||||
//piCout << "bind..." << k.name() << k.path();
|
||||
// piCout << "bind..." << k.name() << k.path();
|
||||
QString cn = w->metaObject()->className();
|
||||
bool ok = false;
|
||||
bool ok = false;
|
||||
if (cn == "QCheckBox" || cn == "QGroupBox") {
|
||||
connect(w, SIGNAL(toggled(bool)), this, SLOT(slotBool(bool)), Qt::UniqueConnection);
|
||||
ok = true;
|
||||
@@ -177,17 +176,17 @@ bool QCDCore::bindWidget(QWidget * w, const CDType & k) {
|
||||
if (cn == "CDView") {
|
||||
bindView(w);
|
||||
}
|
||||
connect(w, SIGNAL(destroyed(QObject*)), this, SLOT(slotDestroyed(QObject*)), Qt::UniqueConnection);
|
||||
connect(w, SIGNAL(destroyed(QObject *)), this, SLOT(slotDestroyed(QObject *)), Qt::UniqueConnection);
|
||||
setWidgetValue(w, k);
|
||||
if (!ok) return false;
|
||||
//piCout << k.name() << k.path() << "ok";
|
||||
// piCout << k.name() << k.path() << "ok";
|
||||
binded_widgets.insert(w, k.path());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::updateBindedWidgets() {
|
||||
QMultiMapIterator<QWidget * , PIDeque<int> > it(binded_widgets);
|
||||
QMultiMapIterator<QWidget *, PIDeque<int>> it(binded_widgets);
|
||||
QWidgetList to_remove;
|
||||
updating = true;
|
||||
while (it.hasNext()) {
|
||||
@@ -197,14 +196,14 @@ void QCDCore::updateBindedWidgets() {
|
||||
else
|
||||
setWidgetValue(w, K[it.value()]);
|
||||
}
|
||||
foreach (QWidget * w, to_remove)
|
||||
foreach(QWidget * w, to_remove)
|
||||
unbindWidget(w);
|
||||
updating = false;
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::bindView(QWidget * v) {
|
||||
CDView * w = qobject_cast<CDView * >(v);
|
||||
CDView * w = qobject_cast<CDView *>(v);
|
||||
if (!w) return;
|
||||
connect(this, SIGNAL(updateViewRequest()), w, SLOT(refreshValues()), Qt::UniqueConnection);
|
||||
}
|
||||
@@ -213,24 +212,24 @@ void QCDCore::bindView(QWidget * v) {
|
||||
void QCDCore::setWidgetValue(QWidget * w, const CDType & k) {
|
||||
if (!w) return;
|
||||
QString cn = w->metaObject()->className();
|
||||
if (cn == "QCheckBox") qobject_cast<QCheckBox*>(w)->setChecked(k.toBool());
|
||||
if (cn == "QGroupBox") qobject_cast<QGroupBox*>(w)->setChecked(k.toBool());
|
||||
if (cn == "QSpinBox") qobject_cast<QSpinBox*>(w)->setValue(k.toInt());
|
||||
if (cn == "QSlider") qobject_cast<QSlider*>(w)->setValue(k.toInt());
|
||||
if (cn == "QScrollBar") qobject_cast<QScrollBar*>(w)->setValue(k.toInt());
|
||||
if (cn == "QDoubleSpinBox") qobject_cast<QDoubleSpinBox*>(w)->setValue(k.toDouble());
|
||||
if (cn == "SpinSlider") qobject_cast<SpinSlider*>(w)->setValue(k.toDouble());
|
||||
if (cn == "QLineEdit") qobject_cast<QLineEdit*>(w)->setText(PI2QString(k.value()));
|
||||
if (cn == "CLineEdit") qobject_cast<CLineEdit*>(w)->setText(PI2QString(k.value()));
|
||||
if (cn == "EvalSpinBox") qobject_cast<EvalSpinBox*>(w)->setValue(k.toDouble());
|
||||
if (cn == "QVariantEdit") qobject_cast<QVariantEdit*>(w)->setValue(PI2QVariant(k.variantValue()));
|
||||
if (cn == "QCheckBox") qobject_cast<QCheckBox *>(w)->setChecked(k.toBool());
|
||||
if (cn == "QGroupBox") qobject_cast<QGroupBox *>(w)->setChecked(k.toBool());
|
||||
if (cn == "QSpinBox") qobject_cast<QSpinBox *>(w)->setValue(k.toInt());
|
||||
if (cn == "QSlider") qobject_cast<QSlider *>(w)->setValue(k.toInt());
|
||||
if (cn == "QScrollBar") qobject_cast<QScrollBar *>(w)->setValue(k.toInt());
|
||||
if (cn == "QDoubleSpinBox") qobject_cast<QDoubleSpinBox *>(w)->setValue(k.toDouble());
|
||||
if (cn == "SpinSlider") qobject_cast<SpinSlider *>(w)->setValue(k.toDouble());
|
||||
if (cn == "QLineEdit") qobject_cast<QLineEdit *>(w)->setText(PI2QString(k.value()));
|
||||
if (cn == "CLineEdit") qobject_cast<CLineEdit *>(w)->setText(PI2QString(k.value()));
|
||||
if (cn == "EvalSpinBox") qobject_cast<EvalSpinBox *>(w)->setValue(k.toDouble());
|
||||
if (cn == "QVariantEdit") qobject_cast<QVariantEdit *>(w)->setValue(PI2QVariant(k.variantValue()));
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::finishEdit(const QList<PIDeque<int> > & pathes) {
|
||||
void QCDCore::finishEdit(const QList<PIDeque<int>> & pathes) {
|
||||
K.calculate();
|
||||
if (direct_on) {
|
||||
foreach (const PIDeque<int> & path, pathes)
|
||||
foreach(const PIDeque<int> & path, pathes)
|
||||
K.directChange(K[path]);
|
||||
}
|
||||
emit updateViewRequest();
|
||||
@@ -239,13 +238,13 @@ void QCDCore::finishEdit(const QList<PIDeque<int> > & pathes) {
|
||||
|
||||
int QCDCore::unbindWindow(QWidget * wnd) {
|
||||
if (!wnd) return 0;
|
||||
return unbindWidgets(wnd->findChildren<QWidget * >());
|
||||
return unbindWidgets(wnd->findChildren<QWidget *>());
|
||||
}
|
||||
|
||||
|
||||
int QCDCore::unbindWidgets(QList<QWidget * > wl) {
|
||||
int QCDCore::unbindWidgets(QList<QWidget *> wl) {
|
||||
int ret = 0;
|
||||
foreach (QWidget * w, wl)
|
||||
foreach(QWidget * w, wl)
|
||||
if (unbindWidget(w)) ++ret;
|
||||
return ret;
|
||||
}
|
||||
@@ -253,29 +252,25 @@ int QCDCore::unbindWidgets(QList<QWidget * > wl) {
|
||||
|
||||
bool QCDCore::unbindWidget(QWidget * w) {
|
||||
if (!w) return false;
|
||||
//qDebug() << "unbind" << w;
|
||||
// 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 == "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();
|
||||
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();
|
||||
// qDebug() << "remove a" << binded_widgets.size();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void QCDCore::unbindAllWidgets() {
|
||||
QList<QWidget * > bwk = binded_widgets.keys();
|
||||
foreach (QWidget * w, bwk) {
|
||||
QList<QWidget *> bwk = binded_widgets.keys();
|
||||
foreach(QWidget * w, bwk) {
|
||||
unbindWidget(w);
|
||||
}
|
||||
binded_widgets.clear();
|
||||
@@ -283,7 +278,7 @@ void QCDCore::unbindAllWidgets() {
|
||||
|
||||
|
||||
void QCDCore::updateBindedWidget(const CDType & k_) {
|
||||
QMultiMapIterator<QWidget * , PIDeque<int> > it(binded_widgets);
|
||||
QMultiMapIterator<QWidget *, PIDeque<int>> it(binded_widgets);
|
||||
updating = true;
|
||||
while (it.hasNext()) {
|
||||
QWidget * w = it.next().key();
|
||||
|
||||
@@ -1,31 +1,32 @@
|
||||
/*
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef QCD_CORE_H
|
||||
#define QCD_CORE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QMultiMap>
|
||||
#include <QVariant>
|
||||
#include "piobject.h"
|
||||
#include "cdutils_types.h"
|
||||
#include "cd_qt_export.h"
|
||||
#include "cdutils_types.h"
|
||||
#include "piobject.h"
|
||||
|
||||
#include <QMultiMap>
|
||||
#include <QObject>
|
||||
#include <QVariant>
|
||||
|
||||
|
||||
class QCDCore;
|
||||
@@ -40,27 +41,29 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class CD_QT_EXPORT QCDCore: public QObject, public PIObject
|
||||
{
|
||||
class CD_QT_EXPORT QCDCore
|
||||
: public QObject
|
||||
, public PIObject {
|
||||
Q_OBJECT
|
||||
PIOBJECT(QCDCore);
|
||||
friend class __QCore_Initializer__;
|
||||
|
||||
public:
|
||||
static QCDCore * instance() {return __QCore_Initializer__::__instance__;}
|
||||
static QCDCore * instance() { return __QCore_Initializer__::__instance__; }
|
||||
|
||||
int bindWindow(QWidget * wnd);
|
||||
int bindWidgets(QList<QWidget * > wl);
|
||||
int bindWidgets(QList<QWidget *> wl);
|
||||
bool bindWidget(QWidget * w);
|
||||
bool bindWidget(QWidget * w, const CDUtils::CDType & k);
|
||||
|
||||
int unbindWindow(QWidget * wnd);
|
||||
int unbindWidgets(QList<QWidget * > wl);
|
||||
int unbindWidgets(QList<QWidget *> 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;}
|
||||
void setDirectKEnabled(bool yes) { direct_on = yes; }
|
||||
bool isDirectKEnabled() const { return direct_on; }
|
||||
|
||||
private:
|
||||
QCDCore();
|
||||
@@ -68,10 +71,10 @@ private:
|
||||
|
||||
void bindView(QWidget * v);
|
||||
void setWidgetValue(QWidget * w, const CDUtils::CDType & k);
|
||||
void finishEdit(const QList<PIDeque<int> > & pathes);
|
||||
void finishEdit(const QList<PIDeque<int>> & pathes);
|
||||
EVENT_HANDLER(void, K_ChangedGlobal);
|
||||
|
||||
QMultiMap<QWidget * , PIDeque<int> > binded_widgets;
|
||||
QMultiMap<QWidget *, PIDeque<int>> binded_widgets;
|
||||
bool updating, direct_on;
|
||||
|
||||
private slots:
|
||||
@@ -80,14 +83,13 @@ private slots:
|
||||
void slotDouble(double v);
|
||||
void slotText(QString v);
|
||||
void slotVariant(QVariant v);
|
||||
void slotDestroyed(QObject * );
|
||||
void slotDestroyed(QObject *);
|
||||
|
||||
public slots:
|
||||
void updateBindedWidgets();
|
||||
|
||||
signals:
|
||||
void updateViewRequest();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
#include "qcd_graphic.h"
|
||||
#include "ui_qcd_graphic.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_x.h"
|
||||
#include "graphic.h"
|
||||
#include "piqt.h"
|
||||
#include "ui_qcd_graphic.h"
|
||||
|
||||
using namespace CDUtils;
|
||||
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
/*
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef QCD_GRAPHIC_H
|
||||
#define QCD_GRAPHIC_H
|
||||
|
||||
#include "cd_qt_export.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <evalspinbox.h>
|
||||
#include <pistring.h>
|
||||
#include "cd_qt_export.h"
|
||||
|
||||
namespace CDUtils {
|
||||
class CDType;
|
||||
class CDSection;
|
||||
}
|
||||
class CDType;
|
||||
class CDSection;
|
||||
} // namespace CDUtils
|
||||
|
||||
namespace Ui {
|
||||
class CDGraphicWidget;
|
||||
class CDGraphicWidget;
|
||||
}
|
||||
|
||||
class Graphic;
|
||||
@@ -42,6 +43,7 @@ class CD_QT_EXPORT CDGraphicWidget: public QWidget {
|
||||
Q_OBJECT
|
||||
friend class CDGraphics;
|
||||
friend class GDockWidget;
|
||||
|
||||
public:
|
||||
CDGraphicWidget(QWidget * p = 0);
|
||||
|
||||
@@ -60,7 +62,6 @@ private:
|
||||
private slots:
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "qcd_modedialog.h"
|
||||
|
||||
#include "ui_qcd_modedialog.h"
|
||||
|
||||
|
||||
@@ -22,14 +23,11 @@ CDUtils::UpdateModeFlags QCDModeDialog::mode() const {
|
||||
}
|
||||
|
||||
|
||||
void QCDModeDialog::changeEvent(QEvent *e) {
|
||||
void QCDModeDialog::changeEvent(QEvent * e) {
|
||||
QDialog::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,36 +1,37 @@
|
||||
/*
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef QCD_MODEDIALOG_H
|
||||
#define QCD_MODEDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <cdutils_types.h>
|
||||
#include "cd_qt_export.h"
|
||||
|
||||
#include <QDialog>
|
||||
#include <cdutils_types.h>
|
||||
|
||||
namespace Ui {
|
||||
class QCDModeDialog;
|
||||
class QCDModeDialog;
|
||||
}
|
||||
|
||||
class CD_QT_EXPORT QCDModeDialog: public QDialog
|
||||
{
|
||||
class CD_QT_EXPORT QCDModeDialog: public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QCDModeDialog(QWidget * parent = 0);
|
||||
~QCDModeDialog();
|
||||
@@ -38,14 +39,13 @@ public:
|
||||
CDUtils::UpdateModeFlags mode() const;
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent *e);
|
||||
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
|
||||
|
||||
@@ -1,28 +1,30 @@
|
||||
#include "qcd_model.h"
|
||||
#include "cdutils_interface.h"
|
||||
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_interface.h"
|
||||
#include "cdutils_x.h"
|
||||
#include "piqt.h"
|
||||
#include <QDebug>
|
||||
#include "qad_types.h"
|
||||
#include "qvariantedit.h"
|
||||
|
||||
#include <QBrush>
|
||||
#include <QColor>
|
||||
#include <QDebug>
|
||||
#include <QMimeData>
|
||||
#include <QPainter>
|
||||
#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;
|
||||
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;
|
||||
expanded = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,19 +36,23 @@ CDItem::~CDItem() {
|
||||
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));
|
||||
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 (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;
|
||||
@@ -58,31 +64,31 @@ QVariant CDItem::data(int column, int role) const {
|
||||
}
|
||||
if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant();
|
||||
PIDeque<int> path = buildPath();
|
||||
CDSection & rs = interface->section(path);
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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();
|
||||
@@ -96,8 +102,10 @@ QVariant CDItem::value(CDType & t, int role) const {
|
||||
if (t.type() == "e") {
|
||||
QAD::Enum et = PI2QADEnum(t.enumValues());
|
||||
et.selectValue(t.toInt());
|
||||
if (role == Qt::EditRole) return QVariant::fromValue<QAD::Enum>(et);
|
||||
else return et.selectedName();
|
||||
if (role == Qt::EditRole)
|
||||
return QVariant::fromValue<QAD::Enum>(et);
|
||||
else
|
||||
return et.selectedName();
|
||||
}
|
||||
return PI2QString(t.value());
|
||||
}
|
||||
@@ -113,15 +121,9 @@ bool CDItem::setData(int column, const QVariant & value) {
|
||||
}
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -166,8 +168,7 @@ QString CDItem::stringType(const PIString & t) const {
|
||||
|
||||
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 << QAD::Enumerator(CDType::X_Current, "Current") << QAD::Enumerator(CDType::X_All_Avg, "All, Averaging");
|
||||
ret.selectValue(v);
|
||||
return ret;
|
||||
}
|
||||
@@ -175,12 +176,11 @@ QAD::Enum CDItem::xModeEnum(int v) const {
|
||||
|
||||
// CDKDelegate
|
||||
|
||||
CDDelegate::CDDelegate(QObject *parent) : QStyledItemDelegate(parent) {
|
||||
}
|
||||
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);
|
||||
CDItem * item = ((CDItemModel *)index.model())->getItem(index);
|
||||
if (item) {
|
||||
if (item->itemType() == CDItem::ItemCDType && item->interface->cdType() == CDType::cdC) {
|
||||
QStyleOptionButton bo;
|
||||
@@ -188,15 +188,14 @@ void CDDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option,
|
||||
bo.fontMetrics = option.fontMetrics;
|
||||
bo.palette = option.palette;
|
||||
bo.rect = option.rect;
|
||||
bo.state = option.state;// & ~(QStyle::State_HasFocus | QStyle::State_MouseOver);
|
||||
bo.state = option.state; // & ~(QStyle::State_HasFocus | QStyle::State_MouseOver);
|
||||
bo.text = item->data(1, Qt::DisplayRole).toString();
|
||||
QWidget * v = (QWidget*)(painter->device());
|
||||
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;
|
||||
// bo.state |= QStyle::State_MouseOver;
|
||||
if (qApp->mouseButtons().testFlag(Qt::LeftButton)) bo.state |= QStyle::State_On;
|
||||
}
|
||||
}
|
||||
qApp->style()->drawControl(QStyle::CE_PushButton, &bo, painter);
|
||||
@@ -204,37 +203,37 @@ void CDDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option,
|
||||
}
|
||||
}
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
|
||||
}
|
||||
|
||||
|
||||
QWidget * CDDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
|
||||
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<QVariantEdit*>(editor);
|
||||
void CDDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const {
|
||||
QVariantEdit * edit = static_cast<QVariantEdit *>(editor);
|
||||
edit->setValue(index.model()->data(index, Qt::EditRole));
|
||||
}
|
||||
|
||||
|
||||
void CDDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
|
||||
QVariantEdit *edit = static_cast<QVariantEdit*>(editor);
|
||||
QVariant v = edit->value();
|
||||
void CDDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const {
|
||||
QVariantEdit * edit = static_cast<QVariantEdit *>(editor);
|
||||
QVariant v = edit->value();
|
||||
if (v.canConvert<QAD::Enum>()) {
|
||||
QAD::Enum et = v.value<QAD::Enum>();
|
||||
model->setData(index, et.selectedValue(), Qt::EditRole);
|
||||
} else model->setData(index, v, Qt::EditRole);
|
||||
} else
|
||||
model->setData(index, v, Qt::EditRole);
|
||||
}
|
||||
|
||||
|
||||
void CDDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {
|
||||
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 CDDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const {
|
||||
QSize s = QStyledItemDelegate::sizeHint(option, index);
|
||||
s.setWidth(s.width() + 20);
|
||||
return s;
|
||||
@@ -243,9 +242,9 @@ QSize CDDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex
|
||||
|
||||
// CDItemModel
|
||||
|
||||
CDItemModel::CDItemModel(int type_, QObject *parent) : QAbstractItemModel(parent) {
|
||||
CDItemModel::CDItemModel(int type_, QObject * parent): QAbstractItemModel(parent) {
|
||||
interface = new Interface((CDType::cdT)type_);
|
||||
root = 0;
|
||||
root = 0;
|
||||
internalRebuild();
|
||||
}
|
||||
|
||||
@@ -256,7 +255,7 @@ CDItemModel::~CDItemModel() {
|
||||
}
|
||||
|
||||
|
||||
QVariant CDItemModel::data(const QModelIndex &index, int role) const {
|
||||
QVariant CDItemModel::data(const QModelIndex & index, int role) const {
|
||||
if (!index.isValid()) return QVariant();
|
||||
CDItem * item = getItem(index);
|
||||
return item->data(index.column(), role);
|
||||
@@ -266,30 +265,32 @@ QVariant CDItemModel::data(const QModelIndex &index, int role) const {
|
||||
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 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");
|
||||
case cValue: return tr("Value");
|
||||
case cComment: return tr("Comment");
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
||||
QModelIndex CDItemModel::index(int row, int column, const QModelIndex &parent) const {
|
||||
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();
|
||||
if (c)
|
||||
return createIndex(row, column, c);
|
||||
else
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
|
||||
QModelIndex CDItemModel::parent(const QModelIndex &index) const {
|
||||
QModelIndex CDItemModel::parent(const QModelIndex & index) const {
|
||||
if (!index.isValid()) return QModelIndex();
|
||||
CDItem * c = getItem(index);
|
||||
CDItem * p = c->parent_;
|
||||
@@ -298,13 +299,13 @@ QModelIndex CDItemModel::parent(const QModelIndex &index) const {
|
||||
}
|
||||
|
||||
|
||||
int CDItemModel::rowCount(const QModelIndex &parent) const {
|
||||
int CDItemModel::rowCount(const QModelIndex & parent) const {
|
||||
CDItem * p = getItem(parent);
|
||||
return p->childs.count();
|
||||
}
|
||||
|
||||
|
||||
int CDItemModel::columnCount(const QModelIndex &parent) const {
|
||||
int CDItemModel::columnCount(const QModelIndex & parent) const {
|
||||
return cLastColumn;
|
||||
}
|
||||
|
||||
@@ -312,23 +313,18 @@ int CDItemModel::columnCount(const QModelIndex &parent) const {
|
||||
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);
|
||||
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 (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;
|
||||
if (index.column() == cXMode || index.column() == cXAvg) f |= Qt::ItemIsEditable;
|
||||
if (index.column() == cName_Cmd) f |= Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled;
|
||||
}
|
||||
}
|
||||
return f;
|
||||
@@ -350,15 +346,15 @@ bool CDItemModel::setData(const QModelIndex & index, const QVariant & value, int
|
||||
}
|
||||
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);
|
||||
// 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);
|
||||
bool result = item->setData(index.column(), value);
|
||||
if (result) {
|
||||
QModelIndex rin(CDItemModel::index(index.row(), cExpression, index.parent()));
|
||||
emit dataChanged(rin, rin);
|
||||
@@ -371,13 +367,12 @@ bool CDItemModel::setData(const QModelIndex & index, const QVariant & value, int
|
||||
QMimeData * CDItemModel::mimeData(const QModelIndexList & indexes) const {
|
||||
if (indexes.size() == 1) {
|
||||
QModelIndex index = indexes[0];
|
||||
if (index.isValid()/* && interface->cdType() == CDType::cdX*/) {
|
||||
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())));
|
||||
mime->setText(PI2QString(CDCore::instance()->typeLetter(interface->cdType()) + CDCore::pathToString(t.path())));
|
||||
return mime;
|
||||
}
|
||||
}
|
||||
@@ -394,13 +389,13 @@ void CDItemModel::rebuildModel() {
|
||||
|
||||
|
||||
void CDItemModel::buildItem(CDItem * it, CDSection & r) {
|
||||
//piCout << "build item" << r.name << r.alias;
|
||||
// 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();
|
||||
auto j = r.s.makeIterator();
|
||||
while (j.next()) {
|
||||
it->childs << new CDItem(interface, j.key(), CDItem::ItemCDSection, it);
|
||||
buildItem(it->childs.back(), j.value());
|
||||
@@ -415,17 +410,17 @@ void CDItemModel::updateModel() {
|
||||
|
||||
|
||||
void CDItemModel::internalRebuild() {
|
||||
//qDebug() << "[CDKItemModel]" << "internalRebuild()";
|
||||
// qDebug() << "[CDKItemModel]" << "internalRebuild()";
|
||||
if (root) delete root;
|
||||
root = new CDItem(interface, 0, CDItem::ItemCDSection, 0);
|
||||
root = new CDItem(interface, 0, CDItem::ItemCDSection, 0);
|
||||
CDSection & r = interface->root();
|
||||
buildItem(root, r);
|
||||
}
|
||||
|
||||
|
||||
CDItem * CDItemModel::getItem(const QModelIndex &index) const {
|
||||
CDItem * CDItemModel::getItem(const QModelIndex & index) const {
|
||||
if (index.isValid()) {
|
||||
CDItem * item = static_cast<CDItem*>(index.internalPointer());
|
||||
CDItem * item = static_cast<CDItem *>(index.internalPointer());
|
||||
if (item) return item;
|
||||
}
|
||||
return root;
|
||||
@@ -435,27 +430,27 @@ CDItem * CDItemModel::getItem(const QModelIndex &index) const {
|
||||
QModelIndex CDItemModel::indexByPath(const PIDeque<int> & path, int column) const {
|
||||
if (path.isEmpty()) return QModelIndex();
|
||||
CDItem * item = root;
|
||||
//piCout << path << "...";
|
||||
bool ok = false;
|
||||
// piCout << path << "...";
|
||||
bool ok = false;
|
||||
for (int i = 0; i < path.size_s() - 1; ++i) {
|
||||
ok = false;
|
||||
foreach (CDItem * j, item->childs)
|
||||
foreach(CDItem * j, item->childs)
|
||||
if (j->type_ == CDItem::ItemCDSection && j->index_ == path[i]) {
|
||||
item = j;
|
||||
ok = true;
|
||||
ok = true;
|
||||
break;
|
||||
}
|
||||
if (!ok) return QModelIndex();
|
||||
}
|
||||
ok = false;
|
||||
foreach (CDItem * j, item->childs)
|
||||
foreach(CDItem * j, item->childs)
|
||||
if (j->type_ == CDItem::ItemCDType && j->index_ == path.back()) {
|
||||
item = j;
|
||||
ok = true;
|
||||
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();
|
||||
// piCout << path << Q2PIString(item->data(cName_Cmd, Qt::DisplayRole).toString()) << getItem(ret)->buildPath();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1,51 +1,52 @@
|
||||
/*
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef QCD_MODEL_H
|
||||
#define QCD_MODEL_H
|
||||
|
||||
#include "cd_qt_export.h"
|
||||
#include "pistring.h"
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
#include <QItemDelegate>
|
||||
#include <QStyledItemDelegate>
|
||||
#include "pistring.h"
|
||||
#include "cd_qt_export.h"
|
||||
|
||||
namespace CDUtils {
|
||||
class CDType;
|
||||
class CDSection;
|
||||
class Interface;
|
||||
class CDType;
|
||||
class CDSection;
|
||||
class Interface;
|
||||
|
||||
enum Column {
|
||||
cID ,
|
||||
cName_Cmd ,
|
||||
cType ,
|
||||
cXMode ,
|
||||
cXAvg ,
|
||||
cExpression,
|
||||
cValue ,
|
||||
cComment ,
|
||||
cLastColumn,
|
||||
};
|
||||
}
|
||||
enum Column {
|
||||
cID,
|
||||
cName_Cmd,
|
||||
cType,
|
||||
cXMode,
|
||||
cXAvg,
|
||||
cExpression,
|
||||
cValue,
|
||||
cComment,
|
||||
cLastColumn,
|
||||
};
|
||||
} // namespace CDUtils
|
||||
|
||||
namespace QAD {
|
||||
struct Enum;
|
||||
struct Enum;
|
||||
}
|
||||
|
||||
class CDItemModel;
|
||||
@@ -54,16 +55,20 @@ class CDItemModel;
|
||||
class CD_QT_EXPORT CDItem {
|
||||
friend class CDItemModel;
|
||||
friend class CDView;
|
||||
|
||||
public:
|
||||
enum CDItemType{ItemCDType, ItemCDSection};
|
||||
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_;}
|
||||
CDItemType itemType() const { return type_; }
|
||||
PIDeque<int> buildPath() const;
|
||||
int index() const {return index_;}
|
||||
int index() const { return index_; }
|
||||
|
||||
CDUtils::Interface * interface;
|
||||
bool expanded;
|
||||
@@ -79,42 +84,42 @@ private:
|
||||
};
|
||||
|
||||
|
||||
class CD_QT_EXPORT CDDelegate : public QStyledItemDelegate
|
||||
{
|
||||
class CD_QT_EXPORT CDDelegate: public QStyledItemDelegate {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
CDDelegate(QObject *parent = 0);
|
||||
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;
|
||||
|
||||
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 CD_QT_EXPORT CDItemModel : public QAbstractItemModel {
|
||||
class CD_QT_EXPORT CDItemModel: public QAbstractItemModel {
|
||||
Q_OBJECT
|
||||
friend class CDView;
|
||||
|
||||
public:
|
||||
explicit CDItemModel(int type_, QObject *parent = 0);
|
||||
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);
|
||||
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<int> & path, int column = CDUtils::cID) const;
|
||||
|
||||
void buildItem(CDItem * it, CDUtils::CDSection &r);
|
||||
void buildItem(CDItem * it, CDUtils::CDSection & r);
|
||||
|
||||
public slots:
|
||||
void rebuildModel();
|
||||
@@ -127,7 +132,6 @@ private:
|
||||
CDItem * root;
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // QCD_MODEL_H
|
||||
|
||||
@@ -1,30 +1,32 @@
|
||||
#include "qcd_view.h"
|
||||
|
||||
#include "cdutils_c.h"
|
||||
#include "cdutils_core.h"
|
||||
#include "cdutils_k.h"
|
||||
#include "cdutils_m.h"
|
||||
#include "cdutils_x.h"
|
||||
#include "pifile.h"
|
||||
#include "piqt.h"
|
||||
#include "qcd_model.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QMouseEvent>
|
||||
#include <QSortFilterProxyModel>
|
||||
#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;
|
||||
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(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);
|
||||
connect(this, SIGNAL(_qcd_receivedX()), this, SLOT(cd_receivedX()), Qt::QueuedConnection);
|
||||
connect(this, SIGNAL(_qcd_changedGlobal()), this, SLOT(cd_changedGlobal()), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,46 +46,44 @@ void CDView::setType(int cdt) {
|
||||
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, 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, 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, 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, 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, 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);
|
||||
if (i.isValid() && i.column() == cName_Cmd) update(i);
|
||||
}
|
||||
QTreeView::mousePressEvent(e);
|
||||
}
|
||||
@@ -92,8 +92,7 @@ void CDView::mousePressEvent(QMouseEvent * e) {
|
||||
void CDView::mouseReleaseEvent(QMouseEvent * e) {
|
||||
if (type_ == CDType::cdC) {
|
||||
QModelIndex i = indexAt(e->pos());
|
||||
if (i.isValid() && i.column() == cName_Cmd)
|
||||
update(i);
|
||||
if (i.isValid() && i.column() == cName_Cmd) update(i);
|
||||
}
|
||||
QTreeView::mouseReleaseEvent(e);
|
||||
}
|
||||
@@ -101,8 +100,7 @@ void CDView::mouseReleaseEvent(QMouseEvent * e) {
|
||||
|
||||
void CDView::currentChanged(const QModelIndex & cur, const QModelIndex & prev) {
|
||||
if (type_ == CDType::cdC) {
|
||||
if (prev.isValid() && prev.column() == cName_Cmd)
|
||||
update(prev);
|
||||
if (prev.isValid() && prev.column() == cName_Cmd) update(prev);
|
||||
}
|
||||
QTreeView::currentChanged(cur, prev);
|
||||
}
|
||||
@@ -121,30 +119,28 @@ void CDView::refresh() {
|
||||
proxy_->setSourceModel(model_);
|
||||
setModel(proxy_);
|
||||
setItemDelegateForColumn(type_ == CDType::cdC ? cName_Cmd : cValue, new CDDelegate());
|
||||
if (type_ == CDType::cdX)
|
||||
setItemDelegateForColumn(cXMode, 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);
|
||||
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(cType, true);
|
||||
setColumnHidden(cXMode, true);
|
||||
setColumnHidden(cXAvg, true);
|
||||
setColumnHidden(cExpression, true);
|
||||
setColumnHidden(cValue, true);
|
||||
setColumnHidden(cValue, true);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
expandAll();
|
||||
for (int i = 0; i < model_->columnCount(); i++) resizeColumnToContents(i);
|
||||
for (int i = 0; i < model_->columnCount(); i++)
|
||||
resizeColumnToContents(i);
|
||||
}
|
||||
|
||||
|
||||
@@ -255,7 +251,7 @@ void CDView::load() {
|
||||
|
||||
|
||||
void CDView::clear() {
|
||||
//piCout << "clearK";
|
||||
// piCout << "clearK";
|
||||
switch ((CDType::cdT)type_) {
|
||||
case CDType::cdK: K.root() = CDSection(); break;
|
||||
case CDType::cdX: X.root() = CDSection(); break;
|
||||
@@ -310,7 +306,7 @@ void CDView::indexClicked(const QModelIndex & i) {
|
||||
CDType & t(model_->interface->section(item->buildPath())[item->index()]);
|
||||
C.sendCommand(t);
|
||||
emit commandSended(PI2QString(t.pathString().join(".")));
|
||||
//piCout << t;
|
||||
// piCout << t;
|
||||
qDebug() << PI2QString(t.pathString().join("."));
|
||||
}
|
||||
|
||||
@@ -346,16 +342,16 @@ void CDView::cd_receiveSucceed() {
|
||||
|
||||
void CDView::cd_receivedX() {
|
||||
X.lock();
|
||||
PIVector<PIDeque<int> > xl = X.enabledList();
|
||||
//piCout << "X" << xl.size();
|
||||
piForeachC (PIDeque<int> & x, xl) {
|
||||
PIVector<PIDeque<int>> xl = X.enabledList();
|
||||
// piCout << "X" << xl.size();
|
||||
piForeachC(PIDeque<int> & x, xl) {
|
||||
CDType & t(X[x]);
|
||||
//piCout << t;
|
||||
//piCout << t.path();
|
||||
// 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();
|
||||
// piCout << CDCore::pathToString(t.path()) << t.toDouble() << "model";
|
||||
// qDebug() << "val" << model_->data(model_->indexByPath(t.path(), cValue), Qt::DisplayRole).toDouble();
|
||||
}
|
||||
X.unlock();
|
||||
emit receivedX();
|
||||
@@ -368,8 +364,10 @@ void CDView::cd_changedGlobal() {
|
||||
|
||||
|
||||
void CDView::pi_cd_messageReceived(PIDeque<int> 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)));
|
||||
QMetaObject::invokeMethod(this,
|
||||
"messageReceived",
|
||||
Qt::QueuedConnection,
|
||||
Q_ARG(QString, PI2QString(CDCore::pathToString(path))),
|
||||
Q_ARG(int, type),
|
||||
Q_ARG(QString, PI2QString(msg)));
|
||||
}
|
||||
|
||||
@@ -1,43 +1,46 @@
|
||||
/*
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
QCD Utils - Qt bindings/utilites for CD Utils
|
||||
|
||||
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
|
||||
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 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.
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef QCD_VIEW_H
|
||||
#define QCD_VIEW_H
|
||||
|
||||
#include <QTreeView>
|
||||
#include "piobject.h"
|
||||
#include "cd_qt_export.h"
|
||||
#include "piobject.h"
|
||||
|
||||
#include <QTreeView>
|
||||
|
||||
namespace CDUtils {
|
||||
class CDType;
|
||||
class CDSection;
|
||||
}
|
||||
class CDType;
|
||||
class CDSection;
|
||||
} // namespace CDUtils
|
||||
|
||||
class CDItemModel;
|
||||
class QSortFilterProxyModel;
|
||||
|
||||
class CD_QT_EXPORT CDView: public QTreeView, public PIObject
|
||||
{
|
||||
class CD_QT_EXPORT CDView
|
||||
: public QTreeView
|
||||
, public PIObject {
|
||||
Q_OBJECT
|
||||
PIOBJECT(CDView);
|
||||
|
||||
public:
|
||||
explicit CDView(QWidget *parent = 0);
|
||||
explicit CDView(QWidget * parent = 0);
|
||||
~CDView();
|
||||
|
||||
void setType(int cdt);
|
||||
@@ -47,11 +50,11 @@ public:
|
||||
CDUtils::CDSection * root();
|
||||
QString typeLetter() const;
|
||||
|
||||
CDItemModel * CDModel() {return model_;}
|
||||
CDItemModel * CDModel() { return model_; }
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent * ) override;
|
||||
void mouseReleaseEvent(QMouseEvent * ) override;
|
||||
void mousePressEvent(QMouseEvent *) override;
|
||||
void mouseReleaseEvent(QMouseEvent *) override;
|
||||
void currentChanged(const QModelIndex & cur, const QModelIndex & prev) override;
|
||||
|
||||
public slots:
|
||||
@@ -77,12 +80,12 @@ private slots:
|
||||
|
||||
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_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<int>, path, int, type, PIString, msg);
|
||||
|
||||
CDItemModel * model_;
|
||||
@@ -101,13 +104,12 @@ signals:
|
||||
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_sendFailed(); // PRIVATE
|
||||
void _qcd_sendSucceed(); // PRIVATE
|
||||
void _qcd_receiveFailed(); // PRIVATE
|
||||
void _qcd_receiveSucceed(); // PRIVATE
|
||||
void _qcd_receivedX(); // PRIVATE
|
||||
void _qcd_changedGlobal(); // PRIVATE
|
||||
|
||||
void _qcd_receivedX(); // PRIVATE
|
||||
void _qcd_changedGlobal(); // PRIVATE
|
||||
};
|
||||
|
||||
#endif // QCD_VIEW_H
|
||||
|
||||
Reference in New Issue
Block a user